1、C语言程序设计实例教程第三版课后习题及答案练习1一、选择题1、一个C程序是由(B )。A. 一个主程序和假设干子程序组成B. 一个或多个函数组成C.假设干过程组成D.假设干子程序组成解析:C语言称为函数式语言,其程序是由至少-个主函数main,和其他更多的函数组成,答 案选B;2、一个C程序的执行是从(A )。A. main函数开始,直到main函数结束 B.第一个函数开始,直到最后一个函数结束 C.第一个语句开始,直到最后一个语句结束 D. main函数开始,直到最后一个函数结束 解析:C语言执行都是从主函数main函数开始,不管main函数放置的位置,答案选A;3、C语言语句的结束符是(B
2、 )。A. 回车符 B.分号 C.句号 D.逗号解析:C语言语句是以分号结束,答案选B:4、下面标识符中(D )不是C语言的关键字。A. char B. goto C. case D. include解析:char声明字符型变量关键字,case为switch结构中开关语句分支关键字,goto为无条 件跳转语句关键字,在C语言中include不属于关键字,属于预处理命令,故答案选D;5、以下说法正确的选项是(A )C程序的注释可以出现在程序的任何位置,它对程序的编译和运行不起任何作用。A. C程序的注释只能是一行。B. C程序的注释不能是中文文字信息。C. C程序的注释中存在的错误会被编译器检查
3、出来。解析:在C程序中注释只是起到增加程序的可读性,编译器并不会对注释进行检查,且C程 序中存在多行注释。故答案选A6、以下说法正确的选项是(D )A. C程序中的所有标识符都必须小写B. C程序中关键字必须小写,其他标识符不区分大小写C. C程序中所有标识符都不区分大小写D. C程序中关键字必须小写,其他标识符区分大小写。解析:C程序中的关键字均是小写定义的,且标识符定义可以使用大写和小写,但是严格区分 大小写;故答案选D。A、x=7 y=8 z=7 B、x=7 y=9 z=7 D、x=8 y=9 z=7 D、x=8 y=9 z=8解析:这里主要是考察if选择结构条件下所能执行的语句只有x=
4、y,y=z;而后边的z=x;并受选 择结构条件所限制,所以根据题目要求当xy(78)不成立,x=y,y=z;语句不能被执行,而只 执行z=x;语句,将变量x的值赋值给z变量,而x与y的值不变化,所以x=7y=8z=7,故答 案选A;6. 下面程序的运行结果是(B )。int main()(int x=6,y=6;if(+xb)if(ac)if(ad) m= 1;else m=2;else m=3;printf(”dn”,m);return 0;A、0B、1 C、2D、3解析:这里考察if的嵌套,进一步考察else与if的配对,根据上一题描述,在程序中由上而 下从第1个else 01=2渣找离他
5、最近的if(ad) m=l;与其配对,下面第2个else m=3;与离它最 近且没有配对的if是if(ac),程序只有两个else,那么第1个if(ab)没有与之配对的else; 当进行if(ab)判断时其条件为假,没有执行的else,整个if结构执行结束,执行print。语句 输出m的值,而m的初值为0,故答案选A;对下面程序运行结果的分析中,正确的选项是(D )。int main ()(int x,y;scanf(”d,%d”,&x,&y);if(xy)x=y;y=x;elsex+; y+;printf(,%d,%dn,x,y);return 0;A、假设输入4和3,那么输出4和5 B、假
6、设输入3和4,那么输出4和5C、假设输入4和3,那么输出4和5 D、有语法错误,不能通过编译解析:此题考核重点是if选择结构中语句层次的划分,对于if语句后只能有一条语句,如果 多条需要用一对花括号 将多条语句括起来,故此题的if语句后面有两条语句,所以这是一 个单条件的if语句,后面的else不能与这个if匹配,所以就语法错误,故答案选D9. 以下关于switch语句的表达中,不正确的选项是(C )。A、switch语句中各case子句后面的表达式必须是整型或字符型常量表达式。B、同一 switch语句中各case子句后面表达式的值必须互不相同。C、switch语句中必须有default局部
7、。D、switch语句必须与break语句结合才能实现真正的选择结构。解析:再switch结构语句中defaule局部是可有可无的,他的作用是当所有case后的常量都 不满足表达式的值时,default位置作为switch语句结构的入口点;而break语句再switch语 句中的作用是中断switch语句的执行,以实现分支效果,此题答案选C;假定已定义变量int x,y测下面正确的switch语句是(BD )。A、switch(x)case 1.1: y+;case 2.1: y;default: y*=y;)C、switch(x)case 2: y+;case 1 + 1: y-;defau
8、lt:y*=y;B、swilch(x)case a:y+;case b:y-;dcfauit:y*=y;D、switch(x)default: y*=y;case I: y+;case 1 + 1: y;解析:这里考察switch语句结构的语法:case后面是整型或字符型常量表达式,且每个case后的值需 要互不相同,故答案A和C都是错误的,答案选B和D;10. 以下程序输出结果是(B )。int main()int x=l,y=2,m=0,n=0:switch(x)(case 1:switch (y)case 2 : m+ ; break ;case 4 : n+ ; break ;case
9、 3:m+; n+; break;case 5:m+; n+;)printf(m=%d.n=%d,m,n);return 0;A、m=l,n=0 B、m=2,n=l C、m= 1 ,n= 1D、m=2,n=2解析:这里考察switch语句的执行流程,因为x=l,所以外层的switch语句执行从case 1入口开始, 而内层switch在case 2入口执行使得m由0变为1,然后执行break语句跳出内层switch结构,顺序 执行外层的case 3使得m由1变为2, n由。变为1,故答案选B;11. 下面的循环语句执行完毕后,循环变量k的值是(B )。int k=l;while (k+10);
10、A、10 B、11 C、9D、无限循环,值不确定解析:此题考查自增运算符的使用,以及空语句在作为循环体执行,当k为9时,k+是先将k的值 参与表达式kvlO运算,9V10成立,然后k的值自增变为10,继续执行k+vlO,艮P 1010不成立, 跳出循环,但是在跳出循环时k由10自增变为11,故答案选择B;12. 对下面程序段中while循环执行情况分析正确的选项是(C )。int k=2;while (k=0) printf(%d”,k);k-;A、该循环只执行1次B、循环是无限循环C、循环体中的语句1次也不执行 D、存在语法错误解析:这里考察阅读者是否仔细阅读while循环结构的表达式,这里
11、表达式并不是关系表达式,而是 一个赋值表达式,是将0赋值给k,表达式的结果为0,即终止循环,循环体育局一次也不执行,故答 案选C;13. 以下程序段(C )。x=-l;do x=x*x;while (!x);A、是死循环B、循环执行2次C、循环执行1次 D、有语法错误解析:do.while结构语句是先执行循环体语句x=x*x,即(-1) * (-1) =1,将1赋值给x,然后进行 循环条件表达式!x的运算,结果为!1,即为0,所以终止循环,故答案选C;14. 对下面程序段中do-while循环执行情况分析正确的选项是(C )。int m=l,n=5;dom+;n”; while (m=A &
12、ch=a& ch=z) c2+;Ireturn 0;A、ch=getchar()getchar() C、ch=getchar() D scanf(%c,&ch)解析:C语言从键盘获取字符数据,使用函数getchar()获取单个字符,这里使用循环结构设计逐个获 取字符,直到获取到回车终止,因为下面是对变量进行判断,所以使用函数getchar()获取的字符需要 赋给变量ch,故答案选A;16. 下面有关for循环的正确描述是(D )。A、for循环只能用于循环次数己经确定的情况。B、for循环的执行流程是先执行循环体语句,后判断表达式。C、在for循环中,表达式1和3可以省略,但表达式2是不能省略
13、。D、for循环的循环体中,可以包含多条语句,但必须用花括号括起来。解析:此题考查foi循环结构语句的语法,对于A的说法是不正确的,不能用只能;对于B答案显然 不符合for循环的执行流程描述,for循环是先判断循环条件,后执行循环体语句;对于C答案,for 循环结构中三个表达式都可以省略,当表达式2省略,默认循环条件为真;故答案选择D;执行语句for(i=l;i+4;);后变量i的值是(C )。A、3B、4 C、5D、不定解析:这里考察自增运算以什么值参与表达式运算,i+是先用i的值参与表达式运算再自增,而+i是 先自增,然后以自增结果参与表达式运算;故而i=l开始,第1次循环条件判断1V4,
14、然后i自增变为 2,进入第2次循环条件判断24,然后i自增变为3,进入第3次循环条件判断34,然后i自增变为 4,进入第4次循环条件判断4V4,然后i自增变为5,这时循环条件判断为假跳出循环,这时变量i的 值为5,故答案选C;17. 以下程序段的循环次数是(B )。for (i=2; i=0;)printf(”d,i-);A、无限次 B、。次 C、1次 D、2次解析:考察识别for结构中各表达式的作用,表达式1为i=2,即为i变量赋值,表达式2为循环条件 判断,i=o,表达式即2=0,显然为假,即终止循环,这里表达式3省略;故而循环次数为0,故答 案选B;18. 下面的双重循环中的内循环体将一
15、共会被执行(C )次。for(i=0;i=3;i+)for(j=4;j;j-)printfCa);A、12 B、15 C、16 D、20解析:外层循环for中i从()到3循环了 4次,内循环for中j从4到1也是循环了 4此,对于内循环 体的次数为内外循环次数的乘积,即4*4=16,故答案选C;19. 如果下面程序在运行时输入、1,0,2,-2/,那么程序输出结果是(C )。int main()int x,i,sum;for (i=0,sum=0; i5;i+)(scanf(”d”,&x);if (x0) continue;suni+=x;printf(%d,sum);return 0;A、-
16、3B、0C、3D、1解析:此题考察循环结构中continue语句的作用;根据程序的执行流程中可以看到这里使用了 for循 环结构,而佛如循环体中并没有改变循环变量i的值,故for循环的次数为5此,艮队从0到4;这里 sum初值为0,循环体中有键盘获取数据,将执行5次,获取5个数据,且体中使用sum变量对键盘 送入的数据进行累加,但是在累加之前有一个判断语句if (x0) continue;代表键盘获取的数据为负数 将结束本次循环,不执行后续的累加语句,故题目是累加键盘送入数据中大于0的数据的和,所以答 案选C;20. 如果下面程序在运行时输入1,2,0,-1,-2/,那么程序输出结果是(C )
17、。int main()(int x,i,sum;for (i=0,sum=0; i10;i+)scanf(d,&x);if(x0) break;sum+=x;piintf(%d,sum);return 0;A、-3B、0C、3D、1解析:此题考察循环结构中break语句的作用;与上题类似,只是本体的循环次数本来是10此,只是 在循环体中进行累加之前有一个判断语句if(x0)break;即在键盘键入负数后终止循环;故只能累加键 盘键入的负数之前的数据;故答案选C;二、填空题在个循环语句的循环体中又包含了另个循环语句,那么这种循环形式称为循环的嵌套。1. for语句中的三个表达式可以全部或局部省略
18、,但应保存其分隔符;。2. 淄些通常适用于条件表达式的取值为多个离散而不连续的整型值(或字符型值)时实现多分支 选择结构。3. C语言提供的选择控制语句可以对给定的条件进行判断,并根据判断结果选择执行分支程序。4. 语句可以分为说明性语句,表达式语句,复合语句 和 控制结构语句4种类型,if语句属于其中的控制结构语句。5. C语言C语句的结束标志是一分号。6. 复合语句是用一对界定的语句块。7. 将“y能被4整除但不能被100整除,或者y能被400整除”这一条件描述写成逻辑表达式能够表示“40x40&xv=60|、vl20。8. 下面程序的功能是求3个整数中的最小数,将程序补充完整。in( m
19、ain()int x,y,z,min;scanR%d%d%cT,&x,&y,&z);if( xvy ) min=x;else min=y;if( zvmin )min=z ;printRmin=%d,min);return 0;switch语句中case关键字后面的表达式必须是_整型常量表达式。9. switch语句只有与 case语句结合使用,才能实现程序的选择结构。10. C语言实现循环结构的三种语句分别是 for 语句、 while 语句和 do-while 语句。11. 除for语句外,可能一次循环体也不执行的循环语句是顼业至少执行一次循环体的循环语 句是 do-while 。12.
20、假设键盘输入字符ABCDEz (/表示按下回车键,那么下面for语句执行后k的值是室_。 fbr(k=O;(c=getchar() !=n ;k+);下述程序段的运行结果是一 2, 1, 2。ini a=l,b=2, c=3, t;while (abc) (t=a; a=b: b=t; c-;printf(d,%d,%d”,a,b,c);执行下面的程序段后,m的值是 3()。int m=l,n=325;do(m*=n%10;n/=10;while(n);卜面程序的功能是求110()之间能同时被3和5整除的数,以8个数为一行的形式输出,将程序 补充完整。int main()int n,j=O;f
21、or(n= 1:n= 100;n+)if(n%3!=()&n%5!=0)continue;printf(,%6d,n);j+;if( i%8=0)printf(n);Ipnntf(,nj=%dn,j);return 0;三、程序阅读,写出程序运行结果。1. int main。int a=l,b=3,c=5,d=4,x:if (ab)if (cd) x=l;elseif (ac)if(b0)case 1: switch (b0)case 1: printf(); break ;case 2: printf(H!); break ;case 0: switch (c=5)case 1: print
22、f(*); break ;case 2: printf(#); break ; default: printfC#); break ;Idefault: prinlf(&”);printf(侦);return 0;输出:*&zint main ()int x,y;for (x=l,y=l ;xv=10; x+)if (y10) break;if(y%3=l)y+=3 ; continue ;I y-=5;printf(%d,%dn,y,x);return 0;输出:13,5找寻两个数的最小公倍数。int main ()(int x,y,z,t;scanf(d,%d”,&x,&y);if(xy)
23、t=x;x=y;y=t;z=x;doif(z%x=0&z%y=0) break;else z+;while(l);printf(gbs=%dn,z);return 0;键盘输入数据:18/输出:gbs=40int main()(int i,j;for (i=l; i=3; i+)for(j=l;jv=i;j+)printfC* ”);for (j=l;jv=7-2*i;j+)printf(*);prinif(n”);)return 0;输出:*米*木*四、编程题编程实现,键盘输入4个整数a,b,c,d,输出其中的最小数。解:#includeint main()(int a.b,c,d,s;pr
24、intf(”请输入个数字,scanf(d%d%d%d”,&a,&b,&c,&d);if(ab) s=b;else s=a;if(sc)s=c;if(sd)s=d;printf(”最小是:%d,s);return 0;1. 编程实现,键盘输入3个整数a,b,c,按照由小到大的顺序输出这三个整数。 解:7、设x、y均为float型变量,那么以下不合法的赋值语句是( B )A. +x ;B. y=(x%2)/10 ;C. x*=y+8;D. x=y=0 ;解析:运算符要求两端的操作数必须为整型,而在答案B中号两端的操作数为x和2, x 为实型,所以是错误的。8、以下不正确的转义字符是(C )A. W
25、B. VC. 19,D. 0解析:转义字符是由单引号括起来的带反斜线的字符,这些字符具有特殊的含义,反斜线后可 以是数字来代表某个字符,而这些数字只包括两种:八进制(1-3位)和十六进制(1-2位)。 十六进制前面要加x (或X),这里的C答案反斜线后是数字,但不是x开头,所以应该是八 进制数,但是数值里有9,和八进制数不符,所以是错误的。9、以下不是C语言常量的是(A )A. e-2B. 074C. aD. * 0 *解析:C语言的常量分为整型、实型、字符型和字符串。整型常量的书写形式分为十进制、八 进制和十六进制,十进制是09的数值表示;八进制是以0开头,07的数值表示,十六进制 是以Ox
26、 (或0X)开头,09与af (或AF)表示。实型常量的书写分为小数形式和指数形 式,小数形式指只包含小数点的形式,如:0.056或300.57;指数形式只指用包含e (或E)的 书写形式,要求e (或E)的前面必须有数值,后面必须是整数的书写规那么。字符型常量指单 引号引起来的单个字符或转义字符。字符串常量是指双引号引起的多个字符。这里答案A是 实型的指数书写形式,但是这种书写形式要求e前面必须有数值,后面必须是整数,而这里所 以是错误的。10、设int类型的数据长度为2个字节,那么unsigned int类型数据的取值范围是(B )A. ()-255B. 0-65535C. -32768-
27、32767D. -256-255解析:2个字节为16个二进制位,且是无符号型,故范围为0到2,6-1=65535,故答案选B;11、假设定义了 int x;那么将x强制转化成双精度类型应该写成( A )A. (double) xB. x (double)C. double (x) D. (x) double解析:A为C语言强制转换的标准书写形式;12、在C语言中,要求参加运算的数必须是整数的运算符是(C )。A. / B. *C. %D.=解析:C选型的为求余运算符,其要求两端的运算数必须为整型。13、为了计算s=10!(即1()的阶乘),那么s变量应定义为( D )。A. int B. un
28、signed C. long D.以上三种类型均可解析:在TC F,此题答案是C,在VC6.0卜此题答案是D,因为两个编译器对int类型数据 的空间分配的大小不一样,在TC下是2字节,在VC6.0下是4字节,所以取值范围也就不一 样。14、putchar ()函数可以向终端输出一-个( D )。A、整型变量表达式值B、实型变量值C、字符串D、字符或字符型变量值#includeint main()(int a,b,c,s;scanf(d%d%d”,&a,&b,&c);if(ab)(s=b; b=a; a=s;if(ac)s=c; c=a; a=s;Iif(bc)(s=c; c=b; b=s;pr
29、intf(%d%d%dn,a,b,c);return 0;I2. 如果有如下的分段函数,编程实现,键盘输入x的值,输出y的值。x2+8(x10)4x+5(10x40)解:#includeint main()int x,y;scanf(%d,&x);if(x10) y=x*x+8;else if(xv40)y=4*x+5;else y=2*x-3;printf(%d,y);return 0;)3. 编程实现,键盘输入一个整数,判断它是奇数还是偶数,假设是偶数那么进一步判断它是否为4的倍数。 解:#includein( main()int a;scanf(%d.&a); if(a%2=0)if(a
30、%4=0)printfC*这是一个偶数能被4整除,elseprintff这是一个偶数不能被4整除勺;else prinf(这是一个奇数”);return 0;4. 编程实现,输入某学生某门课程的五级制成绩A,B,C,D,E(或,a?b*,,T,8),输出该五级 制成绩对应的分数段信息。对应关系为:A级对应90分以上,B级对应80-89分,C级对应70-79 分,D级对应60-69分,E级对应60分以下。解:#includeini main()(int a,b;scanf(%d,&a);b=a/10;switch(b)(case 6: printfCD); break;case 7: print
31、fCC); break;case 8: printf(B); break;case 9:case 10: printf(A); break;default: printf(E);return 0;5. 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1 口起开始“三天打鱼两天晒 网,请编辑程序判断这个人在以后的某一天中是在打鱼,还是在晒网。解:#includeint main()(int Year,Month,Day;/*sumday变量用来存放计算的总天数*/int sumday,Xyear= 199O.rn;printfC1请输入年月日(空格分隔):”);scanf(H%d %d
32、%d,&Year,&Mon山,&Day);if(Year1990)printfC该年份输入错误! n”);return;计算输入年份之前至1990年1月1日的天数,Xyear作为年份自变量 for(surnday=0;XyearYear;Xyear+)/*判断当前计算的年分是否属于闰年*/m=Xyear%4=0&Xyear% 100!=0|Xyear%400=0;if(rn=l)sumday+=366;elsesurnday+=365;/*累加计算输入年份当月之前的天数*/m=Year%4=0&Year% 100!=0|Year%400=0;switch(Month-l)(case 12: s
33、umday+=31;case 11: sumday+=3();case 10: sumday+=31;case 9: sumday+=30;case 8:sumday+=31;case 7:sumday+=31;case 6:sumday+=30;case 5:sumday+=31;case 4:sumday+=30;case 3:sumday+=31;case 2:if(rn= 1 )suniday+=29: else suniday+=28;case l:sumday+=31;/*累加当前输入月的天数*/sumday+=Day;/*根据计算总天数与5的余数判断其形式,前天三为打鱼,后两天为
34、哂网*/switch(suinday%5)(case 1:case 2:case 3:printf(打鱼n);break;case 4:case O:printf(0ffi 网 n);break;return 0;6. 假设银行一年整存零取的月息为0.63%,现在某人手中有一笔钱,他打算在今后的五年中每年的年 底取出100()元,到第五年时刚好取完,请编辑程序算出他存钱时应存入多少。解:*问题分析与设计分析存钱和取钱的过程,可以采用倒推的方法。假设第五年年底连本带息要取1000元,那么要先求出第五年年初银行存款的钱数:第五年初存款=l(X)0/(l +12*0.0063)依次类推可以求出第四年
35、、第三年.的年初银行存款的钱数:第四年年初存款=(第五年年初存款+1000)/(1 +12*0.0063)第三年年初存款=(第四年年初存款+1000)/(1 +12*0.0063)第二年年初存款=(第三年年初存款+1000)/(1 + 12*0.0063)第一年年初存款=(第二年年初存款+1 ()()()/(1 +12*0.0063)通过以上过程就可以很容易地求出第一年年初要存入多少钱。#includeint main()(int i;float totai=0;/*i为年数,取值为第5至第I年,total每次计算结果为第i年初存款数额*/for(i=5;i0;i-)total=(total+
36、 l(X)0)/(l +O.OO63* 12);/*第五次循环后的计算结果即为最初第1年的存款数额*/printf(他存钱时应存入.2f元。n,total);return 0;7. 买买提将养的一缸金鱼分四次出售:第一次卖出全部的一半加一条,第二次卖出余下的三分之一加 两条,第三次卖出余下的四分之一加三条,最后卖出余下的27条。编程输出原来鱼缸中共有多少条鱼。 解:#i ncl udeint main()int fish=27;for(int i=3;i();i-)fish=(fish+i)*(i+ l)/i;IprintfC*原来鱼缸中共有1条鱼n”,fish);return 0;8. 编程
37、实现九九乘法表的输出,要求使用for循环实现。解:#includeint main()(int i,j;for(i=l;i10;i+)for(j=l;jv=i;j+)printf(%d*%d=%dti,j,(i*j);printf(un);return 0;9. 编程实现,输出100到200间所有的完全数。所谓完全数是指一个数恰好等于它的所有因子之和, 这样的数称为完全数。解:#includeint main()int s,i,j;for(i=100;i=200:i+)(s=0;for(j=1 ;j=i/2;j+)if(i%j=O)s+=j;if(s=i)printf(%dt,i);retur
38、n 0;I10. 输出1到100中能被3整除但不能被4整除的数,要求使用continue语句实现。解:#include int main()int i;for(i=l;i100;i+)if(i%3! =0&i%4=0)continue; printf(%d ”,i);return 0;编程实现,按下面的公式求m的近似值,要求精确至让vle-6为止(或者公式中n的值由键盘输 入)。用1111 1m= +.1! 2! 3! 4! n 解:方法一:精确到-le-6为止n#include#includc int main()int n,i;float m= l,s=l;for(i=2;i+)s*=i*
39、(-l);if(fabs(l/s) 1 e-6)break;m+=l/s;printf(%f,m);return 0;方法二:公式中n的值由键盘输入#includeint main()int n,i;float m= l,s=l;scanf(%d”,&n);for(i=2;i=n;i+)s*=i*(-l);m+=l/s;Iprintf(%f,m);return 0;9 oco有一个有规律的分数数列:一,二,2,,编程求该数列前2()项之和。1235解:#includeint main()float s=0;int sl = l,s2=2,i;for(i=0;i20;i+)(s+=(float)s2/s I;s2=sl+s2;s I =s2-s I;printf(%fs);return 0;己知一个直角三角形中3条边x,y,z的长度均为整数,其中1条直角边x的长度己确定,斜边y的 长度不能超过某个整数n,输出满足条件的所有直角三角形,x和n的值由用户键盘输入。解:#include#i ncludeint main()(in