1、- 1 -C 语言复习提纲第一章 C 语言程序设计概述一、Visual C+6.0 开发环境1、了解 Visual C+6.0 的安装过程;2、了解 Visual C+6.0 的工作界面,菜单和工具栏的使用;二、掌握 C 语言程序运行的过程1、编辑:是指把按照 C 语法规则编写的程序代码通过编辑器(Visual C+ 6.0,Turbo C 3.0)输入计算机,并存盘。在存盘时,C 源文件的扩展名为 .c 2、编译:将 C 语言源程序编译成目标程序,即对源程序进行编译,并将源程序转换为扩展名为.obj 的二进制目标代码(即把已经编辑好的源程序翻译成二进制目标代码的过程) 。 3、连接:将用户程
2、序生成的目标代码文件(.obj)和系统提供的库文件(.lib)中的某些代码连接在一起,生成一个可执行文件(.exe) 。4、执行:执行生成的可执行代码,并输出结果。5、调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。三、结构化程序设计的基本概念1、概念以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,将原来较为复杂的问题化简为一系列简单模块的设计,任何模块都可以使用一些基本的结构来实现,任何复杂的程序,都可以使用这些基本结构按一定的顺序组合起来,这些基本结构的特点都是只有一个入口、一个出口,这样的程序设计方法称为结构化程序设计。
3、2、基本思想结构化程序设计的基本思想是采用“自顶向下,逐步细化、模块化设计、结构化编码“的程序设计方法和“单入口单出口“的控制结构。3、三种基本结构顺序结构 选择结构 循环结构4、三种基本结构的特点只有一个入口 只有一个出口每一个基本结构中的每一部分都有机会执行到结构内不存在“死循环”5、设计原则自顶向下 逐步细化 模块化设计结构化编码四、C 程序的基本组成:C 程序是由若干个函数构成的,至少有一个主函数 main(),main()的位置可以任意,其他各函数在程序中的前后位置也是可以任意的。程序的执行总是从主函数开始,在主函数中结束。主函数是可以调用其他任何非主函数的函数,任何非主函数也可以调
4、用其它任何非主函数。C 程序的基本组成:声明区、主程序区、函数定义区。1、声明区处在程序文件的所有函数的外部,一般包含:包含头文件、宏定义、类定义、结构体定义、函数声明、全局变量声明、条件编译等。2、主程序区主程序以 main()函数开始,main()函数(主函数)是程序运行时的入口,包含局部变量的声明、函数调用、一般运算、结构控制、对象与结构的处理、文件处理等。3、函数定义区函数的定义包含函数说明和函数体两部分。- 2 -4、注释/或/* */为注释,不能嵌套不产生编译代码,不影响程序的执行效率。五、标识符1、标识符的定义:用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标
5、识符。2、标识符的命名规则:由字母、数字或下画线组成,并且第 1 个字符必须为字母或下画线。注意:标识符区分大小写,即大写字母和小写字母的通常意义不同,且不能与关键字重名。练习 1_1:下列变量标识符哪些是正确的,哪些是不正确的?a3bc if a!bc _abc abc _3abc a_bc 3abc3、标识符分类:关键字、预定义标识符、用户自定义标识符。第二章 数据类型、运算符和表达式一、C 语言的数据类型C 语言中基本数据类型包括整型、实型、字符型、枚举类型,构造类型有数组、结构体、共用体等。、基本数据类型(见 P17)、构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的。 数
6、组:是由具有相同数据类型的元素组成的集合。 结构体:是由不同的数据类型构成的一种混合的数据结构,构成结构体的成员的数据类型一般不同,并且在内存中分别占据不同的存储单元。 共用体:是类似于结构体的一种构造类型,与结构体不同的是构成共同体的数据成员共用同一段内存单元。 枚举:是将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。、指针类型变量用于存储另一变量的地址,而不能用来存放基本类型的数据。它在内存中占图2_1 C 语言的数据类型数据类型基本类型空类型(无值类型)void构造类型指针类型实型(浮点型)联合型类型union单字符型char整型int单精度型float双精度型double字
7、符型 宽字符型w-char逻辑型bool类类型class枚举类型enum结构类型struct数组类型- 3 -据一个存储单元。、类是一种数据类型,它定义的是一种对象类型,由数据和方法组成,描述了属于该类型的所有对象的性质。 二、常量和变量、常量:在程序运行的整个过程中,其值始终保持不变的量。 整型常量:表示形式有十进制、八进制(以 0 开头)和十六进制(以 0x 或 0X 开头) 。整型常量可以后缀字母 L(或 l)表示长整数,后缀字母 U(或 u)表示无符号整数。 实型常量(浮点型常量):表示形式有一般形式和指数形式。实型常量缺省为 double 型(双精度型) ,如后缀 f 或 F,则为
8、float 型(单精度型) 。 字符常量:用单撇号括起来的一个字符。如A,*等。转义字符:用反斜杠引导的,具有特定含义的字符(见 P22表 2-4),如 n,367,x8a。注:C 语言字符集中的任何一个字符均可用转义字符来表示。 字符串常量:用双撇号括起来的字符序列。如“student“,“广东广州“ 等。 布尔常量:false,true。 符号常量: #define 宏名 常数练习 2_1:下列哪些是合法的常量:12.7f 0986 0986.012 、0625L 87U-0x98C2 01a -6.87E-2 1.2e0.5 E-3 0xFF 2L 72 160 -0xffff5E2.0
9、 -0xcdf 1.3E 2E0 0668(21)011 (22)0xe (23)-01 (24)-0x48a (25)0x变量:指程序在运行时其值可改变的量。 变量应先定义(声明其类型和名称)后使用; 变量定义的一般形式为: ,; 在定义一个变量的同时,也可以给它赋以初值。 练习 2_2 以下正确的变量标识符是3abc $amount Num_of_Student if a!bc _above _abc ab sin day三、运算符和表达式1、算术运算符和算术表达式注意:int i=1.2*3; /结果为 3,而不是 3.6。 int i=5/3 结果为 1。表达式 175 的结果是 3,
10、表达式 175 的结果是 2。2、赋值运算符和赋值表达式注意: 赋值运算符的结合性是从右至左的 复合赋值运算符:int a=12; a+=a-=a*=a;(a=a+(a=a-(a=a*a),结果为 0)注意:在 C 语言中,定义 int a=b=c=3;是错误的,而定义 int a,b,c; a=b=c=3;是正确的。 练习 2_3 设 m=9,i=3,则执行运算 m%=i+1 后,m 的值是多少?结果 1。m=m%(i+1)m=9%(3+1)m=1。3、关系运算符和关系表达式注意: 关系运算符的优先级低于算术运算符。例如:a+bc 等价于 (a+b)c,a!=bc 等价于a!=(bc) “=
11、”与“=”的区别4、逻辑运算符与逻辑表达式- 4 -注意: 逻辑非的优先级最高,逻辑与次之,逻辑或最低练习 2_4 若有 int a=3,b=0;则表达式 ac=+a|+b;后,b 的值为 3。练习 2_7 设 x、y 和 z 都是 int 型变量,且 x=8, y=3, z=5, 则表达式 x*y/z+6-14%z 的值为6。练习 2_8 设有定义:int x=1,y=-1;则执行语句 printf(“%dn“,(x-后的输出结果是0。练习 2_9 设 x,y,z,t 均为 int 型变量,则执行以下语句 x=y=z=1;t=+x|+y 后,x、y、z、t 的值分别为 2,1,1,1。6、条
12、件运算符表达式 1?表达式 2:表达式 3注意: 结合性是自右向左。ab?a:cd?c:d 相当于 ab?a:(cd?c:d) 条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。如:ab?a-b:b-a 相当于 ab?(a-b):(b-a) 练习 2_10 设有变量说明:int x=3,y=5;那么表达式:z=xy?x:y 运算后,z 的值是 5。7、位运算符位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数。练习 2_11 int a=5,b=6;aa|b=7;ab=3;b=-7;b2=1。注:在位运算中,操作数左移三位,其结果相当于操作数乘以 8。8
13、、逗号运算符表达式, 表达式, , 表达式 n注意:自左至右,依次计算各表达式的值, “表达式 n” 的值即为整个逗号表达式的值。如: a = 3 * 5, a * 4, a + 5 的值为 20。四、运算符的优先级与结合性1、所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合性。反之,称为右结合性。结合性是语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。2、表达式求值 按运算符的优先级高低次序执行。例如,先乘除后加减。 如果在一个运算对象(或称操作数)两
14、侧的运算符的优先级相同,则按语言规定的结合方向(结合性)进行。例如,算术运算符的结合方向是“自左至右” ,即:在执行“a b + c”时,变量 b 先与减号结合,执行“a - b” ;然后再执行加 c 的运算。练习 2_12 设 int x=2,y=3,z=4; 执行语句行 x+;y+=1;z=x+y-以后,x,y 和 z 的值分别是多少?答案:3,3,7练习 2_13 若有定义 int m=2;则逻辑表达式(m=3)后,n 的值为 2。练习 2_16 如果 a=5,b=3,c=7,d=9,则条件表达式 am,正常输出; 3.2,根据定义和数据的输入方式,输入函数语句的正确形式为 scanf(
15、“%lf%lf“,n = m+ -1;printf(“%d %dn“, m ,n); 输出结果是 3,1。第四章 选择结构程序设计一、算法1、算法的概念:算法是指为解决一个问题而采取的确定的、有限的方法和步骤。2、算法的描述方法最常用的有自然语言、流程图、N-S 流程图、PAD 图和伪代码等。二、顺序结构程序设计顺序结构是结构化程序设计中最简单、最常见的一种程序结构。顺序结构中的语句是按照书写的先后次序执行的,并且每个语句都会被执行到。练习 4_1 编写一个程序,从键盘上输入一个学生 5 门课的成绩,计算出该学生的总成绩和平均成绩,并用自然语言描述算法。解:设变量 a、b、c、d、e 分别表示
16、学生 5 门课的成绩,sum 表示总成绩,aver 表示平均成绩, 则用自然语言描述算法如下:输入学生 5 门课的成绩 a、b、c、d、e;求总成绩 sum=a+b+c+d+e;求平均成绩: aver =sum/5.0;输出总成绩和平均成绩。程序如下:#include main()float a,b,c,d,e,sum,aver;printf(“请输入学生 5 门课的成绩n“);scanf(“%f,%f,%f,%f,%f“,- 7 -sum=a+b+c+d+e;aver=sum/5.0;printf(“总成绩=%0.2f,平均成绩=%.2fn“,sum,aver);练习 4_2 编写一个程序,
17、从键盘输入梯形的上底、下底和高的值(浮点数) ,计算并输出其面积(保留两位小数) ,并用 N-S 结构图表示算法。 解:设变量 a、b、h、area 分别表示梯形的上底、下底、高和面积,则用 N-S 结构图表示算法如下:程序如下:#include main()float a,b,h,area;printf(“请输入梯形的上底、下底和高n“);scanf(“%f,%f,%f“,area=(a+b)*h/2.0;printf(“梯形的面积为%0.2fn“,area);练习 4_3 编写一个程序,从键盘输入圆的半径,计算并输出圆的周长和面积(保留两位小数),用伪代码表示出算法。解:设用变量 r 、l
18、ength、area 分别表示圆的半径、周长和面积,则用伪代码表示算法如下:BEGINinput rlength=2*3.14*rarea=3.14*r*rprint length,areaEND程序如下:#include #define PI 3.14main()float r,length,area;printf(“请输入圆的半径n“);scanf(“%f“,length=2*PI*r;area=PI*r*r;printf(“圆的周长为%0.2fn“,length);printf(“圆的面积为%0.2fn“,area); 三、选择结构程序设计输入梯形的上底 a、下底 b 和高 h计算梯形的
19、面积:area=(a+b)*h/2.0输出结果。- 8 -1、if 语句、if 语句的一般格式if(表达式) 语句组 1;else语句组 2; if 语句中的“表达式”必须用“(”和“)”括起来。表示程序执行的条件,常用关系运算符、逻辑运算符等表示的条件表达式,其结果只有两个值“1”或“0” (成立或不成立) 。如:表示字符型变量 ch 是大写英文字符的 C 语言表达式是 ch=Aprintf(“输入行李的重量:“);scanf(“%f“,if(w40.0)x=40.0*0.3+(w-40.0)*0.8;elsex=w*0.5;printf(“行李重量 w=%.2f 公斤,托运费 x=%.2f
20、 元n“,w,x);2switch 语句、switch 语句的一般形式switch(表达式) case 常量表达式 1:语句组;break;case 常量表达式 2:语句组;break;.- 9 -case 常量表达式:语句组;break;default:语句组;break; 、执行过程 当 switch 后面“表达式”的值,与某个 case 后面的“常量表达式”的值相同时,就执行该 case 后面的语句(组) ;当执行到 break 语句时,跳出 switch 语句,转向执行 switch 语句的下一条。 如果没有任何一个 case 后面的“常量表达式”的值,与“表达式”的值匹配,则执行de
21、fault 后面的语句(组) 。然后,再执行 switch 语句的下一条。说明 switch 后面的“表达式” ,可以是 int、char 和枚举型中的一种。 每个 case 子句后面的“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案) 。 case 后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以要退出 switch 语句,方法是使用 break 语句。 各 case 及 default 子句的先后次序,不影响程序执行结果。 多个 case 子句,可共用同一语句(组)
22、 用 switch 语句实现的多分支结构程序,完全可以用 if 语句或 if 语句的嵌套来实现。练习 4_5 以下程序段的输出结果是int x=7,y=8,z=9;if(xy)x=y,y=z;z=x;printf(“%d,%d,%dn“,x,y,z);结果:7,8,7练习 4_6 以下程序的输出结果是#include void main() int m=5;if(m+5)printf(“%dn“,m);elseprintf(“%dn“,m-);结果:6练习 4_7 以下程序的输出结果是#include void main()int k=1,x=0,y=0;switch(k) case 0:y+
23、;case 1:x+;case 2:x+;y+;printf(“x=%d,y=%dn“,x,y);- 10 -结果 x=2,y=1第五章 循环结构程序设计一、循环程序设计1、while 语句、一般格式while(循环继续条件) 循环体语句组;、执行过程求解“循环继续条件”表达式。如果其值为非 0,转;否则转。执行循环体语句组,然后转。执行 while 语句的下一条。练习 5_1:/*程序功能:求 1100 的累计和*/#include void main() int i=1,sum=0; /*初始化循环控制变量 i 和累计器 sum*/while( i=100 ) sum += i;/*实现累
24、加*/i+;/*循环控制变量 i 增 1*/printf(“sum=%dn”,sum);程序运行情况如下:sum=50502、do-while 语句(直到型循环)、一般格式do 循环体语句组; while(循环继续条件);/*本行的分号不能缺省*/当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。、执行过程执行循环体语句组。计算“循环继续条件”表达式。如果“循环继续条件”表达式的值为非 0(真) ,则转向继续执行;否则,转向。执行 do-while 的下一条语句。、do-while 循环语句的特点是:先执行循环体语句组,然后再判断循环条件。因此 do.while 语句不论条件是否成立,至少要执行一次循环体。练习 5_2:用 do-while 语句求解 1100 的累计和。/*程序功能:求 1100 的累计和*/main() int i=1, sum=0; /*定义并初始化循环控制变量,以及累计器*/Do sum += i; /*累加*/i+;while(i=100);/*循环继续条件:i=100*/printf(“sum=%dn”,sum);