大一c语言课本第三章习题答案,C语言程序设计 第三章 习题详解

原标题:C语言程序设计 第三章 习题详解

b72d2411ebd0562010e0b8303c895c5e.png

第三章 程序结构

一、选择题

1.设 a=3,b=4 执行“printf(“%d,%d",(a, b),(b,a));”的输出是( )

①3,4 ②4,3 ③3, 3 ④4,4 2.使用“scanf(”x=%f,y=%f“,&x,&y)”,要使 x,y 均为 1.25,正确的输入是( )

①1.25,1.25 ②1.25 1.25 ③x=1.25,y=1.25 ④X=1.25 y=1.25

3.设有 int i=010,j=10;则执行“printf(”%d, %d\n“,++i,j--);”的输出是( )

①11, 10 ② 9,10 ③ 010, 9 ④ 10, 9

4.设 a,b 为字符型变量,执行“scanf(”a=%c, b=%c“,&a,&b)”后使 a 为‘A’,b 为‘B’,从键 盘上的正确输入是( ) ①‘A“B’ ②‘A’,‘B’ ③A=A,B=B ④a=A, b =B

5.设 x、y、z、t 均为 int 型变量,则执行以下 语句后,t 的值为( )

x=y=z=1;t=++x||++y&&++z;

①不定值 ②2 ③1 ④0

第1~5题答案:1.「解」在调用格式输出函数的语句中,其中每 个格式符对应一个输出项,格式符 d 要求输出项内 容以十进制整数形式输出。第一个输出项(a,b) 是一个逗号表达式,该表达式的值是 b 的值,输出 4.接着输出字符逗号。第二个输出项(b,a)的值 是 a 的值,输出 3.所以语句执行将输出 4,3.正解 的选择是② 2.「解」格式输入函数的格式字符串中的字符可 以分成三类:空格类字符、其它普通字符和格式转 换说明。其中空格类字符用来跳过一个空格类字符 序列,直至下一个非空格类字符。普通字符要求输 入字符与其完全相同。格式转换说明对输入字符列 按格式转换说明进行转换,得到内部值存储到对应 输入项所指定的存储位置中。函数调用 scanf(“x =%f,y=%f,&x,&y)以普通字符 x=开头,输 入时也要先输入 x=。接着是一个浮点数输入格式, 所有能构成一个浮点数 1.25 的字符序列都能满足 要求。接着是普通字符列”,y=“,在输入的浮点数 之后也要有字符列”,y=“。后又是浮点数输入格 式,同样所有能构成一个浮点数 1.25 的字符序列都 能满足要求。问题给出的供选择答案中只有 x=1.25,y=1.25 是能满足上述要求的。所以正确选 择是③。 3.「解」变量 i 和 j 的初值分别为八进制数 010 和十进制数 10,函数调用 Printf(“%d,%d\n”, ++i,j——)中,++i 的值是变量 i增 1 后的值,原 来值是八进制数 010,等于十进制数8,输出9.j-- 的值是变量 j 减 1 之前的值,输出 10.格式字符申中 的逗号是普通字符照原样输出。所以问题给出的格 式输出函数调用将输出 9,10.正确的解答是②。 4.「解」函数调用 scanf(“c=%c,b=%c”,&c, &b)中,普通字符必须按格式字符串要求照原样输 入,c 格式对紧接的任何字符都输入。所以实现问 题的要求,输入字符列应为“a=A,b=B”。另外要 特别指出,在程序中,为表示字符常量,字符前后 需加单引号。但用字符格式输入字符时,在要输入 字符前后不必另键人单引号。若键人单引号,则这 个单引号也将作为字符被输入。正确的解答是④. 5.「 解 」 语 句 序 列“x = y = z = l ; t = ++x||++y&&++z;”使变量 x 的值为 1,变量 t 是赋 一个逻辑表达式的值。在 C 语言中,由逻辑与和逻辑或构成的逻辑表达式有特别的计算规则,顺序计 算各逻辑子表达式,并当一旦能得到逻辑表达式的 结果时,就立即结束逻辑表达式的计算,不再计算 后继逻辑子表达式。本题的逻辑表达式是两个运算 分量的逻辑或,而且左运算分量++x 的值为非 0, 立即得到逻辑或运算的结果为 1,并将 1 赋给变量 t,所以变量 t 的值为 1.正确解答为③。

6.设 x、y、z 均为 int 型变量,则执行以下语句 后,x、y, z 的值为( )

x=1; y=0; z=2; y++&&++z ||++ x;

①2、l、3 ②2、0、3 ③2、l、3 ④2、1、2

7.假定所有变量均已正确定义,下列程序段运 行后 x 的值是( ).

a=b=c=0; x=35; if(!a)x--; else if(b);if(c)x=3;else x=4;

①34 ② 4 ③ 35 ④ 3

8.下列语句中,句法错误的是(不考虑语义) ( )

① while(x=y)5 ; ② do x++ while(x= =10) ; ③while(0); ④do 2;while(a==b);

9.循环语句“for(x=0, y=0;(y!=123) ||( x<4);x++);”的循环执行( ) ①无限次 ②不确定次 ③4 次 ④3 次 10.若 i、j 已定义为 int 类型,则以下程序段中的内循环体的执行次数是( ) for( i=5; i; i--) for(j= 0; j<4;j++){……} ①20 ② 24 ③ 25 ④ 30

11.假定 a 和 b 为 int 型变量,则执行以下语句 后 b 的值为( ) a=1; b=10; do {b-=a; a++; }while(b--<0); ① 9 ②-2 ③-1 ④8

12.设 x 和 y 为 int 型变量,则执行下面的循环 后,y 的值为( ) for(y=l, x=l; y<=50; y++) { if(x>=10) break; if(x%2==1){ x+=5; continue;} x -= 3; } ① 2 ②4 ③6 ④8

13.在 C 语言中,下列说法中正确的是( ) ①不能使用“do 语句 while(条件)”的循环 ②“do 语句 While(条件)”的循环中必须使用 “break”语句退出循环 ③“do 语句 while(条件)”的循环中,当条件 非 0 时将结束循环 ④“do 语句 while(条件)”的循环中,当条件 为 0 时将结束循环

第6~10题答案:6.「解」语句序列“x=l;y=0;z=2; y++&&++z||++x;”先使变量 x 的值为 1,变量 y 的 值为 0,变量 z 的值为 2.由逻辑与和逻辑或构成的 逻辑表达式的特别计算规则,顺序计算各逻辑子表 达式,并当一旦能得到逻辑子表达式的结果时,就 立即结束逻辑子表达式的计算,不再计算该逻辑子 表达式。计算 y++因 y 的值为 0,使 y++&&++z 的 结果为 0,立即去计算++x,这次计算使变量 y 的值 变成 1,而变量 z 的值本改变。接着计算++x,使 x 的值变为 2.所以经上述语句执行后,x、y、z 的值 依次为 2、1、2. 正确解答为④. 7.「解」以变量 a,b,c 的值均为 0,变量 x 的 值为 35,语句: if(!a)x--;else if(b);if(c)x=3;else x =4; 由两个 if 语句组成。首先执行前一个 if 语句“if (!a)x--;else if(b);”,因变量 a 的值为 0,条 件!a 成立,执行 x--使 x 的值变为 34.接着执行后 继的 if 语句“if(c)x=3; else x=4;”,因变量 c 的值为 0,条件不成立而执行 x=4,终使变量 x 的值为 4.正确解答是②。注意前一个if语句的else部分的成分语句只有 “if(b);”,这是一个单分支 if 语句,且其成分语 句为空语句。 8.「解」 while 语句的一般形式是: while(表达式) 语句 这里的表达式可以是任何合理的表达式,语句 可以是任何语句,包括空语句,或表达式语句。可 能书写的 while 语句没有任何意义,如供选择的① while(x=y)5;和③while(0);,但这两个语句 的句法没有任何错误。do-while 语句的一般形式是: do 语句 while(表达式); 其中的成分语句也可以是任何语句,但供选择 答案②do x++ while(x==10); 中的代码 x++是一 个表达式,不是语句,语句必须要以分号结束,所 以是错误的。正确解答是②。 9.「解」for 循环语句的初始化部分置变量 x 和 y 的初值为 0,循环条件是(y!=123)||(x<4) , 每次循环后变量 X 的值增 1.由于循环过程中变量 y 的值未被修改过,循环条件又是一个逻辑或,其左 分量(y!=123)永远成立,也就是循环条件永远 成立。所以该循环语句将循环执行无限次。正确解答是①。 10.「解」问题所给的程序段的外循环是一个阶循环语句,它的初始化部分置变量 i 的初值为 5,循环条件简写成 i,即 i!=0,每次循环后变量 i 的值减 1.所以循环共控制 5 次循环。内循环也是一个for 循环语句,它的初始化部分置变量 j 的初值为 0,循环条件是 j<4,每次循环后变量 j 的值增 1.所以内循环共控制 4 次循环。这样,如内循环的体内未曾对变量 i 和 j 有修改,在内、外循环一起控制下,内循环体共被重复执行 20 次。正确解答是①。

第11~13题答案:11.「解」在这个程序段中,循环开始前变量 a 的 值为 1,b 的值为 10,每次循环从变量 b 减去 a, 并让 a 增 1,并在循环条件判定时,又让 b 减去 1. 第一次循环后,变量 b 的值变成 9,变量 a 的值变 为 2,循环判断时,因 b 的值大于 0,循环条件不成立,结束循环。但在循环判断时,让 b 减去了 1, 所以循环结束时,变量b的值为8.正确的解答是④。 12.「解」 for 循环语句的初始化部分置变量 x 和 y 的初值为 1,循环条件是(y<=50),每次循环 后变量 y 的值增 1,控制循环多执行 50 次。循环 体有三个语句:首先在发现变量 x 的值大于等于 10 时,结束循环;接着是当变量 x 除 2 的余数为 1(即 变量 x 是奇数)时,让变量 X 值增 5,让 x 变成偶 数,并直接进入下一轮循环;如变量 x 是偶数,则 从变量 x 减去 3,让变量 x 变成奇数。由上述分析 知,每两次循环使变量x的值增加2.第一次循环后, 变量 x 的值变成 6.第二次循环后,变量 x 的值变成 3. 第三次循环后,变量x的位变成8.第四次循环后, 变量 x 的值变成 5.第五次循环后,变量 x 的值变成 10.第六次循环时,因变量 x 的位大于等于 10,直 接跳出循环,这次循环是非正常结束,对变量 y 的 修正只执行了 5 次。所以循环结束后,变量 y 的值 增至 6.正确的解答是③。 13.「解」 do-while 语句的一般形式是: do 语句 while(表达式); 其语义是重复执行其成分语句,直至表示条件 的表达式值为 0 时结束。do-while 语句是正常使用 的一种循环结构之一。do-while 语句的循环结束条 件由 while 后的表达式值为 0 所控制,并不一定要 有 break 语句跳出循环来结束循环。do-while 语句 在条件值非 0 时,将继续循环,而不是结束循环。 条件值为 0 时,才结束循环。所以正确的选择是④。

二、填空题

1. 结构化程序设计规定的三种基本结构是 结构,选择结构和_____结构。

2.若有定义“int a=25,b=14, c=19;”,以 下语句的执行结果是_____

if ( a++<=25&&b--<=2&&c++) prinif(“a=%d,b=%d,c=%d\n”, a, b,c); else printf(“###a=%d,b=%d,c=%d\n”, a, b,c);

3.以下两条 if 语句可合并成一条 if 语句为_____. if(a<=b) x=1; else y=2; if(a>b) printf(“*y=%dn” ,y); else printf( “####x=%dn” ,x);

4.设 i,j,k 均为 int 型变量,则执行完下面的 for 语句后,k 的值为_____. for(i=0,j=10;i<=j;i++,j--)k=i+j;

5.下列程序的功能是输入一个整数,判断是不 是素数,若为素数输出 1,否则输出 0,请为程序 填空。 main() {int i,x,y=1; scanf(“%d”,&x); for(i=2;i<=x/2;i++) if_____{ y=0; break; } printf(“%d\n”,y); }

第1~5题填空题答案:1.「解」结构化程序设计的三种基本控制结构是 顺序结构、选择结构和循环结构。 2.「解」问题所给的 if 语句中,条件 a++<=25 &&b--<=2&&c++是先求逻辑与的第一个运算 分量,它是一个关系式,关系成立。接着判定第二 个逻辑与运算分量,又是一个关系式,由于变量 b 的值是 14,b 不小于等于 2,运算分量的关系式不 成立,导致 if 语句的条件为假,执行 else 部分。在 求且语句的条件时,计算了 2 个逻辑与分量,使变 量 a 的值增了 1,变量 b的值被减了 1.所以输出内 容是:###a=26,b=13,c=19. 3.「解」在以上两条 if 语句中,两个条件刚巧相 反。若将前一个 if 语句的第一个成分语句与第二个 if 语句的第二个成分语句合并;第一个 if 语句的第 二个成分语句与第二个if语句的第一个成分语句合 并,写成一条 if 语句如下: if(a<=b){x=1;printf(“####x=%dd, x);} else{ y=2; printf(“**y=%dn”,y);} 4.「解」该 for 语句以 i 为 0、j 为 10 初始化, 循环条件是 i<=j,每次循环后 i增 1、j 减 1, 循环体是将 i与j的和赋给 k.这样变量 k将保存的 是后一次赋给它的值。一次循环后 i为 l.j 为 9, 二次循环后 i为 2.j 为 8,……,五次循环后 i为 5.j 为 5,继续第六次循环,将 i与 j的和 10 存于 k 后,i 为 6、j 为 4,结束循环。所以循环执行后 k 为 10. 5.「解」为判数 x 是否是素数,预置变量 y 的值 为 1(x 可能是素数),然后用循环,用 2 至 x/2 的整数 i 测试对 x 的整除性,若能被其中的某个整 数整除,则 x 是合数,置 y 的值为 0(不是素数) , 结束测试循环。若都不能整除,则 x 为素数。i 能 否整除 x,可用求余运算 x%i 等于 0 来判定。所以 程序中的空框可填 x% i==0.测试 X为素数的代 码可写成: y=1; for( i=2; i<=x/2; i++) if(x%i==0){ y=0; bleak; }

三、程序分析题

阅读程序,写出运行结果。 main() { int a=10, b=4,c=3; if(a<b)a=b; if(a<c) a=c; printf(“%d,%d,%dn”, a,b,c); } 2.阅读下列程序,写出程序的输出结果。 main() { int x=100, a=10, b=20, ok1=5,ok2 =0; if(a<b) if(b!=15) if(!ok1) x=1; else if(ok2) x=10; else x=-1; printf(“%d\n”,x); } 3.阅读下列程序,写出程序的输出结果。 main() { int y=9; for(; y>0; y--)

if(y%3==0){ printf(“%d”,--y);continue;}

第1~3题分析题答案:1.「解」程序中,第一个 if 语句 if(a< b)a=b, 当 a< b 时,让 b 值置 a,该语句确保 a 的值不比 b 小。同样第二个 IF 语句 if(a<c)a=c,当 a<c 时,让 C 值置 A,使 A 的值不比 C 小。实际;情 况是 a 本来就比 b 和 c 都大,所以 a 的值没有变, 程序输出 a、b 和 c的原来值:10,4,3. 2.「解」程序预置变量 x 的值为 100,a 的值为10,b 的值为 20,ok1 为 5,ok2 为 0. 程序中给出的if语句可以写成更结构化的形式 如下:if(a<b) { if(b!=15){ if(!ok1) x=1; else{ if(ok2) x=10; else x=-l; } } } 由于条件 a<b 成立,并且条件 b!=15 也成立, 而 ok1 不等于 0,执行 else 后的语句。又因 ok2 等 于 0,执行 else 后的语句赋-1 给 x.所以程序输出-l. 3.「解」循环前,变量 y 的值为 9,其中的循环 语句在 y 大于 0 情况下循环,每次循环后 y 的值减 1.循环体是当 y 能被 3 整除时输出表达式--y,输出 的是减 1 后的 y 值。这样,第一次循环因 y 为 9, 能被 3 整除,输出 8,y 也变成 8.又经两次循环,y 的值变为 6,又让 y 减 1 变成 5,并输出 5;又经两 次循环,y 的值变成 3,让 y 减至变成 2,输出 2; 再经两次循环后,y 的值变成 0,结束循环。所以 程序输出 852.四、程序设计题

1.编一个程序,输入华氏温度(F),按下列公 式计算并输出对应的摄氏温度(C):C= 5( F- 32)/9 2.编一个程序,输入一个整数,输出其符号(若 ≥0,输出 1;若<0 出-1)。 3.编一个程序,输入 X 的值,按下列公式计算 并输出 y 的值。 4.编一个程序,输入三个单精度数,输出其中最 小数。 5.编一个程序,求出所有各位数字的立方和等 于 1099 的 3 位数。

第1~5题设计题答案:1.「解」利用公式:C=5(F-32)/9,输入 F 氏温度,计算并输出对应的 C 氏温度,程序要引入 两个变量,分别用于存储 F 氏温度和 C 氏温度,计 算时应采用浮点型,包括公式中的常数也应写成浮 点数,不能采用整型和把常数写成整数。因采用整 型编写,公式中的除运算变成整除,会得出与实际 要求不一致的结果。程序如下: #include

main() { float f,c;

printf(“输入 F 氏温度”); scanf(“%f,&f); c= 5.0(f-32.0)/9.0; printf(“对应的 C 氏温度%6.2f\n”,c); } 2.「解」程序可用 if 语句判断输入数的符号,并控制输出 1 或-1程序如下: # include

main() { int c;

printf(“输入一个整数”); scanf(“ %d”, &c); if(c>=0) printf(“1n”); else printf(“-1n”) ; } 3.「解」输入 x,按公式计算 y.这可用一个嵌套 的if语句分段判断并计算出y的值。然后输出y值。 程序如下: # include<stdio.h> main() { int x,y;/*变量定义*/

printf(“输入一个整数”); scanf(“%d”,&x) ; if( x<=l) y=x; else if(x<10)y=2x-l; else y=3x-11; printf(“y=%d n”, y);

} 4.「解」设小数存于变量 min 中,为求三个数 中的小数,可分以下多步完成,先预置 min 为 x, 然后分别将其余两个数逐一与 min 比较,当它们中 的某个值比存于 min 中的值更小时,就用它们更新 min.写出程序如下: # include

main() { float x,y,z,min;

printf(“输入三个单精度浮点数”); scanf(“%f%f%f”, &x,&y,&z); min =x; if(min>y) min= y; if(min>z) min=z; printf(“浮点数%f,%f,%f 中的小值是%fn”, x,y,z,min); } 5.「解」找出所有各位数字的立方和等于 1099 的3位整数。 3位整数是100至999范围内的整数, 设分别用 a,b,c 存储 3 位数的百位、十位和个位 的数字,程序用三重循环求出 a,b,c 的立方和为 1099 的 3 位数 a100+b10+c.程序如下: # include

main() { int a,b, c;

for(a=1; a<=9;a++) for(b=0; b<=9; b++) for(c=0;c

for (i=100;i<=999;i++) { a=i/100;

b=(i%10)/10; /*或 b=(i/10)%l0*/

c=i%10;

if(a*a*a+b*b*b+c*c*c==1099) printf(“%dn”, i); } }

6.编一个程序,输入 10 个整数,统计并输出其中正 数、负数和零的个数。 7.编程序,按下列公式计算 e 的值(精度为 1e-6): e=1+1/1!+1/2!+1/3!+…+1/n!+… 8.编程序,按下列公式计算 y 的值(精度为 1e-6): y=∑1/r*r+1 9.编一个程序显示 ASCII 代码 0x20 至 ox6f 的十 进制数值及其对应字符。 10.用三种循环语句分别编写程序显示 1 至 100 的平方值。

第6~10题设计题答案:6.「解」输入 10 个整数,统计其中正数、负数 和零的个数。程序引入 3 个计数器变量,用于统计 大于以小于 0 和等于 0 的整数的个数。开始时,这 3 个计数器都置 0,然后用循环逐一输入 10 个整数, 并判定当前输入的整数是大于 0,或小于 0,或等 于 0,并按判定结果累加相应计数器。最后,程序 输出这 3 个计数器的值。程序如下: # include

main() { int i,d,n,z,p;

n=z=p=0; for(i=1;i<=10;i++) { print(“ 输入第%d 个整数”, i); scanf(“%d”,&d); if(d<0)n++; else if(d>0)p++; else z++; } printf(“负数有%d 个,正数有%d 个,零有%d 个。n”,n,p,z); } 7.「解」按 e 的幂级数展开式计算 e 的值。这是 典型的求级数和计算问题。通常采用逐项计算,并 累计的方法。计算新的项时,可用上一轮循环计算 出的项,这能提高程序的效率。循环直至当前项的 值小于精度要求结束。程序如下: # include

main() { double e,t,i;/*变量定义*/

e=0.0;t=1.0;i=1.0; while(t>=1.0e-6) { e+=t; t/= i; i+= 1.0; } printf(“e=%.6fn”, e); } 8.「解」按所给公式计算数列的和。类似上一小 题的解,逐项计算并累计。程序如下: # include

main() { double y,r,t;/变量定义/

y=0.0;r=1.0; while( (t=1.0/(rr+1.0))>=1.0e-6) { y+=t; r+=1.0; } printf(“y=%.6fn”, y); } 9.「解」显示 ASCII 代码为十六进制 0x20 至 ox6f 的字符的十进制代码值与其字符。程序可用一个循 环,让变量 i 顺序地取 0X20 至 OX6f 的值,并逐一 输出其十进制代码和对应的字符,程序如下: # include

main() { int i,k=0; for(i=0x20; i<=0x6f;i++) { if(k++%10== 0)/每行十个/ printf(“n”); printf(“(%c)=(%d)”, i,i); } printf(“n”); } 10.「解」用三种循环语句分别编写显示 1 至 100 的平方值的程序。直接写出 3 个程序如下: (1) 用输循环实现的程序 # include

main()/*用 for 循环*/ { int i,k=0; for(i=l;i<=100;i++) { if(k++%5==0) /*每行五个*/

printf(“n”); printf(“%d%d=%d ”,i,i,i*i); } printf(“n”); }

(2) 用 while 循环实现的程序 #include

main()/*用 while 循环*/ { int i,k=0 ; i=1; while(i<=100) { if(k++%5==0)/*每行五个*/ printf(“n”); printf(“%d%d=%d ”, i,i,i*i);

i++; } printf(“n”); } (3) 用 do-while 循环实现的程序 #include

main()/*用 do-while 循环*/ { int i, k=0 ; i=1; do { if(k++%5==0) /*每行五个*/

printf(“n”); printf(“%d%d=%d ”,i,i,i*i);

i++; } while(i<=100); printf(“n”); } 返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值