第二部分 选择结构 ·21·
{
int year, month, days, leap;
printf(”please input both year and month:”); scanf(”M/-”,&year,&month); switch (【1】) { case 1: case 3: case 5; case 7: case 8: case 10:
case 12: days=31; 【2】 case 4: case 6: case 9:
case 11: days=30;
break;
case 2: if (year@0==0) leap=1;
else if (year%4==0 && year0!=0) leap=1; else 【3】; if (leap)
days=29;
else
days=28; }
printf(”%d年%d月的天数为%d\\n”, year, month, days); }
20.以下程序完成两个数的四则运算。请在【】内填入正确内容。
#include ”stdio.h” main() {
float x,y; char operator;
printf(”please input the expression:”); scanf(”%f%c%f”,&x,&operator,&y); switch (【1】)
{ case ’+’: printf(”%g%c%g=%g\\n”, x, operator, y, x+y);
【2】;
case ’-’: printf(”%g%c%g=%g\\n”, x, operator, y, x-y);
break;
case ’*’: printf(”%g%c%g=%g\\n”, x, operator, y, x*y);
break;
case ’/’: if (y==0.0)
printf(”除零错误!\\n”); else
printf(”%g%c%g=%g\\n”, x, operator, y, x/y); break;
【3】: printf(”表达式存在错误!\\n”);
第二部分 选择结构 ·22·
}
}
21.以下程序运行后的输出结果是_____________。 #include ”stdio.h” main()
{
int x=10, y=20, t=0;
if (x==y) t=x; x=y; y=t; printf(”%d,%d\\n”,x,y);
}
22.执行以下语句后,x、y和z 的值分别为_____________。
int x,y,z; x=y=z=0;
++x || ++y && ++z;
2.3 答案及部分解析
一.选择题答案
1. D 2. B 3. D 4.C 5.D 6.C 7. C 8. A 9. C 10.C 11.C 12.C 13.B 14.C 15.A 16.B 17.C 18.C 19.B 20.B 21.A 22.C 23.D 24.C 25.D 26.C 27.C 28.C 29.A 30.A 2. 解析:当条件1:m=a>b的值为假时, 便已经确定整个表达式的值为假,所以不必再继
续判断第二个表达式的逻辑值。由于没有执行第二个表达式n=c>d,所以n的值仍为2。
17.解析:if的条件表达式x=y+z为赋值语句,x=5为非零值,即为if (1) printf(”***\\n”); 23.解析:A.的错误在于switch(a+b);其后有一个“;”,B的错误在于switch a的条件表达
式a没有括号,应该为switch(a),C的错误在于有两个case具有相同的入口值。
28.解析:当输入c时,switch语句执行情况为:
switch(ch) {case ’a’: 从此处向下执行 case ’h’: default: v1++; case ’0’: v2++; } 因为没有break语句
当继续输入h时,switch语句的执行情况为: switch(ch) {case ’a’: 从此处向下执行 case ’h’: 因为没有break语句
?v1?v1?1?2 default: v1++; case ’ 0 ’ : v2++; ?
v2?v2?1?2?} 重复上述过程,输入5个有效字符,则v1和v2执行5次自加操作,所以: v1=5, v2=5
第二部分 选择结构 ·23·
二.填空题答案 1.答案:585858
解析:虽然三个if语句按照嵌套方式书写,但是程序仍然是依顺序运行的,会分别对每一
个if的条件表达式进行判断,若其条件表达式为真,就执行其后的语句,否则,不执行。 2.答案:1
解析:注意该表达式是关系表达式的双等号,所以其结果只能为1或0。 3.答案:4 4.答案:1
5.答案:在Turbo C编译系统下,结果为a=2,b=3,c=2,d=3,e=-1;若在Visual C++下,
结果为a=2,b=3,c=2,d=3,e=-0。
解析:①在Turbo C编译系统下,解题过程如下:
第一个赋值语句“c=(-a++)+(++b);”可分解为如下的几个语句:
b?b?1??c??a?b??b?2?1?3,c??1?3?2,a?1?1?2 a?a?1??此时a=2,b=3,c=2。
第二个赋值语句“d=(b--)+(++a)-a;”可分解为如下的几个语句:
??d?b?a?a??a?2?1?3,d?3?3?3?3,b?3?1?2 b?b?1??此时a=3,b=2,c=2,d=3。
第三个赋值语句“e=(a/(++b))-(a/(--a));”中由于自加、自减运算符的优先级高于其它运算符,故先运算++和--,令a=2,b=3,然后该等式中a的值都取2参与运算,故该等式等价与:“e=2/3-2/2;”,因此e的值等于0。 此时a=2,b=3,c=2,d=3,e=0
②在Visual C++编译系统下,解题过程如下: 前两条赋值语句“c=(-a++)+(++b);”、“d=(b--)+(++a)-a;”的运算过程和在Turbo C编译系统一样,第三个赋值语句“e=(a/(++b))-(a/(--a));”可按步骤分解为如下的几个语句 ??e?a/b?a/(a?1)??b?2?1?3,e?3/3?3/2?0,a?2
?a?a?1?因此,其结果为a=2,b=3,c=2,d=3,e=-0 6.答案:a=3,b=2,c=1,d=1,e=0,f=0
解析:第一个赋值语句c=(a++>= --b);可以分解为如下的语句:
b?b?1??c?(a??b)??b?3?1?2,c?(2??2)?1,a?2?1?3 a?a?1??第二个赋值语句d=(a==++b);可以分解为如下的语句:
b?b?1???b?2?1?3,d?(3??3)?1
d?(a??b)?b?b?1a?a?1 第二部分 选择结构 ·24·
第三个赋值语句e=(a--!=b);可以分解为如下的语句:
e?(a!?b)???e?(3!?3)?0,a?3?1?2
a?a?1?第四个赋值语句f=(++a>b--);可以分解为如下的语句:
a?a?1??f?(a?b)??a?a?1?3,f?(3?3)?0,b?3?1?2 b?b?1??由以上各步,可以得到:a=3,b=2,c=1,d=1,e=0,f=0 7.答案:2 0 0
解析:参看如下的注释语句。
if (c>0) s=a+b; /* c=3>0为真,所以执行s=a+b语句;即:s=2*/
if (a<=0) /*由于a= -1, 故a<=0为真,所以执行其后的大括号内的语句*/ { if (b>0) /*由于b=3, 故b>0为真,可以继续下面的语句*/
if (c<=0) w=a-b; /*由于c=3,c<=0为假,其后w=a-b不会执行*/
}
else if (c>0) w=a-b;/*这一对if-else因a<=0为真,所以没有机会执行到*/ else t=c;
8.答案:100
9.答案: 6 250
5 1 0 0
10.答案:【1】x>2 && x<=10 【2】x>-1 && x<=2 【3】y= -1 11.答案:【1】a==0 【2】b==0 【3】disc<0 12.答案:【1】(a+b>c) && (b+c>a) &&(a+c>b) 【2】 (a==b) || (b==c) || (a==c)
【3】 (a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a) 13.答案:【1】(year%4==0)&&(year0!=0) 【2】flag=0 14.答案:【1】ch>=’A’ && ch<=’Z’ 【2】ch=ch-32 15.答案:【1】a>b 【2】min=c; 16.答案:【1】weight>10 【2】rate=0.4 【3】else 17.答案:good!
joke
18.答案:【1】x<0 【2】x/10 【3】y!= -2 19.答案:【1】month 【2】break; 【3】leap=0; 20.答案:【1】operator 【2】break 【3】default 21.答案:20,0 22.答案:1,0,0
第三部分 循环结构 ·25·
第三部分 循环结构
3.1 选择题
1. 以下程序的输出结果是( )。
main() { int n=4;
while (n--)
printf(〞%d〞,--n);
}
A.20 B.31 2. 以下程序的输出结果是( )。
main()
{int x=10,y=10,i; for(i=0;x>8;y=++i) printf(\}
A.10192 B.9876 3. 当执行以下程序段时。
x=-1;
do
{x=x*x;} while (!x);
A.循环体将执行一次 C.循环体将执行无数多次 4. 执行以下程序后输出的结果是( main()
{ int y=10;
do{y--;}while(--y); printf(\
A.-1 B.1 5. 下面程序的输出结果是( )。
main()
{ int x=3,y=6,a=0; while (x++!=(y-=1)) {a+=1;
if (y } printf(\} C.321 D.210 C.10990 D.101091 B.循环体将执行两次 D.系统将提示有语法错误 。 C.8 D.0 )