用C语言计算加减表达式比如输入金额的正则表达式34+12+35输出81

当前位置: >>
C语言控制语句题库
第三章 控制语句一、选择题 1. 以下语句中无限循环语句是 A)for(;2&5;); C)while(‘\0’); 答案:B 2. 若有程序段如下: a=b=c=0;x=35; if(!a)x--; else if(b);if(c)x=3; else x=4; 执行后,变量 x 的值是( ) A.34 B.4 C.35 答案:B。 B)while(1,2,3); D)for(;’\0’;);D.33. 下列 if 语句中,不正确的是( ) A.if (x&y)scanf (“%d”,&x) else scanf (“%d”, &y); B.if (x&y); C.if (x==y)x+=y; D.if (x&y){x++;y++;} 答案:A 4. 若有 int x,y;,执行程序段: for(x=1,y=1;y&50;y++) { if (x&=10) if(x%2==1) { x+=5; } x-=3; } 变量 x 的值最终为( ) A.11 B.12 C.13 D.10 答案:D 5. 若有 int x=3;,执行程序段: do { printf(&%3d&,x-=2); }while(!(--x)); 输出的结果是( ) A.1 3 B.1 -1 C.1 -2 答案 CD.1 -36. 有程序段: for (scanf (“%d”,&a);!a;) printf (“continue”); 则 for 语句中的!a 等价于( ) 。 (A)a!=0 (B)a= =0 (C)a&0 (D)a&=0 答案: (B) 7. 有如下程序段: int x=1,y=1; int m,n; m=n=1; switch (m) { case 0:x=x*2; case 1: { switch (n) { case 1:x=x*2; case 2:y=y*2; case 3:x++; } } case 2:x++;y++; case 3:x*=2;y*=2; default:x++;y++; } 执行完成后,x 和 y 的值分别是( ) 。 (A)x=6 y=6 (B)x=2 y=1 (C)x=2 y=2 答案: (A)(Dx=7 y=78. 以下描述不正确的是 。 A.使用 while 和 do-while 循环时,循环变量初始化的操作应在循环体语句之前完成 B.while 循环是先判断表达式,后执行循环语句 C.do-while 和 for 循环均是先执行循环语句,后判断表达式 D.for、while 和 do-while 循环中的循环体均可以由空语句构成 答案:C 9. 若 x 是 int 型变量,以下程序的输出结果是 。 for (x=3;x&6;x++) printf ((x%2)?(“**%d”):( “##%d\n”),x); printf (“\n”); A.* * 3 B.# # 3 C.# # 3 D.* * 3 # # 4 # # 4 * * 4 * * 4# # 5 * * 5 * * 5 # # 5 答案:D 10.与“for A)for B)for C)for D)for 答案:A (i=0;i&10;i++)putchar ('a'+i);”功能不同的语句是 (i=0;i&10;)putchar ('a'+(++i)); (i=0;i&10;) putchar ('a'+(i++)); (i=0;i&10;putchar ('a'+i),i++); (i=0;i&=9;i++)putchar ('a'+i); 。11.循环控制语句“while (!scanf (“%d”,&i)getchar ( );”执行的情况是 A)循环输入字符,遇文件结束符 EOF 退出 B)循环条件有错,不能执行 C)若输入数据 i 有错,暂停等待处理 D)键入 i 值后,回车退出循环 答案:A 12. 已知 x=3、y=2,则表达式 x*=y+8 的值为 A)3 B)2 C)30 D)10 答案:C 13. 设 x 为 int 型变量,则执行以下语句后,x 的值为 x=10;x+=x- =x-x; A)10 B)20 C)40 D)30 答案:B 。。。14. 在下列描述中,正确的一条是 。 A)if (表达式)语句中,表达式的类型只限于逻辑表达式 B)语句“goto 12; ”是合法的 C)for(;)语句相当于 while(1)语句 ; D)break 语句可用于程序的任何地方,以终止程序的执行 答案:C 15. 下面程序的输出结果是 #include &stdio.h& void main( ) { 。 int i,j,m=0,n=0; for (i=0;i&2;i++) for (j=0;j&2;j++) if (j&=i)m=1;n++; printf(&%d\n&,n); } A)4 答案:C B)2 C)1 D)016. 若输入字符串:abcde&回车&,则以下 while 循环体将执行 While ((ch=getchar ( ))= = ' e ')printf(& * &); A)4 B)5 C)0 D)任意 答案:C 17. 设 j 为 int 型变量,则下面 for 循环语句的执行结果是 for (j=10;j&3;j--) { if (j%3)j--; --j;--j; printf (&%d&,j); } A)6 3 B)7 4 C)6 2 D)7 3 答案:B 18. 以下循环体的执行次数是 。 #include &stdio.h& void main() { int i,j; for (i=0,j=1;i&=j+1;i+=2,j--) printf (&%d\n&,i); } A)3 B)2 C)1 D)0 答案:C 19. 以下程序的输出结果是 。 #include &stdio.h& void main( ) { int a=-1,b=1,k; if((++a&0)&&!(b--&=0)) printf(&%d %d\n&,a,b); else printf(&%d %d\n&, b, a); } A)-1 1 B)0 1 C)1 0 D)0 0次。。 答案:C 20. 下面程序的功能是输出以下形式的金字塔图案: * *** ***** ******* #include &stdio.h & void main( ) { int i,j; for(i=1;i&=4;i++) { for(j=1;j&=4-i;j+ +) printf( & &); for(j=1;j&= ; j++)printf( &*&); printf(&\n &); } } 在下划线处应填入的是 。 A)i B)2*i-1 C)2*i+1 D)i+2 答案:B 21. 以下程序的输出结果是 。 #include &stdio.h& void main( ) { for(i=1;i&6;i++) { if(i%2) { printf(&#&); } printf(&*&); } printf(&\n&); } A)#*#*# B)##### C)***** D)*#*#* 答案:A 22. 在下列选项中,没有构成死循环的程序段是 。 A)int i=100 B)for(;;); C)int k=1000; while(1) do {i=i%100+1; {++k;}D)int s=36; while(s); --s; if(i&100) } 答案:Cwhile(k&=10000);23. 运行下面的程序: #include &stdio.h& void main( ) { char c[6]; int i=0; for(;i&6;c[i]=getchar( ),i++); for(i=0;i&6;i++)putchar(c[i]); printf(&\n&); } 如果从键盘上输入: ab&回车& c&回车& def&回车& 则输出结果为 。 A)a B)a C)ab D)avcdef b b c c c d d d e f 答案:C 24. 下面程序的输出结果是( ) 。 #include &stdio.h& void main( ) { int x=5,a=0,b=0; if(x!=(a+b)) printf(&x=5\n&); else printf(&a=b=0\n&); } A)有语法错,不能通过编译 B)通过编译,但不能连接 C)x=5 D)a=b=0 答案:A 25. 当输入为”right?”时,下面程序的执行结果是( #include &stdio.h& void main( ) { ) 。 c=getchar( ); while((c=getchar())!='?') putchar(++c); } A)Right C)right 答案:B B)jhiu D)sjhiu?26. 下面程序的输出结果是( ) 。 #include &stdio.h& void main( ) { int x=3; do{ printf(&%3d&,x+=1); }while(--x); } A)4 B)4 4 C)4 4 4 D)死循环 答案:D 27. 若变量已正确定义,要求程序段写成 5!的计算,不能完成此操作的程序段是( A)for(i=1,p=1;i&=5;i++) p*=i; B)for(i=1;i&=5;i++){p=1;p*=i;} C)i=1;p=1;while(i&=5){p*=i;i++;} D)i=1;p=1;do{p*=i;i++;}while(i&=5); 答案:B 28. 有以下程序 #include &stdio.h& void main( ) { int i=1,j=2,k=3; if(i++==1&&(++j==3||k++==3)) printf(&%d %d %d\n&,i,j,k); } 程序运行后的输出结果是 (2005 年 4 月) (A)1 2 3 (B)2 3 4 (C)2 2 3 答案:D 29. 有如下程序 #include &stdio.h& void main( ) { ) 。(D)2 3 3 int i, for(i=1;i&=3;sum++) printf(&%d\n&,sum); } 该程序的执行结果是 (A)6 (B)3 答案:C 。 (C)死循环(D)030. 运行以下程序后,如果从键盘上输入 china#&回车&,则输出结果为 A)2,0 (B)5,0 (C)5,5 (D)2,5 #include &stdio.h& void main( ) { int v1=0,v2=0; while ((ch=getchar( ))!= '#') switch (ch) { case 'a': case 'h': default:v1++; case '0':v2++; } printf(&%d,%d\n&,v1,v2); } 答案:C 31. 下面程序运行结果是 。 #include &stdio.h& void main() { int a,b,c,d,x; a=c=0; b=1;d=20; if(a) d=d-10; else if(!b) if(!c)x=15; else x=25; printf(&%d\n&,d); } (A)20 (B)25 (C)15 答案:A 32. 写出下列程序的运行结果 。。(D)10 #include &stdio.h& void main() { int k=0;char c='A'; do { switch(c++) { case 'A':k++; case 'B':k--; case 'C':k+=3; case 'D':k=k%2; case 'E':k=k*6; default:k=k/4; } k++; }while (c&'G'); printf(&k=%d\n&,k); } (A)2 (B)k=2 (C)k=3 (D)k=6 答案:B 33. 定义:int x=7,y=8,z=9;后,则下面表达式为 0 的是 A)' x ' && ' y ' B)x&=y C)x||y+z&&y-z D)!((x&y) &&!z||1) 答案:D 。34. 若 w=1,x=2,y=3,z=4,则条件表达式 w&x?w:y&z?y:z 的值是 A)4 B)3 C)2 D)1 答案:D 35. 以下程序: #include &stdio.h& void main() { int w=4,x=3,y=2,z=1; printf(&%d\n&,(w&x?w:z&y?z:x)); } 其输出结果是 A)1 B)2 答案:A)。C)3D)436. 若 a 和 b 均是正整数变量,正确的 switch 语句是 A) switch(pow(a,2)+pow(b,2)) (注:调用求幂的数学函数) { case 1:case 3:y=a+b; case 0:case 5:y=a-b; } B) switch(a*a+b*b) { case 3: case 1: y=a+b; case 0: y= b - a; } C) switch a { default:x=a+b; case 10: y=a-b; case 11: x=a*d; } D) switch (a+b) { case 10: x=a+b; case 11: y=a-b; } 答案:D) 37. 对以下程序: #include &stdio.h& void main() { while((c=getchar())!='\n') { switch(c-'2') { case 0: case 1:putchar(c+4); case 2:putchar(c+4); case 3:putchar(c+3); default:putchar(c+2); } } printf(&\n&); } 从第一列开始输入数据:2473&CR&(&CR&代表回车符),程序的输出结果是 A)668977 B)668966 C) D)6688766 答案:A) 38. 以下程序: #include &stdio.h& void main() { int n[2]={0}, i,j,k=2; for(i=0;i&k;i++) for(j=0;j&k;j++) n[j]=n[i]+1; printf(&%d\n&,n[k]); } 其输出结果是 A)不确定的值 B)3 C)2 答案:A)D)139. 有以下程序 #include &stdio.h& void main() { int i=1,j=1,k=2; if((j++||k++)&&i++) printf(&%d,%d,%d\n&,i,j,k); } 执行后输出结果是 。 A)1,1,2 B)2,2,1 C)2,2,2 D)2,2,3 答案:C 40. 以下程序的输出结果是 。 #include &stdio.h& void main() { int a= -1,b=1,k; if((++a&0)&&!(b--&=0)) printf(&%d %d\n&,a, b); else printf(&%d %d\n&,b, a); } A)-1 1 B)0 1 C)1 0 答案:C 41. 阅读以下程序: #include &stdio.h& void main() {D)0 0 scanf (&%d&,&x); if (x--&5) printf(&%d&,x); else printf(&%d&,x++); } 程序执行后,如果从键盘上输入 5,则输出结果是 A)3 B)4 C)5 D)6 答案:B 42. 以下程序的输出结果是 。 #include &stdio.h& void main() { int n=4; while(n--) printf(&%d&,--n); } A)2 0 B)31 C)321 答案:A 43. 设有以下定义 int a=0;double b=1.25;char c= 'A' #define d 2 则下面语句中错误的是 。 A)a++; B)b++; C)c++; 答案:D 。 (2001 年 9 月)D)210D)d++;44. 有以下程序 #include &stdio.h& void main() { int a=3,b=4,c=5,d=2; if(a&b) if(b&c) printf(&%d&,d+++1); else printf(&%d&,++d+1); printf(&%d\n&,d); } 程序运行后的输出结果是 。 (2004 年 9 月) A)2 B)3 C)43 D)44 答案:A 45. 下列条件语句中,功能与其他语句不同的是 。 A)if(a) printf(&%d\n&,x);else printf(&%d\n&,y); B)if(a==0) printf(&%d\n&,y);else printf(&%d\n&,x); C)if(a!=0) printf(&%d\n&,x);else printf(&%d\n&,y); D)if(a==0) printf(&%d\n&,x);else printf(&%d\n&,y); 答案:D 46. 有以下程序 #include &stdio.h& void main() { for(i=0;i&3;i++) switch(i) { case 1:printf(&%d&,i); case 2:printf(&%d&,i); default:printf(&%d&,i); } } 执行后输出结果是 。 A)011122 B)012 C)012020 答案:A 47. 有以下主程序 #include &stdio.h& void main() { int a=15,b=21,m=0; switch(a%3) { case 0:m++; case 1:m++; switch(b%2) { default:m++; case 0:m++; } } printf(&%d\n&,m); } 程序运行后的输出结果是 。 A)1 B)2 C)3 D)4 答案:A 48. 以下程序的功能是:按顺序读入 10 名学生 4 门功课的成绩,计算出每位学生的平均分 并输出。程序如下:D)120 #include &stdio.h& void main() { int n,k; float score,sum, sum=0.0; for(n=1;n&=10;n++) { for(k=1;k&=4;k++) { scanf(&%f&,&score);sum+= } ave=sum/4.0; printf(&No%d:%f\n&,n,ave); } } 上述程序运行后结果不正确, 调试中发现有一条语句出现在程序中的位置不正确。 这条 语句是 。 A ) sum=0.0; B ) sum+= C ) ave=sum/4.0; D ) printf(“NO%d:%f\n”,n,ave); 答案:A 49. 有以下程序 #include &stdio.h& void main() { int i,n=0; for(i=2;i&5;i++) { do { if(i%3) n++; }while(!i); n++; } printf(&n=%d\n&,n); } 程序执行后输出结果是 。 A)n=5 B)n=2 C)n=3 答案:D 50. 执行下面的程序后,a 值为 #include &stdio.h & 。D)n=4 void main( ) { int a,b; for(a=1,b=1;a&=10 ;a ++) { if(b&=5) if(b%3==1) { b+=3; } b-=5; } printf(&%d&,b); } A)7 B)8 C)9 D)10 答案:A 51. 若有以下定义:int a,b; 则正确的 switch 语句是 。 A)switch(x) B)switch(x) { case 1.0:printf(“*\n”); { case 1,2:printf(“*\n”); case 2.0:printf(“**\n”); case 3:printf(“**\n”); } } C)switch(a+b) D)switch(a+b) { case 1:printf(“\n”); { case 1:printf(.”*\n”); case 1+2:printf(“**\n”); case 2:printf(“**\n”); } } 答案:C 52. 执行下面程序段的结果是 。 #include &stdio.h& void main( ) { int x=23; do { printf(&%2d&,x--); }while(!x); } A)打印出 321 B)打印出 23 答案:B 53. 下面程序的输出是 。C)不打印任何内容D)陷入死循环 #include &stdio.h& void main( ) { int x=3,y=6,a=0; while(x++!=(y-=1)) { a+=1; if(y&x) } printf(&x=%d,y=%d,a=%d\n&,x,y,a); } A)x=4,y=4,a=1 B)x=5,y=5,a=1 C)x=5,y=4,a=3 答案:D 54. 下面程序段的运行结果是 int n=0; while (n++&=2); printf (&%d&,n); A)2 B)3 答案:C 。D)x=5,y=4,a=1C)4D)有语法错误55. 已知 x、a、b、c、d 均为 int 型变量,则执行如下程序段后,m 的值是_______。 a = 1; b = 2; c= 3; d = 4; x = (a&b) ? a : x = (a&c) ? a : x = (a&d) ? a : A)4 B)3 C)2 D)1 答案:D 56. 若有以下定义语句 int a,b;则以下正确是_______。 A)switch(x) B)switch(x) { { case 1.0: printf(“*”); case 1,2: printf(“*”); case 2.0: printf(“* *”) ; case 2: printf(“**”) ; } } C)switch(a+b) D)switch(a) { { case 1: printf(“*”); case 1,2: printf(“*”); case 2: printf(“* *”) ; case 2: printf(“**”) ; } } 答案:C 57. 运行下列程序段后 x 的值是_______。 int a,b,c,x; a = 0; b = 0; c= 0; x = 7; if (!a) x--; else if (b); if(c) x=3; else x=4; A)4 B)6 答案:AC)7D)358. 运行下列程序段后 x 的值是_______。 int a,b,c,d; a = 1; b = 7; c= 15; d = 10; if (a&b) x--; if(c&d) x=1; else if (a&c) if(b&d) x=2 else x=3; else x=6; else x=7; A)1 B)2 C)6 答案:B 59. 如下程序的输出结果是_______。 #include &stdio.h& void main() { int a,b,c,d; a = 2; b = -6; c= 5; if (a&b) if(b&0) c=0; else c++; printf (& %d \n&, c); } A)0 B)1 答案:CD)7C)5D)660. 以下五条语句中有_______是合法的。 if (a=b) x++; if (a=&b) x++; if (a-b) x++; A)1 B)2 C)3 答案:Dif (a&=b&=c) x++; if(1) x++; D)461. 以下结论中正确的是_______。 A)break 语句是 switch 语句中的一部分 B)switch 语句中可以根据需要使用或不使用 break 语句 C)break 语句只能用于循环结构中 D)以上三个结论中没有一个正确 答案:B 62. 运行下列程序段后 x 的值是_______。 int a=10; switch (a) { case 9: a++; case 10: a++; case 11: a++; default: a++; } A)11 B)12 C)13 答案:CD)1063. 关于以下三条语句的描述中,正确的是_______。 ? if(a) a=1;else a=2; ? if(a= =0) a=2;else a=1; ? if(a!=0) a=1;else a=2; A)三条语句相互等效 B)三条语句中?与?等效 C)三条语句中??与?等效 D)三条语句各不等效 答案:A 64. 如下程序的输出结果是_______。 #include &stdio.h& void main() { int x=1,a=0,b=0; switch (x) { case 0: b++; case 1: a++; case 2: a++; b++; } printf (&a=%d , b=%d \n&, a,b); } A)a=2 , b=1 B)a=1 , b=1 答案:AC)a=1 , b=0D)a=1 , b=265. 下面的 4 段程序都试图求解整数 1 一 l0 的和,不能满足要求的是_______。 A) #include &stdio.h& B) #include &stdio.h& void main() void main() { { int i, int i,sum for(i =1,sum=0;i&=10;++ i) i =1,sum=0; sum+= for( ; i&=10;) printf(& i=%d sum=%d\n &,i,sum); sum+=i++; printf(&i=%d sum=%d\n &,i,sum); } C) #include &stdio.h& B)#include &stdio.h& void main() void main() { { int i, int i,sum i =1,sum=0; i =1,sum=0; for(;i&=10;++i,sum=sum+i); for( ; i&=10; sum=sum+i;++i) printf(&i=%d sum=%d\n&,i,sum); printf(&i=%d sum=%d\n&,i,sum); } } 答案:C 66. 下面程序的运行结果为_______。 #include &stdio.h& void main() { int i, i=1,sum=0; for (;i&=10;) ++i; sum=sum+i; printf(&i=%d sum=%d\n&,i,sum); } A) i=11,sum=55 B) i=10,sum=55 C) i=11,sum=11 D) 形成死循环 答案:C 67. 下面程序的运行结果为_______。 #include &stdio.h& void main() { double sum=0.0,x; for(x=0.0;x!=3.0;x+=0.1) sum+=x; printf(&\n x=%f&, x); } A) x=3.0 C) 会提示出错 答案:D 68. 下面程序的运行结果为_______。 #include &stdio.h& void main() {}B) x=2.0 D)形成死循环 int sum=0,x; for(x=0;x!=3;x+=1) sum+=x; printf(&\n x=%d, x=%d &,x,sum); } A) x=3, sum=3 C) 会提示出错 答案:A B) x=2, sum=3 D)形成死循环69. 定义如下变量 int n=10;则下列循环的输出结果是_______。 while(n&=7) { n--; printf(“%d\n”,n); } A)10 B)9 C)10 9 8 9 8 7 8 7 6 答案:BD)9 8 770. 有以下程序段,w 和 k 都是整型变量,则不能与它等价的循环语句是_______。 w=k; A: if(w==0) goto B; w--; printf(&*&); goto A; B: printf(&f&); A)for(w=k;w!=0;w--) printf(“*”); B)w=k; while(w--!=0) printf(“*”); w++ C)w=k; do{w--;printf(“*”);}while(w!=0); D)for(w=k;w;--w) printf(“*”); 答案:C 71. 若 i、j 已定义为 int 型,则以下程序段中内循环体的总的执行次数是_______。 for(i=6;i;i--) for(j=0;j&5;j++) {??} A)25 B)30 C)36 D)死循环 答案:B 72. 设 x 和 y 为 int 型变量,则执行下面的循环后,y 的值为_______。 for(y=1,x=1;y&=50;y++) { if (x&=10) if (x%2==1) { x+=5; } x-=3; } A)2 B)4 答案:CC)6D)873. 设 a 和 b 为 int 型变量,则执行下而的循环后,b 的值为_______。 a=1; b=10; do { b-=a; a++; }while(b--&10) A)-1 B)-2 C)8 D)9 答案:C 74. 当执行以下程序段时_______。 x=-1; do { x=x*x; }while(!x) A)循环体将执行一次 C)循环体将执行无限次 答案:AB)循环体将执行两次 D)会提示有语法错误75. 以下叙述正确的是_______。 A)do-while 语句构成的循环不能用其它语句构成的循环代替 B)do-while 语句构成的循环只能用 break 语句退出 C)用 do-while 语句构成的循环,在 while 后的表达式为非 0 时结束循环 D)用 do-while 语句构成的循环,在 while 后的表达式为 0 时结束循环 答案:D 76. 在以下程序段中,while 循环招待的次数是_______。 int k=0; while(k=1) k++; A)循环体将执行一次 B)循环体将一次也不执行 C)循环体将执行无限次 D)会提示有语法错误 答案:C 77. 以下程序执行后,sum 的值是_______。 #include &stdio.h& void main() { int n, for(n=1;n&6;n++) sum+=n; printf(&%d\n&,sum); } A)15 B)14 C)0 D)不确定 答案:D 78. 以下程序执行后,输出结果是_______。 #include &stdio.h& void main() { int n=0; while(n&=2) { n++; printf(&%d\n&,n); } } A)1 B)1 2 2 3 答案:AC)2 3D)279.当把以下四个表达式用作 if 语句的控制表达式时,有一个选项与其它三个选项含义不 同,这个选项是______。 A)k%2 B)k%2==1 C)(k%2)!=0 D)!k%2==1 答案:D 80.有以下程序 #include &stdio.h& void main() { int k=5,n=0; while(k&0) { switch(k) { default : case 1 : n+=k; case 2 : case 3 : n+=k; } k--; } printf(&%d\n&,n); } 程序运行后的输出结果是______。 A)0 B)4 答案:D 81.有以下程序 #include &stdio.h& void main() { int i=1,j=2,k=3; if(i++==1&&(++j==3||k++==3)) printf(&%d %d %d\n&,i,j,k); } 程序运行后的输出结果是______。 A)1 2 3 B)2 3 4 答案:DC)6D)7C)2 2 3D)2 3 382.若整型变量 a、b、c、d 中的值依次为:1、4、3、2。则条件表达式 a&b?a:c&d?c:d 的值 是______。 A)1 B)2 C)3 D)4 答案:A 83.有以下程序 #include&stdio.h& void main() { int i, s=0; for(i=1; i&10; i+=2) s+=i+1; printf(&%d\n&, s); } 程序执行后的输出结果是______。 A)自然数 1~9 的累加和 C)自然数 1~9 中奇数之和 答案:DB)自然数 1~10 的累加和 D)自然数 1~10 中偶数之和 86.有如下程序: #include&stdio.h& void main() { int s=0,a=1,n; scanf(&%d&,&n); do { s+=1; a=a-2; }while(a!=n); printf(&%d\n&,s); } 若要使程序输出值为 2,则应该从键盘输入的值是______。 A)-1 B)-3 C)-5 答案:B 87.有以下程序段 int n,t=1,s=0; scanf(&%d&,&n); do{ s=s+t; t=t-2; }while (t!=n); 为使此程序段不陷入死循环,从键盘输入的数据应该是______。 A)任意正奇数 B)任意负偶数 C)任意正偶数 D)任意负奇数 答案:D 88.有以下程序 #include&stdio.h& void main() { int a=1,b; for(b=1;b&=10;b++) { if(a&=8) if(a%2==1) {a+=5;} a-=3; } printf(&%d\n&,b); } 程序运行后的输出结果是______。 A)3 B)4D)0C)5D)6 答案:B 7. 二、填空题 1. 下面程序的功能是在屏幕上显示图形: 1 2 1 3 2 1 4 3 2 1 5 4 3 2 1 填空: #include &stdio.h & void main( ) { int i,j; for(i=1;i &=5;i+ +) { printf(&\n&); for(j=i; ;j --) } }解: #include &stdio.h & void main( ) { int i,j; for(i=1;i &=5;i+ +) { printf(&\n&); for(j=i;j&=1;j--) printf(&%2d&,j); } } 2. 执行下面程序 #include&stdio.h& void main( ) { scanf(&%d&,&x); if(x++&5) printf(&%d\n&, x) ; else printf(&%d\n&, x- -) ; } 若输入 5,其输出结果是 。 答案:6 3. switch 语句中的表达式允许是 (1) 表达式,其值必须是 (2) ,或 (3) ,或 (4) 。switch 语句中的常量表达式,其限制是: (5) 。 答案: (1)任何 (2)整型 (3)字符性 (4)枚举型 (5)常量表达式中的操作数必须是常量,禁止变量出现;它的值类型必须是整型、或字符 型、或枚举型,且要与 switch 后的表达式类型匹配;各常量表达式值不能相同 4. while、do while 和 for 语句正常退出循环的条件是 (1) ,否则会造成 (2) 。 答案: (1)在循环体内必须有修改控制循环结束的表达式值语句,使其值从非 0 变为 0 (2)死循环 5.三种重复结构能相互嵌套吗? (1) 。使用循环嵌套结构的要点是: (2) 。 答案: (1)能 (2) 内层和外层的循环控制变量不能相同; 嵌套循环的执行, 总是从内循环到外循环, 即内循环完整地执行一趟,外循环只执行一次 6. 程序填空 -8 程序功能:求 e=1+1/1!+1/2!+1/3!+ ?的近似值,误差小于 1×10 。请将正确答案写 在横线处。 # include &stdio.h& (1) # define EPS le-8 void main ( ) { double e= (2) , fact=1; long n=0; do { n++; (3) ; e=e+1/ }while ( (4) ); printf (“计算 e 值:%0.8f\n”,e); printf (“调库函数:%0.8f\n”,exp (1,0)); } 答案: (1)# include &math.h& (2)1 (3)fact=fact*n (4)fabs(1/fact)&=EPS 7. break 语句只能用于 ① 语句和 ② 语句。 答案:①循环 ②多分支选择 8. 在循环控制中,break 语句用于结束 ① ,continue 语句用于结束 ② 。 答案:①当前循环层 ②本次循环 9. 有如下程序段 int n=0; int sum=0; while (n++,n&50) { if (n= =(n/2)*2) sum+=n; } printf (“%d\n”,sum); 此段程序执行的输出结果为 答案:625,49,while 循环共执行了次。10. 下列程序运行后的输出结果是 。 # include &stdio.h& void main ( ) { int i,j,k; for (i=1;i&=6;i++) { for (j=1;j&=20-2*i;j++) printf (& &); for (k=1;k&=i;k++) printf (&%4d&,i); printf (&\n&); } } 程序外循环执行 6 次,打印 6 行。对于第 i 次外循环:内循环输出数字 i 共 i 个。程序 执行结果如下: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 611. 有以下程序: #include &stdio.h& void main ( ) { int i=1,j=1,k=2; if ((j++||k++)&&i++) }printf (&%d,%d,%d\n&,i,j,k); 执行后输出的结果是 。 A)1,1,2 B)2,2,1 答案:CC)2,2,2D)2,2,312. 以下程序运行后的输出结果是 。 #include &stdio.h& void main ( ) { int a=1,b=3,c=5; if (c=a+b) printf (&yes\n&); else printf (&no\n&); } 答案:yes 13. 以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出 低于平均分的学生成绩,用输入负数结束输入。 #include &stdio.h& void main ( ) { float x[1000],sum=0.0,ave,a; int n=0,i; printf (&Enter mark:\n &);scanf (&%f &,&a); while (a&=0.0&& n&1000) { sum+ 【1】 ;x[n]= 【2】 ; n++;scanf (&%f &,&a); } ave= 【3】 ; printf (&Output:\n &); printf (&ave=%f\n &,ave); for (i=0;i&n;i++) if ( 【4】 ) printf (&%f\n &,x[i]); } 答案: 【1】=a 【2】a 【3】sum/n 【4】x[i]&sve 14. 以下程序将两个数从小到大输出。 #include &stdio.h& void main ( ) { float a,b, 【1】 ; scanf ( 【2】 ,&a,&b); if (a&b) { t=a; 【3】 b=t;;} printf (&%5.2f,%5.2f\n&,a,b); } 答案: 【1】t 【2】& %f %f & 【3】a=b 15. 若有以下程序: #include &stdio.h & void main( ) { int a=4,b=3,c=5,t =0 ; if(a&b)t=a;a=b;b= if(a&c)t=a;a=c;c= printf(&%d%d%d\n& ,a ,b,c); } 执行后输出结果是 。 答案:503 16.下面的 if 语句与 y=(x&=10)?3*x-11:(x&1)?x:2*x-1;的功能相同,请补充完整。 if ( 【1】 ) if ( 【2】 )y=2*x-1; else y=x; else y=3*x-11; 答案: 【1】x&10 【2】x&=1 17. 有以下程序: #include &stdio.h & void main( ) { int i=0,s=0; do { if(i%2){i++;} i++; s+=i; }while(i&7); printf(& %d\n &,s ) : } 执行后的输出结果是 。 A)16 B)12 C)28 D)21 答案:A 18. 以下主程序运行后的输出结果是 (2003 年 9 月) #include &stdio.h & void main( ) { int i,m=0,n=0,k=0 ; for(i=9;i&=11;i++ ) switch(i%10) { case 0:m++;n++; case 10: n++; default:k++;n++; } printf(&% d % d %d \n&, m,n,k); } 答案:1 3 2 19. 以下程序是利用公式π =4*(1/1-1/3+1/5-1/7+?)来计算π 的值。其中,变量 k 表示当 前符号项,t 表示当前项,n 表示当前项的序号,要求精度控制在 0.00001 内。试分析程序, 完成空标号处应填的内容。 # include &math.h& # include &stdio.h& void main( ) { float pi,t,n,k; pi=0.0;n=k=t=1.0; while( (1) ) { pi+=t;k=-k;t= (2) ;n++; } pi= (3) : printf(&pi=%f\n&,pi); } 答 案 : 1) fabs(t) &0 .00001 ( 2) s/(2*n +1) ( 3 ) 4*pi ( 20. 写出程序段的输出结果 。 int a=100; if (a&100) printf (&%d\n &,a&100); else printf (&%d\n &,a&=100); 答:1。a&100 不成立,输出表达式 a&=100 的逻辑值真。 21. 若变量已正确定义,以下语句段的输出结果是 x=0; y=2; z=3; switch(x) { 。 case 0: switch(y==2) { case 1: printf(&*&); case 2: printf(&%&); } case 1: switch(z) { case 1: printf(&$&); case 2: printf(&*&); default: printf(&#&); } } 答案:*# 22. 以下程序运行后的输出结果是 。 #include &stdio.h& void main() { int p=30; printf(&%d\n&,(p/3&0?p/10:p%3)); } 答案:3 23. 有以下程序 #include &stdio.h& void main() { int a=5,b=4,c=3,d=2; if(a&b&c) printf(&%d \n&,d); else if ((c-1&=d)==1) printf(&%d\n&,d+1); else printf(&%d\n&,d+2); } 执行后输出结果是 。 (2003 年 4 月) A)2 B)3 C)4 D)编译时有错,无结果 答案:B 24. 下面程序段是找出整数的所有因子,请填空。 scanf (&%d&,&x); i=1; for (; ;) { if (x%i==0) printf (&%3d&,i); i++; } 答:i&=x。所有因子包括 1 和整数本身。 25. 执行了以下程序片断后,若原来 x = 9,则输出结果为_【_1_】_;若原来 x = 6,则输 出结果为_【_2_】_。 if(x++&8) printf(&%d&,x); else printf(&%d&,x--); 答: 【1】10; 【2】7 26. C 语言提供了 6 种关系运算符_【_1_】__、_【_2_】__、_【_3_】__、_【_4_】__、_ 【_5_】__、_【_6_】__。 答: 【1】&; 【2】&; 【3】&=; 【4】&=; 【5】= =; 【6】!= 27. C 语言中,关系表达式的值是一个_【_1_】__即真或假,一般以_【_2_】__代表真,以 _【_3_】__代表假。 答: 【1】逻辑值; 【2】非 0; 【3】0 28. C 语言提供三种逻辑运算符,包括_【_1_】__、_【_2_】__、_【_3_】__,这三种逻辑 运算符中_【_4_】__的优先级最高。 答: 【1】&& 【2】|| 【3】! 【4】! 29. 在 if-else 结构中,else 子句不能作为语句单独使用,必须与_【_1_】__配对使用, 且若 if 和 else 后面有多条语句,则需用_【_2_】__将其成为一个复合语句。 答: 【1】if 【2】大括号 30. C 语言中唯一的一个三目运算符是_【_1_】__,其一般形式为_【_2_】__。 答: 【1】条件运算符; 【2】表达式 1?表达式 2:表达式 3 31. 以下两条 if 语句可以合并成一条 if 语句是_【_1_】__。 答:if(a&b) { x=5; printf(&#%d#&,x); } else { x=7; printf(&*%d*&,x); } 32. 执行程序片断,当输入 n 为 1 时,flag 的值为_【_1_】__,当输入 n 为 7 时,flag 的 值为_【_2_】__。 switch(n) { case 1: case 2: case 3: flag=1; case 4: flag=2; default: flag=3; } 答: 【1】1 【2】3 33. while 循环结构中,当表达式为_【_1_】__时执行其中的内嵌语句;循环体如果包含一 个以上的语句,应该用_【_2_】__括起来。 答: 【1】非 0; 【2】花括弧 34. for 循环语句的一般表达形式为“for(表达式 1;表达式 2;表达式 3) {语句;}”若要 省略表达式 1,则必须_【_1_】__;若省略表达式 2 则认为表达式 2 始终为_【_2_】__;若 省略表达式 3 则循环不能_【_3_】__。 答: 【1】在 for 语句之间给循环变量赋初值; 【2】真; 【3】正常结束 35. for( ; ; )语句的等价 while 语句是_【_1_】__。 答: 【1】while (1) 36. while 循环结构中,可以用_【_1_】__退出循环;用_【_2_】__退出本次循环。 答: 【1】break; 【2】continue 37. break 语句,只能用于_【_1_】__和_【_2_】__语句中。 答: 【1】循环语句; 【2】switch 38. 程序功能:下面程序求数组 a[3][3]主对角线上的元素之和,并按矩阵的形式输出数组 及求得的结果。请填空,将程序补充完整。 #include &stdio.h& void main() { int a[3][3],i,j,s=0; printf(&输入矩阵元素:\n&); for (i=0;i&3;i++) for (j=0;j&3;j++) scanf(&%d,&, 【1】 ); printf(&\n&); for (i=0;i&3;i++) 【2】 ; for (i=0;i&=2;i++) { for (j=0;j&=2;j++) printf(&%5d&,a[i][j]); 【3】 } printf(&主对角线和为:%d.\n&,s); } 答案: 【1】&a[i][j]【2】s+=a[i][i]【3】printf(&\n&);39. 程序功能:以下程序是求如下所示分数序列的前 20 项之和。请填空,将程序补充完整。 2/1,3/2,5/3,8/5,13/8 ?? #include &stdio.h& void main() { int n,t; float x=2,y=1,s=0; for (n=1;n&=20;n++) { 【1】 【2】 【3】 【4】 } printf(&the sum is:%f\n&,s); } 答案: 【1】s+=x/y; 【2】t=x; 【3】x=x+y; 【4】y=t; 40. 程序功能:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入 负数时结束输入。请填空,将程序补充完整。 #include &stdio.h& void main() { float x,xmax, printf(&输入成绩:\n&); scanf(&%f&,&x); xmax=x; 【1】 while( 【2】 ) { if(x&xmax) xmax=x; if( 【3】 ) xmin=x; scanf(【4】);} printf(&max=%f,min=%f&,xmax,xmin); } 答案: 【1】xmin=x; 【2】x&0 【3】x&xmin 【4】“%f”,&x41. 程序功能:输出 100 以内能被 3 整除且个位数为 6 的所有正整数。请填空,将程序补充 完整。 #include &stdio.h& void main() { int i,j; for(i=0; 【1】 ;i++) { j= 【2】 ; if( 【3】 ) printf(&%d&,j); } } 答案: 【1】i&=9 【2】i*10+6 【3】i%3!=0 42. C 语言编译系统在给出逻辑运算结果时,以数值_【_1_】_代表“真” ,以_【_2_】_代 表“假” 。 答案: 【1】1; 【2】0 43. C 语言编译系统在判断一个量是否为“真”时,以_【_1_】_代表“真” ,以_【_2_】_ 代表“假” 。 答案: 【1】非 0; 【2】0 44. 逻辑运算副两侧的运算对象可以是任何类型的数据, 系统最终以 0 和非 0 来判断它们属 于“真”或“假” 。此说法正确吗?_【_1_】_。 答案: 【1】正确 45. 如果表达式 x&y 为真或 a&b 为真,则表达式(x&y&&a&b)为真。对吗?_【_1_】_。 答案: 【1】不正确 46. 如果至少有一个操作数为真,则包含||运算符的表达式为真。对吗?_【_1_】_。 答案: 【1】正确 47. 【_1_】_语句用于进行判断。 答案: 【1】if 48. _【_1_】_选择结构用于在条件为真时执行一个操作,条件为假时执行另一个操作。 答案: 【1】if?else 49. else 总是与_【_1_】_配对,必要时,可以通过加花括号来确定配对关系。 答案: 【1】它前面的最近的 if 50. switch 后面括号内的表达式可以是整型表达式、_【_1_】_、_【_2_】_。 答案: 【1】字符表达式; 【2】枚举型数据 51. switch 选择结构中必须有 default 语句。此说法正确吗?_【_1_】_。 答案: 【1】不正确 52. switch 选择结构的 default 中必须有 break 语句才能正确退出这个结构。此说法正确 吗?_【_1_】_。 答案: 【1】不正确 53. case 后面只能是_【_1_】_常量表达式。 答案: 【1】整型 54. 多个 case 可以共用一组执行语句。此说法正确吗?_【_1_】_。 答案: 【1】正确 55.while 语句的特点是_【_1_】_。 答案: 【1】先判断表达式,后执行语句 56.do?while 语句的特点是_【_1_】_。 答案: 【1】先执行语句,后判断表达式 57.do?while 循环是当表达式为_ 【_1_】 _时反复执行循环体,表达式为_ 【_2_】 _ 时结束循环。 答案: 【1】真; 【2】假 58.用 while 和 do?while 循环时,循环变量初始化的操作应在_ 【_1_】 _完成。 答案: 【1】while 和 do?while 语句之前 59.在 C 中,凡用 while 循环能完成的,用_ 【_1_】 _循环都能实现。 答案: 【1】for 60.for 语句中的表达式 1 可以省略,此时应在_ 【_1_】 _给循环变量赋初值。 答案: 【1】for 语句之前 61.如果省略 for 语句中的表达式 1,则其后的分号_ 【_1_】 _省略。 答案: 【1】不能 62.for 语句中的三个表达式都可以省略,相当于_ 【_1_】 答案: 【1】while( 1 ) _语句。 63.for 语句中的表达式 1 和表达式 3 可以是一个简单的表达式,也可以是_ 表达式。 答案: 【1】逗号 64.如果 for 语句后面直接是_ 答案: 【1】分号 【_1_】 _,其循环体为空语句。【_1_】_65.对 while、do?while、for 循环,可以用_ 【_1_】 _语句跳出循环,用_ 【_2_】 _ 语句结束本次循环。 答案: 【1】break; 【2】continue 66.break 语句只能用于_ 【_1_】 _语句和_ 【_2_】 _语句。 答案: 【1】循环; 【2】switch 67.continue 语句和 break 语句的区别是:contine 语句结束_ 【_1_】 _,而 break 语句 结束 _【_2_】 _。 答案: 【1】本次循环; 【2】整个循环 68.滥用_ 【_1_】 _语句将使程序流程无规律、可读性差。 答案: 【1】goto 69.程序功能:求 e=l+l/1! +l/2!+1/3! +?的近似值,误差小于 1×l0 。请将正确答 案写在横线处。 #include&stdio.h& 【1】 #define EPS 1e-8 void main( ) { double e= 【2】 , fact=1; long n=0; do { n++; 【3】 ; e=e+1/ }while ( 【4】 ); printf(&计算 e 值:%0.8f\n&, e); printf(&调库函数:%0.8f\n&, exp(1.0)); } 答案: 【1】#include&math.h& 【2】1 【3】fact*=n; 【4】1/fact&EPS-8 70. 以下程序的功能是计算:s=1+12+123+。请填空。 #include &stdio.h& void main() { int t=0,s=0,i; for( i=1; i&=5; i++) { t=i+ 【1】 ; s=s+t; } printf(&s=%d\n&,s); } 【1】t*10 71. 以下程序的功能是输出如下形式的方阵: ?? 13 14 15 16 ?? 9 10 11 12 ?? 5 6 7 8 ?? 1 2 3 4 请填空。 #include &stdio.h& void main() { int i,j,x; for(j=4; j 【1】 ; j--) { for(i=1; i&=4; i++) { x=(j-1)*4 + 【2】 printf(&%4d&,x); } printf(&\n&); } } 【1】&0 【2】i;72.设 x 和 y 均为 int 型变量, 则执行下面的循环后, x、y 的值分别为 for(y=1, x=1; y&=50; y++) { if(x&=10) if(x%2 == 1) {,。 x+=5; } x-=3; } 答案:10 673. 运行下面的程序,如果从键盘上输入 5,则输出结果是#include &stdio.h& void main() { scanf(&%d&,&x); if(x -- &5) printf(&%d&, x); else printf(&%d\n&, x ++); } 答案;4 74. 以下程序运行后的输出结果是______________ #include &stdio.h& void main() { for(x=0;x&3;x++) switch (x) { case 0:printf(&%d&, x); case 2:printf(&%d&, x); default:printf(&%d&, x); } } 答案:.。 三、问答题 1. 程序改错 # include” stdio.h” void main( ) { c= getchar( ) sw itch c case 0,1,2,3, 4,5,6,7,8,9 : prin tf (“ %d” ,c-’0’); default:putchar(c); } 解: # include” stdio.h” void main( ) { c= getchar( ); /* 修 改 */ sw itch(c) /* 修 改 * / { cas e ‘0’:case’1’:case’2’:case’3’:case’4’: case ‘5’ : case’6’ : case’7’ : case’8’ : case’9’ : printf(“ %d” ,c-’0’): /*修改*/ default:putchar(c); } } 2. 写出以下程序的运行结果 #include &stdio.h & void main( ) { int i,j; for(i=j=1;j&=50;j ++ ) { if(i&=10) if(i%2) { i+=5; } i-=3; } printf(&j=%d\n&,j ); } 解:程序运行结果如下 j=6 3. 有程序如下: #include &stdio.h & void main( ) { ch=getchar( ); if(ch&='a'&&ch&=' m' ||ch&='A'&&ch&='M ') ch=ch+3; else if(ch&= 'n'&&ch&= 'z '||ch&='N'&&ch&=' Z' ) ch=ch-3; printf(&%c\n&,ch) ; } 假设从键盘上输入 Exit 或输入 next 后回车。试问 printf 语句打印出什么信息? 答:如果是输入 Exit 后回车,则打印出大写字母‘H’ ;如果是输入 next 后回车,则打印出 小写字母‘k’ 。这是因为函数 getchar( )在遇到回车符后,总是只接收输入字符串的第 1 个字符。因此,如果输入的是 Exit 后回车,那么它接收的是大写字母‘E’ 。这样 ch 就落在 ch&=‘A’ &&ch&=‘M’区间里,使条件 ch&=‘a’ &&ch&=‘m’‖ch&=‘A’ && ch&=‘M’取真值,故对 ch 做 ch=ch+3 的操作,所以 printf 语句打印出大写字母‘H’ 。如 果是输入 next 后回车,那么 getchar( )函数接收的小写字母‘n’ 。这样,ch 就落在 ch&= ‘n’ &&ch&=‘z’区间里,使条件 ch&=‘n’&&ch&=‘z’‖ch&=‘N’&&ch&=‘Z’ 取真值,故对 ch 做 ch=ch-3 的操作,所以 printf 语句打印出小写字母‘k’ 。 4. 阅读下面的程序,它输出什么结果? #include &stdio.h & void main( ) { int x,y; for(x=1;x&=10;x++ ) { if(x==5) { y=x; } printf(&%d\t&,x); } printf(&\nUsed co nt inue to skip prin ti ng the value??%d \ n& ,y); } 【解】这是一个在 for 循环结构中使用 continue 语句的例子。题目的中心意思是由 x 从 1~10 控制 printf 的执行,把当时 x 的取值打印出来。但如果 x 等于 5,那么就强行结束 这一次循环,即不去执行 printf,而进入下一次循环。所以程序的执行结果是打印出如下 结果: 1 2 3 4 5 6 7 8 9 10 Used continue to skip printing the value:5 5. 阅读下面的程序: #include&stdio.h& main( ) { int j,k,x,y; printf(“ Enter in te gers in the range 1 ~20 : \n” ); scanf(“ %d%d” ,& x, & y); for(j=1;j&=y;j++) { for(k=1;j&=x;k++) printf( “ @” ); printf( “ \n” ); } } 运行后,最终输出什么? 答:输出结果如下图所示。 可以看出,输入的第 1 个数(x)决定了输出时每行打印的字符个数,输入的第 2 个数(y) 决定了打印的行数。上图是打印 8 行,每行打印 20 个字符‘@’ 。6. 阅读下面的程序: #include&stdio.h& void main( ) { scanf(&%d&,&x); if(x&=4) while(x--); printf(&%d\n&, ++ x) ; } 如果输入为 5,则其输出为什么? 答:最后输出为 0。这是因为在 while 循环里,最后判别到 x 为 0 时,循环停止。但在 x 上 还要做“--”操作,从而退出循环后 x 的真正取值是-1。然而在打印时,又先对 x 进行“++” 操作。所以最后输出为 0。 7. 程序改错 程序功能:模拟加法和减法运算程序。请修改程序中的错误并调试。 # include&stdio.h& # include&stdilb.h& void main( ) { int a,b; printf (“输入两个整数:”); scanf (“%d %d”,&a,&b); printf (“输入运算符(+ -) :”); scanf (“%c”,&op); switch (op) { case +:printf (“%d+%d=%d\n”,a,b,a+b); case-; printf (“%d- %d=%d\n”,a,b,a-b); default:printf (“输入运算符错!\n”);exit(1); } } 【 提 示 】 第 一 次 编 译 有 错 误 , 光 标 停 在 case + : printf (“%d+%d=%d\n”,a,b,a+b);行的“p”处,出现第一个错误信息:Expression syntax in function main 【解析】case 的+和-应改为字符常量’+’和’-’。 排除错误,再编译无错误。 输入两个整数:10 20&回车& 输入运算符(+ -) :输入运算符错! 运行错误。 【解析】 scanf (“%c”,&op)语句读入了一个换行符, 因 不是读入操作符’+’或’-’, 所以产生运行错误。在语句 scanf (“%d %d”,&a,&b)后加语句 scanf (“% * c”),跳过换 行符不读,就可保护正常读入操作符’+’或’-’。 程序运行示例: 输入两个整数:10 20 输入运算符(+ -) :+ 10+20=30 8. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后。 #include &stdio.h& void main ( ) { int sum=0,n=0; while (1) { n=n+1; if (n&5) if (n%2) sum+=n; } printf (&sum=%d n=%d\n&,sum,n); } 运行结果: sum=6 n=6 9. 程序改错 程序功能:求正整数 n 以内的奇数。请修改程序中的错误,并调试。 # include &stdio.h& void main ( ) { int n,i=1; long sum=0; printf (&输入一个正整数:&); scanf (&%d&,&n); while (i&n) i+=2; sum+=i; if (n%2==0) n--; printf (&输出 1+3+5+?+%d=%1d\n&,n,sum); } 【提示】编译无错误,运行有错误。 程序运行示例: 输入一个正整数:10&回车& 输出 1+3+5+?9=11 程序运行结果错误。 【解析】由于多个语句含义写错,造成逻辑错误: long sum=0; 应改为 long sum=1; while 循环语句,应改为: while (i&n) { i+=2; sum+=i; } n--; 应改为 n++; 程序运行示例: 输入一个正整数:10&回车& 输出 1+3+5+?+11=36 10. 以下程序在输入 5,2 之后的输出是 。 #include &stdio.h& void main( ) { int s,t,a,b; scanf (&%d,%d&,&a,&b); s=1; t=1; if (a&0) s=s+1; /* ① */ if (a&b) t=s+t; /* ② */ else if (a==b) t=5; else t=2*s; printf (&s=%d,t=%d\n&,s,t); } 解:在输入 5,2 后,a=5,b=2。执行语句①,s=2,执行语句②,a&b 为真,t=s+t=2+1=3。 所以程序输出为:s=2,t=3 11. 阅读下面程序,回答指定的问题。 #include &stdio.h& void main ( ) { int a,b,m,n; scanf (&%d%d,\n&,&a,&b); m=1;n=1; if (a&0) m=m+n; if (a&b) n=2*m; else if (a==b) n=5; else n=m+1; printf (&m=%d n=%d\n&,m,n); }问: (1)当输入为:-1 C2&回车&时,程序的运行结果是什么? (2)当输入为:1 0&回车&时,程序的运行结果是什么? (3)为了输出 n=4,变量 a 和 b 应具备什么条件? 解: 1) ( m=1,n=1,输入后, a=-1,b=-2,a&0 为假, 和 a= =b 都为假, a&b 执行语句 n=m+1=2; 所以输出为:m=1 n=2。 (2)m=1,n=1,输入后,a=1,b=0,a&0 为真,执行语句 m=m+n=2;a&b 和 a= =b 都为 假,执行语句 n=m+1=3;所以输出为:m=2 n=3。 (3) 要使 n=4, 就应执行语句 m=m+n 和 n=2*m,为此要求满足条件 a&0 和 a&b, 0&a&b。 即 12. 说明以下两个程序段的不同点。 程序段 1: int i,n=0; for (i=0;i&10;i++) { n++; if (i&5) } printf (&i=%d,n=%d\n&,i,n); 程序段 2: int i,n=0; while (i&10) { n++; if (i&5) i++; } printf (&i=%d,n=%d\n&,i,n); 解: 表面上看这两个程序段的功能是相同的, 程序段 2 只是将程序段 1 中的 for 语句用 相应的 while 语句替换。实际上,如果其中没有 continue 语句或将 continue 改为 break 语句,这两段程序的功能是相同的。但 continue 语句的功能是退出本次执行的循环体,重 新开始下一次循环,对于 for 循环,&表达式 3&不包含在循环体中,所以在下次循环之前执 行&表达式 3&,而 while 循环不包含&表达式 3&。 对于程序段 1, 执行 for 语句, i=6 时, 当 满足 if 条件, 执行 continue 语句, 执行 i++,i 值为 7,执行下一次循环,如此直到&表达式 2&即 i&10 不再满足,此时 i=10,n=10。对于程 序段 2,执行 while 语句,当 i=6 时,满足 if 条件,执行 continue 语句,i 值仍为 6,执 行下一次循环,满足 if 条件,执行 continue 语句,i 值仍为 6,执行下一次循环??如此 形成了死循环。 为了使程序段 2 与程序段 1 的功能等价,只需将与 for 语句&表达式 3&对应的语句放在 continue 语句之前执行。即改为: int n=0,i=0; while (i&10) { n++; i++; if (i&5) } printf (&i=%d,n=%d\n&,i,n); 13. 试说明以下两个 if 语句的区别: (1)if (x&0) (2)if (x&0) if (y&0)n=1; {if (y&0)n=1;} else n=2; else n=2; 答:前者属于第一种 if 单分支嵌套,如果 x&0 才执行内嵌的 if 语句,n 赋值非 1 即 2,如 果 x≤0,n 不被赋值。 后者属于第二种 if-else 双分支, 如果 x&0 又执行一个嵌套的 if 单分 支语句,y&0 时 n 被赋值 1,否则 n 不被赋值;如果 x≤0,n 被赋值 2。 14. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main ( ) { int a=2,b=2,x,y; x=a++; y=++b; printf(&%d,%d\n &,x,y); printf(&%d,%d\n&,a++,++b); } 运行结果是: 答案:运行结果是: 2, 3 3, 4 15. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main ( ) { int a=3,b=7; printf(&%d, &,(a++)+(++b)); printf(&%d, &,b%a); printf(&%d, &,!(a&b)); printf(&%d &,a+b); } 运行结果是: 答案:运行结果是:11, 0, 1, 12 16.阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main ( ) { short n=65535; n++; printf(&n=%d\n&,n); } 运行结果是: 答案:运行结果是:0 简析:65535 的内存形式为 11111,其加 1 后就变为 00000,即 是 0。 17. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { printf (&输入序号&); scanf(&%d&, &n); switch(n) { case 0: printf (&SUN\n&); case 1: printf (&MON\n&); case 2: printf (&TUE\n&); case 3: printf (&WED\n&); case 4: printf (&THU\n&); case 5: printf (&FRI\n&); case 6: printf (&SAT\n&); } } 当输入 4 时,程序的运行结果是: 答案: THU FRI SAT 18. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { printf (&输入成绩&); scanf(&%d&, &n); n/=10; switch(n) { case 9: printf (&优\n&); case 8: printf (&良\n&); case 7: printf (&中\n&); case 6: printf (&合格\n&); default: printf (&差\n&); } } 当输入 53 时,程序的运行结果是: 当输入 79 时,程序的运行结果是: 答:当输入 53 时,程序的运行结果是: 差 当输入 79 时,程序的运行结果是: 中 合格 差 19. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { int a,b,c; a=2; b=3; c=1; if(a&b) if(a&c) printf(&%d\n&,a); else printf(&%d\n&,b); printf(&end&); } 运行结果是: 答: end 20. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { int i,j; for (i=1;i&=4;i++) { for (j=28-i*2;j&=1;j--) printf(& &); for (j=1;j&=2*i-1;j++) printf(&* &); printf(&\n&); } for (i=3;i&=1;i--) { for (j=28-i*2;j&=1;j--) printf(& &); for (j=1;j&=2*i-1;j++) printf(&* &); printf(&\n&); } } 运行结果是: 答案: * * * * * * * * * * * * * * * * * * * * * * * * * 21. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { int m,n,t,a,b; printf(&请输入 2 个数:&); scanf(&%d,%d&,&m,&n); if(m&n) { t=m;m=n;n=t; } a=m;b=n; while(n!=0) { t=m%n; m=n; n=t; } printf(&%d\n%d\n&,m,a*b/m); } 该程序完成的功能是: 若输入 6,32 则运行结果是: 答案:功能是:求两个数的最大公约数和最小公倍数。 运行结果是: 2 96 22. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { int l,s,n,o; l=0;s=0;n=0;o=0; printf(&请输入一行字符:&); while((c=getchar())!='\n') { if(c&='Z' && c&='A' || c&='z' && c&='a') l++; else if(c&='9' && c&='0') n++; else if(c==' ') s++; else o++; } printf(&\n%d,%d,%d,%d\n&,l,s,n,o); } 该程序完成的功能是: 若输入 ab2. 3c7 **则运行结果是: 答案: 功能是:统计一行字符中字母、空格、数字、其它字符的个数。 运行结果是: 3,2,3,3 23. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { for(n=1;n&6;n++) { if(n%2) { printf(&#&); } printf(&*&); } printf(&\n&); } 运行结果是: 答案: 运行结果是: # * # * # 24. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { char i,j; for(i='a',j='z';i&j;i++,j--) printf(&%c %c &,i,j); printf(&\n &); } 运行结果是: a z b y c x d w e v f u g t h s i r j q k p l o m n 25. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main( ) { char c[7]; int i=0; for (;i&7;c[i]=getchar(),i++); for (i=0;i&7;i++) putchar(c[i]); } 若输入 AB &回车& CD&回车& EFG&回车& 则运行结果是: 答案:运行结果是: AB CD E 26. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main( ) { char c1,c2,c3,c4; c1='A'; c2='b'; c3=c1+('a'-'A'); c4=c2-('a'-'A'); printf(&%c-&%c\n&,c1,c3); printf(&%c-&%c\n&,c2,c4); } 答案:运行结果是: A-&a b-&B 27. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果: ”之后 #include &stdio.h& void main() { int a=1,b=2,c=3; if(c=a) printf(&%d\n&,c); else printf(&%d\n&,b); } 运行结果: 答案:1 28.判断并纠正下列程序中的错误。 #include &stdio.h& void main() { printf(&n=&); scanf(&%d&,n); if(n&7); printf(&n is less than 7\n&); if(n=&7) printf(&n is equal to or greater than 7\n&); } 答案:原语句 1:scanf(&%d&,n); 应改为:scanf(&%d&,&n); 原语句 2:if(n&7); 应改为:if(n&7) 原语句 3:if(n=&7) 应改为:if(n&=7) 29.寻找下列程序代码中的错误并说明如何纠正。 #include&stdio.h& void main() { printf(&gender=&); scanf(&%d&,&gender); if(gender=1) printf(&Woman\n&); printf(&Man\n&); } 答案:原语句 1:if(gender=1) 应改为:if(gender==1) 原语句 2: 应改为:else 30. 寻找下列程序代码中的错误并说明如何纠正。 #include&stdio.h& void main() { printf(&n=&); scanf(&%d&,&n); switch(n){ case 1: printf(&The number is 1\n&); case 2: printf(&The number is 2\n&); default: printf(&The number is not 1 or 2\n&); } } 答案:原语句 case 1: printf(&The number is 1\n&); 应改为: case 1: printf(&The number is 1\n&); 31. 程序功能:求正整数 n 以内的奇数。请修改程序中的错误,并调试。 #include&stdio.h& void main() { int n, i=1; double sum=0; printf(&输入一个正整数:&); scanf(&%d&, &n); while(i&n) i+=2; sum+=i; if(n%2==0) n--; printf(&输出 1+3+5+?+%d=%f\n&, n, sum); } 【提示】编译无错误,运行有错误。 程序运行示例: 输入一个正整数:10<回车> 输出 1+3+5+?+9=11 程序运行结果错误。 答案: 原语句 1:double sum=0; 应改为:double sum=1; 原语句 2:i+=2; 应改为:{ i+=2; 原语句 3:if(n%2==0) n - -; 应改为:if(n%2==0) n - -; } 32. 下列程序代码打印 1 到 10 的值,判断并纠正其中的错误。 #include&stdio.h& void main() { int n=1; while(n&10); printf(&%d\n&,n); } 答案: 原语句 1:while(n&10); 应改为:while(n&=10) 或 while(n&11) 原语句 2:printf(&%d\n&,n); 应改为:printf(&%d\n&,n++); 33. 寻找下列程序代码中的错误并说明如何纠正。 #include&stdio.h& void main() { for( y=.1;y!=1.0;y+=.1) printf(&%f\n&,y); } 答案: 原语句 1:for( y=.1;y!=1.0;y+=.1) 应改为:for( int y=1;y!=10;y++) 原语句 2:printf(&%f\n&,y); 应改为:printf(&%f\n&,(float)y/10); 四、编程题 1. 从键盘输入一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入 a,则 输出 b。如果输入的字符不在 26 个英语字母中,则显示输入数据有误,如果输入的字符是 z 或 Z,则输出 a 或 A。 解: #include &stdio.h& void main( ) { printf(&Please enter a char:&); c=getchar( ); /*输入一个字符*/ if (c&='a'&&c&='y'||c&='A'&&c&='Y') /*字符是除了 z 以外的是 26 个字母中的一个*/ putchar(c+1); else if(c=='z'||c=='Z') /*字符是小写或大写的 z*/ putchar(c-25); else printf(&Data error!&); } 2. 编写程序,求 a+aa+aaa+?+aa?a,其中 a 是一个数字。例如:3+33+333+(此 时 n 为 5) 。要求 a 和 n 从键盘输入,输出格式为 3+33+333+=37035。 解:方法一: # include &stdio.h& void main( ) { int sum,s,j; int i,a,n; printf(&\nEnter a and n:&); scanf(&%d%d&,&a,&n); sum=0; j=1; for(i=n;i&0;i--) { s=i*j*a; sum=sum+s; j=j*10; } for(i=1;i&=n;i++)/*开始输出*/ { for(j=1;j&=i;j++) printf(&%d&,a); if(i==n) printf(&=%1d\n&,sum); else printf(&+&); } } 方法二: #include &stdio.h& void main( ) { long sum,s,a; int i,n,j,b; printf(&\nEnter a and n:&); scanf(&%1d%d&,&a,&n); sum=0; s=0; b=a; /* 暂存 a */ for(i=1;i&=n;i++) { s=s+a; sum=sum+s; a=a*10; } for(i=1;i&=n;i++)/*开始输出*/ { for(j=1;j&=i;j++) printf(&%d&,b); if(i==n) printf(&=%1d\n&,sum); else printf(&+&); } } 程序运行时,首先显示 Enter a and n : 如果用户输入:2 5 则运行结果为: 2+22+222+ =24690 3. 编写程序,输入一个正整数,计算并显示该整数的各位数字之和,例如,整型数 1987 的各位数字之和是 1+9+8+7,等于 25。 解: #include &stdio.h& void main( ) { int i, printf(&\nEnter a integer:&); scanf(&%d&,&i); sum=0; while(i!=0) { k=i%10; /*取数字的最后一位*/ sum=sum+k; /*累加到计数器中*/ i=i/10; /*去掉数字的最后一位*/ } printf(&sum is %d\n&,sum); } 4. 在歌手大奖赛中有若干裁判为歌手打分, 计算歌手最后得分的方法是: 去掉一个最高分, 去掉一个最低分,取剩余成绩的平均分。编写程序,输入一个歌手的若干成绩,以-1 作为 输入结束标记,计算歌手的最后得分。 解: #include &stdio.h& void main( ) { float score,min,max,sum=0; int i=0; printf(&\nEnter some score end with -1:&); scanf(&%f&,&score); /*输入第一个分数*/ min=max= /*设读入第一个分数为最高分和最低分*/ while(score!=-1) { i++; /*计数器增 1*/ sum=sum+ /*分数累加*/ scanf(&%f&,&score); /*输入下一个分数*/ if(score&max) /*刚输入的分数大于最高分*/ max= if(score&min&&score!=-1) /*刚输入的分数小于最低分*/ min= } sum=sum-max- /*去掉一个最高分和一个最低分*/ printf(&Final score is %6.2f\n&,sum/(i-2)); /*输出最后的分数*/ } 运行情况: Enter some score en d with-1: 9.8 9.7 5 9.65 9.88 9.76 C 1 Final score is 9. 77 5. 编写程序计算: 1+2+?+i result= i≤5100-i-(i-1)-?-1 5&i≤10 i2 i&10 答: 程序如下: #include &stdio.h& void main ( ) { int i, j, result=0; printf (&Please input a integer:&); scanf(&%d&,&i); if (i&=5) for (j=1;j&=i;j++) result=result+j; else if (i&10) result=i*i; else { result=100; for (j=i;j&=1;j--) result=result-j; } printf ( &result=%d\n&,result ); } 6. 编写一个程序能读入并计算一个只包含加减运算的表达式, 每个输入的数据都是浮点数, 除第一个数以外, 其余每个数前面都有一个运算符, “23+43-233+234; 表达式以分号 ” 如 ” “; 结束。 答: 程序如下: #include&stdio.h& void main ( ) { float temp, char ch, printf (&\nplease input a digital expression:&); scanf (&%f&,&sum); ch=getchar( ); while(ch!=';') { scanf (&%f&,&temp); switch (ch) { case '+': sum=sum+ case '-': sum=sum- default: printf (&Error input\n&); } ch=getchar( ); } printf (&%f\n&,sum); } 7. 编写一个程序求满足以下公式的变量 k 的最大值。 k 2 ≤m 其中,m 是程序输入的一个正整数。 答: 程序如下: #include &stdio.h& void main ( ) { int i,k=0,m,temp=1; printf (&Please input a integer(m):&); scanf (&%d&,&m); do { k++; temp=temp*2; }while(!(temp&=m)); printf (&m=%d\tk=%d\t2^%d&=%d\n&,m,k,k,m); } 8. 编写一个程序,找出被 2,3,5 整除时余数均为 1 的最小的 10 个自然数。 答: 程序如下: #include &stdio.h& void main ( ) { int i=1; int count=0; printf (&\n 能被 2,3,5 整除时余数为 1 的最小 10 个自然数是:\n&); while (count&=10) { if ((i%2==1)&&(i%3==1)&&(i%5==1)) { count++; printf (&%d\n&,i); } i++; } } 9. 编写一个程序,用以记录在键盘上输入的字符个数,直到输入回车换行符时止。 【解】程序编写如下: #include&stdio.h& void main( ) { int n= -1; do { n++; }while((ch=getchar( ))!='\n'); printf(&The character's number of input is %d.\n&,n); } 假如在键盘上输入 abcdefg 后回车,那么会显示信息: The character’ s nu mber of input is 7. 程序里,之所以把变量 n 的初始值设置为-1,是为了确保计数的准确性。如果一开始就按回 车键,那么 n 就应该是 0。在程序设计中,这些细微之处是必须考虑到的。 10. 编写一个程序,它打印出个位数是 6、且能被 3 整除的所有三位正整数及其个数。要求 一行打印 8 个数据。 【解】题目中要求打印的是三位数,且个位数必须是 6。因此可以 for 循环,它的循 环控制变量从 106 开始,直到 996 为止,增量为 10(因此要保证个位数是 6) 。由于还要打 印这种数据的总个数,因此需要设置一个用于计数的变量,比如是 count。发现一个这样的 数,它就加 1。为了满足一行打印 8 个数据要求,可以利用计数器 count,让这样的数一个 个地打印下去。如果 count %8= =0,就打印一个回车换行。具体程序如下: #include &stdio.h & void main( ) { int count=0,j; for(j=106;j&=996; j+ =10) { if(j%3!=0) else { count++; printf(&%d\t&,j); if(count%8==0) printf(&\n&); } } printf(&\nThe cou nt is %d\n&,count); } 运行此程序,输出结果如下图所示。11. 编写一个 C 语言程序,打印出如下的图形(a)(b)和(c)。答: (a)的程序如下: #include &stdio.h & void main() { int x,y; for(x=10;x&=1;x-- ) { for(y=1;y&=x;y++) printf(&* &); printf(&\n&); } } (b)的程序如下: #include&stdio.h& void main( ) { int x,y;//打 印 一 个 *号 和 一 个 空 格 for (x=1;x&=10;x++) { for(y=1;y&=10;y++) if(y&=10-x) printf(& &); else printf(&* &); printf(&\n&); } } (c)的程序如下: #include &stdio.h& void main( ) { int x, for(x=1;x&=10;x++) { for(y=1;y&=10;y++) if(y&=x-1) printf(& &); else printf(&* &); printf(&\n&); } }//打印两个空格 //打 印 一 个 *号 和 一 个 空 格//打印两个空格 //打 印 一 个 *号 和 一 个 空 格12. 利用下面的公式,求π 的近似值: π /4=1-1/3+1/5-1/7+?±1/n? 循环直到 1/n 的绝对值小于 0.0001 时止。 答:程序编写如下: #include&stdio.h& void main( ) { double pi=0.0,n=1.0,y=1.0,x,z; do { x=y/n; pi+=x; y*=-1.0; n+=2; z=x&0?-x:x; }while(z&1e-7); printf(&??=%lf\n&,4*pi); } 程序中,不断在 x 里形成 1/1、-1/3、1/5、-1/7 等,并将其累加到 pi 上去。由 y*=-1.0; 构成每项的正负号。 用变量 z 来控制循环的次数 (不能直接用 x 来控制, 因为它可能是负的。 z 里实际上是 x 的绝对值) 。运行结束,输出结果:π =3.141598。 13. 应用 switch 语句,判断两个整数 a 和 b 的大小,或相等。例如,输入 a=10,b=5,输出 10&5;输入 a=5,b=15,输出 5&15;输入 a=25,b=25,输出 25=25。 【解析】 (1)分析题意,建立数据模型,设计算法。 switch 语句的常量表达式不能用关系表达式。将关系表达式转换为序号: pvalue=1 *(a&b)+2* (a= =b)+3*(a&b) pvalue 的值只能为 1,或 2,或 3。pvalue 作为 switch 语句的表达式,其常量表达式 为 1、2、3。 需要定义三个变量: 输入量 int a,b; 中间量 再确定执行步骤。用自然语言描述算法: 第一步 读入 a,b。 第二步 应用 switch 多选一判定,并输出相应信息。 (2)编程。 #include &stdio.h& void main ( ) { int a,b, printf (&输入两个整数:&); scanf (&%d %d&,&a,&b); pvalue=1 * (a&b)+2*(a==b)+3*(a&b); switch (pvalue) { case 1:printf (&输出:%d&%d\n&,a,b); case 2:printf (&输出:%d==%d\n&,a,b); case 3:printf (&输出:%d&%d\n&,a,b); } } (3)程序运行示例 输入两个整数:10 5 输出:10&5 输入两个整数:10 10 输出:10= =10 输入两个整数:5 10 输出:5&10 14. 输入起始年号,输出 50 年内的闰年。 【解析】 (1)分析题意,建立数据模型,设计算法。 这个问题比较简单,其算法描述如下: 输入起始年号 year scanf (“%d”,&year); 生成 50 年年号,可用 for 循环实现: for (y=y&year+50;y++) if (y%4= =0&&y%100!=0‖y%400= =0) /* 判闰年*/ { printf (“%5d”,y); /*输出闰年*/ count+ +; /*控制换行*/ if (count%10= =0)printf (“\n”) } (2)编程。 #include &stdio.h& void main( ) { int year ,count=0,y; printf (&输入起始年号:&); scanf (&%d&,&year); for (y=y&year+50;y++) if (y%4==0&&y%100!=0||y%400==0) /* 判闰年 */ { printf(&%5d&,y);count++; if(count%10==0) printf (&\n&); /* 控制换行*/ } printf (&\n&); } (3)程序运行示例: 输入起始年号:04 16 28 40 . 求 N 内的勾股数(A +B =C )A、B、C。 【解析】 (1)分析题意,建立数据模型,设计算法。 该问题可用枚举法实现,直接用 C 语言描述: scanf (“%d”,&n); /* 输入 n */ for (A=1;A&n-1;A++) /* 生成 A 值*/ for (B=A+1;B&n;B++) /*生成 C 值*/ { C=(int)sqrt (A*A+B*B); /*计算 C 值*/ if (C&=n&&A*A+B*B==C*C) /* 输出勾股数*/ { printf (“[%5d”“%5d”%5d] “,A,B,C); count + +; if (count%3= =0) printf (“\n”);2 2 2 } } (2) 编程。 #include &stdio.h& #include &math.h& void main( ) { int n,A,B,C,count=0; printf(&输入一个正整数:&); scanf (&%d&,&n); for (A=1;A&n-1;A++) for (B=A+1;B&n;B++) { C=(int)sqrt(A*A+B*B); if (C&=n&&A*A+B*B==C*C) { printf (&[%5d %5d %5d]&,A,B,C);count++; if (count%3==0)printf (&\n&); } } printf (&\n&); } (3)程序运行示例 输入一个正整数:40 [ 3 4 5 ] [ 5 12 13 ] [ 6 [ 7 24 25 ] [ 8 15 17 ] [ 9 [ 10 24 26 ] [ 12 16 20 ] [ 12 [ 15 20 25 ] [ 15 36 39 ] [ 16 [ 18 24 30 ] [ 20 21 29 ] [ 21 [ 24 32 40 ]8 12 35 30 2810 15 37 34 35] ] ] ] ]16. 找出 1~999 之内的能被 3 整除、且至少有一位数字为 5 的整数,以每行 15 个整数形式 输出。 【解析】 (1)分析题意,建立数据模型,设计算法。 (2)编程。 #include &stdio.h& void main ( ) { int n,found1,found2,count=0,t; for (n=1;n&=999;n++) { found1=0;found2=0; if (n%3==0)found1=1; /*判别 n 能否被 3 整除*/ t=n; /*判别 n 是否含有数字 5*/ while (found1 && t!=0 && !found2) { if (t%10==5)found2=1; t/=10; } if (found1 &&found2) /* 输出满足条件的 n 和计数*/ { printf (&%4d&,n); count++; if(count%15==0) printf (&\n&); /*控制换行*/ } } printf (&\n&); } (3)程序运行示例: 15 45 51 54 57 75 105 135 150 153 156 159 165 195 225 252 255 258 285 315 345 351 354 357 375 405 435 450 453 456 459 465 495 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 615 645 651 654 657 675 705 735 750 753 756 759 765 795 825 852 855 858 885 915 945 951 954 957 975 17. 有 100g 的药品,用天平称量,砝码只有 1g、2g、5g 共 3 种,问:若要求加的砝码总数 为 50 个,有几种不同的加法?若要求总数为 30 个呢?请编程求解上述问题。 答案:本题的实质也是求不定方程的正整数解,由题意列出的不定方程为: x+2y+5(50-x-y)=100,化简为 4x+3y=150,使用二重循环穷举所有可能的 x、y 的正整数值 的组合,对每种组合分别判断是否满足方程。 #include &stdio.h& void main ( ) { int i,j,k,sum=0; for (i=0;i&50;i++) { for (j=0;j&=50-i;j++) { k=50-i-j; if (i+j*2+k*5==100) { ++ printf (&one result:%2d,%2d,%2d\n&,i,j,k); } } } printf (&sum=%d&,sum); } 18. 编写一个程序,求满足以下条件的最大的 n: 2 2 2 2 1 +2 +3 +?n ≤1000 解:n 从 1 开始,然后递增,并且每次计算累加平方和 s,当 s 刚大于 1000 时,这时的 n-1 便是满足该条件的最大的值。程序如下: #include &stdio.h& void main ( ) { int n,s; s=n=0; while (s&=1000) { ++n; s+=n*n; } printf (&n=%d\n&,n-1); } 本程序的执行结果为: n=1319. 编写一个程序,对于用户输入的正偶数 n,将其分解成两个素数之和。 解: 设用户输入的正偶数为 a,a=b+d,b 和 d 是两个素数。 假定 b 是较小的素数, b&=a/2, 则 且至少是奇数。判定 b 是素数的方法是其不能被 2 到 sqrt (b)之间的任何数除尽。程序如 下: #include &stdio.h& #include &math.h& void main( ) { int a,b,c,d; scanf (&%d&,&a); for (b=3;b&=a/2;b+=2) { for (c=2;c&=sqrt(b);c++) /*找素数 b*/ if (b%c==0) if (c&sqrt(b)) /*找到了素数 b,求出 d*/ { d=a-b; for (c=2;c&=sqrt (d);c++)/*判定 d 是否是素数*/ if (d%c==0) if (c&sqrt(d)) /*d 是素数,则找到了一个解,退出*/ { printf (&%d=%d+%d\n&,a,b,d); } } } } 20. 两个乒乓球队进行比赛,各队出 3 人。甲队为 A、B、C3 人,乙队为 X、Y、Z 3 人。以 抽签决定比赛名单。有人向队员打听比赛的名单,A 说他不和 X 比,C 说他不和 X、Z 比。请 编写程序找出 3 对赛手的名单。 解:设 X、Y、Z 三位队员的编号分别为 1、2、3。设 a、b、c 分别表示 A、B、C 三位队 员的对手编号。显然有 a、b、c 互不相同(因为每人都有不同的对手) ,即 a!=b &&b!=c && c!=a 成立,另外依题意有 a!=1 && c!=1 && c!=3 成立。所以应满足条件: a!=b && b!=c && c!=a && a!=1 && c!=1 && c!=3 采用三重 for 循环求解的程序如下: #include &stdio.h& void main( ) { int a,b,c; for (a=1;a&=3;a++) for (b=1;b&=3;b++) for (c=1;c&=3;c++) if (a!=b && b!=c &&c!=a && a!=1 && c!=1 && c!=3) // 已经找到各自的对手,则输出结果 { printf (&A&-& %c\n&,char(a+'W')); printf (&B&-& %c\n&,char(b+'W')); printf (&C&-& %c\n&,char(c+'W')); } } 本题求解结果如下: A &-& Z B &-&X C &-&Y21. 验证:任何四个相邻的自然数(0 除外)的乘积不是完全平方数,但乘积加 1 后则是完 全平方数,如:15 * 16 * 17 * 18=73440 不是,但 1 是。用指针实现。 答:验证一个自然数是否完全平方数,可将这个数先开方再平方,看能否得到原数。 #include &stdio.h& # include &math.h& void main() { int n,s; printf (&input n:&); scanf (&%1d&,&n); s=n*(n+1)*(n+2)*(n+3); r=sqrt(s); if (s!=r*r) printf (&n=%d\ts=%d\tsqrt(%d)=%f\n&,n,s,s,r); else { printf (&结论错误!\n&); } s++; r=sqrt(s); if(s==r*r) { printf (&%d+1=%d=%d*%d\n&,s-1,s,(int)r,(int)r); printf (&结论正确\n&); } else printf (&结论错误!\n\n&); } 运行示例:input n: n=5 s=1680 sqrt (803 1=41*41 结论正确 22. 编写程序,求 e 的值。e≈1+1/1!+1/2!+1/3!+1/4!+?+1/n! (1)用 for 循环,计算前 50 项。 -4 (2)用 while 循环,要求直至最后一项的值小于 10 。 【分析与解答】 (1)本题的基本算法是求累加值。累加项的分子部分都是 1;分母的值有规律的递增, 依次为 1! 、?、n!,即,若第 i-1 项的累加项为 t i-1,则第 i 项的累加项是 t i-1/i,在 、2! 程序中可用表达式:t=t/i(i 从 1 变化到 n)来表示。 (2)根据以上分析,若用变量 t 来存放累加项,当 i 的值从 1 变化到 n 时,可用以下 语句来实现累加: t=t/i; e+=t; (3)为了实现累加过程,以上语句应当放在循环内,循环控制变量从 1 变化到 n。 (4)若用 for 循环,按题目要求已指定 n 的值是 50。若用 while 循环,并没有指定 n -4 的值,但已指定了循环结束的条件,当 t 的值小于 10 结束循环。 (5)现例示用 while 循环来求 e 值的部分程序: i=1;e=1.0;t=1.0; while(t&=le-4) { t=t/i; e+=t; i++; } (6)请读者自己对变量做出正确的定义,设计输出语句,完善程序;也可以参考此程 序段,按照自己的思路独立地完成程序。 (7)e 的值应当是:2.71828。 (8)根据以上分析,读者已不难用 for 循环来实现求 e 值的计算。 (9)注意:在完成此程序时,不要对分母中的阶乘值进行单独计算,因为 17!的值已超过 int 类型的最大值,更无法求到 50! 。 23. 编写程序,对输入的一行数字字符(用回车结束,每个数字字符的前后都有空格) ,把 这一行中的所有数字转换成一个整数。例如,若输入(&CR&代表 Enter 键) : 2 4 8 3 &CR& 则输出整数:2483。 【分析与解答】 (1)一行字符的读入,程序段如下。循环体内的“??”符号表示需要在循环体内完 成的其他操作。 ch=getchar( ); while(ch!='\n') { ?? ch=getchar( ); } (2)在本题中循环体内需要把读入的所有数字字符转换成一个整数。若用变量 n 来存 放这个整数,为了保证有效的存放,应当把它定义成 long 类型。 (3)要把输入的一串数字字符转换成一个整数,首先需要判断当前读入的字符是否是 数字字符,若不是则什么也不做;若是,则进行以下操作: ①把当前读入的一个字符转换成一个一位整数,这可由语句“d=ch-'0'”来实现,在 ; 这里 d 是一个整型变量; ②把 d 中的一位数归并到 n 的低位中,这可用语句“n=n *10+d; ”来实现。这里所述的 操作可由以下语句来完成: if(ch&='0'&&ch&='9'){d=ch-'0' ;n=n * 10+d;} if 语句后一对括号中的判断表达式可以调用字符函数 isdigit 来实现: if(isdigit(ch)){d=ch-'0'; n=n * 10+d;} if 子句的两个语句可以合并成:n=n * 10+ch-'0';。 (4)把(3)中的语句放入循环中: ch=getchar( ); while(ch!='\n') if(ch&='0'&&ch&='9') n=n*10+ch-'0'; ch=getchar( ); (5)请自己写出定义语句并赋初值。注意,最后输出 n 时,应当使用格式说明%1d,而不能 使用%d。 24. 编写输出以下图案的程序,图案的行数由输入的值确定。 A BBB CCCCC DDDDDDD EEEEEEEEE【分析与解答】 (1)若图案的行数输入到变量 L 中。 (2)按要求 L 决定了图形的行数,因此可通过循环来实现 L 行的输出; for(i=1;i&=L;i++) { ?? } 循环体中的“??”号,代表输出 L 行的操作。 (3) 假定 ch 中存放了一个字符, 我们知道, 通过以下循环可以在一行上输出 n 个字符: for(j=1;j&=n;j++)putchar(ch); putchar('\n' ); 注意,在循环后 putchar('\n' );语句不可少,它用以换行。 (4)现在应当解决如何按要求给出每行输出的字符。由图分析,行数(或行号)为 1 时输出字符 A, 行数为 2 时输出字母 B??若输出的字母放在变量 ch 中, 行号取决于外循环 的控制变量 i,则输出的字母和行号的关系可用表达式:ch='A'+i-1 来表示。当 i 为 1 时 ch 中被赋予字母 A,当 i 为 2 时 ch 中被赋予了字母 B,其他依次类推。因此,在此表达 式后,利用(3)中的循环就解决了各行上输出的字母。 (5)按要求每行输出的字母的个数不同,第二行输出 3 个字母,第三行输出 5 个字母, 第四行输出 7 个字母??(3)中 for 循环体的执行次数取决于 n 的值,也就是说 n 的值决 定了每行输出字母的个数。其实,n 的值与行号有着密切的关系:n=2*i-1, 当 i 为 1 时 n 的值是 1、当 i 为 2 时 n 的值是 3、当 i 为 3 时 n 的值是 5、当 i 为 4 时 n 的值是 7。因此在 (3)中 for 循环之前可用此表达式求出 n 的值。 (6)总结以上分析,我们可得到以下的程序段: for(i=1;i&=L;i++) { ch='A'+i-1; n=2*i-1; for(j=1;j&=n;j++)putchar(ch); putchar('\n'); } 若所用的变量都已正确定义,通过输入 L 的值为 5,则程序段在第一列起有以下的输出 结果: A BBB CCCCC DDDDDDD EEEEEEEEE 和题目的要求比较已趋接近,不同的是在每行没有适当的缩进。 (7)现在来解决每行的缩进问题。由题中给出的图形可知,若指定输出 5 行,第一行 缩进 5 个空格,第二行则缩进 4 个空格,第三行则缩进 3 个空格,第四行则缩进 2 个空格, 第五行则缩进 1 个空格。这同样可以由以下的 for 循环来实现: for(k=L;k&=i;k--)putchar(' '); 把此循环放在 i 控制的循环体内、输出每行字符的循环之前即可。 (8)请读者自己补充有关的 include 行、语句和变量的定义,以完成整个程序。注意,如 果有能力可在某些地方作些简化。 25. 用 for 循环分别编程计算下式,变量用 float 类型,试分析结果不同的原因。 S=1-1/2+1/3-1/4+?+1/000 (1)从左到右计算。 (2)从右到左计算 答:只写出程序的主要语句: (1)float i,s=0,t= -1; for (i=1;i&=10000;i++){t=-t;s+=t/i;} printf (“s=%f\n”,s); (2)float i,s=0,t=1; for (i=10000;i&=1;i--){t=-t;s+=t/i;} printf (“s=%f\n”,s); 运算结果对比: (1)0.693091 (2)0.693097 运算按从左到右,结果精度较低。因为当 s 达到一定值时,后面的 1.0/i 的值相对 s 来说太 小,一些小数位将不能加到 s 上而丢失,即俗称“丢失零头” 。如取相反顺序,从右向左计 算, 可使较多的低位有效数字参加运算, 实现 “聚零为整” 结果精度较高。 , 如果改用 double 类型计算,便可发现 0.693097 是比较准确的。 26. 由 e =1+x+x /2!+x /3!+x /4!+?+x /n!+?,计算 e 的近似值,并与标准函数 exp(x)结 果相比较,N、X 的值由键盘输入,N、X 的值宜小不宜大,如 N=10,X=0.1。 答:除 n 以外,变量类型皆定义为 double,使计算精度高一些。 #include &stdio.h& #include &math.h& void main( ) { double e=1,x,i,j=1,m=1; printf (&n,x=&);scanf (&%d %lf&,&n,&x); for (i=1;i&=n;i++) { j*=i;m*=x;e+=m/j; } printf (&e=%12.9f exp(x)=%12.9f\n&,e,exp(x)); } 运行结果:n,x=5 0.1 e=1. exp(x)=1.. 求无符号整型数范围内最大的一个素数。 答 要点:从最大长整型数向递减方向查找,找到的第一个素数则是最大的素数。 #include &stdio.h&x 2 3 4 n x #include &math.h& void main( ) { unsigned int n=-1,i,k; /* 赋值用 n=-1,n 即为最大无符号整型数*/ while (n-=2) /*从大向小查找*/ { k=sqrt (n); for (i=2;i&=k;i++) if (n%i==0) /* 已判断 n 不是素数,结束 for 循环*/ if (i&=k+1) { printf (&max=%lu\n&,n); } /*找到了结束 while 循环*/ } } 运行结果:max= 28. 甲乙丙三个步枪射手, 命中率分别为 0.7、 0.6、 0.5, “甲→乙→丙→甲→乙→丙→?” 按 的顺序, 相继射击同一目标, 直至有人命中为止。 试模拟击中 100 个目标, 所需要的子弹数。 答 要点:循环 100 次,模拟击中 100 个目标。设子弹数 s,开始为 0。执行一次 s++, 产生一个 0~1 之间的随机数,相当于一次射击。每轮第 1 个随机数如小于等于 0.7,则认为 甲命中,开始下一目标的射击;否则,产生第 2 个随机数,如小于等于 0.6,则认为乙命中, 开始下一目标的射击;否则,产生第 3 个随机数,如小于等于 0.5,则认为丙命中,开始下 一目标的射击;否则按上述规则,从甲开始再射击这一目标,直到有人命中。 #include &stdio.h& #include &stdlib.h& #include &time.h& void main( ) { int i,s=0; srand(time(NULL)); //初始化随机数种子 for (i=1;i&=100;i++) { while(1) { s++; if ((rand()%100/100.0)&=0.7) s++; if ((rand()%100/100.0)&=0.6) s++; if ((rand()%100/100.0)&=0.5) } } printf (&s=%d\n&,s); } 29.编写一个程序,输入三条线段的长度,判断这三条线段能否构成一个直角三角形。 答案: #include &stdio.h& void main() { float a,b,c; printf(&请输入三条线段的长度:&); scanf(&%f,%f,%f&,&a,&b,&c); if(a*a+b*b == c*c || a*a+c*c == b*b || b*b+c*c == a*a) printf(&这三条线段能构成直角三角形。\n&); else printf(&这三条线段不能构成直角三角形。\n&); } 30. 编写一个程序,求输入实数的绝对值。 答案: #include &stdio.h& void main() { float x,y; printf(&请输入一个实数:&); scanf(&%f&,&x); if(x&0) y=x; else y=-x; printf(&%f 的绝对值是%f\n&,x,y); } 31. 编写一个程序,输出给定月份的天数。 答案: #include &stdio.h& void main() { int year,mon,days, printf (&请输入年份月份&); scanf(&%d.%d&, &year,&mon); switch(mon) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days=31; case 4: case 6: case 9: case 11: days=30; case 2: if(year % 400 == 0 || (year%4 == 0 && year%100 != 0)) days=29; else days=28; } printf (&%d 年%d 月的天数为%d 天\n&,year,mon,days); } 32. 编写一个程序,输入一个不多于 5 位的正整数,求出它是几位数。 提示:注意整型变量的范围。 答案: #include &stdio.h& void main() { int len,t=0; printf(&请输入一个整数:&); scanf(&%ld&,&n); if(n&0||n&=100000) t=1; else if(n&10) len=1; else if(n&100) len=2; else if(n&1000) len=3; else if(n&10000) len=4; else len=5; if(t==0) printf(&该整数是个%d 位数。\n&, len); else printf(&输入负数或大于 5 位,无法求解。\n&); } 33. 编写一个程序,根据输入的 a,b,c 的值,求出 x 的值。 c/b 若 a=0 时 x = a*c 若 a!=0 且 b=0 时 a+b+c 其它情况 答案: #include &stdio.h& void main() { float a,b,c,x; printf(&请输入 a,b,c 的值:&); scanf(&%f,%f,%f&,&a,&b,&c); if(a==0) x=c/b; else if(b==0) x=a*c; else x=a+b+c; printf(&x=%f\n&, x); } 34. 某市企业管理测评中,若企业得分低于 70 的为较差企业,以“#”表示,若得分在 70 到 80 之间的为中等企业,以“*”表示,若得分在 80 到 90 之间的为良好企业,以“**”表 示,若得分在 90 以上的为优秀企业,以“***”表示,利用 if-else 结构编写一个程序,对 于输入的企业成绩,输出相应的级别标志。 如:输入 89,输出 **。 答案: #include &stdio.h& void main() { printf(&请输入企业的得分情况&); scanf(&%f&,&x); if (x&0||x&100) printf(&输入错误,请校对后重新输入。\n&); else if (x&70) printf(&#\n&); else if (x&80) printf(&*\n&); else if(x&90) printf(&**\n&); else printf(&***\n&); } 35. 编写一个程序,输入某年某月某日,判断该日是这一年的第几天。 提示:以 3 月 5 日为例,先把前两个月的天数加起来,然后再加上 5 天即本年的第几天;特 殊情况,闰年且输入月份大于 3 时需考虑多加一天。 答案: #incl

我要回帖

更多关于 正则表达式加减法 的文章

 

随机推荐