C程序设计复习 C
语言程序设计》重修班辅导资料
陈世清
第 1 页 共 43 页
《
C程序设计复习 第一章 C语言概述
一.知识点
1.C语言的特点:①语言简洁、紧凑,使用方便、灵活; ②运算符丰富;
③数据结构丰富; ④具有结构化控制语句; ⑤语法限制不太严格,程序设计自由度大;
⑥可以进行位操作,能实现汇编语言的大部分功能,能直接对硬件进行操作; ⑦生成的目标代码质量高,程序执行效率高; ⑧程序的移植性好。 2.C程序的组成:
⑴C程序是由函数构成的;
⑵一个函数包括函数的首部(即函数的第一行)和函数体(即花括号部分); ⑶函数体一般包括声明部分和执行部分;
⑷一个C程序总是从main函数开始执行,从main函数结束;
⑸C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上; ⑹每个语句和数据定义的最后必须有一个分号;
⑺C语言本身没有输入输出语句,是通过函数实现输入输出的; ⑻可以用/*??*/对C程序的任何部分作注释。 3. C 语言风格
⑴C 语言严格区分英文字母大小写。 ⑵C 语言用“; ”作为语句分隔符。
⑶C 语言中“{}”用于标识一组语句,构成复合语句。
⑷C 程序书写格式自由,一行内可以写几个语句,一个语句也可以写在几行 上。
⑸注释用来向用户提示或解释程序的意义。(注释部分允许出现在程序的任 何位置。编译时,会忽略所有的注释符,即不对他们作任何处理。)
4.C语言程序的运行:源程序文件的扩展名为.c,目标程序文件的扩展名为.obj,可执行程序文件的扩展名为.exe。
二.练习
㈠.填空题:
1.在TURBO C环境中用RUN命令运行一个C程序时,所运行的程序的后缀是 .c 。 2.C语言源程序文件的后缀是 .c ,经过编译后,生成文件的后缀是 .obj ,经过连接后,生成文件的后缀是 .exe 。
3.结构化程序由 顺序结构 、 选择结构 、 循环结构 三种基本结构组成。
㈡.选择题:
1.组成C语言程序的是( C )。
A.子程序 B.过程 C.函数 D.主程序和子程序
第 2 页 共 43 页
C程序设计复习 2.以下叙述中正确的是( C )。
A.在C程序中无论是整数还是实数,只要在允许的范围内都能准确无误的表示。 B.C程序由主函数组成。 C.C程序由函数组成。
D.C程序由函数和过程组成。
㈢.程序设计题:
1.编写一个C程序,输入a、b、c三个数,输出其中最大者。
第 3 页 共 43 页
C程序设计复习 第二章 数据类型、运算符与表达式
一.知识点
1.C的数据类型:基本、构造、指针和空类型,char、int、short、long、unsigned、float、double、enum、struct、union、typedef。
2.常量与变量的概念,注意符号常量的定义与使用;
3.整型、实型、字符型常量的表示,注意整型常量的十进制、八进制、十六进制的书写。 4.变量的定义,C的标识符包括关键字、预定义标识符、用户定义标识符;用户定义标识符的可用字符为字母、数字、下划线,第一个字符为字母或下划线。
5.常见数据类型的取值范围,int为-32768~+32767,unsigned int为0~65535。 6.转义字符:\\n、\\t、\\b、\\r、\\f、\\\\、\\’、\\”、\\ddd、\\xhh 7.不同数值型数据的混合运算,低级类型转换为高级类型运算 8.C的运算符:注意结合方向和运算的优先级
9.算术运算符:+、-、*、/、%、++、--,注意自加、减运算符分前缀和后缀两种方式。其中前缀方式为先自加、减,后引用;后缀方式为先引用,后自加、减;运算符%要求运算量为整数,运算结果也为整数。注意除运算时,若运算量为整型时,其运算结果也是整型的规则。
10.赋值类运算符:=、+=、-=、*=、/=、%=,注意含义和数据类型的转换。 11.逗号运算符的使用,注意逗号运算符的运算规则。 【要点归纳】 1、基本数据类型
C 语言的数据类型有基本数据类型和非基本数据类型之分。
2、变量 所谓变量就是在程序执行过程中,其值可以改变的量。变量有两个要素:
z 变量名。每个变量都必须有一个名称,即变量名,变量名应遵循标识符 的命名规则。 z 变量值。在程序运行过程中,变量的值存储在内存中,不同类型的变量, 占用的内存单元数不同。
C 语言是一种强类型语言,它要求在使用数据之前对数据的类型进行说明。 也就是说,在 C 语言中,所有变量必须先定义后使用。在定义的同时也可以进 行赋初值操作,即初始化。 定义变量的格式如下:
[存储类型] 数据类型 变量 1,变量 2, …;
3、常量 常量又称作常数,是指在程序运行过程中其值不能被改变的量。在 C 语言 中,常量有不同的类型,如整型常量、实型常量和字符串常量等。 ⑴整型常量:可以是十进制、八进制和十六进制表示的数。
z 十进制 其形式是: d 其中, d 可以是从 0-9 的一个或多个十进制数位,第一位不能是 0。
z 八进制 其形式是: 0d 其中, d 可以是一个或多个八进制数( 0-7 之间),起始0 是必须的引导符。 z 十六进制
其形式是: 0xd 其中, d 可以是一个或多个十六进制数(从 0-9 的数字,或是从”a”到”f”
第 4 页 共 43 页
C程序设计复习 的 字母)。引导符 0 是必须的,字母 X 可以用大写或小写。 整型数据在内存中是以二进制方式存放的,最高位为符号位,并以补码表示。 将一个十进制整数转化为补码表示的方法如下:
z 对于正数,其补码表示与原码相同。
z 对于负数,其补码表示为它的反码加 1;负数的反码为其绝对值的所有 位(含符号 位)取反得到。 对于用补码表示的数据,还原为原码的方法如下: z 对于正数(补码表示的符号位为 0),原码与补码相同。
z 对于负数,原码一定为负数,其绝对值为除符号位以外所有位取反后加1。
⑵实型常量 实型常量又称浮点型常量,是一个用十进制表示的符号实数。实型常量表示 形式有以下两种: z 十进制小数表示方式
z 指数表示方式 注: e 之前必须有数字, e 后面的指数必须为整数。
⑶字符常量 字符常量又分为字符型常量、字符串常量、转义字符和符号常量四种类型。 z 字符型常量 字符型常量是指用一对单引号括起来的一个字符。 z 字符串常量 字符串常量是指用一对双引号括起来的一串字符。 例: \\ddd 三位八进制 \\xhh 二位十六进制 z 符号常量
C 语言允许将程序中的常量定义为一个标识符,称为符号常量。 例: #define PI 3.1415926 4、运算符 运算符:狭义的运算符是表示各种运算的符号。 表达式:使用运算符将常量、变量、函数连接起来,构成表达式。 ⑴算术运算符 +、-、 *、 /、 %
注: “%”运算符的操作数只能是整数。 “/”运算符的运算结果根据操作数的类 型而定。 ⑵自增和自减运算符 ++、 ――
注:自增和自减运算符只适用于单个变量,而不能用于表达式或常量。 ⑶赋值运算符 = ⑷复合的赋值运算符
+=、-=、 *=、 /=、 %= 注:复合的赋值运算符只能是双目运算符。 ⑸关系运算符 <、 <=、 >、 >=、 ==、 ⑹逻辑运算符 !、 &&、 ||
⑺逗号运算符 表达式 1,表达式 2, … ⑻条件运算符 c ? e1 : e2 ⑼长度运算符 sizeof() 5、类型转换
⑴数据的混合运算和类型自动转换
C 语言允许不同类型的数据混合运算,但此时要遵循一定的规则,将运算符 两边的操作数转换成共同的类型,具体转换原则是将运算符两边的数据转换成为 它们之中数据最长的数据类型,以保证运算的精度不会低。 ⑵强制类型转换 (类型名称)(表达式)
第 5 页 共 43 页
C程序设计复习 注: (1)类型说明和表达式都需要加括号(单个变量可以不加括号); (2)无论隐式转换,强制转换都是临时转换,不改变数据本身的类型和值。
二.练习
用N—S图表示下列问题:
1.有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换。 2.依次将10个数输入,要求将其中最大的数打印出来。
3.有3个数a、b、c,要求按从大到小的顺序把它们打印出来。 4.求1+2+3+??+100。
5.判断一个数n能否同时被3和5除。 6.将100~200之间的素数打印出来。 7.求两个整数m和n的最大公约数。
2
8.求方程ax+bx+c=0的根;分别考虑有两个不等的实根和有两个相等的实根的情况。
㈠.填空题:
1.若k为整型变量且赋值11。请写出运算k++后表达式的值 11 和变量的值 12 。 2.若x为double型变量,运算x=3.2,++x后表达式的值 4.2 和变量的值 4.2 。 3.函数体由符号 { 开始,用符号 } 结束。函数体的前面是 声明 部分,其后是 执行部分。
4.C语言中的标识符可分为 关 、 和预定义标识符三类。
5.在C语言程序中,用关键字 int 定义基本整型变量,用关键字 定义单精度实型变量,用关键字 定义双精度实型变量。
6.把a1、a2定义成单精度实型变量,并赋初值1的定义语句是 float a1,a2; 。
7.C程序中定义的变量,代表内存中的一个 地址 。 8.表达式3.5+1/2的计算结果是 3.5 。 9.写出数学表达式
a?b三个等价的C语言表达式 、 、 。 c?d10.通常一个字节包含 8 个二进制位。
11.当计算机用两个字节存放一个整数时,能存放的最大(十进制)整数是 32767 、最小(十进制)整数是 -32768 。
12.在C语言中整数可用 进制数、 进制数和 进制数三种数制表示。
13.C语言中,int型数据占 2 个字节,long型数据占 4 个字节,unsigned int型数据占 2 个字节,short型数据占 2 个字节, float型数据占 4 个字节,double型数据占 8 个字节,char型数据占 1 个字节。
㈡.选择题:
1.以下选项中正确的整型常量是( B )。
A.12. B.-20 C.1,000 D.4 5 6
第 6 页 共 43 页
C程序设计复习 2.以下选项中正确的实型常量是(D )。
2
A.0 B.3. 1415 C.0.329╳10 D..871 3.以下选项中不合法的用户标识符是(B )。
A._123 B.printf C.A$ D.Dim 4.C语言中运算对象必须是整型的运算符是( A )。 A.% B./ C.! D.*
5.可在C程序中用作用户标识符的一组标识符是( B )。 A.void B.as_b3 C.For D.2c define _123 -abc DO WORD If case SIG
6.若变量已正确定义并赋值,不符合C语言语法的表达式是( C )。 A.a=a+7; B.a=7+b+c,a++ C.int(12.3%4) D.a=a+7=c+b 7.不合法的八进制数是( B )。
A.0 B.028 C.077 D.01 8.不合法的十六进制数是( A )。
A.oxff B.0Xabc C.0x11 D.0x19
㈢.程序设计题: 略
第 7 页 共 43 页
C程序设计复习 第三章 顺序程序设计
一.知识点
1.算法:为解决一个问题而采取的方法和步骤。 2.算法的分类:数值算法、非数值算法。
3.算法的特点:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性。 4.算法描述方法:自然语言、流程图、改进流程图、N—S流程图、伪代码、计算机语言。 5.C语句的类型:控制语句、函数调用语句、表达式语句、空语句、复合语句。 6.输入输出的概念:输入输出是相对主机而言,C语言是由函数来实现输入输出的。 7.字符数据的输入/输出:getchar()、putchar() 8.格式输入/输出:scanf()、printf()
9.printf的格式符:d、i,o,x、X,u,c,s,f,e、E,g、G;l,m,n,-。
10.scanf的格式符:d、i,o,x、X,u,c,s,f,e、E,g、G;l,m,*;&。注意输入数据时数据流的分隔符,系统默认的分隔符为空格、tab键和回车。
11.顺序结构的设计思想:定义(声明)变量、输入数据、处理数据、输出结果。 【要点归纳】 1、 C 语言语句
一个 C 程序应包括数据描述(由数据声明部分来实现)和数据操作(由执 行语句来实现)两部分。 C 语句分为以下五类: z 控制语句( 9 种) z 函数调用语句 z 表达式语句 z 空语句 z 复合语句 2、数据输出
在 C 语言中可以使用 printf( )、 putchart( )、 puts( )等函数进行数据输出。 注:在 printf ()语句中,是从右向左计算输出表达式的值。 3、数据输入
在 C 语言中可以使用 scanf( )、 getchar( )、 gets( )等函数进行数据输入。 注:⑴scanf()函数中没有精度控制。
⑵gets(str);与 scanf(“%s”,str);的差别是:使用 gets()函数输入的字符串可以含有空格,而 scanf(“%s”,str);不能输入含空格字符的字符串。
二.练习
㈠.填空题:
1.以下程序段执行后的输出结果是:⑴ ⑵ ⑶ 。
int i=-200,j=2500; printf(“⑴ %d %d”,i,j); printf(“⑵ i=%d,j=%d\\n”,i,j);
第 8 页 共 43 页
C程序设计复习 printf(“⑶ i=%d\\n j=%d\\n”,i,j);
2.复合语句在语法上被认为是 一条词句 。空语句的形式是 ; 。 3.C语句的最后用 ; 结束。
4.以下程序段的输出结果是 。
int x=0177;printf(“x=m,x=%6o,x=%6x,x=%6u\\n”,x,,x,x,x); 5.以下程序段的输出结果是 。
double a=513.789215; printf(“a=%8.6f,a=%8.2f,a=.8f,a=.8lf\\n”,a,a,a,a); 6.以下程序段的输出结果是 。
a=3+5,a*4;x=11/3;printf(“%d,%%d\\n”,a,x);
7.以下程序输入三个整数值给a、b、c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a、b、c的值。请填空:
#include
{ int a,b,c, ; printf(“Enter a,b,c:”); scanf(“%d,%d,%d”, ); ;a=b;b=c; ; printf(“a=%d,b=%d,c=%d\\n”,a,b,c);}
8.以下程序不借助任何变量把a、b中的值进行交换。请填空:
#include
㈡.选择题:
1.若a、b、c、d都是int型变量且初始值为0,下列不正确的赋值语句是( C )。 A.a=b=c=100; B.d++; C.c+b; D.d=(c=22)-(b++); 2.以下选项中不是C语句的是(C )。 A.{int i;i++;printf(“%d\\n”,i);} B.; C.a=5,c=10 D.{ ;} 3.以下合法的C语言赋值语句是( B D )。 A.a=b=58 B.k=int(a+b); C.a=58,b=58 D.--i; 4.以下程序的输出结果是( C )。
A.0 B.1 C.3 D.不确定的值
main()
{ int x=10,y=3; printf(“%d\\n”,y=x/y);}
第 9 页 共 43 页
C程序设计复习 5.若变量已正确说明为int类型,要给a、b、c输入数据,正确的输入语句是(D )。 A.read(a,b,c); B.scanf(“%d%d%d”,a,b,c); C.scanf(“%D%D%D”,&a,&b,&c); D.scanf(“%d%d%d”,&a,&b,&c); 6.若变量已正确定义,要将a和b中的数进行交换,下面不正确的语句组是( C )。 A.a=a+b,b=a-b,a=a-b; B.t=a,a=b,b=t; C.a=t;t=b;b=a; D.t=b;b=a;a=t;
7.若变量已正确定义,以下程序段的输出结果是(D )。 A.输出格式说明与输出项不匹配,输出无定值 B.5.1700 C.5.16800 D.5.16900
x=5.16894;printf(“%f\\n”,(int)(x*1000+0.5)/(float)1000); 8.执行以下程序段后,c3中的值是( A )。
A.0 B.1/2 C.0.5 D.1
int c1=1,c2=2,c3;c3=c1/c2; 9.执行以下程序段后,其输出结果是( B )。
A.0,0,-10 B.0,0,5 C.-10,3,-10 D.3,3,-10
int a=0,b=0,c=0; c=(a-=a-5),(a=b,b+3); printf(“%d,%d,%d\\n”,a,b,c); 10.以下程序的输出结果是( A )。
A.a=%2,b=%5 B.a=2,b=5 C.a=%%d,b=%%d D.a=%d,b=%d
main()
{ int a=2,b=5; printf(“a=%%d,b=%%d\\n”,a,b);} 11.若int型占两个字节,以下程序段的输出是( D )。
A.-1,-1 B.-1,32767 C.-1,32768 D.-1,65535
int a=-1;printf(“%d,%u\\n”,a,a); 12.以下程序段的输出结果是(C )。
A.|3.1415| B.| 3.0| C.| 3| D.| 3.|
float a=3.1415;printf(“|%6.0f|\\n”,a); 13.以下程序段的输出结果是( B )。
A.9 8 B.8 9 C.6 6 D.以上三个都不对
#include
{ double a=-3.0,b=2; printf(“%3.0f %3.0f\\n”,pow(b,fabs(a)),pow(fabs(a),b));} 14.若a为整型变量,则以下语句( B )。
A.赋值不合法 B.输出值为-2 C.输出为不确定值 D.输出值为2
a=-2L;printf(“%d\\n”,a); 15.若有定义char s=‘\\092’;则该语句( B )。
A.使s的值包含1个字符 B.定义不合法,s的值不确定 C.使s的值包含4个字符 D.使s的值包含3个字符
第 10 页 共 43 页
C程序设计复习 16.若k、g均为int型变量,则下列语句的输出为( D )。 A.15 B.16 C.15 D.16 6f 70 71 6f
k=017;g=111;printf(“%d\\n”,++k);printf(“%x\\n”,g++); 17.已知字母a的ASCII十进制代码为97,执行下列语句后的输出为(C )。 A.b,c B.a--运算不合法,故有语法错误
C.98,c D.格式描述和输出项不匹配,输出无定值
char a=‘a’;a--;printf(“%d,%c\\n”,a+‘2’-‘0’,a+‘3’-‘0’); 18.下列程序的输出为( A )。
A.27.000000 B.27.500000 C.28.000000 D.28.500000
#include
{ int m=7,n=4; float a=38.4,b=6.4,x; x=m/2+n*a/b+1/2;printf(“%f\\n”,x); } 19.下列程序的输出结果是( C )。
A.18 B.9 C.-18 D.-9
main() { int a=9;a+=a-=a+a;printf(“%d\\n”,a); } 20.下列程序的输出结果是( A )。
A.0 B.5 C.1 D.不确定值
main() { int a=7,b=5;printf(“%d\\n”,b=b/a);} 21.下列程序的输出结果是( C )。
A.12 B.11 C.10 D.9
main() { int a=011;printf(“%d\\n”,++a);}
㈢.程序设计题:
1.编写程序,输入两个整数1500和350,求出它们的商和余数并进行输出。
2.编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。
3.输入一个华氏温度,要求输出摄氏温度。公式为:c=5(f-32)/9。
第四章 选择结构程序设计
一.知识点
第 11 页 共 43 页
C程序设计复习 1.关系运算符、逻辑运算符、逻辑值的表示与含义;注意&&、||的运算规则。 2.三种if语句
3.选择结构的嵌套,注意if与else的配对; 4.条件运算符:?:
5.switch语句,注意其执行过程; 6.选择结构程序设计思想。 【要点归纳】 1、 if 语句
if 语句有三种使用形式 ⑴单分支 if 语句。 if(条件) 语句; ⑵双分支 if 语句。 if(条件) 语句 1; else 语句 2;
⑶多分支 if 语句。 if(〈条件 1〉) 语句 1; else if(〈条件 2〉)语句 2; …
else if (〈条件 n〉)语句 n; else 语句 n+1;
2、 switch(开关)语句
switch 语句用于方便地从多个语句中选择一个或多个语句执行。 switch( 〈表达式〉) {
case 常量表达式 1: 语句 1; case 常量表达式 2: 语句 2; …
case 常量表达式 n: 语句 n; default: 语句 n+1; }
注:表达式的值一定是整型值,若为其他类型,最后都要转换为整型数。
二.练习
㈠.填空题:
1.C语言中用 1 表示逻辑值“真”,用 0 表示逻辑值“假”。
2.C语言中的关系运算符按优先级别是 、 、 、 、 、 。 3.C语言中的逻辑运算符按优先级别是 、 、 。
4.C语言中的关系运算符和逻辑运算符的优先级别是 、 、 、 、 、 、 、 、 、 、 、 。
5.C语言中逻辑运算符的 ! 优先级高于算术运算符。
第 12 页 共 43 页
C程序设计复习 6.将下列数学式改写成C语言的关系表达式或逻辑表达式:
a=b或a
main()
{ int a=100;
if(a>100) printf(“%d\\n”,a>100); else printf(“%d\\n”,a<=100);} 8.若已知a=10、b=15、c=1、d=2、e=0,请分别给出下列表达式的运算结果:
⑴ a*b && c 1 ⑵ a+b>10 || a+b<0 1 ⑶ e 0 ⑷ c==b>e 1 ⑸ !a ⑽ (b==10) && (a==10) 0 ⑾ !0 || d && a==c+d 0 ⑿ (a+c==b)==(b+d==a) || (c=b+a)>(d=c+b) 1 9.当a=1、b=2、c=3时,执行以下if语句后,a= 3 、b= 2 、c= 2 。 if(a>c);b=a;a=c;c=b; 10.当a=1、b=2、c=3时,执行以下if语句后,a= 、b= 、c= 。 if(a>c)b=a;a=c;c=b; 11.当a=1、b=2、c=3时,执行以下if语句后,a= 、b= 、c= 。 if(a>c)b=a,a=c;c=b; 12.将以下两条if语句合并为一条if语句: 。 if(a>b) scanf(“%d”,&x);else scanf(“%d”,&y); if(a<=b) i++;else j++; 13.将以下嵌套的if语句改写成不嵌套的if语句: 。 if(w<0) k=0;else if(w<=100) k=1; else k=0; 14.以下程序判断输入的一个整数是否能被3或7整除,若能整除,输出“YES”,若不能整除,输出“NO”。请填空: #include ㈡.选择题: 1.若给定条件表达式(M)?(a++):(a--),则和表达式M等价的表达式为( B )。 A.M==0 B.M==1 C.M!=0 D.M!=1 2.为表示关系x≥y≥z,应使用的C语言表达式是( A )。 A.(x>=y) && (y>=z) B.(x>=y)AND(y>=z) C.(x>=y>=z) D.(x>=y)&(y>=z) 3.以下程序的输出结果是( A )。 A.0 B.1 C.2 D.3 第 13 页 共 43 页 C程序设计复习 main() { int a=2,b=-1,c=2; if(a if(b<0) c=0; else c+=1; printf(“%d\\n”,c); } 4.以下程序的输出结果是( A )。 A.1 B.2 C.3 D.4 main() { int w=4,x=3,y=2,z=1;printf(“%d\\n”,(w main() { int a,b,s;scanf(“%d %d”,&a,&b); s=a; if(a 6.在C语言中,if语句后的一对圆括号中,用以决定分支的流程的表达式( D )。 A.只能用逻辑表达式 B.只能用关系表达式 C.只能用逻辑表达式或关系表达式 D.可用任意表达式 7.下列程序段运行后,x的值是( D )。 A.14 B.4 C.15 D.3 ok1=1;ok2=2;ok3=3;x=15; if(!ok1) x--;else if(ok2) if(ok3)x=3;else x=4; 8.在C语言中,switch语句后一对圆括号中exp的类型(DC )。 A.可以是任何类型 B.只能为int型 C.可以是整型或字符型 D.只能是整型或实型 9.以下各组运算符中,优先级最高的分别为( B C C D )。 ⑴A.?: B.++ C.&& D.+= ⑵A.*= B.>= C.(类型) D., ⑶A.|| B.% C.! D.== ⑷A.= B.!= C.*(乘) D.( ) 10.若a为整型变量,b为字符型变量,则以下正确的switch语句是( A )。 A.switch((int)x/10) B.switch(b) { case 1:a++;break; { case ‘\\042’;x=a/b;break; case 2:b++;break; case ‘6’;x=a*b;break; case 3:c++;break; case ‘\\010’;x=a+c;break; } } C.switch((int)x/10); D.switch(a/100+10) { case 0:a++;break; { case2 :x=a/b;break; 第 14 页 共 43 页 C程序设计复习 default:b++;break; case6 :x=a*b;break; case 3+1:c++;break; case8 :x=a+c;break; case 3:d++;break; case10 :x=a-c;break; } } ㈢.程序设计题: 1.从键盘输入一个字母,若是大写字母,要求改用小写字母输出。 22 2.求ax+bx+c=0的根。a、b、c由键盘输入,设b-4ac>=0. 第五章 循环结构程序设计 一.知识点 1.循环的概念,C实现循环的方法; 2.goto语句,注意标号的书写; 3.while语句,注意条件表达式的设计; 第 15 页 共 43 页 C程序设计复习 4.do??while语句,注意条件表达式的设计,及while之后的分号; 5.for语句,注意for中三个表达式的一般含义; 6.循环的嵌套; 7.break与continue语句,注意二者之间的区别; 8.循环结构程序设计思想 【要点归纳】 1、 while 循环语句 while(条件)语句; 注:先判断条件,后执行语句; 2、 do-while 循环语句 do 语句; while(条件); 注:先执行一次循环体,再判断条件。 While 和 do-while 语句的差别是,后者至少执行“语句”一次,而前者有时一次也不执行语句。 3、 for 循环语句 for(表达式 1;表达式 2;表达式 3) 语句; 注:省略各个表达式时,应能够知道其意义。 ⑴“表达式 1”可以省略,此时应在该语句之前给循环变量赋初值。其后的分号不能省略。 ⑵“表达式 2”可以省略,即无判定条件,循环无终止进行下去。需要在循环体中用 break 等语句退出循环。 ⑶“表达式 3”可以省略,这样需要在循环体“语句”中让循环变量变化,以保证循环能正常结束。 ⑷“表达式 1”和“表达式 3”可以同时省略,这样为⑴和⑶两种情况同时出现,需要使用相关语句保证循环结束。 ⑸三个表达式都可省略,这样为⑵和⑷两种情况同时出现,需要使用相关语句保证循环结束。 #include 4、 break 语句 break 语句的使用格式很简单,由关键字 break 和分号构成,其功能如下: z 在 switch 语句中,break 用来使程序流程跳出 switch 语句,继续执行 switch后的语句; z在循环语句中, break 用来从最近的循环体内跳出来。 5、 continue 语句 continue 语句只能用于循环语句中,作用为结束本次循环,即跳过循环体中尚末执行的语句,接着进行是否执行下一次循环的判定。 二.练习 ㈠.填空题: 1.以下程序段的输出结果 7 18 。 x=y=0;while(x<20)y++,x+=3; 第 16 页 共 43 页 C程序设计复习 printf(“y=%d,x=%d\\n”,y,x); 2.当执行以下程序段后,i的值是 5 、j的值是 4 、k的值是 5 。 int a,b,c,d,i,j,k;a=10;b=c=d=5;i=j=k=0; for( ;a>b;++b)i++; while(a>++c) j++; do k++;while(a>d++); 3.以下程序段的输出结果 。 int k,m,n;n=10;m=1;k=1; while(k<=n) m*=2; printf(“%d\\n”,m); 4.以下程序的输出结果 -1 。 main() { int x=2;while(x--);printf(“%d\\n”,x);} 5.以下程序段的输出结果 10 。 int i=0,sum=1;do{ sum+=i++;}while(i<5);printf(“%d\\n”,sum); 6.有以下程序段: s=1.0;for(k=1;k<=n;k++)s=s+1.0/(k*(k+1));printf(“%f\\n”,s); 要使下面的程序段的功能与上面程序段的功能相同,请填空: s=0.0;k=0; d=1.0 ; do{ s=s+d; k++ ;d=1.0/(k*(k+1));}while( k<=n ); printf(“%f\\n”,s); 7.以下程序的功能是:从键盘上输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请填空: main() { float x,amax,amin; scanf(“%f”,&x);amax=x;amin=x; while( x<0 ) { if(x>amax)amax=x; if( x a=10;y=0; do { a+=2;y+=a; printf(“a=%d,y=%d\\n”,a,y); if(y>50)break;}while(a=14); 9.下列程序段中,for循环的循环次数为 4 。 a=2;b=10;for(i=b;i<=a;i--,a++) printf(“=”,i); 10.以下程序段的输出结果 。 for(i=0;i<3;i++,i++) 第 17 页 共 43 页 C程序设计复习 { for(j=10;j>0;j--) { if((j+i)%2){ j--;printf(“*%d ”,j);continue;} --j;--j;printf(“%d ”,j);} printf(“\\n”);} ㈡.选择题: 1.以下程序段的输出结果是( D )。 A.9 B.1 C.11 D.10 int k,j,s; for(k=2;k<6;k++,k++){ s=1;for(j=k;j<6;j++) s+=j;} 2.以下程序段的输出结果是( C )。 A.12 B.15 C.20 D.25 int i,j,m=0; for(i=1;i<=15;i+=4) for(j=3;j〈=19;j+=4〉m++; printf(“%d\\n”,m); 3.以下程序段的输出结果是(B )。 A.10 B.9 C.10 D.9 9 8 9 8 8 7 8 7 7 6 int n=10;while(n>7){ n--;printf(“%d\\n”,n);} 4.以下程序段的输出结果是( C )。 A.1 B.3 0 C.1 -2 D.死循环 int x=3;do { printf(“=”,x-=2);}while(!(--x)); 5.以下程序的输出结果是(C )。 A.15 B.14 C.不确定 D.0 main() { int i,sum;for(i=1;i<6;i++)sum+=sum;printf(“%d\\n”,sum);} 6.以下程序的输出结果是( B )。 A.741 B.852 C.963 D.875421 main(){ int y=10; for( ;y>0;y--)if(y%3==0){ printf(“%d”,--y);continue;} } 7.若x是int型变量,以下程序段的输出结果是( D )。 A.**3 B.##3 C.##3 D.**3##4 ##4 **4 **4##5 **5 **5 ##5 for(x=3;x<6;x++)printf((x%2)?(“**%d”) :(“##%d\\n”),x); 8.以下程序的输出结果是( C )。 第 18 页 共 43 页 C程序设计复习 A.*#*#*#$ B.#*#*#*$ C.*#*#$ D.#*#*$ main() { int i; for(i=1;i<=5;i++) { if(i%2)printf(“*”);else continue; printf(“#”);} printf(“$\\n”); } 9.以下叙述正确的是( D )。 A.do_while语句构成的循环不能用其它语句构成的循环来代替。 B.do_while语句构成的循环只能用break语句退出。 C.用do_while语句构成循环时,只有在while后的表达式为非零时结束循环。 D.用do_while语句构成循环时,只有在while后的表达式为零时结束循环。 10.以下程序的输出结果是( B )。 A.39 81 B.42 84 C.26 68 D.28 70 main() { int x,i; for(i=1;i<=100;i++) { x=i;if(++x%2==0)if(++x%3==0)if(++x%7==0)printf(“%d ”,x);} printf(“\\n”); } 11.对下面程序段描述正确的是( C )。 A.while循环执行了10次 B.循环是无限循环 C.循环体语句一次也不执行 D.循环体语句只执行一次 int x=10;while(x=0)x=x-1; 12.以下关于for循环的正确描述是( D )。 A.for循环只能用于循环次数已确定的情况 B.for循环是先执行循环体语句,后判断表达式 C.在for循环中,不能用break语句跳出循环体 D.for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来 13.下列程序段中是死循环的是( C)。 A.int n=1;while(!n)n++; B.int n=1;do { n--;}while(n); C.int n=1;do { n++;}while(n); D.for(n=5;n<1;); 14.以下能正确计算1╳2╳3╳?╳10的程序段是( C )。 A.do { k=1;n=1;n=n*k;k++;}while(k<=10); B.do { k=1;n=0;n=n*k;k++;}while(k<=10); C.k=1;n=1;do { n=n*k;k++;}while(k<=10); D.k=1;n=0;do { n=n*k;k++;}while(k<=10); ㈢.程序设计题: 1.编写程序,求1-3+5-7+?-99+101的值。 第 19 页 共 43 页 C程序设计复习 2.求1+2+3+?+100的值。 3.把100~200之间的不能被3整除的数输出。 4.求Fibonacci数列前40个数。 5.打印100以内的所有素数。 第六章 函数 一.知识点 1.函数定义的一般形式:函数类型 函数名(形参类型 形参名,??) { 函数体 } 2.函数的参数:注意形参与实参在类型、个数上的一一对应关系。 3.函数值:函数的返回值,也就是函数类型,若函数无返回值,则为void; 4.函数的调用:注意调用的形式; 5.函数原型与对被调函数的声明,注意整型函数可以不用声明; 6.函数的嵌套调用: 7.函数的递归调用,要求能用递归编写求n!、1+2+??+n等问题的程序。 第 20 页 共 43 页 C程序设计复习 8.数组作为函数参数,注意其含义及使用的情况; 9.变量的存储类型,注意static类型的初值、值的变化,外部变量的使用等; 10.内部函数和外部函数:注意其区别。 【要点归纳】 1、函数定义 函数定义的格式有两种,即传统格式和现代格式。 z 传统的函数定义的一般格式如下: 存储类别 数据类型 函数名(形参表) 形参说明语句序列; { 说明语句序列; 可执行语句序列; } z 现代的函数定义的一般格式如下: 存储类别 数据类型 函数名(形参说明表) { 说明语句序列; 可执行语句序列; } 2、函数调用 C 语言中函数调用的一般格式如下: 函数名(实参表) 注:在调用函数时,实参与形参的个数必须相等,对应类型应一致,实参与形参按对应顺序一一传递数据。 3、被调函数说明 在程序中调用一个函数时,需要说明该函数的数据类型,这称为函数说明。 函数说明在程序的数据说明部分。 传统的函数说明格式如下: 数据类型 函数名(); 现代的函数说明格式如下: 数据类型 函数名(形参说明表); 或 数据类型 函数名(形参数据类型表); 4、函数的存储类别 在 C 语言中,函数可分为 static 型和 extern 型两种。 z extern 型函数 在定义一个函数时,若指定函数的存储类别为 extern 关键字,则称该函数为“外部”函数,其基本特征是:该函数可以被其他编译单位中的函数调用。 z static 型函数 在定义一个函数时,若指定函数的存储类别为 static 关键字,则称该函数为“静态”函数,其基本特征是:只限于本编译单位中的其他函数调用它,而不允许其他编译单位中的函数调用它。 5、函数参数的计算顺序 在 Turbo C 中,函数参数的计算顺序是从右向左进行的。 第 21 页 共 43 页 C程序设计复习 6、变量的作用域 从作用域的角度看, C 语言的变量分为局部变量和全局变量。 z 局部变量 在函数内部或复合语句内定义的变量称为局部变量,也称为内部变量。函数的形式参数也属于局部变量。 z 全局变量 在函数外部定义的变量称为全局变量。全局变量的作用域是从该变量定义的位置开始,到整个源文件结束止。 7、变量的存储类别 ⑴局部变量的存储类别 z auto 局部变量 z register 局部变量 z static 局部变量 ⑵全局变量的存储类别 z static 全局变量 z extern 全局变量 二.练习 ㈠.填空题: 1.以下程序的输出结果是 12 。 unsigned fun6(unsigned num) { unsigned k=1; do { k*=num;num/=10;}while(num); return k;} main() { unsigned n=26; printf(“%d\\n”,fun6(n)); } 2.以下程序的输出结果是 9.0 。 double sub(double x,double y,double z) { y-=1.0;z=z+x;return z;} main() { double a=2.5,b=9.0; printf(“%f\\n”,sub(b-a,a,a));} 3.以下程序的输出结果是 4 。 fun1(int a,int b) { int c; a+=a;b+=b;c=fun2(a,b); return c*c;} fun2(int a,int b) { int c; c=a*b%3;return c;} 第 22 页 共 43 页 C程序设计复习 main() { int x=11,y=19; printf(“%d\\n”,fun1(x,y));} 4.下面pi函数的功能是,根据以下公式返回满足精度ε要求的π的值。请填空。 double pi(double eps) { double s=0.0,t=1.0;int n; for( n=1 ;t>eps;n++) { s+=t;t=n*t/(2*n+1); return (2.0* s );} 5.以下函数是求x的y次方。请填空。 double fun(double x,int y) { int i;double z=1; for(i=1;i <=y ;i++) z= z*x ;return z;} 6.以下程序的功能是计算s=1!+2!+??+n!请填空。 long f(int n) { int i;long s; s= 1 ;for(i=1;i<=n;i++) s= s*i ; return s;} main() { long s;int k,n; scanf(“%d”,&n);s= 0 ; for(k=1;k<=n;k++) s=s+ f(k) ; printf(“%d\\n”,s);} 7.在定义一个函数时如果不加类型说明,则它隐含的类型为 int 。 8.下列程序的运行结果是a= 4 4 ,b= 5 6 f( ) { int a=3; static b=4; a=a+1; b=b+1; printf(“a=%d,b=%d\\n”,a,b);} main( ) { f( ); f( );} 9.下列程序的运行结果是 i=7;j=6;x=7 i=2;j=7;x=5 main( ) {int i=2,x=5,j=7; fun(j,6 ); printf(“i=%d;j=%d;x=%d\\n”,i,j,x);} fun( int i, int j) { int x=7; printf(“i=%d;j=%d;x=%d\\n”,i,j,x);} 10.下列程序的运行结果是 # x=2 y=3 z=0 第 23 页 共 43 页 C程序设计复习 * x=4 y=9 z=5 @ x=2 y=3 z=0 main( ) { int x=2; y=3; z=0; printf(“# x=%d y=%d z=%d\\n”, x, y, z); add(x, y, z); printf(“@ x=%d y=%d z=%d\\n”, x, y, z);} add( int x, int y, int z) { z=x+y; x=x*x;; y=y*y; printf(“* x=%d y=%d z=%d\\n”, x, y, z);} ㈡.选择题: 1.以下说法中正确的是( C )。 A.C语言程序总是从第一个定义的函数开始执行 B.在C语言程序中,要调用的函数必须在main函数中定义 C.C语言程序总是从main函数开始执行 D.C语言程序中的main函数必须放在程序的开始部分 2.以下函数的类型是( C )。 A.与参数x的类型相同 B.void类型 C.int类型fff(float x) { printf(“%d\\n”,x*x);} 3.以下函数调用语句中,含有的实参个数是( B )。 A.1 B.2 C.4 D.5 func((exp1,exp2),(exp3,exp4,exp5)); 4.以下程序的输出结果是( C )。 A.11 B.20 C.21 D.31 func(int a,int b) { int c;c=a+b;return c;} main() { int x=6,y=7,z=8,r; r=func((x--,y++,x+y),z--); printf(“%d\\n”,r);} 5.以下程序的输出结果是( A )。 A.-1 B.0 C.1 D.2 main() { int i=2,p; p=f(i,i+1); printf(“%d\\n”,p);} int f(int a,int b) { int c;c=a; 第 24 页 共 43 页 .无法确定 D C程序设计复习 if(a>b) c=1;else if(a==b) c=0;else c=-1; return (c);} 6.以下程序输出的结果是( D )。 A.0 B.1 C.6 D.无定值 fun(int a,int b,int c) { c=a*b;} main() { int c; fun(2,3,c);printf(“%d\\n”,c);} 7.以下程序输出的结果是( A )。 A.5.500000 B.3.000000 C.4.000000 D.8.25 double f(int n) { int i;double s; s=1.0;for(i=1;i<=n;i++) s+=1.0/i;return s;} main() { int i,m=3;float a=0.0; for(i=0;i A.函数不能嵌套定义,但可以嵌套调用 B.main函数由用户定义,并可以被调用 C.程序的整个运行最后在main函数中结束 D.在C语言中以源文件而不是以函数为单位进行编译 9.以下概念正确的是( B ) A.形参是虚设的,所以它始终不占用存储单位 B.实参与它所对应的形参占用不同的存储单元 C.实参与它所对应的形参占用一个存储单元 D.实参与它所对应的形参同名时可占用一个存储单元 10.以下不正确的说法是 C A.在C语言中允许函数递归调用 B.函数值类型与返回值类型出现矛盾时,以函数值类型为准 C.形参可以是常量、变量或表达式 D.C语言规定,实参变量对形参变量的数据传递是“值传递” 11.以下正确的函数首部是 B A.float swap(int x,y) B.int max(int a,int b) C.char scmp(char c1,char c2); D.double sum(float x;float y) 12.在函数中未指定存储类别的变量,其隐含存储类别为( B) 第 25 页 共 43 页 C程序设计复习 A.静态 B.自动 C.外部 D.存储器 13.在一个文件中定义的全局变量的作用域为 D A.本程序的全部范围 B.离定义该变量的位置最近的函数 C.函数内全部范围 D.从定义该变量的位置开始到本文件结束 14.以下函数的返回值类型是(A ) fun(int x) {printf(“%d\\n”,x);} A.void类型 B.int类型 C.没有 D.不确定的 15.在一个函数中的复合语句中定义了一个变量,则该变量的有效范围是(A ) A.在该复合语句内 B.在该函数中 C.本程序范围内 D.非法变量 16.若用数组名作为函数调用的实参,传递给形参的是(A ) A.数组的首地址 B.数组第一个元素的值 C.数组中全部元素的值 D.数组元素的个数 ㈢.程序设计题: 1.用递归法求n!。 2.用递归法求1+2+??+n。 第七章 数组 一.知识点 1.数组的概念与定义 2.数组的初始化 3.数组元素的引用 4.字符数组的定义、使用、字符串处理函数 5.数组数据的一般处理方式 【要点归纳】 1、一维数组 任何数组在使用之前必须先说明,即指定数组名称,大小和元素类型。一旦说明了一个数组,系统就会为它在内存中分配一个所申请大小的存储空间 ( sizeof(类型)*长度)。 ⑴一维数组的说明 第 26 页 共 43 页 C程序设计复习 类型说明符 数组名[常量表达式]; 说明:①数组名是一个地址常量,不允许对其值进行修改。 ②“常量表达式”表示该数组拥有多少个元素,即数组的大小,它必须是正数数。 ⑵一维数组元素的引用 数组名[下标] 说明:下标是某个数组元素到数组开始元素的位置偏移量;数组下标从 0开始。 ⑶一维数组的初始化 z 对数组的全部元素赋初始值; z 对数组的部分元素赋初始值; z 在对数组的全部元素赋初值时,也可以将数组定义为一个不确定长度的数组(形式上的不确定)。 2、二维数组 ⑴二维数组的说明 类型说明符 数组名[常量表达式 1][常量表达式 2]; 注:①二维数组中元素的顺序是:按行优先存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素,依此类推。 ②二维数组可看成是一个特殊的一维数组,它的元素又是一维数组。 ⑵二维数组元素的引用 数组名[下标 1][下标 2] 例: int A[M][N] 其元素 A[i][j] 排在第 i*N+j+1 个存储位置上。 ⑶二维数组的初始化 z 分行给二维数组赋初始值; z 按数组存储的排列顺序赋初始值; z 允许省略第一维长度说明来给二维数组赋初始值。 3、字符数组 字符数组是用来存放若干个字符的数组,其定义和引用方式与其它数组相同。 4、字符串数组 字符串数组的每个元素又都是一个字符串。字符串数组是二维数组。 5、字符串处理函数 ⑴puts(字符数组) ⑵gets(字符数组) ⑶strcat(字符数组 1,字符数组 2) ⑷strcpy(字符数组 1,字符数组 2) ⑸strcmp(字符串 1,字符串 2) ⑹strlen(字符串) ⑺strlwr(字符串) ⑻strupr(字符串) 第 27 页 共 43 页 C程序设计复习 二.练习 ㈠.填空题: 1.若有定义:double w[10];则w数组元素下标的上限是 9 ,下限是 0 。 2.以下程序的输出结果是 12 。 main() { int arr[10],i,k=0; for(i=0;i<10;i++) arr[i]=i; for(i=0;i<4;i++) k+=arr[i]+i; printf(“%d\\n”,k); } 3.以下程序的输出结果是 -850 2 0 。 main() { int i,j,row,col,m; int arr[3][3]={{100,200,300},{28,72,-30},{-850,2,6}}; m=arr[0][0]; for(i=0;i<3;i++) for(j=0;j<3;j++) if(arr[i][j] 4.在C语言中,二维数组元素在内存中的存放顺序是 按行存放 。 5.若二维数组a有m列,则计算任一元素a[i][j]在数组中相对位置的公式为 (i+1)*(j+1)/m,j 。 6.若有定义:int a[3][4]={{1,2},{0},{4,6,8,10}};则初始化后,a[1][2]得到的初值是 0 ,a[2][1]得到的初值是 6 。 7.若有说明char s[20];如果想从键盘上把字符串“This is a book.”输入到数组s中,应当调用的函数是 gets ;函数调用语句的形式是 s=gets(); 。 8.若有char str1[20]={“a good”},str2[ ]={“ student”};能把str2中的字符串接到str1中的字符串后面的函数调用语句是 strcat(str1,str2) 。 9.以下findmax函数返回数组s中最大元素的下标,数组中元素的个数由t传入,请填空。 findmax(int s[ ],int t) { int k,p; for(p=0,k=p;p if(s[p]>s[k]) s[k]=s[p] ; return s[k] ; } 10.以下程序统计从终端输入的字符中每个大写字母的个数,num[0]中统计字母A的个数,其它依次类推。用#号结束输入,请填空。 #include “stdio.h” #include “ctype.h” main() { int num[26]={0},i; char c; while( ( c=getchar() ) !=‘#’) 第 28 页 共 43 页 C程序设计复习 if(isupper(c)) num[ c-‘A’ ]+=1; for(i=0;i<26;i++) if(num[i]) printf(“%c: %d\\n”,i+‘A’,num[i]); } ㈡.选择题: 1.以下程序的输出结果是( B )。 A.不确定的值 B.3 C.2 D.1 main() { int n[2]={0},i,j,k=2; for(i=0;i for(j=0;j 2.以下对一维数组a的正确说明是( D )。 A.char a(10); B.int a[ ]; C.int k=5,a[k]; D.char a[ ]={‘a’,‘b’,‘c’}; 3.若有说明语句:int a[2][4];则对a数组元素的正确引用是( A )。 A.a[0]3] B.a[0][4] C.a[2][2] D.a[2][2+1] 4.以下能对二维数组y进行正确初始化的语句是( D )。 A.int y[2][ ]={{ 1,0,1 },{ 5,2,3 }}; B.int y[ ][3]={{1,2,3},{4,5,6}}; C.int y[2][4]={1,2,3},{4,5},{6}; D.int y[ ][3]={{1,0,1,0},{ },{1,1}}; 5.若有说明语句:int y[ ][4]={0,0};则下面不正确的叙述是( C )。 A.数组y的每个元素都可以得到初值0; B.二维数组y的行数为1; C.该说明等价于int y[ ][4]={0}; D.只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值0; 6.若有说明语句:int a[ ][3]={1,2,3,4,5,6,7,8};则a数组的行数为( 3 )。 A.3 B.2 C.无确定值 D.1 7.若二维数组y有m列,则在y[i][j]前的元素个数为( C )。 A.j*m+i B.i*m+j C.i*m+j-1 D.i*m+j+1 8.若有以下语句,则正确的描述是( B )。 char x[ ]=“12345”;char y[ ]={‘1’,‘2’,‘3’,‘4’,‘5’}; A.x数组与y数组的长度相同 B.x数组长度大于y数组长度 C.x数组长度小于y数组长度 D.x数组等价于y数组 9.下面程序段的运行结果是( B )。 A.‘a’‘b’ B.ab C.ab c D.abc char c[5]={‘a’,‘b’,‘\\0’,‘c’,‘\\0’};printf(“%s”,x); 10.有两个字符数组a、b,则以下能正确为a、b进行赋值的语句是( D )。 第 29 页 共 43 页 C程序设计复习 A.gets(a,b); B.scanf(“%s%s”,&a,&b); C.getchar(a);getchar(b); D.gets(a);gets(b); 11.有字符数组s1[80]和s2[80],则以下能正确对s1、s2进行输出的语句是( B )。 A.puts(s1,s2); B.printf(“%s,%s\\n”,s1,s2); C.putchar(s1,s2); D.puts(s1),puts(s2); 12.下面描述正确的是( D )。 A.两个字符串所包含的字符个数相同时,才能比较字符串; B.字符个数多的字符串比字符个数少的字符串大 C.字符串“STOP ”与“STOP”相等 D.字符串“That”小于字符串“The” 13.以下对字符数组的描述中错误的是( C )。 A.字符数组中可以存放字符串 B.字符数组中的字符串可以整体输入、输出 C.可以在赋值语句中通过赋值运算符“=”对字符数组整体赋值 D.不可以用关系运算符对字符数组中的字符串进行比较 14.语句printf(“%d\\n”,strlen(“school”));的输出结果是( B )。 A.7 B.6 C.存在语法错误 D.不定值 15.有语句char s1[10],s2[10]={“books”};则能将s2的值正确赋给s1的语句是( B )。 A.s1={“books”}; B.strcpy(s1,s2); C.s1=s2; D.strcpy(s2,s1); ㈢.程序设计题: 1.编写程序打印九九乘法表。 2.用随机函数产生20个100以内的整数,用选择法对它们排序。 3.用随机函数产生50个200以内的整数,用冒泡法对它们排序。 4.打印杨辉三角形的前10行。 5.有一篇文章,共有3行文字,每行有80个字符。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。 6.输入一行数字字符,请用数组元素作为计数器来统计每个字符的个数。用下标为0的元素统计字符“1”的个数,下标为1的元素统计字符“2”的个数,依次类推。 第 30 页 共 43 页 C程序设计复习 第八章 预处理命令 一.知识点 1.宏定义:注意带参宏定义 2.文件包含:注意两种书写方式的区别 二.练习 (1).选择题: 1.以下程序的输出结果是( B )。 A.15 B.100 C.10 D.150 #define MIN(x,y) (x)<(y)?(x):(y) main() { int i,j,k;i=10;j=15;k=10*MIN(i,j); printf(“%d\\n”,k);} 2.以下程序中的for循环执行的次数是( C )。 A.5 B.6 C.8 D.9 #define N 2 第 31 页 共 43 页 C程序设计复习 #define M N+1 #define NUM (M+1)*M/2 main() { int i;for(i=1;i<=NUM;i++); printf(“%d\\n”,i);} 3.以下程序的输出结果是( B )。 A.11 B.12 C.13 D.15 #include “stdio.h” #define FUDGF(y) 2.84+y #define PR(a) printf(“%d”,(int)(a)) #define PRINT1(a) PR(a);putchar(‘\\n’) main() { int x=2;PRINT1(FUDGF(5)*x); } 4.以下叙述正确的是( D )。 A.用#include包含的头文件的后缀不可以是“.a” B.若一些源程序中包含某个头文件;当该头文件有错时,只需对该头文件进行修改,包含此头文件所有源程序不必重新进行编译 C.宏命令可以看做是一行C语句 D.C编译中的预处理是在编译之前进行的。 5.以下有关宏替换的叙述不正确的是( D )。 A.宏替换不占用运行时间 B.宏名无类型 C.宏替换只是字符替换 D.宏名必须用大写字母表示 第 32 页 共 43 页 C程序设计复习 第九章 指针 一.知识点 1.指针的概念 2.指针变量 a[0] a[1] a[2] a[3] a[4] 3.指针与数组 4.指针与字符串 10 20 30 40 50 【要点归纳】 图8.1 1、指针变量 p ↑ 在 C 语言中允许用一个变量来存放指针,这种变量称为指针变量。 在 C 语言中,提供了两种指针运算符: z *:取指针目标运算符 z &:取地址运算符 2、指针的说明和初始化 指针说明的一般形式如下: 数据类型 *指针名; 说明:与普通变量不同的是,说明指针时指定的数据类型并不是指针变量本身的数据类型,而是其目标的数据类型。无论目标数据类型如何,所有指针都是具有相同格式的地址量,随着机器硬件不同,地址量的数据长度也不同。 第 33 页 共 43 页 C程序设计复习 指针初始化的一般形式如下: 数据类型 *指针名=初始地址值; 说明:指针初始化的过程是:系统按照给出的数据类型,在一定的存储区域为该指针分配存储空间,同时把初始值置入指针的存储空间内,从而该指针就指向了初始地址值所给定的内存空间。 3、指针运算 ⑴指针与整数的加减运算 C 语言的地址计算规定,一个地址量加上或减去一个整数 n,其计算结果仍然是一个地址量,它是以运算量为基点的前方或后方第 n 个数据的地址。 对于目标类型为 type 的指针 p, p+n 表示的实际位置的地址值是: p+n*sizeof(type)。 ⑵指针相减 在 C 语言中,两个地址量相减,并非它们的两个地址值之间直接做减法运算,两个指针相减的结果是整数,表示该两指针所指地址之间的数据个数。 ⑶指针的关系运算 目标类型相同的两个指针之间的关系运算,表示的是它们指向的地址位置之间的关系。 4、指针和一维数组 在C 语言中,指针与数组之间的关系十分密切,它们都可以处理内存中连续存放的一系列数据。数组与指针在访问内存时采用统一的地址计算方法。 C 语言中规定,数组名代表数组的首地址,也就是说,可以将数组名(即在内存中存放该数组的首地址)赋给指针。 注:以下四种关系等价 int a[10], *pa=a; a[i], *(a+i), pa[i], *(pa+i)。 5、字符指针和字符串 字符指针变量和字符数组的区别如下: ⑴字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,而不是将字符串放在字符指针变量中。 ⑵赋值方式,对字符数组,只能对各个元素赋值,但不能直接给字符数组进行整体赋值,而对于字符指针,既可以用字符串常量进行初始化,又可以直接用字符串常进行赋值。 ⑶在定义一个数组时,在编译时即已分配内存单元,有确定的地址,而定义 一个字符指针变量时,是给指针变量分配内存单元,并在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果末对它赋一个地址值,则它并末具体指向哪个字符数据。 C 语言编译系统提供了动态分配和释放存储单元的函数: z malloc(size) :在内存的动态存储区中分配一个长度为 size 的连续空间,此函数的返回值是一个指向分配域起始地址的指针。 z calloc(n, size):在内存的动态存储区中分配 n 个长度为 size 的连续空间,此函数的返回值是一个指向分配域起始地址的指针。 z free(ptr):释放由 ptr指向的内存区。 6、指针和二维数组 二维数组应区分开行,列指针的概念: 以下几种关系等价: int a[10][20]; a[3][2] , *(*(a+3)+2) , *(a[3]+2)。 7、指针数组 当一系列有次序的指针变量集合成数组时,就形成了指针数组。指针数组是指针的集合, 第 34 页 共 43 页 C程序设计复习 它的每个元素都是一个指针变量,并且指向相同的数据类型。 指针数组的说明形式如下: 数据类型 *指针数组名[元素个数]; 8、多级指针 指向指针的指针称为多级指针。 其说明形式如下: 数据类型 **指针名; 说明:当一个指针指向普通数据时,这样的指针称为一级指针,指向一级指针的指针称为二级指针。指向二级指针的指针称为三级指针,依此类推。 9、函数的数据传递方式 C 语言的参数传递均为单向的值传递,但值又分为普通数据和地址值两种。 ⑴数据复制方式传递数据 其特点是:由于数据在传递方和被传递方占用不同的内存空间,所以接收被 传递数据的变量在被调用函数中无论如何变化,都不会影响调用的函数中相应的实参值。 ⑵地址传递方式传递数据 地址传递方式传递数据时传递的不是数据本身,而是存储该数据的地址。 其特点是:由于数据无论是在调用的函数中还是被调用函数中都使用同一个 存储空间,所以被调用函数对该存储空间的值做出某种变动后,必然会影响到使 用该空间的调用函数中的变量的值。 ⑶return 传递数据 ⑷全局变量传递数据 9、指针型函数 当函数的返回值为某种类型的数据的地址时,称为指针型函数。 其定义和说明的一般格式如下: 数据类型 *函数名(形参说明表) 10、指向函数的指针 在 C 语言中,指针变更除了可以保存数据的存储地址外,还可以用于保存 函数的存储首地址。函数的存储首地址又称为函数的执行入口地址。指针变量保 存函数的入口地址时,它就指向了该函数,所以称这种指针为指向函数的指针, 简称为函数指针。 其说明形式如下:数据类型 ( *函数指针名)(); 二.练习 ㈠.填空题: 1.若有定义:char ch; ⑴使指针p可以指向变量ch的定义语句是 char *p 。 ⑵使指针p指向变量ch的赋值语句是 p=&ch 。 ⑶通过指针p给变量ch读入字符的scanf函数调用语句是 scanf(“%c”,p) 。 第 35 页 共 43 页 C程序设计复习 ⑷通过指针p给变量ch赋字符的语句是 *p=’a’ 。 ⑸通过指针p输出ch中字符的语句是 printf(“%c”,p) 。 2.若有如图8.1所示五个连续的int类型的存储单元并赋值,且p和s的基类型皆为int, p已指向存储单元a[1]。 ⑴通过指针p,给s赋值,使其指向最后一个存储单元a[4]的语句是 s=p+3 。 ⑵用以移动指针s,使之指向中间的存储单元a[2]的表达式是 s=s-2 。 ⑶已知k=2,指针s已指向中间的存储单元a[2],表达式*(s+k)的值是 5 。 ⑷指针s已指向存储单元a[2],不移动指针s,通过s引用存储单元a[3]的表达式是 *(s+1) 。 ⑸指针s指向存储单元a[2],p指向存储单元a[0],表达式s-p的值是 2 。 ⑹若p指向存储单元a[0],则以下语句的输出结果是 1 2 3 4 5 。 for(i=0;i<5;i++) printf(“%d ”,*(p+i));printf(“\\n”); ㈡.选择题: 1.若有定义:int x,*pb;则以下正确的赋值表达式是( A )。 A.pb=&x B.pb=x C.*pb=&x D.*pb=*x 2.以下程序的输出结果是( B )。 A.因变量无定义输出不定值 B.0 C.-1 D.1 #include “stdio.h” main() { printf(“%d\\n”,NULL);} 3.已知指针p的指向如图8.1所示,则表达式*++p的值是( B )。 A.20 B.30 C.21 D.31 4.已知指针p的指向如图8.1所示,则表达式++*p的值是( C)。 A.20 B.30 C.21 D.31 5.以下程序的输出结果是( D )。 A.23 B.24 C.25 D.26 void prtv(int *x) { printf(“%d\\n”,++*x); } main() { int a=25;prtv(&a);} 6.指针变量a所指的字符串长度为(D ) A.26 B.27 C.28 D.23 char *a=”\\nMy Name is Zhang Li.\\”\\n”; 7.在C语言中,变量的指针是指该变量的(C ) A.值 B.名 C. 地址 D.一个标志 8.下面程序段的运行结果是(C ) A.cde B.无确定的输出结果 C.字符’c’的ASCII码值 D.存放字符’c’的存储单元的地址 第 36 页 共 43 页 C程序设计复习 char *s=”abcde”; s+=2; printf(“%d”,s); 9.若有定义:int *p[4];则标识符p(B ) A.是一个指向整型变量的指针 B.是一个指针数组名 C.是一个指针,它指向一个含有四个整型元素的一维数组 D.说明不合法 10.有一个二维数组a[3][4],2行3列元素的正确表示方法为(D ) A.&a[2][3] B.a[2]+3 C.*(a+2)+3 D.*(a[2]+3) 11.若有以下说明语句 char *language[ ]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”}; 则表达式:*language[1] >*language[3] 比较的是 A A.字符B和字符J B.字符串BASIC和字符串JAVA C.字符串FORTRAN和字符串PASCAL D.字符F和字符P 12.指向一个包含4个整型元素的一维数组的指针变量的定义形式为(A ) A.int (*p)[4]; B.int *p[4]; C.int (p[4]); D.int (p)[ ] 13.以下程序的运行结果是( A) fun( int *p1,int *p2) { if(*p1>*p2) printf(“%d\\n”,*p1); else printf(“%d\\n”,*p2);} main( ) { int a=3,b=7; fun(&a,&b);} A.7 B.3 C.10 D.4 第 37 页 共 43 页 C程序设计复习 第十章 结构体与共用体 一.知识点 1.结构体的概念与定义 2.结构体变量的定义 3.结构体变量的引用 4.结构体数组 5.共用体的概念与定义 6.枚举类型 7.用户自定义类型 【要点归纳】 1、结构体类型说明 结构体是一种构造数据类型,即先要定义结构体类型,然后定义其结构体变 量。 结构体类型说明的一般形式如下: struct 结构体名 { 数据类型 成员名 1; 数据类型 成员名 2; ? 数据类型 成员名 n; }; 2、结构体变量的定义 可以使用如下几种方式定义结构体变量: 第 38 页 共 43 页 C程序设计复习 ⑴先定义结构体类型再定义结构体变量 ⑵在定义结构体类型的同时定义结构体变量 ⑶直接定义结构体类型变量 3、结构体变量成员的引用 引用结构体变量中的一个成员的一般方法如下: 结构体变量名.成员名 或 指针变量名->成员名 4、结构体变量的初始化 结构体变量初始化的一般形式如下: struct 结构体名 变量={初始数据列表} 5、结构体数组 结构体数组的每一个元素都是结构体变量。 ⑴结构体数组的定义 struct 结构体名 结构体数组名[元素个数] ⑵结构体数组的引用 ⑶ 结构体数组的初始化 6、结构体指针 结构体指针是一个指针变量,用来指向一个结构体变量,即指向该变量所分配的存储区域的首地址,结构体指针变量还可以用来指向结构体数组中的元素。 ⑴ 结构体变量指针定义和使用 结构体变量指针的格式如下: struct 结构体类型名 *结构体指针名; ⑵ 结构体数组指针 一个指针变量可以指向结构体数组,即将该数组的起始地址赋值给该指针变 量,这种指针就是结构体数组指针。 7、结构体复制方式 在函数间利用参数以数据复制方式传递结构体变量时,如果调用函数中的实 参使用结构体变量名,那么被调用函数的相应形参应该是具有相同结构体类型的 结构体变量。在执行被调用的函数时,实参的结构体变量赋值给形参的结构体变量,实际上是进行实参到形参的结构体变量对应成员项之间的数据复制。 8、结构体地址传递方式 结构体地址传递方式是把结构体变量的存储地址作为实参向函数传递,在函数中用指向相同结构体类型的指针作为形参接收该地址值,并通过这个结构体指针来处理结构体中的各项数据。 9、结构体数组在函数间传递 当需要把多个结构体作为一个参数向函数传递时,应该把它们组织成结构体数组,在函数间传递结构体数组时,一般采用地址传递方式,即把结构体数组的存储首地址作为实参。在被调用函数中,用同样结构体类型的结构体指针作为形参接收传递的地址值。 二.练习 ㈠.填空题: 1.为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域),请填空。 data next struct link { char data; struct link *next ;}node; 第 39 页 共 43 页 C程序设计复习 2.访问结构体数组元素a[k]的成员b,写作 a[k].b 。 3.以下程序的运行结果是 Zhang 。 struct s { int num; char name[20]; int age; }; main( ) { struct s stud[3]={{101,”Li”,18},{102,”Wang”,19},{103,”Zhang”,21}}; fun(stud+2); } fun(struct s *p) { printf(“%s\\n”,(*p).name);} 4.以下程序的运行结果是__2,3___。 main( ) { struct EXAMPLE {struct {int x; int y; }in; int a; int b; }e; e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(“%d,%d”,e.in.x,e.in.y); ㈡.选择题: 1.根据以下定义,能输出字母M的语句是( D )。 A.printf(“%c\\n”,class[3].name); B.printf(“%c\\n”,class[3].name[1]); C.printf(“%c\\n”,class[2].name[1]); D.printf(“%c\\n”,class[2].name[0]); struct person{ char name[9];int age;}; struct person class[10]={ “John”,17,“Paul”,19,“Mary”,18,“Adam”,16}; 2.以下程序的输出结果是( B )。 A.32 B.16 C.8 D.24 typedef union{ long x[2];int y[4];char z[8];}MYTYPE; MYTYPE them; main(){ printf(“%d\\n”,sizeof(them));} 第 40 页 共 43 页 C程序设计复习 3.设有定义语句 enum weekday{sun,mon,tue,wed,thu,fri,sat} workday; 则以下语句中编译不能通过的语句为______B_____. A.sun=0; B.workday=thu; C.workday=3; D.workday=1/7; 4.以下对结构体类型变量的定义中,不正确的是( C )。 A. typedef struct aa B.#define AA struct aa { int n; AA { int n; float m; float m; }AA; }td1; AA td1; C) struct D) struct { int n; { int n; float m; float m; }aa; }td1; stuct aa td1; 5.当定义一个结构体变量时,系统分配给它的内存是(B ) A.结构体最后一个成员所需内存量的大小。 B.各成员所需内存量的总和。 C.成员中占内存量最大者所需的容量。 D.结构体中第一个成员所需内存量。 6.在16位IBM-PC机上使用C语言,如果有以下说明语句,则变量ss所占内存的字节数 为(C ) struct s { int m; char c; double d; }ss; A.8 B.1 C.11 D.2 7.下面程序的运行结果是(D ) main( ) { struct cmplx { int x; int y; }cnum[2]={1,3,2,7}; prinyf(“%d\\n”,cnum[0].y/cnum[0].x*cnum[1].x);} A.0 B.1 C.3 D.6 第 41 页 共 43 页 C程序设计复习 第十一章 文件 一.知识点 1.文件类型指针:FILE 2.文件的打开与关闭:fopen()、fclose() 3.文件的读写:fputc()、fgetc()、fread()、fwrite()、fprintf()、fscanf() 4.文件的定位:rewind()、fseek()、ftell() 5.出错检测:ferror()、clearerr() 二.练习 ㈠.填空题: 1.在C程序中文件可以用两种方式存取,它们是 文本文件 和 二进制文件 。 2.在C程序中数据可以用两种代码形式存放,它们是 ASCII 和 二进制 。 3.在C语言中,文件的存取是以 字节 为单位的,这种文件被称作 文本文件 文件。 4.在C语言中,文件的打开使用 fopen() ,文件的关闭使用 fclose() 。 5.在C语言中,文件类型为 FILE 。 ㈡.选择题: 1.若执行fopen函数时发生错误,则函数的返回值是( C )。 A.随机值 B.1 C.NULL D.EOF 2.若用fopen函数打开一个新的二进制文件,要求文件既能读也能写,则应选用的文件方式字符串是( A )。 A.“wb+” B.“r+” C.“rb+” D.“ab+” 3.当正常执行了文件关闭操作时,fclose函数的返回值是( C )。 第 42 页 共 43 页 C程序设计复习 A.-1 B.随机值 C.0 D.1 4.在C语言中,对文件的存取是以( C )为单位的。 A)记录 B)函数 C)字节 D)模块 5.定义fp为文件型指针变量,使用fopen函数打开一个既能读也能写的新的二进制文件,以下正确的调用形式是( C ) A. fp=fopen(“filel”,”ab+”) B. fp=fopen(“filel”,”r+”) C. fp=fopen(“filel”,”wb+”) D.fp=fopen(“filel”,”ab”) 6.fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是(C A.只写 B.追加 C.读或读写 D.答案B和C都正确 7.若调用fputc函数输出字符成功,则其返回值是(D ) A.EOF B.1 C.0 D.输出的字符 8.fread和fwrite函数常用来要求一次读入/输出( D)数据 A.一个整数 B.一个实数 C.一个字节 D.一组 9.函数调用语句:fseek(fp,-20L,2);的含义是(C ) A.将文件位置指针移到距离文件头20个字节处 B.将文件位置指针从当前位置向后移动20个字节 C.将文件位置指针从文件末尾处向后退20个字节 D.将文件位置指针移到离当前位置20个字节处 10.函数rewind的作用是(B ) A.位置指针自动移到下一个字符位置 B.位置指针重新返回文件的开头 C.位置指针自动移到文件尾 D.位置指针移到指定的位置 11.当fclose函数正确执行后,函数的返回值是(A ) A.0 B.-1 C.1 D.非零值 第 43 页 共 43 页 )