第1部分 习 题 解 析 第1部分习题解析 1.1习题1 1. 单项选择题 (1) 一个C程序的执行是从()。 A. 本程序的main()函数开始,到main()函数结束 B. 本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C. 本程序的main()函数开始,到本程序文件的最后一个函数结束 D. 本程序文件的第一个函数开始,到本程序main()函数结束 答案: A 解析: C语言程序是由函数组成的,有且只有一个main()函数,其执行是从main()函数开始,到main()函数结束。 (2) 以下叙述正确的是()。 A. 在C程序中,main()函数必须位于程序的最前面 B. 程序的每行中只能写一条语句 C. C语言本身没有输入/输出语句 D. 在对一个C程序进行编译的过程中,可发现注释中的拼写错误 答案: C 解析: C语言程序是由函数组成的,main()函数的位置是任意的,其输入/输出也是由函数完成的。程序语句可以占一行,也可以一行包含多个语句,只要用分号隔开就可以。注释语句只是起解释和说明作用,并不能发现其中的拼写错误。 (3) 以下叙述不正确的是()。 A. 一个C源程序可由一个或多个函数组成 B. 一个C源程序必须包含一个main()函数 C. C程序的基本组成单位是函数 D. 在C程序中,注释说明只能位于一条语句的后面 答案: D 解析: 注释语句可以单独占一行,也可以位于一条语句的后面。 (4) C语言规定: 在一个源程序中,main()的位置()。 A. 必须在最开始B. 必须在系统调用的库函数后面 C. 可以任意D. 必须在最后 答案: C 解析: C语言程序是由函数组成的,main()函数的位置是任意的。 (5) 一个C语言程序由()。 A. 一个主程序和若干子程序组成B. 函数组成 C. 若干过程组成D. 若干子程序组成 答案: B 解析: C语言程序是由函数组成的,因此C语言也称为函数语言。 2. 填空题 (1) C源程序的基本单位是。 答案: 函数 解析: C语言程序是由函数组成的,其基本单位就是函数。 (2) 一个C源程序中至少包括一个。 答案: 主函数或main()函数 解析: C语言程序是由函数组成的,一个C语言程序至少包含一个main()函数。 (3) 在C语言中,格式化输入操作是由库函数完成的,格式化输出操作是由库函数完成的。 第 1 部 分 习题解析 C语言程序设计教程学习指导(第2版) 答案: scanf()、printf() 解析: C语言程序是由函数组成的,其输入/输出也是由函数完成的,格式化输入是由函数scanf()完成,而格式化输出是由函数printf()完成。 1.2习题2 1. 单项选择题 (1) C语言中的标识符只能由字母、数字和下画线三种字符组成,且第一个字符()。 A. 必须为字母 B. 必须为下画线 C. 必须为字母或下画线 D. 可以是字母、数字和下画线中的任意一种 答案: C 解析: C语言标识符的命名规则: 只能由字母、数字、下画线组成,第一个字符不能为数字字符,不能是C语言的关键字。 (2) 下面四个选项中,均是不合法的用户标识符的选项是()。 A. Ap_odoB. floatlao_A C. bagotointD. _123tempINT 答案: C 解析: 根据C语言标识符的命名规则: 只能由字母、数字、下画线组成,第一个字符不能为数字字符,不能是C语言的关键字。“”不能组成C语言的标识符,goto和int都是C语言的关键字。 (3) 下面正确的字符常量是()。 A. 'c"B. '\\"C. 'w'D. " 答案: C 解析: C语言的字符是指: 一对单引号之间的一个普通字符或转义字符。 (4) 在C语言中,char型数据在内存中的存储形式是()。 A. 补码B. 反码 C. 原码D. ASCII码 答案: D 解析: 字符型数据在计算机内存中占1字节(8个二进制位,且最高位为0),转换后就是对应的ASCII值。 (5) 在C语言中,要求运算数必须是整型的运算符是()。 A. /B. ++ C. !=D. % 答案: D 解析: C语言规定: 取余运算符的运算对象必须为整数。 (6) 若x、i、j和k都是int型变量,则计算表达式x=(i=4,j=16,k=32)后,x的值为()。 A. 4B. 16 C. 32D. 52 答案: C 解析: 括号里面是逗号表达式,根据逗号表达式的运算规则,其值为32,再将32赋给变量x。 (7) 假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值是()。 A. 7B. 8 C. 6D. 2 答案: B 解析: 逗号表达式,b++后b的值为6,所以a+b的值为8,即为该逗号表达式的值。 (8) 设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的数据类型为()。 A. intB. float C. doubleD. 不确定 答案: C 解析: 先将f转换为double,'a'转换为int类型(97),然后计算i*f,得到double类型,再计算10+97,得到整型类型(107),再将107转换为double类型和i*f相加,最后得到double类型的结果。 (9) 若有数学式3aebc,则不正确的C语言表达式是()。 A. a/b/c*e*3B. 3*a*e/b/c C. 3*a*e/b*cD. a*e/c/b*3 答案: C 解析: 3ae是分子上的式子,bc是分母上的式子,因此分母的式子必须在除号/的后面或用括号括起来。 (10) 表达式18/4*sqrt(4.0)/8值的数据类型为()。 A. floatB. char C. doubleD. 不确定 答案: C 解析: 先计算sqrt(4.0)得到double类型的结果2.0,18/4得到整数4,再将4转换为double类型的数据,和2.0相乘得到double类型的数据8.0,再将整数8转换为double类型数据,相除得到double数据1.0。 (11) 判断字符型变量c1是否为小写字母的正确表达式为()。 A. 'a'<=c1<='z'B. (c1>=a)&&(c1<=z) C. ('a'>=c1)||('z'<=c1)D. (c1>='a')&&(c1<='z') 答案: D 解析: 小写字母的ASCII码值是从小到大排列的(a:97,z:122),因此变量c1的取值范围为97≤c1≤122,写成C语言的表达式为(c1>='a')&&(c1<='z')。 (12) 设int a=1,b=2,c=3,d=4,m=2,n=2; 执行(m=a>b) && (n=c>d)后n的值为()。 A. 1B. 2C. 3D. 4 答案: B 解析: 这是短路表达式,a>b为假,则m=0,由于是进行的“与”运算,这样n=c>d就不用执行了,整个表达式的值就是0。 (13) 下列表达式中,不满足“当x的值为偶数时值为真,为奇数时值为假”的要求的是()。 A. x%2==0B. !(x%2==0) C. (x/2*2-x)==0D. !(x%2) 答案: B 解析: x%2==0表示x为偶数,即满足偶数为真,奇数为假。取反即满足题意。 2. 填空题 (1) 在C语言中,不带任何修饰符的浮点常量,是按类型数据存储的。 答案: 双精度(或double) 解析: C语言规定,不带任何修饰符的整数为int类型,浮点数为double类型。 (2) C语言中的标识符只能由三种字符组成,它们是、和。 答案: 字母、数字、下画线 解析: C语言标识符的命名规则: 只能由字母、数字、下画线组成,第一个字符不能为数字字符,不能是C语言的关键字。 (3) 若s是int型变量,s=6; 则表达式s%2+(s+1)%2的值为。 答案: 1 解析: s%2的结果是0,而(s+1)%2的结果是1,因此整个表达式的值为1。 (4) 若a是int 型变量,则表达式(a=4*5,a*2),a+6的值为。 答案: 26 解析: 这是一个逗号表达式,其中的一个运算对象又为逗号表达式。先计算括号内的逗号表达式,a的值为20,括号内的表达式的值为40,而a+6相当于20+6,即26,因此整个表达式的值为26。 (5) 若a、b和c均是int型变量,则计算表达式a=(b=4)+(c=2)后,a值为,b值为,c值为。 答案: 6、4、2 解析: 求赋值表达式的值,赋值表达式b=4的值为4,c=2的值为2,因此a的值为6。 (6) 若x和n均是int型变量,且x和n的初值均为5,则计算表达式x+=n++后x的值为,n的值为。 答案: 10、6 解析: 这是复合赋值,相当于x=x+(n++),因此x=5+5,而n自加后为6。 (7) 若定义: int a=2,b=3;float x=3.5,y=2.5;则表达式(float)(a+b)/2+(int)x%(int)y的值为。 答案: 3.500000 解析: 求混合数据类型的表达式的值,(float)(a+b)/2为5.0/2,即2.5。(int)x%(int)y相当于3%2,即为1; 因此整个表达式的值为3.500000。 (8) 假设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为。 答案: 9 解析: 求逗号表达式的值,a++后a为3,b++后b为6,因此整个表达式的值为9。 (9) 若定义: int e=1,f=4,g=2;float m=10.5,n=4.0,k;则计算赋值表达式k=(e+f)/g+sqrt((double)n)*1.2/g+m后k的值是。 答案: 13.700000 解析: 先计算括号内的式子,(e+f)为5,(double)n为双精度的4.0,将各变量的值代入整个表达式得到5/2+sqrt(4.0)*1.2/2+10.5,即2+2.0*1.2/2.0+10.5=2.0+1.2+10.5=13.700000。 (10) 表达式8/4*(int)2.5/(int)(1.25*(3.7+2.3))值的数据类型为。 答案: 整型(或int) 解析: 先将2.5转换为整型数,再将(1.25*(3.7+2.3))的结果转换为整型数,这样参与运算的所有运算对象皆为整型数,因此最后的结果也为整型。 (11) 假设m是一个三位数,从左到右用a、b、c表示各位数字,则从左到右各个数字是bac的三位数的表达式是。 答案: ((m/10)%10)*100+(m/100)*10+m%10 解析: 分别取出m的个位、十位和百位上的数字,再进行相应的乘积和加法运算。 (12) 已知A=7.5,B=2,C=3.6,表达式A>B && C>A || AB的值是。 答案: 0 解析: 根据运算符的优先顺序,先计算!C得0,再计算关系表达式的值,A>B的值是1,再计算C>A的值为0,因此A>B && C>A的值为0,AB的值为0,所以整个表达式的值为0。 (13) 若有x=1,y=2,z=3,则表达式(x=1) && (x<=10) && (x>=200) && (x<=210) B. (x>=1) | | (x<=10) | | (x>=200) | | (x<=210) C. (x>=1) && (x<=10) | | (x>=200) && (x<=210) D. (x>=1) | | (x<=10) && (x>=200) | | (x<=210) 答案: C 解析: 根据数学知识,x应该是在[1,10]或在[200,210],且都是闭区间,因此只有C选项满足题意。 (7) C语言对嵌套if语句的规定是: 当缺省{ }时,else总是与()。 A. 其之前最近的if配对 B. 第一个if配对 C. 缩进位置相同的if配对 D. 其之前最近的且尚未配对的if配对 答案: D 解析: 根据C语言中嵌套的if语句中if和else的配对原则: 当缺省{}时,else总是与其前面的、最近的、没有配对的if匹配。 (8) 设int a=1,b=2,c=3,d=4,m=2,n=2; 执行(m=a>b) && (n=c>d)后n的值为()。 A. 1B. 2C. 3D. 4 答案: B 解析: 这是短路表达式。由于是与运算,因此只有当运算符两端都是非0时,整个表达式的值才为1,如果运算符左边表达式的值为0,则运算符右边表达式就不用计算了,整个表达式的结果肯定为0。由于a>b不成立,因此m=0,则右边n=c>d不用计算,所以n的值没有改变,仍然为2。 (9) 下述程序的输出结果是()。 #include #include int main() { int a=0,b=0,c=0; if(++a>0 | | ++b>0) ++c; printf("%d,%d,%d",a,b,c); system("pause"); return 0; } A. 0,0,0B. 1,1,1C. 1,0,1D. 0,1,1 答案: C 解析: 这是短路表达式。由于是或运算,因此只要当运算符两端有一个表达式是非0时,整个表达式的值就是1,如果运算符左边表达式的值为非0,则运算符右边表达式就不用计算了。++a的值为1,++b>0就不用再计算了,因此b的值没有发生改变,仍然为0。++c后c的值为1,所以a=1,b=0,c=1。 (10) 以下程序的输出结果是()。 #include #include int main() { int x=1,y=0,a=0,b=0; switch(x) { case 1:switch(y) { case 0: a++; break; case 1: b++; break; } case 2:a++; b++; break; case 3:a++; b++; } printf("a=%d,b=%d",a,b); system("pause"); return 0; } A. a=1,b=0B. a=2,b=1 C. a=1,b=1D. a=2,b=2 答案: B 解析: 在switch语句中的break每次只能跳出本层的switch,如果case后面的语句没有break,则继续往下执行。x=1,执行case 1后面的switch(y),y=0,从本层的case 0后面的语句开始执行,a++后a的值为1,break后跳出本层的switch结构,转到其后续语句case 2后面的语句执行,a++后a=2,b++后b=1,break后跳出本层的switch,转到后续语句printf("a=%d,b=%d",a,b)输出a=2,b=1。 (11) 有如下程序段: int k=2; while(k=0) {printf("%d",k);k--;} 则下面描述中正确的是()。 A. while循环执行10次B. 循环是无限循环 C. 循环体语句一次也不执行D. 循环体语句执行一次 答案: C 解析: while后面括号里是赋值表达式k=0,即表达式的值为0,循环体没有被执行,则应选C。 (12) 若运行以下程序时,输入2473↙,则程序的运行结果是()。 #include #include int main() { int c; while((c=getchar()) !='\n') switch(c-'2') { case 0: case 1: putchar(c+4); case 2: putchar(c+4); break; case 3: putchar(c+3); default: putchar(c+2); break; } printf("\n"); system("pause"); return 0; } A. 668977B. 668966C. 66778777D. 6688766 答案: A 解析: 每次从键盘上接收一个字符,遇到回车后结束循环。当输入字符2(c='2')时,c-'2'为0,从case 0进入,由于没有break语句继续往下执行,输出c+4(即6),同样后面没有break语句,则继续进行,再输出c+4(即6),遇到break语句,跳出switch。从键盘上接收字符4,c-'2'为2,从case 2进入,输出c+4(即8),遇到break语句,跳出switch,一直循环到输入回车('\n')。 (13) 以下程序段的循环次数是()。 for(i=2; i==0;)printf("%d",i--); A. 无限次B. 0次C. 1次D. 2次 答案: B 解析: i的初值为2,条件表达式是判断i与0是否相等,因此表达式的值为0(条件为假),跳出循环。 (14) 下面程序的输出结果是()。 #include #include int main() { int x=9; for(; x>0; x--) { if(x%3==0) { printf("%d",--x); continue; } } system("pause"); return 0; } A. 741B. 852C. 963D. 875421 答案: B 解析: 从题目的输出可以得出,当x能被3整除后,输出 --x。因此很容易得出9~1中能被3整除的数只能是9、6、3,对应的输出为8、5、2。 (15) 下面程序的输出结果是()。 #include #include int main() { int k=0,m=0,i,j; for(i=0; i<2; i++) { for(j=0; j<3; j++) k++; k-=j; } m = i+j; printf("k=%d,m=%d",k,m); system("pause"); return 0; } A. k=0,m=3B. k=0,m=5C. k=1,m=3D. k=1,m=5 答案: B 解析: 外循环做一次,内循环做三次,三次内循环做完后k=3,j=3,k-=j后k=0。即每次内循环后k的值都为0,而外循环完成后i=2,因此m=5,k=0。 2. 填空题 (1) 一个表达式要构成一个C语句,必须。 答案: 用;表示结束 解析: C语言的语句结束,后面必须加“;”号。 (2) 复合语句是用一对界定的语句块。 答案: { } 解析: 复合语句是在逻辑上由多条语句组成的,必须用一对{ }括起来。 (3) 写出数学式子y=1,x<0 0,x=0 -1,x>0的C语言表达式: 。 答案: y=x<0?1:x==0?0:-1 解析: 要求用表达式而不是用条件语句,因此采用条件运算符的嵌套来解决。 (4) 将条件“y能被4整除但不能被100整除,或y能被400整除”写成逻辑表达式。 答案: y%4==0&&y%100!=0||y%400==0 解析: 判断闰年的条件。 (5) C语言的语法规定: 缺省复合语句符号时,else子句总是与的if相结合,与书写格式无关。 答案: 上面的离它最近的未配对 解析: 嵌套的if else语句的配对原则。 (6) switch语句中,如果没有与该值相等的标号,并且存在default标号,则从开始执行,直到switch语句结束。 答案: default标号 解析: 就是指没有case 后面的值与switch的表达式的值相等时,只能执行default标号后面的语句。 (7) C语言三个循环语句分别是语句、语句和语句。 答案: while、do…while、 for 解析: C语言的循环语句包括while、do…while、for三种结构。 (8) 至少执行一次循环体的循环语句是。 答案: do…while 解析: do…while循环是先执行后判断,不管条件是否满足,都要先执行一次循环体。 (9) continue语句的作用是结束循环。 答案: 本次 解析: continue语句只能用在循环语句结构中,其功能是结束本次循环(continue后面的语句不执行),开始下次循环。 (10) 用break语句可以使程序流程跳出switch语句体,也可以在循环结构内中止循环体。 答案: 本层 解析: break语句可以用在switch和循环语句中,其功能是结束本层循环或跳出本层的switch结构。 3. 程序阅读题 (1) 若运行时输入100↙,以下程序的运行结果是。 #include #include int main() { int a; scanf("%d",&a); printf("%s",(a%2!=0)? "No":"Yes"); system("pause"); return 0; } 答案: Yes 解析: 100除以2的余数为0,因此条件运算符中运算对象1的值为0(条件为假),取值为Yes。 (2) 以下程序的运行结果是。 #include #include int main() { int a=2,b=7,c=5; switch(a>0) { case 1: switch(b<0) { case 0: printf("@"); break; case 1: printf("!"); break; } case 0: switch(c==5) { case 0: printf("*"); break; case 1: printf("#"); break; default: printf("#"); break; } default: printf("&"); } printf("\n"); system("pause"); return 0; } 答案: @#& 解析: a=2,则a>0的值为1,从case 1进入执行switch(b<0),因b=7,则b<0的值为0,于是从case 0进入输出@,遇到break后跳出内层switch结构,到外层swtich的case 0处执行switch(c==5),因c=5,则c==5的值为1,于是从case 1进入输出#,遇到break后跳出内层switch结构到default处,输出&。 (3) 阅读下面程序,输入字母A时,其运行结果是。 #include #include int main() { char ch; ch=getchar(); switch(ch) { case 65:printf("%c",'A'); case 66:printf("%c",'B'); default:printf("%s\n","other"); } system("pause"); return 0; } 答案: ABother 解析: 字母A的ASCII码为65,当输入A时,从case 65进入,输出A,由于没有break语句,则继续执行下面语句,输出B、other,直到return 0;。 (4) 下面程序运行的结果是。 #include #include int main() { int k=1,n=263; do { k*= n%10; n/=10; } while(n); printf("%d\n",k); system("pause"); return 0; } 答案: 36 解析: 对263进行数位分离,将各数位上的数字相乘,并输出这个乘积。 (5) 下面程序运行的结果是。 #include #include int 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); } system("pause"); return 0; } 答案: 2870 解析: 本题如果按从上往下执行的思路,就比较烦琐。可以逆向思考: 在4~103中,能被7整除的数有7、14、21、28、35、42、49、56、63、70、77、84、91、98,这些数中减1能被3整除的有7、28、49、70、91,只剩下5个数了,在这剩下的5个数中减2能被2整除的就只剩下28和70了。 (6) 下面程序运行的结果是。 #include #include int main() { int i,b,k=0; for(i=1; i<=5; i++) { b=i%2; while(b--==0) k++; } printf("%d,%d",k,b); system("pause"); return 0; } 答案: 2,0 解析: 当b=0(即i为偶数)时,k才自加1,1~5中只有2、4两个偶数,因此k=2,最后一次循环i=5,则b=1,b--后b的值为0。 (7) 下面程序运行的结果是。 #include #include int main() { int a,b; for(a=1,b=1; a<=100; a++) { if(b>=20) break; if(b%3==1) { b+=3; continue; } b-=5; } printf("%d\n",a); system("pause"); return 0; } 答案: 8 解析: 当b≥20时,结束for循环,b<20且b%3的余数为1时,b的值增加3并执行continue语句,结束本次循环,执行a++后开始下一次循环。若b%3的余数不为1时,则b的值减5。可以通过下面列表观察a,b的值。 b 1 4 7 10 13 16 19 22 a 1 2 3 4 5 6 7 8 (8) 下面程序运行的结果是。 #include #include int main() { int i=5; do { switch(i%2) { case 0: i--; break; case 1: i--; continue; } i--; i--; printf("%d",i); }while(i>0); system("pause"); return 0; } 答案: 1 解析: i=5,i%2的余数为1,执行case 1后面的语句,i--后,i=4,执行continue语句,结束本次循环,开始下一次循环。i%2的余数为0,执行case 0后面的语句,i--后i=3,执行break,跳出switch结构,执行i--; i--; 后i=1,输出i。因i>0,继续循环,i%2的余数为1,执行case 1后面的语句,i--后,i=0,执行continue语句后,不满足继续执行循环的条件,结束整个循环。 (9) 下面程序运行的结果是。 #include #include int main() { int i,j; for(i=0;i<3;i++,i++) { for(j=4; j>=0; j--) { if((j+i)%2) { j--; printf("%d, ",j); continue; } --i; j--; printf("%d, ",j); } } system("pause"); return 0; } 答案: 3,1,-1,3,1,-1 解析: j+i为奇数时,执行if结构的语句序列,否则执行if语句的后续语句。i=0,j=4,i+j是4为偶数,执行--i,j--后i=-1,j=3,输出j。j--后j=2,执行内循环,j+i是1,执行j--后j=1,输出j。执行continue语句,结束本次循环。j--后j=0,j+i=-1,执行if语句体,j--后输出j=-1,结束j循环,开始i的下一次循环。i++,i++后i=1,j=4,重复上述过程直到i≥3。 (10) 下面程序运行的结果是。 #include #include int main() { int a=10,y=0; do { a+=2; y+=a; if(y>50) break; } while(a==14); printf("a=%d y=%d\n",a,y); system("pause"); return 0; } 答案: a=12,y=12 解析: 循环结束的条件是y>50或者a不等于14。循环开始时,执行a+=2后a=12,y+=a后y=12,循环条件a==14为假,循环结束。输出a和y。 (11) 下面程序运行的结果是。 #include #include int main() { int i,j,k=19; while(i=k-1) { k-=3; if(k%5==0) { i++; continue; } else if(k<5) break; i++; } printf("i=%d,k=%d\n",i,k); system("pause"); return 0; } 答案: i=6,k=4 解析: 由于while循环语句的表达式是赋值语句,因此只有当k=1时i的值才为0。循环开始k=19,i=18,执行循环体,k=16不能被5整除,执行i++,i=19,开始下一次循环,i=15,k=13,k不能被5整除。i++后i=16,开始下一次循环,i=12,k=10,k能被5整除,i++后执行continue,结束本次循环,开始下一次循环,i=12,k=7,不能被5整除,继续开始下一次循环,i=6,k=4结束循环。 (12) 下面程序运行的结果是。 #include #include int main() { int y=2,a=1; while(y--!=-1) do { a*=y; a++; } while(y--); printf("%d,%d\n",a,y); system("pause"); return 0; } 答案: 1,-2 解析: y--的值为2,y=1进入内循环do while,a*=y后a=1,a++后a=2,内循环的条件y--的值为1,然后y=0。再执行内循环,a=0,a++后a=1。y--为0,结束内循环,y=-1,外循环条件为假,y--后y=-2。 4. 程序填空题 (1) 以下程序输出x,y,z三个数中的最小值。 #include #include int main() { int x=4,y=5,z=8; int u,v; u = x #include int main() { char cx, front='\0'; while(!='\n') { if(cx!=' ') putchar(cx); if(cx==' ') if() putchar() front=cx; } system("pause"); return 0; } 答案: cx=getchar()、 cx!=front、cx 解析: 从键盘上输入字符,直到按回车键,并删除多余的空格字符。因此第一空填cx=getchar(),如果当前字符是空格,要判断前一个字符是否为空格,则第二空填cx!=front,如果前一个字符不是空格,说明没有两个连续的空格,直接输出cx。 (3) 以下程序的功能是: 从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入,请填空使程序完整。 #include #include int main() { double s; double gmax,gmin; scanf("%lf",&s); gmax=s; gmin=s; while() { if(s>gmax) gmax=s; if() gmin=s; scanf("%lf",&s); } printf("\ngmax=%lf\ngmin=%lf\n",gmax,gmin); system("pause"); return 0; } 答案: s>=0、s=0,第二空是判断是否为最小值,则应填s #include int main() { int n,k=1,s=0,m; for(n=1; n<=100; n++) { k=1; s=0; ; while() { k*=m%10; s+=m%10; ; } if(k>s) printf("%d",n); } system("pause"); return 0; } 答案: m=n、m!=0、m=m/10 解析: 因n为for语句的循环控制变量,而while语句中是对m进行除10求余,因此第一空应填 m=n,利用数位分离(除10取余再整除10,直到该数为0),因此第二空填m 或m!=0或m>0。第三空填m=m/10或m/=10。 (5) 已知如下公式: p2=1+13+1325+132537+13253749+… 下面程序的功能是根据上述公式输出满足精度要求的eps的π值,请填空使程序完整。 #include #include int main() { double s=1.0,eps,t=1.0; int n; scanf("%lf",&eps); for(n=1;; n++) { t=; s+=t; } ; system("pause"); return 0; } 答案: t>=eps、t*n/(2*n+1)、printf("%lf\n",2*s) 解析: 当满足精度要求时就停止循环,因此第一空填t>=eps。从第二项开始前一项和后一项的关系是tn=tn-1×n2n+1,则第二空应填t*n/(2*n+1)。由于该数列之和为π2,且程序必须要有输出,则第三空应填printf("%lf\n",2*s);。 (6) 下面程序段的功能是计算1000!的末尾有多少个零,请填空使程序完整。 #include #include int main() { int i,k,m;