1、第第1章章C语言与程序设计简介语言与程序设计简介 1.1 计算机和程序设计基本概念 1.2 C语言的发展历程和特点 1.3 C语言程序的基本组成 1.4 Visual C+上机操作 1.1 计算机和程序设计基本概念计算机和程序设计基本概念1.1.1 计算机系统组成计算机系统组成计算机是一种能够自动、高速处理数据的工具。一个完整的计算机系统包括硬件和软件两大部分,其组成如图1-1所示。图1-1 计算机系统组成1.硬件硬件硬件是指计算机的机器部分,即我们所见到的物理设备和器件的总称。计算机硬件结构如图1-2所示。图1-2 计算机硬件结构图中央处理器(CPU)是计算机的核心,它由控制器和运算器两部分
2、组成。控制器是计算机的神经中枢,它统一指挥和控制计算机各部分的工作。运算器对数据进行运算和处理。计算机存储器分为内存储器和外存储器两种。内存储器简称内存,也叫主存,是计算机用于直接存取程序和数据的地方。内存可直接与CPU交换信息。其存取信息的速度快,但容量有限。外存储器简称外存,也叫辅存,常用的外存有磁盘、U盘等。由于内存容量的限制,常用外存来存放大量暂时不用的信息,这些信息一般以文件形式存放在外存上。外存的特点是存储量大,信息可以长期保存,但存取信息的速度较慢。CPU不能直接处理外存中的信息,处理前必须先将这些信息由外存调入内存后再进行处理,程序也只有装入内存后才可运行。输入、输出设备是计算
3、机与外界传递信息的通道。输入设备用于把数据、图像、命令、程序等信息输入给计算机,给计算机直接输入信息的最常用设备是键盘。输出设备用于将计算机执行的结果输出反馈给使用者,主要的输出设备有显示器和打印机。磁盘和U盘既可作为输入设备,又可作为输出设备。2.软件软件软件通常指计算机系统中的程序和数据,并按功能分为系统软件和应用软件两类。系统软件是指为进行计算机系统的管理和使用而必须配置的那部分软件,如:操作系统、汇编程序、编译程序等。应用软件是指针对某类专门应用需要而配置的软件,如:计算机辅助教学CAI、财务管理软件以及火车和飞机订票系统等。仅有硬件的计算机系统(称之为裸机)是难以进行工作的。为了对计
4、算机所有软、硬件资源进行有效的控制和管理,在裸机基础上形成了第一层软件,这就是操作系统。操作系统是最基本的系统软件,是对硬件机器的首次扩充。其他软件都是建立在操作系统之上的,通过操作系统对硬件功能进一步扩充,并在操作系统的统一管理和支持下运行(见图1-3)。因此,操作系统在整个计算机系统中具有特殊的地位,它不仅是硬件与其他软件的接口,而且是整个计算机系统的控制和管理中心,它为人们提供了与计算机进行交互的良好界面。图1-3 计算机硬件功能的扩展和人机交互的界面综上所述,硬件是计算机的物质基础,软件是建立在硬件基础之上,对硬件功能的扩充与完善。两者缺一不可,没有软件,计算机的硬件难以工作;没有硬件
5、,软件的功能无法实现。1.1.2 程序与程序设计语言程序与程序设计语言要使计算机能够完成人们指定的工作,就必须把工作的具体实现步骤编写成能够由计算机识别并执行的一条条指令。计算机执行这个指令序列后,就能完成指定的任务,这样的指令序列就是程序。因此,程序就是由人编写的指挥和控制计算机完成特定功能的指令序列。书写程序所使用的语言称为程序设计语言,它是人与计算机进行信息通信的工具,而设计、编写和调试程序的过程则称为程序设计。计算机发展到今天,程序设计语言经历了由机器语言到汇编语言,最后发展到高级语言这三个阶段。我们知道,计算机所能执行的每一项操作称为一条指令,计算机能够执行的全部指令集合就是该计算机
6、的指令系统。由于计算机硬件的器件特性,决定了计算机本身只能直接接受由0和1编码的二进制指令和数据,这种二进制形式的指令集合称为该计算机的机器语言,它是计算机唯一能够直接识别并接受的语言。用机器语言编写程序很不方便且容易出错,编写出来的程序也难以调试、阅读和交流。为此,出现了用助记符代替机器语言二进制编码的另外一种语言,这就是汇编语言。汇编语言是建立在机器语言之上的,因为它是机器语言的符号化形式,所以较机器语言直观。但是计算机并不能直接识别这种符号化的语言,因此用汇编语言编写的程序必须翻译成机器语言之后才能够执行,这种“翻译”是通过专门的软件汇编程序来实现的。尽管汇编语言与机器语言相比在阅读和理
7、解上有了长足的进步,但其依赖具体机器的特性是无法改变的。能够编写好汇编程序除了掌握汇编语言之外,还必须了解计算机的内部结构和硬件特性,再加上不同的计算机上的汇编语言又各不相同,这无疑给程序设计增加了难度。随着计算机应用需求的不断增长,出现了更加接近人类自然语言的功能更强、抽象级别更高的面向各种应用的高级语言。高级语言由于接近人们的自然语言,因而使用方便,编写的程序也符合人们的习惯,能够较自然地描述各种问题,极大地提高了编程的效率,编写的程序也便于查错、阅读和修改。更为重要的是,高级语言已经从具体机器中抽象出来,摆脱了依赖具体机器的问题,使高级语言编写的程序几乎在不改动的情况下就能够在任何计算机
8、上运行。并且编程人员在编程时也无需去了解计算机内部的硬件结构。这些都是机器语言和汇编语言难以做到的。与汇编语言一样,计算机也不能够直接识别用高级语言编写的程序,即必须经过编译程序的分析、加工,将其翻译成机器语言程序,然后才能执行。编译程序是把高级语言程序翻译成等价的机器语言程序的程序。在编译方式下,高级语言程序的执行分为两个阶段:编译阶段和运行阶段。编译阶段把高级语言程序翻译成机器语言程序,运行阶段才真正执行这个机器语言程序(见图1-4)。图1-4 高级语言程序执行过程示意例如,要给内存16进制地址为1000单元中的数据加上十进制数10,则用机器语言、汇编语言和高级语言表示如下:(1)用808
9、6/8088机器语言表示(2)用8086/8088汇编语言表示(3)用C高级语言表示X=X+10;/*X为1000地址的变量名*/自从20世纪50年代中期第一个高级语言FORTRAN语言问世以来,全球已经出现了几千种高级语言,但广泛使用的高级语言也不过数十种。例如:适用于科学计算的FORTRAN语言,适用于商业事务处理的COBOL语言,第一个体现结构化程序设计思想的PASCAL语言,用于人工智能程序设计的PROLOG语言,功能丰富的C语言,面向对象程序设计的C+、Java语言等。1.2 C语言的发展历程和特点语言的发展历程和特点1.2.1 C语言发展历程语言发展历程由于操作系统等系统程序依赖于
10、计算机硬件,所以以前这类系统程序主要是用汇编语言编写的。但是汇编语言程序的可读性和可移植性都很差,严重影响了系统程序的编写效率。在这种情况下,人们希望有一种语言既有高级语言可读性高、便于移植的优点,同时又具有汇编语言能够直接访问计算机硬件的特点。因此,C语言就在这种情况下产生了。C语言的起源可以追溯到ALGOL 60语言。1963年,英国剑桥大学在ALGOL 60的基础上推出了CPL(Combined Programming Language)语言,但该语言规模较大而难以实现。1967年,英国剑桥大学的Matin Richards对CPL语言做了简化和改进,推出了BCPL(Basic Comb
11、ined Programming Language)语言。1970年,美国贝尔实验室的Ken Thompson以BCPL语言为基础,又做了进一步的简化,设计出简单且接近硬件的B语言(取BCPL的第一个字母),而且用B语言写出了第一个UNIX操作系统并在DEC PDP-7型计算机上实现。1971年,在DEC PDP-11计算机上实现了B语言。1972年,由美国的D.M.Ritchie在B语言的基础上设计出了C语言(取BCPL的第二个字母),并首次在UNIX操作系统的DEC PDP-11计算机上使用。后来C语言又进行了多次改进,但主要还是在贝尔实验室内部使用。1977年,D.M.Ritchie发表
12、了不依赖于具体机器的C语言编译文本可移植C语言编译程序,使C语言移植到其他机器时所做的工作大为简化,这也推动了UNIX操作系统迅速地在各种机器上实现。随着UNIX操作系统的广泛使用,C语言也迅速得到推广,成为世界上应用最为广泛的程序设计语言之一。1978年,B.W.Kernighan和D.M.Ritchie两人合作出版了C语言白皮书The C Programming Language,给出了C语言的详细定义。1983年,美国国家标准化协会(ANSI)对C语言的各种版本作了扩充和完善,制定了C语言的标准(称为ANSI C),这就给C语言程序的移植创造了更有利的环境。1990年,ANSI C为国际
13、标准化组织(ISO)所接受。微机上使用的C语言编译系统多为Microsoft C、Turbo C、Borland C、Quick C等,它们都是按标准C语言编写的,相互之间略有差异,每一种编译系统又有不同的版本,各版本之间也存在着差异,版本越高则编译系统所提供的函数越多、编译能力越强,使用也就越方便。1.2.2 C语言主要特点语言主要特点C语言与其他语言相比之所以发展如此迅速,成为最受欢迎的语言之一,主要原因是它具有强大的功能。许多著名的系统软件,如UNIX操作系统就是用C语言编写的。归纳起来,C语言具有下列特点:(1)简洁、紧凑、方便、灵活。C语言共有32个关键字,9种控制语句,其程序书写自
14、由,主要用小写字母表示,压缩了一些不必要的成份。因此C语言程序比其他许多高级语言编写的程序要简练得多。(2)运算符丰富。C语言的运算符包含的范围很广泛,共34个运算符。C语言把括号、下标、赋值、强制类型转换等都作为运算符处理,从而使C语言的运算类型丰富、表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。(3)数据结构丰富。C语言的数据类型有整型、实型、字符型、数组类型、结构体类型、共用体类型等,具有现代高级语言所具有的各种数据类型,能够实现复杂数据结构的各种运算。尤其是C语言的指针类型,使程序运行的效率更高。此外,C语言还具有强大的图形功能,支持多种显示器和驱动器。(
15、4)结构化语言。结构化语言的显著特点是代码及数据的分离,即程序的各种部分除了必要的信息交流之外,彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护和调试。C语言是以函数形式提供给用户的,这些函数可以方便地调用,并有多种循环语句、条件语句来控制程序的流向,从而使程序实现结构化。(5)语法检查不太严格,程序设计自由度大。一般的高级语言语法检查比较严格,能够检查出几乎所有的语法错误,而C语言放宽了语法检查,允许程序编写者有较大的自由度,这是C语言的优点,同时也是C语言的缺点。限制严格就失去了灵活性,而强调灵活性必然放松了限制。也即,在C语言程序设计中,不要过分依赖编译器的语法检查。因此对于初学
16、者来说,编写一个正确的C语言程序比编写一个其他高级语言程序要困难一些。(6)允许直接访问物理地址。C语言中含有位运算和指针运算,能够实现对内存地址的直接访问和操作,即C语言可以实现汇编语言的大部分功能,可以直接对硬件操作。所以,C语言既有高级语言的功能,又兼有汇编语言(低级语言)的大部分功能,这就是有时也称C语言为“中级语言”的原因。(7)生成目标代码效率高。C语言仅比汇编程序生成的目标代码(即机器语言程序)执行效率低10%20%,这远高于其他高级语言的执行效率。(8)适用范围大,可移植性好。C语言的一个突出优点就是适用于多种操作系统,如DOS、Windows、UNIX,同时也适用于多种机型。
17、这样,C语言程序就可以很容易地移植到其他类型的计算机上。1.3 C语言程序的基本组成语言程序的基本组成我们通过下面几个简单的C语言程序,来大致了解一下C语言程序的基本组成,以便有一个初步的概念。例1.1 在显示器输出“Hello,China!”。程序说明如下:(1)一个C程序有一个名为main的主函数,main是主函数名。程序执行时就是从主函数main开始,具体来讲就是从main下面的“”开始到“”结束。花括号“”中间的内容称为函数体,该函数体就是实现某种功能的一段程序。例1.1的函数体只有一个printf函数调用语句,该语句实现将双引号“”括起的字符串照原样输出到显示器上,而字符串中的n字符
18、表示换行的意思,即在输出以下字符串:Hello,China!后光标换到下一行的开始处。(2)在main前加上“void”,表示主函数main没有返回值。main后面的圆括号“()”表明主函数main没有参数。(3)printf函数调用语句后面有一个分号“;”表示该语句的结束。C语言规定:语句以分号“;”表示结束。(4)程序中的“/*/”表示其中的文字是注释内容。程序中的注释是给阅读程序的人看的,是为了提高程序的可读性而加入的说明性信息。注释内容的有无都不影响程序的功能和运行结果。(5)程序第一行的“#include”是编译预处理命令行,它通知编译系统,将包含输入和输出标准库函数的stdio.h
19、文件作为当前源程序的一部分。像输出函数printf以及输入函数scanf都要使用stdio.h才能实现输出和输入。例1.2 求两个数a与b之和。运行结果:Input x and y:12 15x+y=27 程序说明如下:为了表示变化的数据,程序中引入了变量,即通过变量来保存数据的值。在例1.2中定义了三个变量分别命名为x、y和sum。第一个函数调用语句printf输出“Input x and y:”用来提示输入x和y值的提示信息,这时就可以由键盘输入给变量x和变量y两个数值了。scanf是C语言的输入函数,语句中的“%d”是整型数输入格式,用来指定由键盘输入数据的格式和类型。两个“%d%d”表
20、示读入两个数,输入时要用空格符分隔。scanf语句中的“&x,&y”则表示将输入的两个数分别送给变量x和变量y,这里的“&”表示地址,即数据是送到x和y对应的内存地址中。语句“sum=x+y;”实现x+y的求和并将结果送给变量sum。第二个printf语句先输出“x+y=”,然后按格式“%d”将sum的值输出,即为:x+y=27例1.3 从键盘上输入2个整数,在屏幕上输出它们的最大值。#includeint max(int x,int y);/*函数声明*/void main()/*主函数*/int a,b,c;/*定义变量a、b、c 为整型*/printf(Input a,b=);/*输出提
21、示字符串“Input a,b=”*/scanf(%d,%d,&a,&b);/*由键盘输入a、b 值*/c=max(a,b);/*调用函数max(),并将max()的返回值送给变量c*/printf(Max is:%dn,c);/*输出结果*/int max(int x,int y)/*定义函数max(),形参x、y为整型。打头的int 表示返回值为整型*/int z;/*定义变量 z 为整型*/if(xy)/*条件判断语句,判断 x 是否大于 y*/z=x;/*x y 为真时将 x 值赋给 z*/else z=y;/*x y 为假时将 y 值赋给 z*/return(z);/*将 z 值返回给
22、调用函数 main()*/运行结果:Input a,b=8,12 Max is:12 程序说明如下:(1)程序中定义了两个函数:主函数main和被调函数max。注意函数scanf和printf是C语言提供的标准函数,无需用户定义,只要通过预处理命令“#include”将“stdio.h”包含在程序中就可直接使用了。而函数max是用户自行定义的函数,即在程序中必须写出函数max的定义。(2)一个自定义函数由两部分组成:函数首部:包括函数名、函数类型、参数类型和参数名。例如:函数体:即函数首部下面的花括号“”内的部分,如果一个函数内有多个花括号“”,则最外层的一对“”为函数的范围。函数体一般包括说
23、明部分和执行部分,它们都是C语言的语句。说明部分用来定义函数内部所用到的变量及其数据类型。执行部分则是实现函数要完成的功能,如函数max就是将x、y两个数中大者送给z,然后返回z值给主函数main。由于本例中自定义函数放置于主函数main之后,因此要先在主函数main之前予以声明,即将自定义函数max的首部作为声明语句在主函数main之前重写一次(并添加“;”)进行声明。(3)主函数main中函数printf和函数scanf功能同例1.2,语句“c=max(a,b);”的作用是:用a和b作为实参调用函数max,即将a和b的值分别传给函数max的形参x和y,且函数max最终通过return语句将
24、z值返回给主函数main中的c变量。通过以上几个例子,可以概括出C语言程序的结构特点:(1)C语言程序主要由函数构成。C语言程序中有主函数main、系统提供的库函数如printf和scanf,以及由编程者自己设计的自定义函数如max等3种类型函数。(2)一个函数由说明部分和执行部分这两部分组成。说明部分在前,执行部分在后,这两部分顺序不能颠倒。(3)无论主函数main写在程序中的什么位置,一个程序总是从主函数main开始执行的。(4)C语言书写格式自由。一个语句可以占多行,一行也可写多个语句。(5)C语言的语句都是以分号“;”结尾。(6)为了增加程序的可读性,C程序中可用“/*字符串*/”对程
25、序进行注释,注释部分可以放置到程序的任何位置。(7)程序中可以有由“#”开头的预处理命令行(include仅为其中的一种),预处理命令行通常应放在程序的最前面。1.4 Visual C+上机操作上机操作1.4.1 Visual C+的安装和启动的安装和启动如果你的计算机未安装Visual C+6.0,则应先安装。Visual C+是Visual Studio的一部分,因此需要找到Visual Studio的光盘,执行其中的setup.exe,并按屏幕上的提示进行安装即可。安装结束后,在Windows的“开始”菜单的“程序”子菜单中就会出现Microsoft Visual Studio 6.0子
26、菜单。在使用Visual C+时,只需从桌面上顺序选择“开始”“程序”“Microsoft Visual Studio 6.0”“Visual C+6.0”即可,此时屏幕上出现Visual C+6.0的主窗口,如图1-5所示。图1-5 Visual C+6.0主窗口在Visual C+主窗口的顶部是Visual C+的主菜单栏。其中包含9个菜单项:File(文件)、Edit(编辑)、View(查看)、Insert(插入)、Project(项目)、Build(构建)、Tools(工具)、Window(窗口)和Help(帮助)。主窗口的左侧是项目工作区窗口,用来显示所设定的工作区信息;右侧是程序编
27、辑窗口,用来输入和编辑源程序。1.4.2 Visual C+环境的使用环境的使用下面就以一个简单的程序为例来说明Visual C+开发环境的使用方法。该程序的功能是在屏幕上输出一行字符串“Hello C!”。1.源程序的新建源程序的新建新建一个C源程序,可采取以下步骤:在Visual C+主窗口的菜单栏中单击“File”,然后在其下拉菜单中单击“New”菜单项,如图1-6所示。图1-6 “File”菜单中的“New”选项屏幕上弹出一个“New”对话框,在“New”对话框顶部有“Files”、“Projects”、“Workspaces”、“Other Documents”4个标签,Visual
28、 C+默认打开的是“Projects”标签页。此时单击此对话框上方的“Files”标签,打开“Files”的对话框,选择列表中的“C+Source File”选项(表示这项的功能是建立新的C+源程序文件);然后点击“Location”输入框右边的按钮,如图1-7所示。图1-7 “New”对话框中的“File”标签在弹出的“Choose Directory”对话框中选择存储源程序文件的驱动器和目录,点击“OK”按钮关闭“Choose Directory”对话框,如图1-8所示。图1-8 设置源文件保存路径此时返回到“Files”标签页,在“Location”输入框上方的“File”输入框中输入将
29、要新建源程序的文件名(假设为first.cpp或first.c),如果不写后缀,系统会默认指定为C+源程序文件,自动加上后缀.cpp;点击“OK”按钮,关闭“New”对话框,如图1-9所示。图1-9 命名源文件在关闭“New”对话框后,回到Visual C+主窗口。此时在程序编辑窗口光标闪烁处开始输入源程序,如图1-10所示。图1-10 源文件编辑窗口程序输入完以后保存源程序,接下来的工作是编译和调试程序。2.源程序的编译、调试源程序的编译、调试点击“Build”菜单中的“Compile*.cpp”进行编译,如图1-11所示。图1-11 编辑源文件此时会弹出如图1-12所示的对话框,询问用户是
30、否建立一个默认的工作区,点击“是(Y)”按钮,关闭对话框,然后Visual C+开始编译源程序。也可以直接按图1-11中所示的命令按钮或Ctrl+F7键来完成编译。图1-12 确认创建默认工作区 在进行编译时,编译系统检查源程序中有无语法错误,然后在主窗口下方的调试信息窗口中输出编译的信息,如果有错,就会指出错误的位置和性质,如图1-13所示。在该信息框中显示此程序有1条错误信息,0条警告信息;错误信息“first.cpp(5):error C2143:syntax error:missing;before”表示在源程序第5行的“”之前丢失了分号“;”。按照提示修改源程序,直到重新编译显示没有
31、错误,编译成功产生一个后缀名为.obj的文件为止,如图1-14所示。图1-13 程序编译结果图1-14 编译成功注意,error错误必须全部改正,warning错误有时可以忽略。当error错误消除后方可生成目标程序。3.源程序的连接源程序的连接在得到目标程序后,就可以对程序进行连接了。此时应选择“Build”菜单下的“Build*.exe”,或直接按工具栏中的Build按钮(或按F7键),如图1-15所示。图1-15 连接目标文件完成连接后,在调试信息窗口中显示连接时的信息。若发现错误将会出现错误提示信息,此时需改正错误,直到连接显示没有错误后生成一个后缀名为.exe的可执行文件,如图1-1
32、6所示。图1-16 连接成功以上介绍的是分别进行程序的编译和连接,也可以选择菜单“Build”“Build”(或按F7键)一次完成编译与连接。4.程序的执行程序的执行在得到可执行文件*.exe后,就可以直接运行程序并查看结果了。执行程序时选择菜单“Build”“Execute*.exe”或直接点击执行程序按钮(或按Ctrl+F5键)即可,如图1-17所示。图1-17 执行程序程序执行后,屏幕切换到输出结果的窗口,显示出运行结果,如图1-18所示。图1-18 输出结果可以看到,在输出结果窗口的第一行是程序的输出:Hello C!然后换行。第二行“Press any key to continue
33、”并非程序的输出结果,而是系统自动添加的信息,用来提示用户当按下任意键后,此输出窗口消失并回到Visual C+的主窗口,以便继续进行其他的工作。注意,在程序正确编译通过并且运行结果正确以后,就要关闭当前的工作区,以便进行下一个程序的输入和编译。关闭当前工作区以后连同当前编译的文件一起关闭。关闭当前工作区的方法是点击“File”菜单中的“Close Workspace”命令,如图1-19所示。点击此命令后会弹出如图1-20所示的对话框,询问用户是否要关闭所有的文件窗口,点击“是(Y)”按钮即可关闭当前的工作区和所有打开的文件。然后开始下个程序的工作。如果不关闭当前工作区,则下一个程序的输入和编译都能正常进行,但连接生成可执行文件时就会出错。这一点要特别引起注意。图1-19 关闭当前工作区图1-20 确认关闭文件通过以上4步,我们简要地介绍了在Visual C+开发环境中开发和调试一个C语言程序的完整过程。