1《全国计算机等级考试二级教程——C语言程序设计》习题分析与详细解答第一章程序设计基本概念习题分析与解答1.1【参考答案】EXE1.2【参考答案】[1].C[2].OBJ[3].EXE1.3【参考答案】[1]顺序结构[2]选择结构[3]循环结构第二章C程序设计的初步知识习题分析与解答一、选择题2.1【参考答案】B)2.2【参考答案】D)2.3【参考答案】B)2.4【参考答案】A)2.5【参考答案】C)2.6【参考答案】A)2.7【参考答案】B)2.8【参考答案】B)2.9【参考答案】D)2.10【参考答案】C)2.11【参考答案】B)2.12【参考答案】B)2.13【参考答案】A)二、填空题2.14【参考答案】[1]11[2]122.15【参考答案】[1]4.2[2]4.22.16【参考答案】[1]{[2]}[3]定义[4]执行2.17【参考答案】[1]关键字[2]用户标识符2.18【参考答案】[1]int[2]float[3]double2.19【参考答案】floata1=1.0,a2=1.0;或floata1=1,a2=1;(系统将自动把1转换为1.0)2.20【参考答案】存储单元2.21【参考答案】3.52.22【参考答案】[1]a*b/c[2]a/c*b[3]b/c*a2.23【参考答案】把10赋给变量s2.24【参考答案】[1]位[2]1位二进制数据(0或1)2.25【参考答案】[1]8[2]127[3]01111111[4]-128[5]100000002.26【参考答案】[1]32767[2]-32768[3]10000000000000002.27【参考答案】[1]十[2]八[3]十六三、上机改错题2.28【分析与解答】第1行的错误:(1)include是一个程序行,因此在此行的最后不应当有分号(;)。2第2行的错误:(1)main()是主函数的起始行,不是语句,因此最后不应当有分号(;)。(2)在同一行上的/*mainfunction*/显然是注释;C语言规定:注释由/*开头,由*/结束,但在*号和/之间不得插入任何空格,而在此处“/*”和“*/”之间存在空格,因此,/*mainfunction*/的写法是错误的,而应写成:/*mainfunction*/。第3行的错误:(1)在主函数的起始行main()的后面是函数体,函数体由左花括号({}开始。但在函数体的第一行:float的前面缺少了左花括号({}。(2)在同一行上的/*/*risradius*/,/*sisareaofcircular*/*/显然是注释;C语言规定:注释由/*开头,由*/结束,并且开头的/*将去找最近的*/去配对,因此在/*/*risradius*/中,第一个/*与radius后的那个*/配上了对,结果紧跟在后面的那个逗号(,)落在了注释的外面,而构成了一个多余符号,为此,在编译时将报告“语法错”。/*sisareaofcircular*/*/中第一个*/就结束了注释,第一个*/就成了多余的了。第6行的错误:(1)printf(″%f\n″,s)应当是一条输出语句,但在最后缺少了一个分号。(2)printf(″%f\n″,s);是程序的最后一条语句,程序应当结束;但缺少了程序体结束所需的右花括号());此右花括号可以放在printf(″%f\n″,s);的后面,也可以放在printf(″%f\n″,s);的下一行上。2.27【分析与解答】第2行的错误:在main的后面缺少一对圆括号。第4行的错误:在c=4.0的后面缺少分号。第6行的错误:在printf(″%f\n″,v)的后面缺少分号。第三章顺序结构习题分析与解答一、选择题(单选题)3.1【参考答案】C)3.2【参考答案】C)3.3【参考答案】D)3.4【参考答案】C)3.5【参考答案】D)3.6【参考答案】B)3.7【参考答案】C)3.8【参考答案】D)3.9【参考答案】A)3.10【参考答案】B)3.11【参考答案】C)3.12【参考答案】D)3.13【参考答案】D)3.14【参考答案】A)3.15【参考答案】C)3.16【参考答案】C)3.17【参考答案】C)3.18【参考答案】D)把D的答案修改为:scanf(“%8f”,&c);3.19【参考答案】C)3.20【参考答案】B)3二、填空题3.21【参考答案】(1)-200,2500(2)i=-200,j=2500(3)i=-200j=25003.22【参考答案】[1]12[2]0[3]03.23【参考答案】[1]一条语句[2]分号(或;)3.24【参考答案】分号(;)3.25【参考答案】[1]:10025.811.89234[2]:100CR25.81CR1.89234CR[3]:100Tab25.81Tab1.892343.26【参考答案】x=127,x=127,x=177,x=7f,x=1273.27【参考答案】x=127,x=127,x=$127,x=$000127,x=%06d3.28【参考答案】a=513.789215,a=513.79,a=513.78921500,a=513.78921500三、编程题和改错题3.29【分析与解答】(1)主函数名main后应有一对圆括号。(2)第三行的printf语句用以提示输入,但是原样输出的字符串没有用双引号括起来;另外,从输入的形式看,输入的数据紧跟在提示之后,因此,printf格式串中最后不应该有换行符——\n。(3)因为输入项a、b、c从定义和计算结果来看都是double类型,因此,第四行scanf语句格式串中的格式说明不应当用%d而应当用%lf;且每一个变量之前应该加地址运算符&。(4)第七行的printf语句中应当把%d都改成%lf或%f;按输出要求在格式串中应添加相应的原样输出的字符;因为下一个printf的输出从新的一行开始,因此在本输出语句的格式串的最后应当加换行符——\n。(5)第八行的printf语句中应当把格式串整理合并放在输出项的前面,输出项放在后面,%d都改成%lf或%f;中间的\n删去。(6)请同学们自己写出修改后的程序,并上机调试。3.30【分析与解答】(1)分析:可用算术式560÷60把分钟换算成小时和分钟,商数就是小时数,余数就是分钟数。(2)确定变量的名字和定义变量的类型:在程序中把小时数放在变量h中,把分钟数放在变量m中。这两个变量的类型可以是整型(本题中采用整型),也可以是实型。(3)确定所用算法:求560÷60的商数,在C语言中可以用整除的算法,语句是h=560/60;。求余数可用求余运算符%:560%60,其值放入变量m中的语句是:m=560%60;。(4)设计输出格式。若输出的形式定为:小时:分钟,则按此形式设计输出语句。(5)把以上内容放在主函数的一对花括号中。(6)编写程序如下:main(){inth,m;h=560/60;m=560%60;4printf(″Theresult:%3d:%3d\n″,h,m);}运行结果是:Theresult:9:203.31【分析与解答】(1)确定变量的名字和定义变量的类型。若用a存放1500,用b存放350;用q存放商数,用r存放余数,所有变量应定义成int类型。(2)设计输入语句从终端输入1500和350;在输入语句之前,应当设计一个输出语句,用以提示输入。(3)可用整除求商数,结果放在变量q中。可用求余运算符%求两数之余数,结果放在变量r中。(4)设计输出语句。输出a、b、q、r。(5)把以上内容放在主函数的一对花括号中。本题的程序与3.30相似,请大家参考上题并根据本题的解释自己编程,并上机调试。3.32【分析与解答】(1)定义4个双精度变量a、b、c和ave,变量a、b、c分别存放读入的3个双精度数,ave存放它们的平均值。(2)设计输入语句,以及在此之前用于提示输入的(printf)语句。(3)设计求平均值的算法,把所求得的平均值放入变量ave中。(4)设计把变量ave中的数,从小数点后第二位数进行四舍五入的算法。现举例说明:若ave中的数为123.4644,为了保留此值小数点后一位,可用表达式:(int)(123.4644*10)/10.0;依次推算,为了保留此值小数点后二位,可用表达式:(int)(123.4644*100)/100.0;其他依此类推。(5)若要求对小数点后第二位数进行四舍五入,则可对原数加0.05后再进行以上运算。如要求保留123.4644小数点后一位且对第二位数进行四舍五入,可用表达式:(int)((123.467+0.05)*10)/10.0。注意:分母一定要用实数10.0而不能用整数10,否则就变成整除了;若要求保留123.4644小数点后两位且对第三位数进行四舍五入,可用表达式:(int)((123.467+0.005)*100)/100.0;其他依此类推。(6)设计输出语句。输出a、b、c和ave。(7)把以上内容放在主函数的一对花括号中。(8)编写程序如下:main(){doublea,b,c,ave;printf(″Entera,b,c:″);scanf(″%lf%lf%lf″,&a,&b,&c);ave=(a+b+c)/3;printf(″ave=%f\n″,ave);/*用以比较四舍五入前后的数据*/ave=(int)((ave+0.05)*10)/10.0;/*上句也可写成ave=(int)(ave*10+0.5)/10.0;*/printf(″a=%f,b=%f,c=%f,ave=%f\n″,a,b,c,ave);}3.33【分析与解答】(1)关于对变量中的数进行交换的算法请参考3.7题中的解释和《教程》中有关的例题。(2)定义4个整型变量a、b、c和t,变量a、b、c分别存放读入的3个整数,t用作临时存储单元。5(3)设计输入语句,以及在此之前用于提示输入的(printf)语句。(4)输出a、b、c中的值,以便于比较。(5)交换的步骤如下:①把c中的值赋给t。②把b中的值赋给c。③把a中的值赋给b。④把t中的值赋给a。经过以上步骤,已按要求进行了交换。(6)输出a、b、c中的值。(7)编写程序如下:main(){inta,b,c,t;printf(″Entera,b,c:\n″);scanf(″%d%d%d″,&a,&b,&c);printf(″(1)a=%d,b=%d,c=%d\n″,a,b,c);t=c;c=b;b=a;a=t;printf(″(2)a=%d,b=%d,c=%d\n″,a,b,c);}第四章选择结构习题分析与解答一、选择题4.1【参考答案】A)4.2【参考答案】B)4.3【参考答案】A)4.4【参考答案】D)4.5【参考答案】C)4.6【参考答案】A)4.7【参考答案】B)4.8【参考答案】C)4.9【参考答案】D)4.10【参考答案】D)二、填空题4.11【参考答案】[1]非零[2]零4.12【参考答案】、、=、=、==、![KG-*2]=4.13【参考答案】[1]![2]&&[3][JB1|][JB1|]4.14【参考答案】[1]:![KG-*2](逻辑非)[2]:、、=、=(小于、大于、小于等于、大于等于)[3]:==、![KG-*2]=(等于、不等)[4]:&&(逻辑与)[5]:[JB1|][JB1|](逻辑或)。4.15【参考答案】!4.16【参考答案】[1]a=b或ac[2][JB1|]x[JB1|]44.17【参考答案】14.18【参考答案】[1]x=0[2]14.19【参考答案】[1]3[2]2[3]24.20【参考答案】*#6三、编程题4.21【分析与解答】相关内容请参考《教程》4.2节和4.4节。(1)改写如下:switch(a/10){default:m=5;break;case0:case1:case2:m=1;break;case3:m=2;break;case4:m=3;break;case5:m=4;break;};