C语言程序设计
目 录
第一章 C语言程序设计概述 .................................................................................... 1
一、主要内容......................................................................................................... 1 二、练习题部分..................................................................................................... 1 三、参考答案......................................................................................................... 3 第三章 数据类型、运算符和表达式........................................................................ 4
一、主要内容......................................................................................................... 4 二、练习题............................................................................................................. 5
(一)练习题之数据类型.............................................................................. 5 (二)练习题之 运算符和表达式................................................................ 8 三、参考答案....................................................................................................... 13
(一)练习题之数据类型 参考答案.......................................................... 13 (二)练习题之 运算符和表达式 参考答案............................................ 14
第四章 顺序程序设计.............................................................................................. 15
一、主要内容....................................................................................................... 15 二、练习题........................................................................................................... 15 三、参考答案....................................................................................................... 16 第五章 选择结构程序设计...................................................................................... 17
一、主要内容....................................................................................................... 17 二、练习题........................................................................................................... 17 三、参考答案....................................................................................................... 22 第六章 循环结构...................................................................................................... 26
一、主要内容....................................................................................................... 26 二、练习题........................................................................................................... 26 三、参考答案....................................................................................................... 35 第七章 数组.............................................................................................................. 40
一、主要内容....................................................................................................... 40 二、练习题........................................................................................................... 40 三、参考答案....................................................................................................... 50 第八章 函数.............................................................................................................. 55
一、主要内容....................................................................................................... 55 二、练习题........................................................................................................... 56 三、参考答案....................................................................................................... 63 第九章 预处理命令.................................................................................................... 68
一、主要内容....................................................................................................... 68 二、练习题........................................................................................................... 68 第十章 指针.............................................................................................................. 70
一、主要内容....................................................................................................... 70 二、练习题........................................................................................................... 70 三、参考答案....................................................................................................... 75 第十一章 结构体和共用体...................................................................................... 77
一、主要内容....................................................................................................... 77 二、练习题........................................................................................................... 77 三、参考答案....................................................................................................... 79 第十二章 位运算...................................................................................................... 83
一、主要内容....................................................................................................... 83 二、练习题........................................................................................................... 83 第十三章 文件.......................................................................................................... 84
一、主要内容....................................................................................................... 84 二、练习题........................................................................................................... 84 三、参考答案....................................................................................................... 86
第一章 C语言程序设计概述
一、主要内容
c程序基本结构特点
函数与主函数
1. 程序由一个或多个函数组成,函数由函数头和函数体构成。 2. 必须有且只能有一个主函数main()
3. 程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。
程序语句
1. C程序由语句组成,用“;”作为语句终止符
2. /* */部分为注释,不能嵌套,不产生编译代码
编译预处理不是C语言的一部分
C程序的运行步骤
运行一个C程序,从输入源程序开始,要经过编辑源程序文件(?C)、编译生成目标文件(?obj)、连接生成可执行文件(?exe)和执行四个步骤
二、练习题部分
一、选择题:
1、C语言程序编译过程中产生的文件有: ( )
A. 索引文件和文本文件两种 B. 目标文件和可执行文件
C. 二进制文件一种 D. ASCII码文件和二进制文件两种
2、以下说法中正确的是 : ( )
A. C语言程序总是从第一个定义的函数开始执行
B. 在C语言程序中,要调用的函数必须在main函数中定义 C. C语言程序总是从main函数开始执行
D. C语言程序中,main函数必须放在程序的开始部分
3、C语言源程序的基本单位是:( )
A. 函数 B. 标识符 C. 表达式 D. 语句
4、以下叙述正确的是:( )
A) C语言比其他语言高级 B) C语言可以不用编译就能被计算机识别执行 C) C语言以接近英语国家的自然语言和数学语言作为语言的表达形式 D) C语言出现的最晚、具有其他语言的一切优点
5、在一个C语言程序中 :( )
A) main函数必须出现在所有函数之前 B) main函数可以在任何地方出现 C) main函数必须出现在所有函数之后 D) main函数必须出现在固定位置
6、C++语言中工程文件的扩展名是: 。( )
A. .cpp B. .prj C. .c D. .obj
第 1 页 共 86页
(说明:BC++环境中工程文件扩展名.prj ,VC中为.dsp) 7、C文件的扩展名是:( )
(A).cpp (B).prj (C).c (D).txt
8、一个C程序的执行是从: ( )
A)本程序的main函数开始,到main函数结束
B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C)本程序的main函数开始,到本程序文件的最后一个函数结束 D)本程序文件的第一个函数开始,到本程序main函数结束
9、以下叙述正确的是: ( )
A)在C程序中,main函数必须位于程序的最前面
B)C程序的每行中只能写一条语句 C)C语言本身没有输入输出语句 D)在对一个C程序进行编译的过程中,可发现注释中的拼写错误
10、以下叙述不正确的是: ( )
A) 一个C源程序可由一个或多个函数组成 B) 一个C源程序必须包含一个main函数 C) C程序的基本组成单位是函数
D) 在C程序中,注释说明只能位于一条语句的后面
11、C语言规定:在一个源程序中,main函数的位置:( ) A) 必须在最开始 B) 必须在系统调用的库函数的后面 C) 可以任意 D) 必须在最后
12、一个C语言程序是由 : ( )
A) 一个主程序和若干子程序组成 B) 函数组成 C) 若干过程组成 D) 若干子程序组成
13、以下叙述中正确的是:( )
A) C语言的源程序不必通过编译就可以直接运行
B) C语言中的每条可执行语句最终都将被转换成二进制的机器指令 C) C源程序经编译形成的二进制代码可以直接运行 D) C语言中的函数不可以单独进行编译
14、以下对C语言函数的描述中,正确的是 :( ) A) C程序必须由一个或一个以上的函数组成 B) C函数既可以嵌套定义又可以递归调用 C) 函数必须有返回值,否则不能使用函数
D) C程序中有调用关系的所有函数必须放在同一个程序文件中
15、C 语言的注释定界符是:( )
A. { } B. [ ] C. * * D. /* */
第 2 页 共 86页
二、填空题:
1、C程序的运行需要经过 _ 和 _ _两步进行。 2、C语言的编译单位是 __ __。 3、C语言程序由__ _组成。
4、结构化设计中的三种基本结构是_ _、_ _和_ __ 。 5、C 语言中,一个函数一般由两个部分组成,它们是_ __和__ _。 6、一个C语言程序总是从_ _函数开始执行程序。 7、一个 C 程序中至少应包括一个__ _。
8、C语言函数是由函数头和函数体两部分组成。其中,函数头包括_ __,__ __和__ _。
9、C程序中用/*……*/ 括起来的内容是程序的 。 10、C源程序的基本单位是 。
三、判断题:
1、C语言程序的三种基本结构是递归、选择、循环。 ( ) 2、函数若无返回值,则它的返回值是整数值0。 ( ) 3、函数若无返回值,则它一定无形参。 ( )
三、参考答案
一、选择题:
1~5:BCACB 6~10:BCACD 11~15:CBBAD 二、填空题: 1、编译 连接 2、文件 3、函数
4、顺序结构 选择结构 循环结构 5、函数首部 函数体 6、主函数(或main函数) 7、函数
8、函数类型 函数名 函数参数 9、注释 10、函数
三、判断题:
1、× 2、× 3、×
第 3 页 共 86页
第三章 数据类型、运算符和表达式
(温馨提示:本章内容非常繁琐,细节较多,请将所记笔记中的说明部分和例题好好看看,一般考选择题和填空题)
一、主要内容
标识符命名原则:
1. 合法的要求是由字母,数字,下划线组成,并且第一个必须为字母或则是下划线。关
键字不可以作为用户标识符号。
2. main define scanf printf 及其他库函数的函数名都不是关键字可以用作标识
符。
3. If与if不同,If是可以做为用户标识符,因为C区分大小写。
基本数据类型:
1. 基本数据类型有哪些?所占空间大小及说明符。
2. 整型、实型、字符型常量的合法表示形式,字符串的表示形式。
a)实型数据的合法形式:小数形式和指数形式-----尤其要注意指数形式的格式e前必有数,e后必为整数。2.333e-1 就是合法的
b) 字符数据的合法形式:以单引号括起来的一个字符,注意转义字符P48表3-3。
如‘\\x6d’是合法的字符,ASCII码为十六进制的6d,‘\\141’也合法,ASCII码为八进制141,‘\\108’不合法。
c) 字符常量和字符串的区别:'a' 是字符占一个字节,
\是字符串占两个字节(含有一个结束符号)。
常量和变量
1. 符号常量的定义格式:eg #define PI 3.14159 (注意宏定义后无分号结尾) 2. 变量的定义格式:
3. 变量赋初值的方式。 int a=b=c=3;不合法
数据混合计算时数据类型的转换:P54图3-10。 a) 强制类型转换:一定是(int)a 不是 int(a),注意类型上一定有括号的。 b) 注意(int)(a+b)和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。
运算符
1. 运算符的优先级别和结合方向: a) 单目运算>双目运算
b) 算术> 关系运算>逻辑运算>条件运算>赋值运算>逗号运算 2. 算术运算符:
a) %要求左右两边都是整型数,运算结果为余数。 b) /运算若左右两边都是整型数,结果为整数。
c) 自增自减运算符,前置先自增减,再运算;后置先运算,再自增减。自增自减运算
符只能作用于变量,不能作用于常量和表达式。
如:#define A 3
A++;是错误写法。 3. 关系运算符:
a)注意赋值=与关系= =的区别。
第 4 页 共 86页
b) c语言中没有逻辑类型,逻辑“真”用非0表示,逻辑“假”用0表示,
c) x在[a,b]间的关系表达式为x>=a && x<=b,不能写为a>=x>=b。但该表达式语法成
立,有运算结果。如3>=1>=5运算时从左向右依次运算,即3>=1为真,值为1,此时,表达式为1>=5,运算结果为假,值为0。所以整个1>=3>=5的值为0.
4. 逻辑运算符:
a)!优先级别比较高, !>&&>|| 。 b)&&和||运算时注意短路原则。(常考!)
5. 赋值运算符:
a)复合赋值运算符的使用。如a=12,则a+=a-=a*=a;运算后a的值
6. 条件运算符:
a)结合方向从右向左。
7. 逗号运算符:优先级别最低;也叫顺序执行运算符,表达式的数值逗号最右边的那个
表达式的数值。(2,3,4)的表达式的数值就是4
表达式
1. 能将数学表达式写成c表达式
2. 计算表达式的值,注意优先级别和结合方向。
二、练习题
(一)练习题之数据类型
一、选择题:
1、以下标识符中,不能作为合法的C用户定义标识符的是 ( ) A)putchar B)double C)_123 D)INT
2、下列字符序列中, 不可用作C 语言标识符的是 ( ) A. b70 B. #ab C. symbol D. a_1
3.以下不能定义为用户标识符的是:( )
A. MAIN B. _HJ C. 208ong D. LINE12 4. 以下是正确的字符常量是:( )。
A. \ B. '\\\\' C. 'W1' D. \
5. 以下各项是错误的整型常量的是:( )
A. -0xcdf B. 018 C. 0xe D. 011
6、下列四组选项中,均不是C语言关键字的选项是 :( ) A) define B) getc C) include D) while
第 5 页 共 86页
IF char scanf go type printf case pow
7、下面四个选项中,均是正确的八进制数或十六进制数的选项是:( ) A) -10 B) 0abc C) 0010 D) 0al2 0x8f -017 -0x11 -0xl23
-011 0xc 0xf1 -0x8
8、下面四个选项中,均是正确的数值常量或字符常量的选项是: ( ) A) 0.0 B) \C) '3' D) +001 0f 3.9E-2.5 011 0xabcd 8.9e lel0xFFOO 2e2 '&'
'\\' '' 0a 50.
9、下面不正确的字符串常量是:( )。 A) 'abc' B) \ D) \
10.设int类型的数据长度为2字节,则该类型数据的取值范围是: ( )
A. 0至65536 B. 0至65535 C. -32767至32768 D. -32768至32767
11、在C语言中(以16位PC机为例),5种基本数据类型的存储空间长度的排列顺序为( )
A)char < int < 1ong int <= float < double B)char = int < 1ong int <= float < double C)char < int < 1ong int = float = double D)char = int = 1ong int <= float < double
12.若有以下程序段(n所赋的是八进制数) int m=32767,n=0327; printf(\执行后输出结果是:( )
A) 32767,327 B) 32767,0327 C) 32767,777 D) 32767,0777
13.设变量a是整形,f是实型,i是双精度型,则表达式10+′a′+i*f值的数据类型为:( )
A. int B. float C. double D. 不确定
14. 在C语言中,char型数据在内存中的存储形式是:( )
A. 补码 B. 反码 C. 源码 D. ASCII码
15. 字符串\在内存中占据的字节个数为 : ( )
A. 0 B. 1 C. 2 D. 3
16.下列为字符常量的是:( )
第 6 页 共 86页
A.“a” B. ‘ab’ C. ‘\\n’ D.‘\\084’
17.在C语言中,下面字符串能用作变量名的是:( ) A. a+b B. auto C. 2-and D. a2
18.已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句
c2 = 'A' + '6' - '3';后c2中的值为( )
A) D B) 68 C) 不确定的值 D) C
19、在C语言中合法的字符型常量是。 ( ) A、“A” B、‘\\t’ C 、65 D、A
20、以下选项中,C中正确的整型常量形式是。 ( ) A、0x16 B、-202.18 C、1,000 D、0458
二、填空题:
1. 在C语言中的实型变量分为两种类型,它们是_ __ 和 ___ ___。
2.将下列字符串表示成C语言的字符串常量
(1)C:\\TC\\LIB_____________
(2)He said:\’m a student.\_________
(3)85% student passed.____________________________
3.在C语言中,标识符中英文字母的大小写________(是/不是)等价的。换句话说,sum、Sum、SUM是3个_______(相同/不同)的标识符。 4.已知char w; int x; float y; double z;
则表达式:w * x + z - y所求得的数据类型为 。 5.变量名由字母、数字和下划线组成,并且必须是______打头。
6. C语言的数据类型分为基本类型、构造类型、指针类型和空类型 。(正确/错误)。 7.已知字母a的ASCII码为十进制数97,且设ch为字符型变量,
则表达式ch = 'a' + '8' - '3'的值为 。
三、看程序写结果
1.如果对以下程序进行编译和运行,其结果为________。 main()
{int x,y; x=555;y=x+2; y=x+2;
printf(“x=%d”,x,y);}
2.执行以下程序,写出程序运行结果________。 main() {
int c1,c2; c1=97;
第 7 页 共 86页
c2=98;
printf(\ printf(\ }
3.执行以下程序,写出程序运行结果________。 main()
{ char c1, c2;
c1='A' ; c2='a' ; c1=c1+2 ; c2=c2+2 ;
printf(\ }
(二)练习题之 运算符和表达式
一、选择题:
1、以下运算符中,优先级最高的运算符是( ) A. = B. != C. *(乘号) D. ()
2、若有以下定义,则能使值为3的表达式是( ) int k=7, x=12;
A. x%=(k%=5) B. x%=(k-k%5) C. x%=k-k%5 D. (x%=k)-(k%=5)
3、设在tc2.0中有整型变量x,y,z均为3,表达式(x++)+(y++)+(z++)的值是 ( ) A. 6 B. 7 C. 8 D. 9
4、有以下程序运行后的输出结果是: ( ) main()
{ char a='A',b; print(\ printf(\ }
A. B,B B. B,C C. A,B D. A,C 5、有以下程序运行后的输出结果是 :( ) main()
{ char a='a';
printf (\ printf(\ }
A)b,b B)b,c C)a,b D)a,c
6、设a=6,b=4,则表达式b*=a+3的值为 : ( ) A)3 B)18 C)27 D)36
第 8 页 共 86页
7、有如下程序段,其输出结果是: ( )
int a=3;
float b=15.6,f=1.5;
printf(“%d”,a+(int)b/2+(int)f%3); A)10 B)11 C)12 D)13
8、以下程序的输出结果是: ( ) main( ) {int a=3 ;
printf ( \
A. 4 3 B. 4 4 C. 5 3 D. 5 4 9、以下程序的输出结果是( )。
main( ) {
int a=10;
printf ( \ }
(A)11 10 (B)11 11 (C)12 20 (D)12 11
10、若有定义:int a=8,b=5,c;执行语句c=a / b+0.4 ; 后c的值为( )。
(A)1.4 (B)1 (C)2.0 (D)2
11、若x,i,j和k都是int型变量, 则执行下面表达式x = (i = 4, j = 16, k = 32)后x的值为( )
A) 4 B) 16 C) 32 D) 52
12、若有代数式3ae/bc,则不正确的C语言表达式是: ( ) A) a / b / c * e * 3 B) 3 * a * e / b / c C) 3 * a * e / b * c D) a * e / c / b * 3
13、以下不正确的叙述是:( )
A)在C程序中,逗号运算符的优先级最低 B)在C程序中,APH和aph是两个不同的变量
C)若a和b类型相同,在执行了赋值表达式a=b后b中的值将放人a中,而b中的值不变。 D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值。
14、已知各变量的类型说明如下: ( ) int i = 8, k, a, b; unsigned long w = 5;
double x = 1.42, y = 5.2;
则以下符合C语言语法的表达式是:
A) a += a -= (b = 4) * (a = 3) B) a = a * 3 = 2
第 9 页 共 86页
C) x % (-3) D) y = f1oat(i)
15、若有定义:int a = 7; float x = 2.5, y = 4.7; 则表达式x + a % 3 * (int)(x + y) % 2 / 4的值是:( )
A) 2.500000 B) 2.7500OO C) 3.500000 D) 0.000000。
16、表达式b*=(b=3)+(a=10)的值为: ( ) (A)3 (B)19 (C)27 (D)39
17、假设所有变量均为整型,则表达式(a = 2, b = 5, b ++, a + b)的值是: ( A) 7 B) 8 C) 6 D) 2 18、若有以下程序:
main()
{int k=2,i=2,m;
m=(k+=i*=k); printf(\ }
执行后的输出结果是: ( ) (A) 8,6 (B) 8,3 (C) 6,4 (D) 7,4
)
19.在C语言中运算对象必须是整型的运算符是:( ) A. % B. / C. = = D. <=
20.若有以下定义:int x=10,y=3,z; 则语句:printf(“%d\\n”,z=(x%y, x/y));的输出结果为 ( ) A. 1 B. 0 C. 2 D. 3
21.下列哪一个表达式的值是整数类型( )。 A. 15/2 B. 15/2+2.0 C. 25/5.0 D. 0.5*10
22.若double x=2,y;则执行y=x+3/2;后,y的值是( )。 A. 3.500000 B. 3.000000 C. 2.000000 D. 3
23、以下运算符中优先级最低的是 ( )
A) && B) & C) || D) |
24、设以下变量均为int类型,则值不等于7的表达式是( ) A) (x=y=6,x+y,x+1) B) (x=y=6,x+y,y+1) C) (x=6,x+1,y=6,x+y) D) (y=6,y+1,x=y,x+1)
25.设有以下定义
int a=0; double b=1.25; char c=’A’; #define d 2
则下面语句中错误的是: ( ) (A) a++; (B) b++ (C) c++; (D) d++;
26、若有int x=12,n=5;则x%=(n%=2);后x的值是。 ( )
第 10 页 共 86页
A、1 B、0 C、-1 D、2
27、设有定义int k=0;则以下四个表达式中与其它三个的值不同的是。 ( ) A、k++ B、k+=1 C、++k D、k+1
二、填空题:
1、若有以下定义int m=5,y=2;则计算表达式y+=y-=m*=y后的y值是 。 2、若a为int型变量,则下面表达式的值为 。 (a = 4 * 5, a * 2), a + 6
3、若a是int型变量,则执行表达式\后,a的值为 。 4、s=3,s++,s; 这个语句执行完后,s的值为 。
5、C语言中的标识符只能由三种字符组成,他们是字母、数字和 。 6、已知 i=5;写出语句 a= -- i, 执行后整型变量 a 的值是 。 7、设 x 的值为15,n 的值为2,则表达式 x*=n+3 运算后 x 的值是 。 8、int x=2;x*=y=z=4; 则x的值为 。 9、表达式 i++ 相当于表达式i= 。
10、若s是unsigned int型变量,则下面表达式的值是________。
s%2+(s+1)%2 11、程序段执行后c3的值是_______。
int c1=1,c2=2; float c3; c3=1/c2*c1;
12、已知’a’的ASCII码为97,printf(“\\\n”,’e’)的输出是______;
printf(“]\\n”,’e’)的输出是___________。 13、表达式:5%2=__________,2/3=__________。
14、在C语言中,单目运算符的结合方向(运算方向)是_____________;唯一的一个三目运算符是_____________。
15、设a,b,t 为整型变量,初值为a=7,b=9,执行完语句t=(a>b)?a:b后,t 的值是 。
16、算术表达式 a=b+3 中, a、b 称为_________, 3 称为________,=、+称为_________。
17、若有定义:int b = 7;float a = 2.5,c = 4.7;
则表达式a + (int)(b / 3 * (int)(a + c) / 2) % 4的值为 。 18.C语言中为了简化程序,提高程序的编译效率,在赋值运算符前面加上其他运算符号构
第 11 页 共 86页
成复合运算符。例如:x=x+5 用复合运算符可以写成 。 19、表达式1/4+2.75的值是 。
20、若a是int型变量,且a的初值为6,则计算表达式“a+=a-=a*a”后a的值为 21、若s是int型变量,且s=6,则表达式“s%2+(s+1)%2”的值为 。 22、若x是int型变量,则执行表达式“x=(a=4,6*2)”后,x的值为 。 23、若x和n均是int型变量,且x的初值为12,n的初值为5,
则执行表达式“x%=(n%=2)”后,x的值为 。
24、设 int x=1/4;则x的值为 。
25、若 char w,int x,float y,double z;则表达式w*x+z-y的结果为 类型。 26、设 x 的值为15,n 的值为2,则表达式 x*=n+3 运算后 x 的值是 。 27、假设有条件 int x=1,y=2,z=3;则表达式z+=x>y?++x:++y的值是 。 28、int a = 2, b = 3; 表达式 a > b ? a ++ : ++ b的值为 。
29、执行语句\后,变量a、c的值依次为 、 。 30、表达式a = 3, a ++, - -a的值为 。
31、设a、b、c为整型数,且a = 3,b = 5,c = 2,则执行完以下语句:
a *= 16 + (b ++) - (++ c);后a的值是 。
32、以下程序运行后的输出结果是 main( )
{ int a=1,b=4,c=2; a=(a+b)/c;
printf(“%d \\n”,--a); }
运行结果 ;
33、设int a=3,b=5;float x=7.5,y=3.5;则表达式
(float)a+b/2+(int)x%(int)y; 的值是 34、在C语言的表达式中,x=x+5 用复合运算符可以写成 。 35、设a=12,表达式a/=a+a 运算后,a的值是 。 36.若定义:char c=‘\\010’;则变量c中包含的字符个数是 。 37.赋值语句是由 加上一个分号构成。 38.a=12,n=5,表达式a%=(n%=2)值是 。 39.设说明为 int a=10; 执行语句 a*=1+2+3; 后a的值是____________。 40、设int m=1,n=2;则m==--n的结果是 。
41、设x为int型变量,则执行语句x=10;x+=x-=x-x;后x的值为 。
第 12 页 共 86页
42、设所有变量均为整型,则表达式(a=5,b=3,--a,++b,a-b)的值为 。 三、看程序写结果:
1、写出以下程序运行的结果________。 main ( ) {
int i,j,m,n; i=8; j=10; m=++i; n=j++;
printf(“%d,%d,%d,%d”,i,j,m,n); }
2、阅读下列程序,写出运行结果 #include
{ int a=1,b=4,c=2; a=(a+b)/c;
printf(“%d \\n”,--a); }
运行结果 ;
3、阅读下列程序,写出运行结果 main() { int n=1;
printf(\; }
运行结果 ;
4、main( )
{ int i=3 ;
printf(\ i++);
} 运行结果 ;
5、执行以下程序,写出程序运行结果 main() {
int a=-017L; printf(\}
三、参考答案
(一)练习题之数据类型 参考答案
第 13 页 共 86页
一、选择题:
1、B 2、B 3、C 4、B 5、B 6、A 7、C 8、D 9、A 10、D 11、A 12、A 13、C 14、D 15、C 16、C 17、D 18、A 19、B 20、A
二、填空题:
1、float double
2、 (1) ”c:\\\\TC\\\\LIB”
(2) ”He said :\\”I\\’ am a student” (3)”85%% student passed” 3、不是 ,不同 4、double
5、字母、下划线 6、正确 7、 ‘f’
三、看程序写结果 1、x=555 2、 a b
97 98 3、67 c
(二)练习题之 运算符和表达式 参考答案
一、选择题:
1、D 2、D 3、D 4、A 5、A 6、D 7、B 8、A 9、A 10、B 11、C 12、C 13、D 14、A 15、A 16、D 17、B 18、C 19、A 20、D 21、A 22、B 23、C 24、C 25、D 26、B 27、D
二、填空题:
1、-16 2、 26 3、2 4、4 5、下划线 6、4 7、 75 8、8 9、i+1 10、1
11、0 12、□□□□e □□101 13、1 0
14、由右向左 条件运算符 15、9 16、变量 常量 运算符 17、5.5 18、x+=5 19、2.75 20、-60 21、1 22、12 23、0 24、0 25、double
26、75 27、6 28、4 29、11 6 30、3 31、54 32、1 33、6.0 34、x+=5 35、0
36、1 37、赋值表达式 38、0 39、60 40、 1 41、20 42、0
三、看程序写结果 1、9,11,9,10 2、 1 3、1 0 1 4、4,3 5、-15
第 14 页 共 86页
第四章 顺序程序设计
一、主要内容
输入输出函数
1. printf函数的格式考查:
a)格式:printf(“格式控制串”,输出表)
b)输出表:要输出的数据(可以没有,多个时以“,”分隔)
格式控制串:包含两种信息
? 格式说明: %[修饰符]格式字符 ,用于指定输出格式 ? 普通字符或转义序列:原样输出 c)修饰符m、n、l的功能: 修饰符 功能 m 输出数据域宽,数据长度 a)格式:scanf(“格式控制串”,地址表) b)格式控制字符串中包含的非格式控制字符要原样输入;如: scanf(“sum=%d”,&a); 输入时”sum=”也要输入。 scanf函数中没有精度控制,如:scanf(“%5.2f”,&a) ;是非法的。 3.getchar( )获取一个字符。 a)格式:char c; c=getchar(); 4. putchar()输出一个字符,括号中的参数是一个字符变量或常量 a)格式:putchar(‘a’); 二、练习题 一、选择题: 1.设有语句scanf(“%d,%d”,&m,&n);要使m、n的值依次为2,3,正确的输入是 ( ) A. 2?3↙ B. 2,3↙ C. 2;3 D. 2↙3↙ 2.______是C语言的标准函数名。 ( ) A. scanf B. case C. while D. int 3、若有int i=-19,j=i%4;printf(“%d”,j);结果为。 ( ) A、-3 B、1 C、3 D、-1 4、int x,y; 第 15 页 共 86页 scanf(“%d,%d”,&x,&y) ;若要使x得11,y得12,则以下输入形式中错误的是。 ( ) A、11,12↙ B、 11空格12↙ C、11,空格↙12↙ D、11,↙12↙ 二、填空题: 1、在TC中,printf()函数输出表列的求值顺序是 。 2、在scanf函数中, 表示变量的地址。 3、以下程序的运行结果是 。 main() { printf(\ 4、若想通过以下输入语句使 a=5.0,b=4,c=3,则输入数据的形式应该是 。 int b,c; float a; scanf(\,%d,c=%d\,&a,&b,&c); 5、若变量x、y已定义为int类型且X的值为99,y的值为9, 请将输出语句printf(_____,x/y);补充完整,使其输出的计算结果形式为:x/y=11。 6、表达式pow(2.8,sqrt(double(x)))值的数据类型为 。 7、 输入一个华氏温度,要求输出摄氏温度: void main( ) { float c,f; printf(\请输入一个华氏温度:\ ; ; /* 摄氏温度c= (f - 32) */ printf(\摄氏温度为%5.2f\\n\} 8、int x=102,y=012;printf(“-,-\\n”,x,y); 则执行结果是 。 三、参考答案 一、选择题: 1、B 2、A 3、A 4、B 二、填空题: 1、由右向左 2、& 3、computer,□□com 4、5,4,c=3 5、“x/y=%d” 6、double 7、scanf(“%f”,&f); c=5.0/9*(f-32); 8、102,10 第 16 页 共 86页 第五章 选择结构程序设计 一、主要内容 三种程序结构:顺序结构、选择结构、循环结构 if语句(条件选择语句) a)if语句的三种形式: b)if后面的表达式类型任意的;若执行语句是多条,必须为复合语句,即 写在一对花括号内。 c)if结构可以嵌套,注意缺省{ }时,else总是和它上面离它最近的未配对 的if配对 switch语句 a)格式中,E1,E2,…En是常量表达式,且值必须互不相同 b)注意执行时语句中有break和无break时,执行流程的区别。(本处常考) c)default可以不写。 二、练习题 一、选择题: 1、经过以下语句定义后, 表达式z+=x>y?++x:++y 的值为:( ) int x=1,y=2,z=3; A. 2 B. 3 C. 6 D. 5 2、能正确表示逻辑关系:\或a≤ 0\C 语言表达式是 : ( ) A. a>=10 or a<=0 B.a>=0|a<=10 C. a>=10&&a<=0 D. a>=10||a<=0 3.已知int a=5,b=7,c=3;则逻辑表达式a A. 1 B. 0 C. 3 D. 4 4、下列程序的输出结果是 :( ) main() { int x, y, z ; x=y=z=1 ; ++x&&++y||++z ; printf(\ } A.1 1 1 B. 2 2 2 C. 2 2 1 D. 2 1 1 5、在C语言中逻辑值“真”是用 表示的。 ( ) A. 预定义为真值的宏 B. 非零值 C. 正数 D. 非零整数 6、 设有int x,y; 以下语句判断x和y是否相等,正确的说法是该语句:( ) if (x=y) printf(\A. 语法错 B. 不能判断x和y是否相等 C. 编译出错 D. 能判断x和y是否相等 7、以下程序的输出结果是:( )。 main() { int a=5,b=4,c=6,d; printf(\ 第 17 页 共 86页 } A. 5 B. 4 C. 6 D. 不确定 8、若希望当A 的值为奇数时, 表达式的值为\真\的值为偶数时, 表达式的值为\假\则以下不能满足要求的表达式是 :( ) A. A%2==1 B. !(A%2==0) C. !(A%2) D. A%2 9、若希望当A 的值为奇数时, 表达式的值为\真\的值为偶数时, 表达式的值为\假\则以下不能满足要求的表达式是 :( ) A. A%2==1 B. !(A%2==0) C. !(A%2) D. A%2 10、执行以下语句后,a,b的值分别为:( )。 int a ,b ,c ; a=b=c=1 ; ++a||++b&&++c; (A)2 ,2 (B)1 ,1 (C)2 ,1 (D)1 ,2 11、 判断char型变量c l是否为小写字母的正确表达式为: ( ) A. ’a’<=c1<=’z’ B. (c1>=a)&&(c1<=z) C. (‘a’>=c1) (‘z’<=c1) D. (c1>=’a’)&&(c1<=’z’) 12、已知int x=10,y=20,z=30;以下语句执行后x,y,z的值分别是:( )。 if(x>y) z=x ; x=y ; y=z ; (A)x=10,y=20,z=30 (B)x=20,y=30,z=10 (C)x=20,y=30,z=30 (D)x=20,y=30,z=20 13、以下选项中非法的表达式是: ( ) (A) 0<=x<100 (B) i=j==0 (C) (char)(65+3) (D) x+1=x+1 14、阅读以下程序: main() { int x; scanf(\ if(x--<5) printf(\else printf(\} 程序运行后,如果从键盘上输人5,则输出结果是:( ) (A)3 (B) 4 (C) 5 (D) 6 15. C语言对于嵌套if语句规定else总是与( )匹配。 A)与最外层的if B.)与之前最近的if C)与之前最近的不带else的if D)与最近的{ }之前的if 16.以下有关switch语句的正确说法是________。 ( A)break语句是语句中必须的一部分 B)在switch 语句中可以根据需要使用或不使用break语句 C)break语句在switch 语句中不可以使用 D)在switch 语句中的每一个case都要用break语句 17.设有: int a=2,b=3,c=7,d=8,m=3,n=3; 执行 (m=a>b)&&(n=c>d) 后的_________。 A) 0 B) 1 C ) 2 D) 3 ) 第 18 页 共 86页 ) n 值为( 18.可判断非0变量 a为正,b为负的正确表达式是_________。 ) A) a*b <0 B) (a>0||b >0)&&a*b <0 C) (a<0||b<0)&&a*b <0 D) a>0&&a*b<0 ( 19.假定 int a=3, b=2, c=1, 表达式: (c==a>c)+(a/b) 的值是_________。 ) A) 1.75 B) 2 C) 1.5 D) 2.5 20.设a、b和c都是int型变量,且a=3,b=4,c=5;则以下的表达式中,值为0的 ( 表达式是__________。 ( ) A) a&&b B) a<=b C) a||b+c&&b-c D) !((a 21、如果a=4,b=3,c=2,d=1,则条件表达式a<b?a:c<d?c:d的值是。 ( ) A、1 B、2 C、3 D、4 22、设有定义int a=1,b=2,c=3,d=4,m=2,n=2; 则执行表达式(m=ad)后,n的值为。 ( ) A、1 B、2 C、3 D、0 二、填空题: 1、设x=3,y=-4,z=5,则表达式!(x>y)+(y!=z)||(x+y)&&(y=z)的值是 。 2、 当a=5,b=4,c=2时,表达式 a>b!= c的值是 _______。 3、 为表示关系x ≥ y ≥z,正确的C语言逻辑、关系表达式为 。 4、有int a=3,b=4,c=5,x,y;,则以下表达式的值为 !(x=a)&&(y=b)&&c 5、在C语言中,表示逻辑\真\值用 . 6、当a=3,b=2,c=1时,表达式f=a>b>c的值是 . 7、与if(x==0) 等价的表达式写法写法是 。 8、若定义:int a=5,b=2,c=1; 则表达式 a-b>c||b==c 的值是 ; 表达式 a-b>c&&b==c 的值是 。 9、 “: ?”条件运算符是C语言中唯一的三目运算符。由其连接的表达式为条件表达式, 其格式为: <表达式1>?<表达式2>:<表达式3> 。执行过程:首先计算表达式1的值,如果表达式1的值是“真”(非0),则整个表达式的值为 的值;如果表达式1的值是“假”(0),则整个表达式的值为 的值。 10.C语言提供的三种逻辑运算符是______、______和_______。 11.若已知a=10,b=20,则表达式!a 12.若a,b变量的值任意,表达式(a==b)&&(a>b)的值是_________。 13.设x,y,z均为int型变量,请写出: (1)x、y中至少有一个小于z的表达式_____________; (2)x、y都大于z的表达式____________; 14、能正确表示a>=10或a<=0的关系表达式为 。 15、以下程序的功能是:输出a、b、c三个变量中的最小值,请填空。 #include 第 19 页 共 86页 main() { int a,b,c,min; scanf(\ if( ) min=a; else min=b; if( ) min=c; printf(\ 三、看程序写结果: 1、main() { int x, y, z ; x=y=z=1 ; z=++x&&++y||++z ; 运行结果: printf(\ 2、main( ) { int m=5; if(m++>5)printf(\,m); 运行结果: else printf(\,m--); } 3、若从键盘输入58,则以下程序输出的结果是 。 main() { int a; scanf(“%d”,&a); if(a>50) printf(“%d”,a); if(a>40) printf(“%d”,a); if(a>30) printf(“%d”,a); } 4、 以下程序运行后的输出结果是 。 main() { int p,a=5; if(p=a!=0) printf(\else printf(\} 5、 源程序如下: #include { int a=2,b=7,c=5; switch(a>0) 第 20 页 共 86页 {case 1: switch(b<0) {case 1: printf(\ case 2: printf(\ } case 0: switch(c==5) {case 0: printf(\case 1: printf(\case 2: printf(\} default: printf(\} printf(\ 运行结果: 6、main( ) { int x=1, y=2; switch(x) {case 0 : case 1 : switch(y) 运行结果: { case 1: case 2: y+=2; } case 2 : x++; } printf(“ %d, %d\\n” , x, y) ; } 7.以下程序的输出结果是 。 main() { int x=1,y=1,a=0,b=0; switch(x) { case 1:switch(y) {case 0: a++; case 1: b++; case 2: b++;break; } case 2: a++;b++;break; case 3: a++;b++; } printf(“a=%d,b=%d\\n”,a,b); } 8. 以下程序段的运行结果是_________。 int a,b,c; a=50;b=100;c=30; if(a>b) { a=b;b=c;c=a;} 第 21 页 共 86页 printf(\ 9.下面程序的输出结果是 void main() { int i=10; switch(i) { case 9:i+=1; case 10:i+=1; case 11:i+=1; case 12:i+=1; } printf(“i=%d\\n”,i); } ( ) 四、编程题: 1、从键盘输入3个整数,按照从大到小的顺序输出。 2、设有一个函数如下。编程,输入x,求y值。 y=错误!未找到引用源。 2 3、求一元二次方程ax+bx+c=0的根,要求考虑所有根的情况。 4、设有一个函数如下。编程,输入x,求y值。 y=错误!未找到引用源。 5.输入一个字符,判断其是否是大写字母,如果是,则转换成为小写字母,然后输出字符,如果不是小写字母,则直接输出字符。 6、有分段函数 x, x<1 y= 2x -1,1<=x<10 3x –11, x>=10 编写一程序,输入x,输出相应的y值。 7、分别用两种判断方法,写出判断一个年份为闰年的程序。 三、参考答案 一、选择题: 1~5 :CDCCB 6~10:BCCCC 11~15:DCDBC 16~20:BDDBD 21、A 22、B 二、填空题: 1、1 2、1 3、(x>=y)&&( y>=z ) 4、0 5、非零值 6、0 7、if(!x) 8、1 0 9、表达式2 ,表达式3 10、 ! ,&& ,|| 11、1 12、0 13、(1)x 第 22 页 共 86页 (2) x>z && y>z 14、a>=10||a<=0 15、(1)a 1、221 2、6 3、585858 4、1 5、#& 6、2,4 7、a=1,b=3 8、a=100,b=30,c=100 9、i=13 四、编程题: 1、从键盘输入3个整数,按照从大到小的顺序输出。 main() { int x,y,z,t; scanf(\if (x>y) {t=x;x=y;y=t;} /*交换x,y的值*/ if(x>z) {t=z;z=x;x=t;} /*交换x,z的值*/ if(y>z) {t=y;y=z;z=t;} /*交换z,y的值*/ printf(\} 2、设有一个函数如下。编程,输入x,求y值。 y=错误!未找到引用源。 #include { double x,y; scanf(\if (x>0) y=sqrt(x); else if(x<0) y=(x+1)/(x*x+2); else y=0; printf(\} 2 3、求一元二次方程ax+bx+c=0的根,要求考虑所有根的情况。 教材P108例5.6 4、设有一个函数如下。编程,输入x,求y值。 y=错误!未找到引用源。 第 23 页 共 86页 #include { double x,y; scanf(\if (x>=0) y=sqrt(x+1); else y=sin(x); printf(\} 5.输入一个字符,判断其是否是大写字母,如果是,则转换成为小写字母,然后输出字符,如果不是小写字母,则直接输出字符。 main() { char ch; scanf(\ if (ch>=’A’ &&ch<=’Z’) ch=ch+32; printf(\} 6、有分段函数 x, x<1 y= 2x -1,1<=x<10 3x –11, x>=10 编写一程序,输入x,输出相应的y值。 #include { double x,y; scanf(\if (x>10) y=3*x-11; else if(x>1) y=2*x-1; else y=x; printf(\} 7、分别用两种判断方法,写出判断一个年份为闰年的程序。 见教材P106页例5.5 第 24 页 共 86页 第六章 循环结构 一、主要内容 三种循环结构: 1.while 语句 a)当型结构,条件成立执行循环体。 b)先判断表达式,后执行循环体。循环体有可能一次都不执行 2. do ~ while 语句 a)先执行后判断,至少执行一次循环体 b)do~while语句表达式后面必须加分号 3. for 语句 a)for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省 循环嵌套: 1.执行时先内存循环,后外层循环。(看程序写结果题) 2.外层循环可包含两个以上内循环,但不能相互交叉 break和continue (注意程序中两者的区别) 1. break语句在循环语句和switch语句中,终止并跳出循环体或开关体 2. break只能终止并跳出最近一层的结构 3. continue语句,结束本次循环,跳过循环体中尚未执行的语句,进行下一次 是否执行循环体的判断 4. continue仅用于循环语句中 二、练习题 一、选择题: 1. 执行语句:for(i=1;i<9; i++)后; 变量i的值是( )。 (A)10 (B)9 (C)不定 (D)11 2.若t为int类型,进人下面的循环之前,t的值为0 , while( t=l ) { ……} 则以下叙述中正确的是( )。 (A) 循环控制表达式的值为0 (B) 循环控制表达式的值为1 (C) 循环控制表达式不合法 (D) 以上说法都不对 3. 对do...while语句错误的描述是:( ) A.可构成多重循环结构 B. 循环次数不可能为0 C.循环次数可能为0 D. 先执行后判断。 4.下面程序段的运行结果是( )。 int n=0; while(n++<=2) ; printf(“%d” ,n ) ; 第 25 页 共 86页 (A)4 (B)3 (C)2 (D)有语法错误 5. 以下描述正确的是( )。 A. 由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句。 B. do-while循环由do开始,用while结束,在while(表达式)后面不能写分号。 C. 在do-while循环体中,一定要有能使while后面表达式的值变成零(“假”)的操作。 D. do-while循环中,根据情况可以省略while。 6.关于do-while 语句的正确叙述是( ) A. do-while 语句构成的循环不能用其它语句构成的循环来代替 B. do-while 语句构成的循环只能用continue语句退出 C. 用do-while 语句构成的循环, 在while后的表达式为非零时结束循环 D. 用do-while 语句构成的循环, 在while后的表达式为零时结束循环 7.C 语言中,while 和 do…while 循环的主要区别是( )。 A. while 的循环控制条件比do…while 的循环控制条件严格 B. do…while 的循环体至少无条件执行一次 C. do…while 允许从外部转到循环体内 D. do…while 的循环体不能是复合语句 8.以下程序的输出结果是( ) 。 main( ) { int x=10,y=10,i; for(i=0;x>8;y=++i) printf(\,%d \,x- -,y); } A. 10 1 9 2 B. 9 8 7 6 C. 10 9 9 0 D. 10 10 9 1 9.现已定义整型变量int i=1;执行循环语句while(i+ +<5);后,i的值为( A)1 B)5 C)6 D)以上三个答案均不正确 10.有以下程序 main() { int i; for(i=0;i<=3;i++) switch(i) { case 1: printf(\ case 2: printf(\default: printf(\} } 执行后输出的结果是 :( ) A. 01123 B. 012 C. 012020 D. 120 11、执行语句:for(i=1;i<=9; i++);后变量i的值是:( ) 第 26 页 共 86页 ) A. 10 B. 9 C. 不定 D. 11 12.设执行变量y值为3,执行下列循环语句后,变量y的值是( )。 do y++; while(y++<4); (A)3 (B)4 (C)5 (D)6 13.若k为整型变量,则下面while循环执行的次数是( )。 k=10; while(k= =0) k=k-1; (A)0次 (B)1次 (C)10次 (D)无限次 14. 以下程序段_________。 x=-1; do {x=x*x;} while (!x); A) 是死循环 B) 循环执行 2 次 C) 循环执行 1 次 D) 有语法错误 15.对表达式for( 表达式1; ;表达式3) 可理解为( ) A.)for(表达式1;0; 表达式3) B)for(表达式1;1; 表达式3) C)for(表达式1; 表达式1; 表达式3) D)for(表达式1; 表达式3; 表达式3) 二、填空题: 1. 在循环语句中,continue和break语句的区别是: 语句提前结束本次循环,进 行下一次循环的判断;而 语句跳出循环结构,结束循环。 2、执行下面的程序段后,k值是 。 k=1; n=263; do { k*=n; n/=10; } while(n); 3.用_________________语句可以实现提前结束循环。 4.执行完语句 for (i=0; i <3 ; i ++);后,变量i的值为_________________。 5、在C语言中,实现循环的语句有:if__goto语句、while语句、 语句和for语句。 三、看程序写结果: 1.下列程序段的输出结果是 。 void main() { int i,j; for(i=4;i>=1;i--) { for(j=1;j<=i;j++) 第 27 页 共 86页 printf(\printf(\} 2.以下程序运行后的输出结果是 。 #include {int k=1,s=0; do{ if((k%2)!=0)continue; s+=k;k++; }while(k>10); printf(\} 3.源程序如下,运行时假定键盘输入数据为:2004 #include while( (c=getchar())!='') {if(c>='0'&&c<='9') n=n*10+c-'0';} printf(\ 结果为: 4.以下程序运行后的输出结果是 。 main() { char c1,c2; c1='0',c2='9'; for( ;c1 printf(\ \ printf(\} 5.以下程序运行后的输出结果是 。 main() { int i, j, k; for(i=1; i<=10; i++) { for(j=1; j<=31-i; j++)printf(\ for(k=1; k<=2*i-1 ; k++)printf(\*\ printf(\ 第 28 页 共 86页 } } 6.以下程序运行后的输出结果是 。 #include while( (c=getchar())!='') {if(c>='0'&&c<='9') n=n*10+c-'0';} printf(\(设输入:2518) 7. 以下程序的输出结果是 。 main () {int s,i; for(s=0,i=1;i<3;i++,s+=i); printf(\} 8.以下程序运行后的输出结果是 。 main() { int s=0,n; for(n=0;n<3;n++) {switch(s) { case 0: case 1: s+=1; case 2: s+=2;break; case 3: s+=3; default: s+=4; } printf(“%d ”,s); } } 9. 以下程序的运行结果是_________。 main() { int num=0; while (num<=2) { printf(“=”,num); num++;} } 第 29 页 共 86页 10.写出程序运行结果 。 #include int i=10,j=0; do { j=j+i; i--; }while(i>2); printf(\} 11.设有以下程序: #include 程序运行后,如果从键盘上输入7648;写出输出结果为 。 int n1,n2; scanf(\while(n2!=0) { } printf(\ n1=n1*10+n2; n2=n2/10; 四、程序填空题: 1.以下程序的功能是:打印出所有的水仙花数。请补充完整。 #include printf(\ for(n=100; n<=999; n++) { i= ; j=(n/10); k= ; 第 30 页 共 86页 if (n==pow(i,3)+pow(j,3)+pow(k,3)) printf(\ } } 2.以下程序是求1+1/2+1/4+1/6……+1/100的值。请补充完整。 #include printf(“sum=%f”, sum); } 3. 下列程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束循环。 #include int n=0, ch; ch=getchar( ); while( ______________ ) { if ( _______________ ) n++; c=getchar( ); } } 4. 统计所有四位正整数中各个数位上数字之和是9的数的个数。 如:1008、1017是满足条件的数 #include int i,j,s, count; ; for(i=1000;i<=9999;i++) { j=i; s=0; while( ) { 第 31 页 共 86页 ; j=j/10; } if(s==9) count++; } printf(\} 5. 下列程序用来计算n!的值,请填空。 main( ) {int i,s,n; s=1; printf(\ scanf(\for(i=1;i<=n;i++) printf(\} 6.下面程序的功能是计算并输出“(1)*(1+2)*(1+2+3)*……*(1+2+3+……+10)”,请完善程序:(本题4分) main() { float x,y=1; int i,j; for(i=1;i<11;i++) { _; for(j=1;j<=i;j++) _ __; y=y*x; } printf(\} 7.下面程序的功能是计算1-3+5-7+…-99+101的值存在s中,请填空。 #include int i,t=1,s=0; for(i=1;i<=101;_______) { s=s+i*t; t=_______; 第 32 页 共 86页 } } 8、程序的功能是计算:s=1-2+3-4+5-…+99-100,请填空。 main() { int s=0,i,falg=1; for( i=1; i<=100; i++ ) { s+= ; ;} printf(\ 9、程序的功能是计算:s=2+22+222+2222+22222,请填空。 main() { int s=0,i,a=0; for( i=1; i<=5; i++) { a= ; s= ; } printf(\ 10、程序的功能是计算:s=1+12+123+1234+12345,请填空。 main() {int s=0,i,a=0; for( i=1; i<=5; i++) { a= ; s= ; } 11、编写程序,把100到200之间的能被3整除的数输出。 main() { int i; for(i=100;i<201;i++) {if ( ) continue; __ _____; } } 五、程序设计题: 1、编程实现:输入两个正整数m和n,求其最大公约数和最小公倍数。 2、求1+2+4+6+……+100之和。分别用三种循环语句实现(while,do-while,for)。 3、编写程序求2到100间的全部素数,要求每行输出5个数。 4、编程输出九九乘法表。 5、编程求Fibonacci数列前20个数。这个数列有如下特点:第1、2两个数为1、1。 从第3个数开始,该数是其前面两个数之和。 第 33 页 共 86页 6、一个球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。求它在第10次落地时,共经过了多少米?第10次反弹多高? 7、 编写程序,把100到200之间的能被3整除的数输出。 8、试编写程序输出100~300间的所能能同时被3和5整除的数。 9、 请编写程序解决如下数学计算问题: 一个整数被5除余3,被7除余5,被9除余7,这个数最小是几? 10、设计程序求自然数1~100(包含1和100)中所有素数的和。 11、编写程序,使用下面的公式求出e的近似值。 e≈1+ 11111???????? (精确要求?10?6) n!1!2!3!n! 12、求出所有的“水仙花数”并输出。提示:所谓水仙花数,是指一个3位数,其各位数字 333 。 立方和等于该数字本身,例如153是一个水仙花数,因为153=1+5+3。 三、参考答案 一、选择题: 1~5:BBCAC 6~10:DBDCA 11~15:ACACB 二、填空题: 1. continue break 2. 36 3. break 4.3 5. do…while 三、看程序写结果: 1. ***** *** ** * 2. s=0 3. value=2004 4. 0,9 1,8 2,7 3,6 4,5 5. * *** ***** ******* ********* *********** ************* *************** ***************** ******************* 6. value=2518 第 34 页 共 86页 7. 5 8. 3 10 14 9. 0 1 2 10. 52 11. 8467 四、完成程序: 1. (1) #include 3. (1)while(ch!= '\\n') (2)if(ch<'9'&&ch>'0') 4. (1) count=0 (2)while(j!=0) (3)s=s+j 5. (1) s=s*i 6. (1)x=0 (2)x=x+j 7. (1) i+=2 (2)-t 8. (1) i (2)flag=-flag 9. (1) a*10+2 (2) s+a 10.(1) a*10+i (2) s+a 11.(1) i%3||i%5 (2) printf(“%d ”,i) 五、编程题: 1、编程实现:输入两个正整数m和n,求其最大公约数和最小公倍数。 main() { int m,n,temp,s; printf(\ scanf(\ if(m while(n!=0)/*利用辗除法,直到n为0为止*/ { temp=m%n; m=n; n=temp; } printf(\printf(\} 2、求1+2+4+6+……+100之和。分别用三种循环语句实现(while,do-while,for)。 (1) main( ) { int i=2,sum=1; while (i<=100) { sum=sum+i; i=i+2; } printf(“sum=%d”, sum); 第 35 页 共 86页 } (2) main( ) { int i=2,sum=1; do { sum=sum+i; i=i+2;}while(i<=100); printf(“sum=%d”, sum); } (3) main( ) { int i,sum; for(i=2,sum=1;i<=100;i+=2) sum=sum+i; printf(“sum=%d”, sum); } 3、编写程序求2到100间的全部素数,要求每行输出5个数。 #include { int m,k,i,n=0; for(m=2;m<=100;m+=2) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>=k+1) { printf(“]”,m); n=n+1; } if(n%5==0) printf(“\\n”); } } 4、编程输出九九乘法表。 #include \main() { int i,j,result; printf(\ for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf(\ \表示左对齐,占3位*/ } printf(\每一行后换行*/ } } 5、编程求Fibonacci数列前20个数。这个数列有如下特点:第1、2两个数为1、1。 从第3个数开始,该数是其前面两个数之和。 main() {long int f1=1,f2=1,f; 第 36 页 共 86页 int i; printf(“]] ”,f1,f2); for(i=3;i<=20;i++) { f=f1+f2; printf(“]”,f); f1=f2; f2=f; } } 6、一个球从100m高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。求它在第10次落地时,共经过了多少米?第10次反弹多高? main() { float sn=100.0,hn=sn/2; int n; for(n=2;n<=10;n++) { sn=sn+2*hn; /*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反跳高度*/ } printf(\printf(\} 7、 编写程序,把100到200之间的能被3整除的数输出。 main() {int i; for(i=100;i<=200;i++) if(i%3= =0) printf(“]”,i); } 8、试编写程序输出100~300间的所能能同时被3和5整除的数。 main() {int i; for(i=100;i<=300;i++) if((i%3= =0)&&(i%5= =0) printf(“]”,i); } 9、 请编写程序解决如下数学计算问题: 一个整数被5除余3,被7除余5,被9除余7,这个数最小是几? main() {int i=8; while(1) {if((i%5= =3) if(i%7= =5) if(i%9= =7) {printf(“]”,i); break;} i=i+5; } 第 37 页 共 86页 } 10、设计程序求自然数1~100(包含1和100)中所有素数的和。 #include { int m,k,i,s=0; for(m=2;m<=100;m+=2) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>=k+1) s=s+m; } printf(“sum=%d”,s); } 11、编写程序,使用下面的公式求出e的近似值。 e≈1+ 11111???????? (精确要求?10?6) n!1!2!3!n!main() {int i=1 float sum=1,t=1; while(t<1e6) {t=t*i; sum=sum+1.0/t; i=i+1; } printf(“%.2f”,sum); } 12. 求出所有的“水仙花数”并输出 main() { int i,j,k,n; for(n=100;n<1000;n++) { i=n/100;/*分解出百位*/ j=n/10;/*分解出十位*/ k=n;/*分解出个位*/ if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) printf(\ } } 第 38 页 共 86页 第七章 数组 一、主要内容 一维数组: 1. 一维数组的定义:数据类型 数组名[常量表达式]; (a)常量表达式表示数组元素个数,从0开始计算。 (b)不能用变量来表示元素的个数,可以是符号常量或常量表达式。 (c)数组名为地址常量 2. 一维数组元素的引用:数组名[下标] (a)只能逐个引用数组元素,不能一次引用整个数组 3. 一维数组初始化:类型说明符 数组名[常量表达式]={值1,值2,…… ,}; (a)只给部分数组元素赋初值,当{}中值的个数少于元素个数时,只给前面部分元 素赋值,其余自动赋零。 (b)当全部数组元素赋初值时,可不指定数组长度 二维数组: 1. 二维数组的定义:数据类型 数组名[常量表达式] [常量表达式]; (a)数组元素的存放顺序:按行序优先 2. 二维数组元素的引用:数组名[行下标] [列下标] (a)只能逐个引用数组元素,不能一次引用整个数组 3. 二维数组初始化: (a)可以按行赋值,也可逐元素赋值。 (b)当全部数组元素赋初值时,可不指定数组长度 字符数组: 1. 字符数组的定义:char 数组名[常量表达式]; (a)数组元素的存放顺序:按行序优先 2.字符数组的输入输出: (a)按字符输入输出 (getchar、putchar、printf+%c控制字符、scanf+%c) (b)字符串输入输出 (gets、puts、printf+%s控制字符、scanf+%s)(此方法的4 个函数格式要重点掌握) 3.字符串处理函数 (a)头文件 #include (b) 常用函数:strlen strcat strcmp strcpy 二、练习题 一、选择题: 1. C 语言的注释定界符是: ( ) A) { } B) [ ] C) * * D) /* */ 2.在定义一个一维数组时,不能用来表示数组长度的是:( ) A) 常量 B)符号常量 C)常量表达式 D)已被赋值的变量 3. 若定义数组并初始化int a[10]={1,2,3,4},以下语句哪一个成立? ( ) A. 若引用a[10],编译时报错 B. 若引用a[10],连接时报错 C. 若引用a[10],运行时出错 D. 若引用a[10],系统不报错 第 39 页 共 86页 4.对以下说明语句 int a[10]={6,7,8,9,10}; 的正确理解是:( ) A)将5个初值依次赋给a[1] 至a[5] B)将5个初值依次赋给a[0] 至a[4] C)将5个初值依次赋给a[6] 至a[10] D)因为数组长度与初值的个数不相同, 所以此语句不正确 5.以下一维数组a的正确定义是:( ) A. int a(10); B. int n=10,a[n]; C. int n; D. #define N 10 scanf(“%d”,&n); int a[N]; int a[n]; 6.以下二维数组 a 的正确说明是:( ) A) int a[1,1]; B) float a(3,4); C) double a[1][4]; D) float a(3)(4); 7.设已定义:int x[2][4]={1,2,3,4,5,6,7,8}; 则元素x[1][1]的正确初值是( ) A. 6 B. 5 C. 7 D. 1 8.若有说明:int a[3][4]; 则对a数组元素的非法引用是: ( ) (A)a[0][2*1] (B)a[1][3] (C)a[4-2][0] (D)a[0][4] 9.以下定义语句中,错误的是 ( ) A. int a[ ]={1,2} B. int a[ ][3]={1,2,3,4,5}; C. char s[10]=“test”; D. int n=5,a[n]; 10.若有说明:int a[3][4]; 则对a数组元素的正确引用是:( ) (A)a[2][4] (B)a[1, 3] (C)a[1+1][0] (D)a(2)(1) 11.以下对二维数组a 的正确说明是:( ) A. int a[3][] B. float a(3,4) C. double a[1][4] D. float a(3)(4) 12.以下不能正确定义二维数组的选项是 ( ) A)int a[2][2]={{1},{2}}; B)int a[][2]={1,2,3,4}; C)int a[2][2]={{1},2,3}; D)int a[2][]={{1,2},{3,4}}; 13. 若二维数组a有m列,则在a[i][j]前面的元素个数为: ( ) A. j*m+i B. i*m+j C. i*m+j-1 D. i*m+j+1 14.数组定义为:int a[4][5]; 引用“a[1]+3”表示的是。(以下记数均从自然数1开始) (A)a数组第2行第4列元素的地址 (B)a数组第2行第4列元素的值 (C)a数组第4行的首地址 (D)a数组第1行第3个元素的地址 ( ) 15.C标准库函数中,字符串处理函数的原形在 头文件中。( ) A. stdio.h B. math.h C. string.h D. ctype.h 16.有以下程序 main() { int p[7]={11,13,14,15,16,17,18},i=0,k=0; 第 40 页 共 86页 while(i<7&&p[i]%2){k=k+p[i]; i++;} printf(\} 执行后输出的结果是:( ) A) 58 B) 56 C) 45 D) 24 17.有数组定义:char array[]=”Computer”;则数组array所占的存储空间为 ( ) A)7个字节 B) 8个字节 C)9个字节 D)10个字节 18.以下程序的输出结果是。 ( ) main() { char ch[3][5]={\printf ( \} A. AAAA B. BBB C. BBBCC D. CC 19.判断字符串s1是否大于字符串s2,应当使用的表达式是: (A)if(s1>s2) (B)if(a= =b) (C)if(strcpy(s2,s1)>0) (D)if(stcmp(s1,s2)>0) 20.以下程序段的输出结果是: ( ) char s[]=\printf (\ (A) 5 (B) 6 (C) 8 (D) 9 21.下面是对s的初始化,其中不正确的是: ( ) (A)char s[5]={“abc”}; (B)char s[5]={‘a’, ‘b’, ‘c’}; (C)char s[5]= “ ”; (D)char s[5]=“abcdef”; 22.有两个字符数组a,b,则以下正确的输入格式是: ( ) (A)gets(a, b); (B)scanf(“%s%s”, a, b); (C)scanf(“%s%s”, &a, &b); (D)gets(“a”); gets(“a”); 23. 若有以下程序段: int a[ ]={4,0,2,3,1},i,j,t; for(i=1;i<5;i++) { t=a[i]; j=i-1; while(j>=0&&t>a[j]) {a[j+1]=a[j]; j--;} a[j+1]=t;} 则该程序段的功能是:( ) A)对数组a进行插入排序(升序) B)对数组a进行插入排序(降序) C)对数组a进行选择排序(升序) D)对数组a进行选择排序(降序) 24、在int a[ ][3]={{1},{3,2},{4,5,6},{0}}中a[1][1]的值是。 ( ) A、0 B、6 C、5 D、 2 25、若有定义int a[3][4];则能正确表示a数组元素地址的表达式是 (A) &a[3][2] (B) a[3][2] (C) &a[1][2] (D) a[2] 26 、若有定义:int b[3];则数组元素的不合法引用是。 (A) b[1] (B) b[0] (C)b[2] (D) b[3] ( ) 第 41 页 共 86页 二、 填空题: 1. 若有定义:int a[3][4]={{1,2},{0},{4,6,8,10}};则初始化后,a[1][2]得到的初值是________ a[2][1]得到的初值是 ___________。 2. 在C语言中,二维数组元素的内存中的存放顺序是_______________。 3. C 语言对数组下标的引用一般从_____________开始。 4. 若有定义:double x[3][5];则数组中行下标的下限为______________,列下标的上限为 ______________。 5.若二维数组a有m列,则在a[i][j]前面的元素个数为_________________。 6.设有数组a[10],数组元素a[3]的地址可以写成_________________。 7.字符串 \在内存中占用的字节数为_________________。 8.strlen(\的值为: _________________。 9.下面程序段的运行结果是 。 char c[5]={‘a’, ‘b’, ‘\\0’, ‘c’, ‘\\0’}; printf(“%s”, c); 10、char str[12]={‘s’,’t’,’d’,’i’,’o’}; printf(“%d\\n”,strlen(str));则输出结果为 。 三、 看程序写结果: 1. 以下程序运行后的输出结果是 。 int main() { char c1[5]={‘A’,‘B’,‘C’,‘D’},c2[5]; int i; for(i=0;i<4;i++) c2[i]=(c1[i]-‘A’-3+26)&+‘A’; c2[4]= ‘\\0’ ; puts(c2); } 2.以下程序运行后的输出运行结果 main() { int y[2][3]={{9,8,7},{6,5,4}}; int m[2],k,j; for(k=0;k<=1;k++) {m[k]=y[k][0]; 第 42 页 共 86页 for(j=1;j<=2;j++) if(y[k][j] printf(“%d,%d\\n”,m[k],m[k+1]); } 3. 以下程序运行后的输出运行结果 #include int i,a[10]; for(i=0;i<=9;i++) a[i]=i; for(i=10;i>=1;i--) printf(\ printf(\} 4.以下程序运行后的输出结果是 main() { int i,n[]={0,0,0,0,0}; for(i=1;i<=4;i++) { n[i]=n[i-1]*2+1; printf(\} } 5. 以下程序运行后的输出结果是 void main( ) { int i,a[10]; for(i=0;i<=9;i++) a[i]=i+1; for(i=9;i>=7;i--) printf(\ } 6.以下程序输出的结果是 。 main() { char s[]=\s[3]='\\0'; printf(\} 第 43 页 共 86页 7.以下程序输出的结果是 。 #include char p1[10]=\strcpy(str+2,strcat(p1,p2)); printf(\} 8.以下程序输出的结果是 。 #include int i=5; static char c[6]=\do { c[i]=c[i-1]; i--; }while(i>0); puts(c); } 9.以下程序输出的结果是 。 void main( ) { char *s=\int v1=0,v2=0,v3=0,v4=0,k; for(k=0;s[k];k++) switch(s[k]) { case '1': v1++; case '3': v3++;break; case '2': v2++; default: v4++; } printf(\ 10、main( ) { int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0; for(i=0;i<3;i++) for(j=0;j 第 44 页 共 86页 } s+=a[i][j]; printf(“%d\\n”,s); } 结果是 。 四、 完善程序 1. 下面程序的功能是:将二维数组a的行和列元素互换后存到另一个二维数组b中。请完善程序: main() { int i,j,b[3][2],a[2][3]={{1,2,3},{4,5,6}}; printf(\ for(i=0;i<2;i++) {for(j=0; ;j++) {printf(\ b[j][i]= ; } printf(\ } printf(\ for(i=0; ;i++) {for(j=0;j<=1;j++) printf(\ printf(\} 2. 有一个3×4的矩阵,要求编程以求出其中值最大的那个元素,以及它所在的行号和列号。请完善程序:程序如下: main() { int i,j,row,col,max; int a[3][4]={{3,5,1,8},{6,4,11,7},{9,3,10,2}}; max= ; for(i=0;i<3;i++) for(j=0;j<4;j++) if( ) { max= ; row=i; col=j; } printf(\ } 3.下面程序将字符数组a复制到字符数组b中。 main() { 第 45 页 共 86页 char a[]=\int i; for(i=_______;a[i]!='\\0';i++) { _____________; } ______________; } 4.下面程序段将字符数组b连接到数组a的后面。 main() { char a[20]=.\char b[]=.\int i,j; i=strlen(a); for(j=_____;b[j]!='\\0';j++) { a[_____]=b[______]; } a[______]=_______; } 5.用数组来处理求Fibonacci数列问题。 main( ) { int i; ; for(i=2; i<20; i++) ; for(i=0; i<20; i++) { if(i%3= =0) printf(“\\n”); printf(“d” , f[i]); } } 6.以下程序从输入终端读入数据到数组中,统计其中正数的个数,并计算正数之和及平均值。 main() { int i,a[20],count;float ave,sum; sum=0.0;count=0;ave=0; for(i=0;i<20;i++) scanf(\ for(i=0;i<20;i++) { if( ) { count++; sum+= ; } 第 46 页 共 86页 } ave= printf(\ 7.以下程序从终端读入数据到数组中,统计其中偶数的个数,并计算它们之和及平均值。 main() { int i,a[20],count;float ave,sum; sum=0.0;count=0;ave=0; for(i=0;i<20;i++) scanf(\ for(i=0;i<20;i++) { if( ) { count++; sum+= ; } } ave= printf(\ } 8.下面程序的功能是将字符串a中的下标为奇数的元素由小到大排序,其他元素不变,请填空。 main() { char a[]=\ for(i=1;i<7;i+=2) for(j=i+2;j<8; ) if( ) {t=a[i];a[i]=a[j];a[j]=t;} puts(a); } 9.对排序数列进行折半查找问题: #include {int a[N]={2,5,6,7,8,13,15,17,19,21,23,25,26,27,28,35,41,52,63}; int mid,top,bot,x; top=0;bot=N-1; printf(“请输入要找的元素:”); scanf(“%d”,&x); while(top<=bot) { ; if(x==mid) {printf(“\\n找到的元素%d是:a[-]\\n”,x,mid); exit(0); } 第 47 页 共 86页 else if(x>mid) ___________________; else ____________________; } printf(“没有找到该元素!\\n”); return 0; } 10、以下程序中函数f的功能是:在数组x的n个数(假定n个数互不相同)中找出最大数,将最大的数放在下标最大的元素中,请填空。(本题4分) #include {if(x[i]>max) {max=x[i]; maxi=i;} } temp=x[maxi]; x[maxi]= ________; _ _______=temp; //最大值与最后一个数的对换 11、以下程序的功能是:为数组a中所有的元素输入数据,请填空。(本题4分) main(){ int a[10],i=0; while(i<10)sacnf(“%d”, ________)} 五、编程题: 1. 实现用选择法对n个整数的排序,按从小到大的顺序。 2.利用冒泡排序的方法,实现对10个整数的升序排列。 3.有n个整数,使其前面各数顺序向后移动m(m<=n)个位置,最后的m个数变成最前面的m个数,且移动的元素之间的相对位置不变。 4.从键盘任意输入10个不相同的整数,然后,输入要查找的数x,如果在这10个数中找到x,则打印“Found!”;如果找不到,则打印“Not found!”。 5. 编程实现:输入4行5列的矩阵,输出其中最大的那个元素的值,以及其所在的行号和列号。 6. 编写一个程序,将一个3*4的矩阵转置。 7.求一个3*3矩阵的对角线元素之和。 8. 编程实现:输入一行文字,求出其中大写字母、小写字母、空格、数字及其他字符各有多少。 9. 编写一程序,将两个字符串连接起来,要求不用strcat函数。 10.设计一个候选人得票统计程序。设有3个候选人,他们的姓名分别是:Li、Zhang、Wang。 编程输入得票的候选人的名字,要求最后统计出得票结果。 11.有一行文字,要求删去其中某个字符,此行文字和要删除的字符均由键盘输入。 12.有一篇短文,共有3行文字,每行最多有80个字符。要求统计出其中英文大写字母、小写字母、数字、空格及其他字符各有多少个。 13.译密码。为使电文保密,往往按照一定规律将其转换成密码,收报人再按约定的规律将 其译回原文。一种明文向密文转换的规则是:将字母A变成F,a变成f,即变成其后 第 48 页 共 86页