1、第4章 选择结构 作业有答案版C程序设计第4章 选择结构习题一、单选题1、以下程序输出结果是 #include int main ( ) int m=5; if (m+ 5) printf (yes:m=%dn,m); else printf (no:m=%dn,m-); return 0;A. 7B. 6C. 5D. 4参考答案:B (if (m+ 5) printf (yes:m=%dn,m); else printf (no:m=%dn,m-); 可清楚的看到对m的引用情况。依然遵循先加一再引用或先引用再加一的原则。)2、若变量都已经说明,则以下程序段输出为( ) #include in
2、t main ( ) int a,b,c;a=10; b=50; c=30;if (a b) a=b; b=c; c=a; printf(a=%d b=%d c=%dn,a,b,c); A. a=10 b=50 c=10 B. a=10 b=30 c=10C. a=50 b=30 c=10 D. a=50 b=30 c=50参考答案:B 3、为避免嵌套的条件分支语句ifelse的二义性,C语言规定,C程序中的 else总是与_组成配对关系。 A. 其上面距它最近的,并且没有其他else与其配对的if相配对B. 在同一行上的ifC. 缩排位置相同的ifD. 在其之前未配对的if参考答案 :A 4
3、、以下程序的输出结果是#include int main( ) int a=-1, b=1; if(+a0)& !(b-=0) printf(%d %dn,a,b); else printf(%d %dn,b,a); A. -1 1B. 0 1C. 1 0D. 0 0参考答案:C (因为(+a0)已经为假,!(b-=0)不会被执行,所以b不会改变)5、若执行下面的程序从键盘输入3和4,则输出是_int main( ) int a,b,s; scanf(%d%d,&a,&b); s=a; if (ab) s=b; s=s*s; printf(%dn,s); A. 14B. 16C. 18D. 2
4、0参考答案:B 6、下面的程序是_int main( ) int x=3,y=0,z=0; if (x=y+z) printf(*); else printf(#); A. 有语法错误不能过通过编译B. 输出*C. 可能通过编译,但是不能通过连接,因而不能运行D. 输出#参考答案:D 7、请读程序: #includeint 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; printf(a=%d,b=%dn,a,b);
5、 上面程序输出结果是 A. a=2,b=1B. a=1,b=1C. a=1,b=0D. a=2,b=0参考答案:A (再次理解一旦从某个case分支进来,顺序执行的思想)8、执行下面语句后的输出为( ) #includeint main( ) int i=1; if (i=0) printf(*n)else printf(%n) A. * B. %C. % D. 有语法错,不能执行参考答案:C 9、有如下程序 #includeint main( ) int x=1,a=0,b=0; switch(x) case 0: b+; case 1: a+; case 2: a+; b+; printf
6、(a=%d,b=%dn,a,b); 该程序的输出结果是 A. a=2,b=1 B. a=1,b=1C. a=1,b=0D. a=2,b=2参考答案:A (没有break语句就会顺序执行)10、有如下程序 #includeint main( ) int a=2, b=-1, c=2;if(ab) if(b0) c=0; else c+;printf(%dn,c); 该程序的输出结果是 A. 0B. 1C. 2D. 3参考答案:C (else和内层if配对,ab不成立,则直接跳到printf语句)11、阅读以下程序:#includeint main( ) int x; scanf(%d,&x);
7、if(x-5) printf(%dx); else printf(%d,x+); 程序运行后,如果从键盘上输人5,则输出结果是 A. 3B. 4C. 5D. 6参考答案:B 12、以下语句执行后x,y,z的值是 #includeint main( ) int x=10,y=20,z=30;if(xy) z=x; x=y; y=z; A. x=10,y=20,z=30 B. x=20,y=30,z=30C. x=20,y=30,z=10 D. x=20,y=30,z=20参考答案:B 13、执行完下面一段程序后x的值是 #includeint main( ) a=1,b=3,c=5,d=4;if
8、(ab) if(cd) x=1; else if(ac) if(bd) x=2; else x=3; else x=6; else x=7; A. 1B. 2C. 3D. 6参考答案:B 14、读下列程序: #include int main( ) float a,b,t;scanf(“f,f”,&a,b); if(ab) t=a; a=b; b=t; prinff(“5.2f,5.2f”a,b); 运行时从键盘输入3.8和-3.4,则正确的输出结果是( )。 A. -3.40,-3.80 B. -3.40,3.80C. -3.4,3.8 D. 3.80,-3.40参考答案:B 15、读下列程
9、序: #include int main( ) int x,y; scanf(“d”,x); y=0;if(x=0) if(x0)y=1; else y=-1;prinff(”d”,y); 当从键盘输入32时,程序输出结果为( )。 A. 0B. 1C. -1D. 不确定参考答案:B 16、以下程序的输出结果是( )。#include int main( ) int a=15,b=21,m=0;switch(a3) case 0:m+;break; case 1:m+:switch(b2) default:m+: case 0:m+;break; printf(”dn”,m); A. 1B.
10、2C. 3D. 4参考答案:A 17、下列程序段运行后x的值是( )。#include int main( ) int a,b,c,x;a=b=c=0; x=35;if(!a) x-; else if(b); if(c) x=3; else x=4: A. 34 B. 4 C. 35 D. 3参考答案:B 18、在执行以下程序时,为了使输出结果为t=4, 则给a和b输入的值应满足的条件是 #include int main( ) int s,t,a,b; scanf(%d,%d,&a,&b);s=1; t=1; if(ab) t=s+1; else if(a=b) t=5; else t=2*
11、s; printf(t=%dn,t); A. 0ab B. a=0b C. a=b0 D. ab0参考答案:D 19、若有定义: float w; int a, b; 则合法的switch语句是 A. switch(w) case1.0: printf(*n); case2.0: printf(*n); B. switch(a); case 1 printf(*n); case 2 printf(*n); C. switch(b) case a: printf(*n); default: printf(n); case b: printf(*n); D. switch(a+b) case 1:
12、 printf(*n); case 2: printf(*n); default: printf(n); 参考答案:D 20、以下程序的输出结果是#include int main( ) int a=100, x=10, y=20, ok1=5, ok2=0; if(xy) if(y!=10) if(!ok1) a=1; else if(ok2) a=10;a=-1; printf(%dn,a); A. 1B. 0C. -1D. 值不确定参考答案:C 二、程序分析1、若从键盘输入58,则以下程序输出的结果是 _ 。 #include int main( ) int a; scanf(%d,&a
13、); if(a50) printf(%d,a); if(a40) printf(%d,a); if(a30) printf(%d,a); 参考答案:585858 2、以下程序运行后的输出结果是 。 #include int main( ) int x=10,y=20,t=0; if(x=y) t=x;x=y;y=t; printf(“d,dn”,x,y); 参考答案:20,0 3、若int i=10;,则执行下列程序后,变量i的正确结果是 。#include int main( ) switch( i ) case 9:i+=1;case 10:i+=1; case 11:i+=1:defau
14、lt:i+=1; 参考答案:134、下列程序段的输出结果是 _ 。 #include int main( ) int n=c; switch(n+) default: printf(error);break; case a:case A:case b:case B:printf(good);break; case c:case C:printf(pass);case d:case D:printf(warm); 参考答案:passwarm 5、执行程序段后t的值为 。#include int main( ) int x=10,t; t=x&x10; printf(“t=%dn”,t);参考答案
15、: 0 6、程序段运行后y的值为 。#include int main( ) int a=-5, y=10; if (a=0) y-; else if (a0) y+; else y+=y; printf(“y=%dn”,y);参考答案:20 7、下列程序段的执行结果是 。#include int main( ) int a=25,b=14,c=19; if (a=25&b=2&c) printf(“*a+b=%d,a-b=%d*n”,a+b,a-b); else printf(“*a=%d,b=%d,c=%d*n”,a,b,c);参考答案: *a=25,b=14,c=19* 8、执行下列程序
16、段后,i的值为 。#include int main( ) int i=1,j; switch(i) case 1: for(j=0;j9;j+) i+=j; break; case 2: for(j=1;j10;j+) i+=j;break; case 3: i+; printf(“i=%dn”,i);参考答案: 37 9、以下两条if语句可合并为一条if语句,即 。if (ab) printf(“*y=%dn”,y);else printf(“*x=%dn”,x);参考答案: if (a=b) x=1; printf(“*x=%dn”,x); else y=2; printf(“*y=%d
17、n”,y); 10、假设两次运行时分别输入600和1200,写出以下程序运行结果 。#include#includeint main( ) int x; float y; printf(input a integer =1000) printf(input again!); scanf(%d,&x); y=sqrt(x); printf(the root of x is y:%-6.0fn,y);参考答案:24 input again!三、程序改错题教材P112 习题7:(1)画出对应代码的流程图,分析逻辑错误的原因;(2)改错并实现正确功能。四、程序设计题1、编写程序,任意输入三个整数,求其
18、最大值并输出。方法一#include int main() int x,y,z,m,n; int max(int a ,int b); printf(please input three numbers:); scanf(%d%d%d,&x,&y,&z);m=max(x,y) ;n=max(m,z) ;printf(the biggest number is:%dn,n); return 0;int max(int a ,int b) int c; if (ab) c=a; else c=b; return c; 方法二#include int main() int x,y,z; int ma
19、x(int a,int b,int c); printf(please input three numbers:); scanf(%d%d%d,&x,&y,&z);printf(the biggest number is:%dn,max(x,y,z); return 0;int max(int a ,int b,int c) int e,f; if (ab) e=a; else e=b;if (ec) f=e; else f=c; return f;2、编写程序,任意输入三个整数,将其按照从小到大的顺序排列并输出。(尝试从小到大排序并输出4个整数的算法)方法一不讲,用到后面的内容。#inclu
20、de void sort(int *x,int *y,int *z) int e; if (*x*y) e=*x; *x=*y; *y=e; if (*x*z) e=*x; *x=*z; *z=e; if (*y*z) e=*y; *y=*z; *z=e; int main()int a,b,c,*p1,*p2,*p3; printf(please input three numbers:); scanf(%d%d%d,&a,&b,&c); p1=&a; p2=&b; p3=&c; sort(p1,p2,p3); printf(the sorted numbers is:%d %d %dn,a
21、,b,c); return 0; 方法二#include int main()int x,y,z,e; printf(please input three numbers:); scanf(%d%d%d,&x,&y,&z); if (xy) e=x; x=y; y=e; if (xz) e=x; x=z; z=e; if (yz) e=y; y=z; z=e; printf(the sorted numbers is:%d %d %dn,x,y,z); return 0; 3、有一个分段函数 分别用不嵌套的if语句、嵌套的if语句、switch语句编写程序,实现以上分段函数。并列的if语句#i
22、ncludeint main() int x,y; printf(please input a integer to x:); scanf(%d,&x); if (x=1&x=10) y=3*x-11;printf(y=%dn,y); return 0;嵌套的if语句#includeint main() int x,y; printf(please input a integer to x:); scanf(%d,&x); if (x=10) y=3*x-11;printf(y=%dn,y); else y=2*x-1;printf(y=%dn,y); return 0;switch语句 /该
23、问题分支不多,用switch优势不明显#includeint main() int x,n; printf(please input a integer to x:); scanf(%d,&x); if (x=10) n=1; else n=x/10; switch(n) case -1:printf(y=%dn,x);break; case 0:printf(y=%dn,2*x-1);break; case 1:printf(y=%dn,3*x-11);break; default:printf(error data input!); return 0;4、给出一个百分制成绩,要求输出成绩等
24、级A,B,C,D,E。90分以上为A,8089分为B,7079分为C,6069分为D,60分以下为E。#includeint main() int i,n; char grade; printf(please input score:); scanf(%d,&n); if (n=0&n=100) /对成绩归类,用于switch的各分支 if (n60) i=5; else i=n/10; switch(i) /i可以是整型或字符型表达式,则case后是对应的常量 case 9:printf(grade is An);break; case 8:printf(grade is Bn);break
25、; case 7:printf(grade is Cn);break; case 6:printf(grade is Dn);break; case 5:printf(grade is En);break; default:printf(error data inputn); return 0;5、给一个不多于5位的正整数,要求:(1)求出它是几位数字;(2)分别输出每一位数字;(3)按逆序输出各位数字,例如原数为123,应输出为321。#includeint main() int num1,num2,a,b,c,d,e,n; printf(please iuput a integer to num1:); /求位数 scanf(%d,&num1); if (num19999) n=5; else if (num1999) n=4; else if (num199) n=3