C语言基础练习题(1-3) 下载本文

内容发布更新时间 : 2024/4/30 23:57:44星期一 下面是文章的全部内容请认真阅读。

第二部分 选择结构 ·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 )