第 4 章 控制语句
大纲要求重点 1.用 if 语句实现选择结构。 2.用 switch 语句实现多分支选择结构。 3.选择结构的嵌套。 4.for 循环结构。 5.while 和 do-while 循环结构。 6.continue 语句和 break 语句。 7.循环的嵌套。4.1 考证题库
4.1.1 考点汇总 考点一 用 if 语句实现选择结构 (1)在 C 语言中,if 语句有两种形式: 形式 1:if(表达式) 语句 形式 2:if(表达式) 语句 1 else 语句 2 (2)if 语句执行时,首先计算紧跟在 if 后面一对圆括号中的表达式的值,如果表达式的 值为非零(真),则执行 if 后的“语句”,然后去执行 if 语句后的下一个语句。如果表达式的 值为零(假),直接执行 if 语句后的下一个语句。 (3)if 语句后面的表达式并不限于是关系表达式或逻辑表达式,还可以是任意表达式。 if 语句中可以再嵌套 if 语句。C 语言规定,在嵌套的 if 语句中,else 子句总是与前面最近的不 带 else 的 if 相结合。 考点二 用 switch 语句实现多分支选择结构 (1)switch 语句是用来处理多分支选择的一种语句。它的一般形式如下: switch(表达式) { case 常量表达式 1:语句 1; case 常量表达式 2:语句 2; : :case 常量表达式 n:语句 n;
default :语句 n+1 }
(2)switch 语句的执行过程是:首先计算紧跟 switch 后面的一对圆括号中的表达式的值, 当表达式的值与某一个 case 后面的常量表达式的值相等时,就执行此 case 后面的语句体并将 流程转移到下一个 case 继续执行,直至 switch 语句的结束;若所有的 case 中的常量表达式的 值都没有与表达式值匹配,又存在 default,则执行 default 后面的语句,直至 switch 语句结束; 如果不存在 default,则跳过 switch 语句体,什么也不做。
考点三 选择结构的嵌套
if 语句和 switch 语句都可以嵌套使用:
(1)对于构成嵌套的 if 语句,else 子句总是和离它最近的、不带 else 的 if 子句相匹配。 (2)在一个 switch 语句中的 case 后面又嵌套了一个 switch 语句,在执行内嵌的 switch 语句后还要执行一条 break 语句才跳出外层的 switch 语句。 考点四 for 循环结构 (1)for 循环语句的一般表达式是: for(表达式 1;表达式 2;表达式 3) 语句 (2)C 语言语法规定:循环体语句只能包含一条语句,若需多条语句,应使用复合语句。 (3)for 循环语句的执行次序为:①计算表达式 1 的值;②计算表达式 2 的值,如果值为 真,执行第③步,否则执行第⑤步;③执行循环体语句;④计算表达式 3 的值,并转向第②步; ⑤跳出循环体。 考点五 while 和 do-while 循环结构 (1)while 语句用来实现“当型”循环结构,它的一般形式如下: while(表达式) 语句; 当表达式为非 0 值时执行 while 语句中内嵌的语句;当表达式的值为 0 时,直接跳过 while 语句后面的语句,执行下一条语句。 (2)while 语句执行的特点是:先判断表达式,后执行语句。 (3)do while 用来实现“直到型”循环结构,它的一般形式为: do 语句 while(表达式); 这个语句执行时,先执行一次指定的内嵌的语句,然后判断表达式,当表达式的值为非 0 时,返回重新执行该语句,如此反复,直到表达式的值等于 0 为止,此时循环结束。 (4)do while 语句执行的特点是:先执行语句,后判断表达式,循环至少执行一次。 考点六 continue 语句和 break 语句
(1)break 语句有两个用途:①在 switch 语句中用来使流程跳出 switch 结构,继续执行 switch 语句后面的语句。②用在循环体内,迫使本次循环立即终止,即跳出本次循环体,继续 执行循环体后面的第一条语句。
(2)continue 语句结束本次循环,即跳过循环体中尚未执行的语句。在 while 和 do while 语句中,continue 语句将使控制直接转向条件测试部分,从而决定是否继续转向循环。在 for 循环中,遇到 continue 语句后,首先计算 for 语句中表达式 3 的值,然后再执行条件测试(表 达式 2),最后根据测试结果来决定是否继续转向 for 循环。 考点七 循环的嵌套 (1)一个循环体内包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以 嵌套循环,这就是多层循环。
(2)三种循环(while 循环、do while 循环和 for 循环)可以互相嵌套。 4.1.2 真题精析 一、选择题 例 1 以下关于结构化程序设计的叙述中正确的是_________。(2010.9) A.一个结构化程序必须同时由顺序、分支、循环三种结构组成 B.结构化程序使用 goto 语句会很便捷 C.在 C 语言中,程序的模块化是利用函数实现的 D.由三种基本结构构成的程序只能解决小规模的问题 解析:考点为结构化程序设计语句的结构。 结构化程序设计简单的程序可以只由顺序结构组成。并且在结构化程序中,尽可能地少 使用 goto 语句。函数是组成 C 语言程序的基本单位,用函数来实现程序的模块化。C 程序中, 三种基本结构构成的程序可以解决任何复杂的问题。 答案:C 例 2 有以下程序 #include <stdio.h> main() { int a=1,b=0; if(!a) b++; else if(a==0)if(a)b+=2; else b+=3; printf("%d\n",b); } 程序运行后的输出结果是_________。(2010.9) A.0 B.1 C.2 D.3 解析:考点为 if 条件语句。 在 if 条件语句中,else 总是与它前面最近的未与 else 配对的 if 语句配对。 程序中的等价语句为: if(!a) b++; else if(a=0) { if(a) b+=2; else b+=3; } 两个条件均不满足,没有执行任何赋值语句,b 保持原来的值不变(b=0)。 答案:A 例 3 若有定义语句 int a, b;double x;则下列选项中没有错误的是_________。(2010.9) A.switch(x%2) B.switch((int)x/2.0
{case 0: a++; break; {case 0: a++; break; case 1: b++; break; case 1: b++; break; default : a++; b++; default : a++; b++; } }
C.switch((int)x%2) D.switch((int)(x)%2) {case 0: a++; break; {case 0.0: a++; break; case 1: b++; break; case 1.0: b++; break; default : a++; b++; default : a++; b++;
} } 解析:考点为 switch 语句。 switch 后圆括号的表达式应该为整型表达式或字符表达式,case 后的常量类型应该和 switch 圆括号中表达式的类型一致。 选项 A 中运算符%要求左右分量必须为整数,x%2 中的 x 为 double 类型。 选项 B 中 switch 后的表达式不为整型,不应该进行除法运算,应进行求余运算。 选项 D 中 case 后面的表达式与 switch 不一致。 答案:C 例 4 有以下程序 #include <stdio.h> main() { int a=1,b=2; while(a<6){b+=a;a+=2;b%=10;} printf("%d,%d\n",a,b); } 程序运行后的输出结果是_________。(2010.9) A.5,11 B.7,1 C.7,11 D.6,1 解析:考点为 while 语句。 判断 while 后面的表达式是否为真,如果为真,则执行循环体,否则退出,本题中循环条 件为 a<6。程序的执行流程如下: 初始值:a=1 b=2 第一次执行循环体:b=1+2=3 a=1+2=3 b=3%10=3 第二次执行循环体:b=3+3=6 a=3+2=5 b=6%10=6 第三次执行循环体:b=6+5=11 a=5+2=7 b=11%10=1 此时 a<6 不成立,退出循环,a=7,b=1。 答案:B 例 5 有以下程序 #include <stdio.h> main() { int y=10; while(y--); printf("y=%d\n",y); } 程序执行后的输出结果是_________。(2010.9)
A.y=0 B.y= -1 C.y=1 D.while 构成无限循环 解析:考点为 while 语句及“--”运算符。
再自减 1。
只要循环条件 y--为真就始终执行循环,即执行空语句。当 y--为假,即 y=0 时,循环结束, 但是 y 的值还要减 1,故最后输出 y 的值为-1。
答案:B
例 6 以下选项中与 if(a==1) a=b;else a++;语句功能不同的 switch 语句是:_________。 (2010.3)
A.switch(a) B.switch(a==1) { case 1:a=b;break; { case 0 : a=b;break; default : a++; case 1 : a++;
} }
C.switch(a) D.switch(a==1) { default : a++;break; { case 1:a=b;break; case 1:a=b; case 0: a++;
} } 解析:考点为 if 语句和 switch 语句。
在选项 A 和 C 中,可以看出该语句功能与题目中的 if 语句完全一样,选项 B 中,要判断 表达式(a==1)的值。当 a=1 时,表达式 a==1 成立,值为 1,应该执行 case 1;当 a!=1 时,表 达式 a==1 不成立,值为 0,应该执行 case 0。与 if 语句的功能不一样。 答案:B 例 7 有如下嵌套的 if 语句 if(a<b) if(a<c) k=a; else k=c; else if(b<c) k=b; else k=c; 以下选项中与上述 if 语句等价的语句是_________。(2010.3) A.k=(a<b)?a:b;k=(b<c)?b:c; B.k=(a<b)?((b<c)?a:b):((b<c)?b:c); C.k=(a<b)?((a<c)?a:c):((b<c)?b:c); D.k=(a<b)?a:b;k=(a<c)?a;c 解析:考点为 if 语句的嵌套以及条件语句 (表达式)?m:n。 条件语句 k=(m<n)?m:n 的等价语句为: if(m<n) k=m; else k=n; 答案:C 例 8 有以下程序 #include <stdio.h> main() { int i,j,m=1; for(i=1;i<3;i++)
{ for(j=3;j>0;j--) { if(i*j>3) break; m*=(i*j); } } printf("m=%d\n",m) } 程序运行后的输出结果是_________。(2010.3) A.m=6 B.m=2 C.m=4 D.m=5 解析:考点为循环的嵌套。 在循环嵌套中,外层循环执行 2 次(i=1、2),内层循环正常执行 3 次(j=3、2、1)。 m*=(i*j)与 m=m*(i*j)等价 外层循环:第一次循环,i=1,i*j>3 始终不成立 i=1 j=3 m=1*(1*3)=3 i=1 j=2 m=3*(1*2)=6 i=1 j=1 m=6*(1*1)=6 外层循环:第二次循环,i=2
i=2 j=3 此时 i*j>3 条件成立,执行 break 退出内层循环,此时外层循环也是最后一次 循环,同时退出,接着输出 m 的值为 6。 答案:A 例 9 有以下程序 #include <stdio.h> main() { int a=1,b=2;
for(;a<8;a++) {b+=a; a+=2;} printf("%d,%d\n",a,b); }
程序运行后的输出结果是_________。(2010.3)
A.9,18 B.8,11 C.7,11 D.10,14 解析:考点为 for 语句。
表达式 a<8 为真,执行循环体,循环体执行完后,接着执行 a++,再判断循环条件 a<8 是 否为真,如果为真继续循环,否则退出循环。 初始值:a=1 b=2 表达式 a<8 为真,执行第一次循环: 循环体:b=b+a=3 a=a+2=3 执行 a++后, a=4 表达式 a<8 为真,执行第二次循环: 循环体:b=a+b=7 a=a+2=6 执行 a++后, a=7 表达式 a<8 为真,执行第三次循环: 循环体:b=a+b=14 a=a+2=9 执行 a++后, a=10 表达式 a<8 为假,退出循环,
输出 a=10 b=14。 答案:D 例 10 设有定义:int a=1,b=2,c=3;,以下语句中执行效果与其他三个不同的是_________。 (2009.9) A.if(a>b) c=a,a=b,b=c; B.if(a>b) {c=a,a=b,b=c;} C.if(a>b) c=a;a=b;b=c; D.if(a>b) {c=a;a=b;b=c;} 解析:考点为 if 语句和逗号表达式。 逗号表达式是一个整体,逐个执行逗号表达式中的每个表达式。
复合语句也是一个整体。if 语句中,当 a>b 时,选项 C 中只执行 c=a;而不执行 a=b; b=c; 选项 A、B、D 则执行或者等价于执行 c=a; a=b; b=c;这 3 个语句。
答案:C 例 11 有以下程序 #include <stdio.h> main() { int c=0,k; for (k=1;k<3;k++) switch (k) { default: c+=k case 2: c++;break; case 4: c+=2;break; } printf("%d\n",c); } 程序运行后的输出结果是_________。(2009.9) A.3 B.5 C.7 D.9 解析:考点为 switch 语句的使用。 switch 语句在循环中被执行 2 次。
k=1 时:switch(1),执行 default 后面的语句 c+=k c=0+1=1 程序继续执行 case 2: c++;break;此时 c=2。
k=2 时:switch(2),执行 case 2 后面的语句 c++ c=3 后遇到 break;终止 switch 循环结 束,输出 c 的值为 3。 答案:A 例 12 有以下程序 #include <stdio.h> main() { int n=2,k=0; while(k++&&n++>2); printf("%d %d\n",k,n); } 程序运行后的输出结果是_________。(2009.9) A.0 2 B.1 3 C.5 7 D.1 2 解析:考点为 while 语句的使用。
while(k++&&n++>2);该循环体为空语句。 开始,n=2 k=0 while 中的条件表达式结果为假,退出循环,k 的值增 1,而&&右边的分量并不计算,n 的值不变,仍然为 2。 答案:D 例 13 有以下程序 #include <stdio.h> main() { int a[ ]={2,3,5,4},i; for(i=0;i<4;i++) switch(i%2) {case 0:switch(a[i]%2) {case 0:a[i]++;break; case 1:a[i]--; }break; case 1:a[i]=0; }
for(i=0;i<4;i++) printf("%d",a[i]); printf("\n"); }
程序运行后的输出结果是_________。(2009.9)
A.3 3 4 4 B.2 0 5 0 C.3 0 4 0 D.0 3 0 4 解析:考点为 switch 语句。
外部 switch 语句在循环中被执行 4 次。
i=0 时,执行 case 0,内部 switch 执行 case 0,a[i]++ a[0]=3 i=1 时,执行 case 1,a[1]=0。
i=2 时,执行 case 0,内部 switch 执行 case 1,a[i]-- a[2]=4 i=3 时,执行 case 1,a[3]=0
故:最后的 a[0]=3,a[1]=0,a[2]=4,a[3]=0 答案:C 例 14 以下是 if 语句的基本形式: if(表达式)语句 其中“表达式” _________。(2009.3) A.必须是逻辑表达式 B.必须是关系表达式 C.必须是逻辑表达式或关系表达式 D.可以是任意合法的表达式 解析:考点为 if 语句。 if(表达式)语句中的“表达式”可以是任意合法的 C 语言表达式,包括关系表达式和逻辑 表达式等。 答案:D 例 15 有以下程序 #include <stdio.h> main() { int x; scanf("%d",&x); if(x<=3);else
if(x!=10) printf(" %d\n",x); } 程序运行时,输入的值在哪个范围才会有输出结果_________。(2009.3) A.不等于 10 的整数 B.大于 3 且不等于 10 的整数 C.大于 3 或等于 10 的整数 D.小于 3 的整数 解析:考点为 if 语句。 第一个 if 语句中的表达式成立的时候,什么也不做,程序结束,无输出结果,如果要有 输出结果,则表达式不成立,也就是 x 要大于 3,如果 x 大于 3,则执行 else 语句后面的 if 语句,该 if 语句中,判断 x 是否等于 10,如果 x 等于 10,则什么也不做,程序结束,那么, 也不会有输出结果,要有输出结果,x 必须不等于 10。 答案:B 例 16 有以下程序 #include <stdio.h> main() { int a=1,b=2,c=3,d=0; if(a==1&&b++==2) if(b!=2||c--!=3) printf("%d,%d,%d\n",a,b, c);
else printf("%d, %d, %d\n",a,b, c); else printf("%d, %d,%d\n",a,b,c); } 程序运行后的输出结果是_________。(2009.3) A.1,2,3 B.1,3,2 C.1,3,3 D.3,2,1 解析:考点为 if 语句嵌套和逻辑与、逻辑或运算。 初始值 a=1 b=2 c=3 d=0 外层 if 语句中条件成立,进入内层 if 语句,b=3 条件成立,因为是||运算符,左边分量为 真后结果直接为真,不再执行右边分量的情况,故 c=3 值不变,进入输出语句。 答案:C 例 17 有以下程序 #include <stdio.h> main() { char *s= {"ABC"}; do {printf("%d";*s%l0); s++; }whi1e(*s); } 注意:字母 A 的 ASCII 码值为 65。程序运行后的输出结果是_________。(2009.3) A.5670 B.656667 C.567 D.ABC 解析:考点为 do…while 语句。 字符型指针变量 s 的初始值为“ABC”的首地址,*s 的内容即为字母 A 的 ASCII 码值, 为 65,*s%10=5,s++,指针指向 B,*s%10=6,s++,指针指向 C,*s%10=7,s++,指针指向 空,跳出循环。 答案:C
例 18 有以下程序段
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=%d",a,b,c); 程序的输出结果是 _________。(2008.9) A.a=10 b=50 c=10 B.a=10 b=50 c=30 C.a=10 b=30 c=10 D.a=50 b=30 c=50 解析:考点为逗号表达式语句及 if 语句。 逗号表达式作为一个整体,if(a>b)只有一条逗号表达式语句 a=b,b=c;如果 if 语句后面带有 多条语句,必须用大括号{ }括起来。 答案:A 例 19 有以下程序 #include <stdio.h> main() { int i,j;
for(i=3; i>=1; i--)
{for (j=1;j<=2;j++) printf("%d",i+j); printf("\n"); } } 程序的运行结果是_________。(2008.9) A.2 3 4 B.4 3 2 C.2 3 D.4 5
3 4 5 5 4 3
3 4 3 4 4 5
2 3 解析:考点为 for 语句的循环嵌套。 i=3 时,j=1,输出 4 j=2,输出 5 j=3 时,不满足条件,退出内层循环。 换行 i=2 时,j=1,输出 3 j=2,输出 4 j=3 时,不满足条件,退出内层循环。 换行 i=1 时,j=1,输出 2 j=2,输出 3 j=3 时,不满足条件,退出内层循环。 换行 i=0 时,不满足判断条件,退出外层循环。 答案:D 例 20 有以下程序 #include <stdio.h> main()
{ int x=1,y=2,z=3; if(x>y) if (y<z) printf("%d",++z); else printf("%d",++y); printf("%d\n",x++); } 程序运行结果是_________。(2008.9) A.331 B.41 C.2 D.1 解析:考点为 if,if-else 结构。 初始值 x=1,y=2, z=3 首先判断 x>y 不成立,直接执行后面的语句 printf("%d\n",x++);,printf 函数中输出表达式 中,先输出 x 的值后,x 再加 1,故程序运行结果为输出 1。 答案:D 例 21 有以下程序 #include <stdio.h> main() { int i=5; do {if(i%3= =1) if(i%5= =2) {printf("*%d",i); break; } i++; }while(i!=0); printf("\n"); } 程序的运行结果是_________。(2008.9) A.*7 B.*3*5 C.*5 D.*2*6 解析:考点为 do…while 语句中 break 的用法。
当 i 的值满足(i%3= =1) 并且满足(i%5= =2)时,输出*i. 并且 break;退出整个循环,如果不 满足就只执行 i++,当 i 自加到 7 时,满足要求,输出*7,退出整个循环,执行后面的语句。
答案:A
例 22 若变量已正确定义,有以下程序段
int a=3,b=5,c=7; if (a>b) a=b; c=a; if (c!=a) c=b; printf ("%d.%d.%d\n",a,b,c); 其输出结果是_________。(2008.4) A.程序段有语法错 B.3,5,3 C.3,5,5 D.3,5,7 解析:考点为 if 语句。 if 语句只对其后的一条语句或语句块产生作用。
第 1 个 if 语句中 a>b 为假,语句 a=b;不执行,接着执行 c=a 后,a=3、b=5、c=3。第 2 个 if 语句中 c!=a 为假,语句 c=b;不执行。最后执行 printf 语句。
例 23 有以下程序 #include <stdio.h> 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; case 3: a++; b++; }
printf("a=%d, b=%d\n", a,b); }
程序的运行结果是_________。(2008.4)
A.a=1, b=0 B.a=2, b=2 C.a=1, b=1 D.a=2, b=1 解析:考点为 switch 语句的嵌套。
初始值 x=1,y=0,a=0,b=0;
外层 switch,x=1,进入 case1 分支,y=0,进入内层 case 0 分支,执行 a++; break;,跳出 内层 switch 语句,跳出后由于没有碰到 break;语句,所以执行外层 case2 分支,a++;b++;break;, 遇到 break;跳出外层 switch 语句。 答案:D 例 24 若变量已正确定义,有以下程序段 i=0; do printf("%d,",i);while(i++); printf("%d\n",i) 其输出结果是_________。(2007.9) A.0,0 B.0,1 C.1,1 D.程序进入无限循环 解析:考点为 do…while 循环语句。 do…while 循环的循环体至少会被执行一遍,因为它首先执行循环体一遍,然后再判断 while 后的逻辑表达式是否为真来决定是否进行下一次循环。初始值 i=0,进入 do…while 循环, 执行一遍循环体输出 i 的值 0。然后判断表达式 i++的值为 0,循环结束,但是 i 的值加 1,第 2 个 printf 函数中输出 i 的值为 1。 答案:B 例 25 有以下程序 #include <stdio.h> main() { int i,j,m=55; for(i=1;i<=3;i++) for(j=3;j<=i;j++) m=m%j; printf("%d\n",m); } 程序的运行结果是_________。(2007.9) A.0 B.1 C.2 D.3
解析:考点为 for 循环语句。 初始值 m=55 外循环中,i=1,i<=3 成立,执行内循环,j=3,j<=i 成立,执行 m=m%j;m=1。执行 j++, j=4,j<=i 不成立,跳出内循环,外循环中执行 i++,i=2,i<=3 成立,再执行内循环,内循 环条件不成立跳出,依次这样执行,直到外循环中 i=4,i<=3 不成立,跳出外循环,输出 m 的值。 答案:B 例 26 以下叙述中错误的是_________。(2007.4) A.C 语言是一种结构化程序设计语言 B.结构化程序由顺序、分支、循环三种基本结构组成 C.使用三种基本结构构成的程序只能解决简单问题 D.结构化程序设计提倡模块化的设计方法 解析:考点为 C 程序设计语句的三种结构。 C 语言的三种结构:顺序,选择,循环,这三种基本结构能完成 C 语言中的任何功能。 答案:C 例 27 以下叙述中正确的是_________。(2007.4) A.break 语句只能用于 switch 语句体中 B.continue 语句的作用是:使程序的执行流程跳出包含它的所有循环 C.break 语句只能用在循环体内和 switch 语句体内 D.在循环体内使用 break 语句和 continue 语句的作用相同 解析:考点为 break 语句和 continue 语句的用法及区别。 二者的区别有如下两点:①break 语句既可以出现在 switch 语句中,也可以出现在循环体 中,而 continue 语句只能出现在循环体中;②break 语句跳出整个循环,而 continue 语句只是 结束本轮循环。 答案:C 例 28 有以下程序 main() { int i,j; for(i=1;i<4;i++)
{ for(j=i;j<4;j++) printf("%d*%d=%d ",i,j,i*j);
printf("\n"); } } 程序运行后的输出结果是_________。(2007.4) A.1*1=1 1*2=2 1*3=3 B.1*1=1 1*2=2 1*3=3
2*1=2 2*2=4
2*2=4 2*3=6 3*1=3 3*3=9 C.1*1=1 D.1*1=1
1*2=2 2*2=4
2*1=2 2*2=4
1*3=3 2*3=6 3*3=9
3*1=3 3*2=6 3*3=9 解析:考点为嵌套循环。
在本题中外层循环每一次结束,就执行 printf("\n")语句,输出一个换行符,所以最后的输 出结果为 B 选项。 答案:B 二、填空题 例 1 有以下程序 #include <stdio.h> main() { int a=1,b=2,c=3,d=0; if (a==1) if(b!=2) if(c!=3) d=1; else d=2; else if(c!=3) d=3; else d=4; else d=5; printf("%d\n",d); } 程序运行后的输出结果是:_________。(2010.3) 解析:考点为 if 语句。 初始值 a=1,b=2,c=3,d=0; a=1 执行最外层的 if…else 部分
b=2 执行 else if(c!=3) d=3;由于(c!=3)条件不成立,执行 else d=4;部分,故 d 的值最后为 4。 答案:4 例 2 有以下程序 #include < stdio.h > main() { int m,n; scanf("%d%d",&m,&n); while (m!=n) { while(m>n) m=m-n; while(m<n)n=n-m; } printf("%d\n",m); } 程序运行后,当输入 14 63<回车>时,输出结果是_________。(2010.3) 解析:考点为 while 语句嵌套 初始值:m=14 n=63 最外层 while 中 m!=n 成立 内层 while 中 m<n 成立,执行 n=n-m: 此时:m=14 n=49 最外层 while 中 m!=n 成立 内层 while 中 m<n 成立,执行 n=n-m: 此时:m=14 n=35 最外层 while 中 m!=n 成立 内层 while 中 m<n 成立,执行 n=n-m:
此时:m=14 n=21 最外层 while 中 m!=n 成立 内层 while 中 m<n 成立,执行 n=n-m: 此时:m=14 n=7 最外层 while 中 m!=n 成立 内层 while 中 m>n 成立,执行 m=m-n: 此时:m=7 n=7 最外层 while 中 m!=n 不成立,退出循环。 答案:7 例 3 有以下程序 #include <stdio.h> main() { int []={1,2,3,4,5,6},*k[3],i=0; while(i<3) { k[i]=&a[2*i]; printf("%d",*k[i]); i++; } } 程序运行后的输出结果是_________。(2010.3) 解析:考点为 While 循环语句。 While 循环执行 3 次:
i=0 k[0]=&a[0] *k[0]=a[0]=1 输出 1 i=1 k[1]=&a[2] *k[1]=a[2]=3 输出 3 i=2 k[0]=&a[4] *k[2]=a[4]=5 输出 5 答案:135 例 4 以下程序运行后的输出结果是_________。(2009.9) #include <stdio.h> main() { int a=1,b=7; do{ b=b/2;a+=b; } while (b>1); printf("%d\n",a); } 解析:考点为 do while 语句的用法。 初始值:a=1 b=7 执行循环体 b=b/2=3 a=a+b=4 判断循环条件 b>1 成立, 执行循环体:b=b/2=1 a=a+b=5 判断循环条件 b>1 不成立,退出循环。 答案:5
例 5 有以下程序 #include <stdio.h> main() { int f,f1,f2,i; f1=0;f2=1; printf("%d %d",f1,f2); for(i=3;i<=5;i++) { f=f1+f2; printf("%d",f); f1=f2; f2=f; } printf("\n"); } 程序运行后的输出结果是_________。(2009.9) 解析:考点为 for 循环语句。 初始值:f1=0 f2=1 输出:0 1 for 循环执行 3 次: i=3 f=f1+f2=0+1=1 输出 1; f1=f2=1 f2=f=1 i=4 f=f1+f2=1+1=2 输出 2; f1=f2=1 f2=f=2 i=5 f=f1+f2=1+2=3 输出 3; f1=f2=2 f2=f=3 答案:0 1 123 例 6 以下程序运行后的输出结果是_________。(2009.3) #include <stdio.h> main() { int k=1, s=0; do{ if((k%2)!=0) continue; s+=k; k++; }while(k>10); printf("s=%d\n",s); } 解析:考点为 do…while 语句。 初始值:k=1 执行循环体,循环体执行一次,判断条件(k>10)不成立,退出循环。所以最后 k=1,s=0。 答案:s=0 例 7 若有定义:int k;,以下程序段的输出结果是_________。(2008.4) for (k=2; k<6; k++,k++) printf("##%d",k); 解析:考点为 for 循环语句。 初始值:k=2,判断 k<6 为真,执行循环体,输出##2,执行 k++,k++。 k=4,判断 k<6 为真,执行循环体,输出##4,执行 k++,k++ k=6,判断 k<6 为假,退出循环体。 答案:##2##4
例 8 以下程序的定义语句中,x[1]的初值是_________,程序运行后输出的内容是 _________。(2008.4)
#include <stdio.h> main()
{ int x[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}, *p[4],i;
for(i=0; i<4; i++)
{ p[i]=&x[2*i+1]; printf("%d", p[i][0]); } printf("\n"); } 解析:考点为 for 循环语句。 x[1]是数组 x 的第 2 个元素,初值为 2。(第一空) 在 for 循环中: i=0,2*i+1=1, i=1,2*i+1=3 i=2,2*i+1=5 i=3,2*i+1=7 i=4 退出循环体。故循环体中将 x[1]、x[3]、x[5]、x[7]的地址值依次赋值给指针数组 p 的 各个元素,然后使用 printf 函数输出 p[i][0],也就是 x[1]、x[3]、x[5]、x[7]的值。 答案:2(第 1 空)和 2 4 6 8(第二空) 例 9 有以下程序段,且变量已正确定义和赋值 for(s=1.0,k=1;k<=n;k++) s=s+1.0/(k*(k+1)); printf("s=%f\n\n",s); 请填空,使下面程序段的功能完全相同。(2007.9) s=1.0;k=1; while(_______){ s=s+1.0/(k*(k+1)); ______;} printf("s=%f\n\n",s); 解析:考点为 while 语句和 for 语句。
for 循环语句可以用 while 语句来实现,for 语句中的条件表达式,即第 2 个表达式可以在 while 语句的条件判断表达式中,用与之等价的形式来实现,for 语句中的第 3 个表达式可以在 while 语句的循环体内实现。 答案:k<=n 或 n>=k(第 1 空) 和 k++(第 2 空) 例 10 以下程序的运行结果是_________。(2007.4) main() { int a=2,b=7,c=5; switch(a>0) {case 1:switch(b<0)
{case 1:printf("@"); break; case 2: printf("!"); break; }
case 0: switch(c==5)
{case 0: printf("*"); break; case 1: printf("#"); break; case 2: printf("$"); break; }
default : printf("&"); }
printf("\n"); }
解析:考点为 switch 语句。
在 switch 语句中,如果没有 break 语句,程序执行完 case 匹配后的语句,会接着往下执 行,直到遇到 break 语句或者 switch 匹配结束。 答案:#& 4.1.3 强化练习及解答 一、选择题 1.有以下程序 #include <stdio.h> main() { int x=8; for( : x>0; x--)
{ if(x%3) { printf("%d,", x--); continue; }
} } 程序的运行结果是_________。(2008.4) A.7,4,2, B.8,7,5,2, C.9,7,6,4, D.8,5,4,2, 2.以下不构成无限循环的语句或语句组是_________。(2008.4) A.n=0; B.n=0;
do {++n;} while (n<=o); while (1) {n++;} C.n=10; D.for(n=0,i=1; ;++)n+=i while (n); {n--;} 3.有以下程序 #include <stdio.h> main() { int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i;
for(i=0; i<12; i++) c[s[i]]++; for(i=0; i<5;i++) printf("%d",e[i]); printf("\n"); } 程序的运行结果是_________。(2008.4) A.1 2 3 4 B.2 3 4 4 C.4 3 3 2 D.1 1 2 3 4.有以下程序 #include <stdio.h>
void fun(char *a,char *b)
{ while( *a=='*') a++;
while( *b=*a){b++;a++;} } main() { chau *s="*****a*b****",t[80]; fun(s,y; puts(t); }
程序的运行结果是_________。(2008.4)
A.*****a*b B.a*b
C.a*b**** D.ab
5.有以下程序:
#include <stdio.h>
void fun(char *t,char *s) { while(*t!=0)t++; while((*t++=*s++)!=0); } main() { char ss[10]="acc",aa[10]="bbxxyy"; fun(ss,aa); printf("%s,%s\n",ss,aa); } 程序运行结果是_________。(2007.9)
A.accxyy , bbxxyy B.acc, bbxxyy C.accxxyy,bbxxyy D.accbbxxyy,bbxxyy 6.有以下程序 main() { int k=5,n=0; do { switch(k) {case 1: case 3:n+=1; k--;break; default: n=0;k--; case 2: case 4:n+=2;k--;break; } printf("%d",n); }while(k>0&&n<5); } 程序运行后的输出结果是_________。(2007.4) A.235 B.0235 C.02356 D.2356 7.在嵌套使用 if 语句时,C 语言规定 else 总是________。(2006.9) A.和之前与其具有相同缩进位置的 if 配对 B.和之前与其最近的 if 配对 C.和之前与其最近的且不带 else 的 if 配对 D.和之前的第一个 if 配对 8.下列叙述中正确的是________。(2006.9) A.break 语句只能用于 switch 语句 B.在 switch 语句中必须使用 default
C.break 语句必须与 switch 语句中的 case 配对使用 D.在 switch 语句中,不一定使用 break 语句
9.有以下程序 mian() { int k=5; while(-k) printf("%d",k-=3); printf("\n") } 执行后的输出结果是________。(2006.9) A.1 B.2 C.4 D.死循环 10.有以下程序 main() { int i; for(I=1;I<=40;I++) { if(I++%5=0) if(++I%8=0) printf("%d",i) } printf("\n") } 执行后的输出结果是________。(2006.9) A.5 B.24 C.32 D.40
11.若有定义:float x=1.5; int a=1,b=3,c=2;则正确的 switch 语句是 ________。(2006.4) A.switch(x) B.switch((int)x);
{case 1.0: printf("*\n"); {case 1: printf("*\n"); case 2.0: printf("**\n");} case 2: printf("**\n");} C.switch(a+b) D.switch(a+b)
{case 1: printf("*\n"); {case 1: printf("*\n"); case 2+1: printf("**\n");} case c: printf("**\n");}
12.在以下给出的表达式中,与 while(E)中的(E)不等价的表达式是________。(2006.4) A.(!E=0) B.(E>0||E<0) C.(E==0) D.(E!=0) 13.若有以下程序 main() { int y=10; while(y--); printf("y=%d\n",y); } 程序运行后的输出结果是________。(2006.4)
A.y=0 B.y=-1 C.y=1 D.while 构成无限循环 14.有以下程序 main() { int a=0,b=0,c=0,d=0; if(a=1) b=1;c=2; else d=3; printf("%d,%d,%d,%d\n",a,b,c,d); } 程序输出________。(2006.4)
A.0,1,2,0 B.0,0,0,3 C.1,1,2,0 D.编译有错 15.有以下程序 main() { int i,j,x=0; for(i=0;i<2;i++) { x++; for(j=0;j<=3;j++) { if(j%2) continue; x++; } x++; } printf("x=%d\n",x); } 程序执行后的输出结果是 ________。(2006.4) A.x=4 B.x=8 C.x=6 D.x=12 16.有以下程序 main() { int i,s=0,t[]={1,2,3,4,5,6,7,8,9}; for(i=0;i<9;i+=2) s+=*(t+i); printf("%d\n",s); } 程序执行后的输出结果是 ________。(2006.4) A.45 B.20 C.25 D.36 17.当把以下四个表达式用作 if 语句的控制表达式时,有一个选项与其他三个选项含义 不同,这个选项是________。(2005.9) A.k%2 B.k%2==1 C.(k%2)!=0 D.!k%2==1 18.有以下程序段 int k=0,a=1,b=2,c=3; k=ac ? c:k; 执行该程序段后,k 的值是________。(2005.9) A.3 B.2 C.1 D.0 19.有以下程序段 int n,t=1,s=0; scanf("%d",&n); do{ s=s+t; t=t-2; }while (t!=n); 为使此程序段不陷入死循环,从键盘输入的数据应该是________。(2005.9) A.任意正奇数 B.任意负偶数 C.任意正偶数 D.任意负奇数 20.设变量已正确定义,则以下能正确计算 f = n!的程序段是________。(2005.9) A.f=0; B.f=1;
for(i=1;i<=n;i++) f*=i; for(i=1;i>=2;i--) C.f=1; D.f=1;
for(i=n;i>1;i++) f*=i; for(i=n;i>=2;i--) 21.有以下程序 main() { int k=5,n=0; while(k>0) { switch(k) { default:break; case 1:n+=k; case 2: case 3:n+=k; } k--; } printf("%d\n",n); } 程序运行后的输出结果是________。(2005.9) A.0 B.4 C.6 D.7 22.有以下程序 main() { int p[8]={11,12,13,14,15,16,17,18},i=0,j=0;
while(i++<7) if(p[i]%2) j+=p[i];
printf("%d ",j); } 程序运行后的输出结果是 ________。(2005.4) A.42 B.45 C.56 D.60 23.有以下程序 main() { int a=1,b; for(b=1;b<=10;b++) { if(a>=8) break;
if(a%2==1) { a+=5; continue;} a-=3; } printf("%d ",b); } 程序运行后的输出结果是________。(2005.4) A.3 B.4 C.5 D.6 二、填空题 1.以下程序的输出结果_________。(2008.9) #include <stdio.h> main() { int i,j,sum; for(i=3;i>=1;i--) { sum=0; for(j=1;j<=i;j++) sum+=i*j;
} printf("%d\n",sum); } 2.以下程序按下面指定的数据给 x 数组的下三角置数,并按如下形式输出,请填空。 (2008.9) 4 3 7 2 6 9 1 5 8 10 #include <stdio.h> main() { int x[4][4],n=0,i,j; for(j=0;j<4;j++) for(i=3;i>=j; _________) {n++;x[i][j]= _________;} for(i=0;i<4;i++) {for(j=0;j<=i;j++) printf("%3d",x[i][j]); printf("\n"); } }
3.以下程序用于判断 a,b,c 能否构成三角形,若能输出 YES,若不能输出 NO。当 a,b,c 输 入 三 角 形 三 条 边 长 时 , 确 定 a,b,c 能 构 成三角 形 的条 件是 需 要同 时满 足 三个 条件 : a+b>c,a+c>b,b+c>a。请填空。(2006.4) main() { float a,b,c; scanf("%f%f%f",&a,&b,&c); if(____)printf("YES\n");/*a,b,c 能构成三角形*/ else printf("NO\n");/*a,b,c 不能构成三角形*/ } 4.以下程序的功能是:输出 100 以内(不含 100)能被 3 整除且个位数为 6 的所有整数, 请填空。(2006.4) main() { int i,j; for(i=0;__[13]__;i++) { j=i*10+6; if(_[14]____) continue; printf("%d ",j); } } 5.以下 isprime 函数的功能是判断形参 a 是否为素数,如果是素数,函数返回 1,否则返 回 0,请填空。(2006.4) int isprime(int a) { int i; for(i=2;i<=a/2;i++) if(a%i==0) ______; _____; }
6.以下程序的功能是输入任意整数给 n 后,输出 n 行由大写字母 A 开始构成的三角形字 符阵列图形,例如,输入整数 5 时(注意:n 不得大于 10),程序运行结果如下: A B C D E F G H I J K L M N O 请填空完成该程序。(2006.4) main()
{ int i,j,n; char ch='A';
scanf("%d",&n); if(n<11) { for(i=1;i<=n;i++) { for(j=1;j<=n-i+1;j++) { printf("%2c",ch); _______; } _______ ; } }
else printf("n is too large!\n"); printf("\n"); } 7.以下程序的功能是输出如下形式的方阵: 1 3 1 4 1 5 1 6 9 1 0 1 1 1 2 5 6 7 8 1 2 3 4 请填空。(2005.9) main() { int i,j,x; for(j=4; j ______; j--)
{ for(i=1; i<=4; i++)
{x=(j-1)*4 + _____ ; printf("%4d",x); } printf("\n"); } } 8.以下程序运行后的输出结果是________。(2005.4) main() { int a=3,b=4,c=5,t=99; if(b<a&&a<c) t=a;a=c;c=t; if(a<c&&b<c) t=b;b=a;a=t; printf("%d%d%d ",a,b,c); }
答案: 一、选择题 1-23 DACCD ACDAC CCDDB CDBDD DBB 二、填空题 1.1 2.i-- ; 和 n 3.(a+b>c)&&(a+c>b)&&(b+c>a) 4.i<=9(或 i<10) 和 j%3!=0 5.return 0 和 return 1 6.ch=ch+1 和 printf("\n") 7.>0 和 6 8.4599
4.2 项目实训
[实训 4-1] 编写遍历某班学生指定信息(属性)并按格式输出的函数。 //该班级学生信息存放在结构体数组中void output(struct st[],int n)//输出该班级学生的籍贯 { int i; for(i=0;i<n;i++) printf("%s %s\n",st[i].name,st[i].area); } [实训 4-2] 编写按指定科目成绩降序排列的函数,建议使用冒泡排序法。 #include <stdio.h> #define M 5
void paixu(float num[],int n); void main() { float score[M]; int i; printf("请输入%d 个学生的英语成绩:\n",M); for(i=0;i<M;i++) scanf("%f",&score[i]); paixu(score,M); }
void paixu(float num[],int n) { int i,j; float temp; for(i=0;i<=n-2;i++) for(j=0;j<=n-2-i;j++) if(num[j]<num[j+1]) { temp=num[j]; num[j]=num[j+1];
num[j+1]=temp; } printf("%d 个学生的英语成绩降序排列为:\n",n); for(i=0;i<n;i++) printf("%f ",num[i]); printf("\n"); } [实训 4-3] 编写求指定科目成绩平均成绩的函数。
float avg(float num[],int n) { float sum=0; int i; for(i=0;i<n;i++) sum=sum+num[i]; return sum/n; } [实训 4-4] 编写求指定学生总学分的函数。 //假设有两门课程,语文和数学。成绩按照学号升序排列存放在数组中 float avg(float num1[],float num2[],int n)
{ printf("请输入学生的学号"); int i; scanf("%d",&i); float sum=0; sum=sum+num1[i]+num2[i]; return sum/2.0; }
4.3 习题解答
1.输出 1~1000 之间所有的素数。 #include <stdio.h> int check(int m) { int i; for(i=2;i<m;i++) if(m%i==0) return 0; return 1; } void main() { int i,j; j=1; printf("1~1000 之间所有的素数:\n"); for(i=2;i<=1000;i++) if(check(i)) { printf("%d ",i); j++;if(j%10==0) printf("\n"); } } 2.用循环语句分别输出以下图形: * ***** * ***** ** **** ** **** *** *** *** *** **** ** **** ** ***** * ***** * (1) (2) (3) (4) #include <stdio.h> void main() { int i,j; for(i=1;i<=5;i++) { for(j=1;j<=i;j++) { printf("*"); } printf("\n"); } printf("\n"); for(i=1;i<=5;i++) { for(j=1;j<=5;j++) { if(i>j) printf(" "); else printf("*"); } printf("\n"); } printf("\n"); for(i=1;i<=5;i++) { for(j=5;j>=1;j--) { if(i<j) printf(" "); else printf("*"); } printf("\n"); } printf("\n"); for(i=1;i<=5;i++) {
for(j=1;j<=5-i+1;j++) { printf("*"); } printf("\n"); } } 3.用 C 语言计算一元二次方程 aX2+bX+c=0 的两个根。要求:系数 a、b、c 由用户随机 输入,且对复根与无根情况有判定和处理机制。 #include <stdio.h> #include <math.h> void main() { double a,b,c; printf("请输入一元二次方程的三个系数:(1,3,4)"); scanf("%lf,%lf,%lf",&a,&b,&c); if(a==0) if(b==0&&c!=0) printf("无根\n"); else printf("x=%g\n",-b/c); else if(b*b-4*a*c>=0) printf("x1=%g,x2=%g",(-b+sqrt(b*b-4*a*c))/(2*a),(-b-sqrt(b*b- 4*a*c))/(2*a)); else printf("x1=%gi,x2=%gi",(-b+sqrt(4*a*c-b*b))/(2*a),(-b-sqrt(4*a*c- b*b))/(2*a)); } 4.由用户随机输入一个整数,对此整数进行质因数分解。要求:首先能判定输入的是否 为整数且为合数,输出格式为 S=s1*s2*…sn,其中 S 为待分解整数。 #include <stdio.h> void main() { int n,i; printf("请输入一个整数: "); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) { while(n!=i) { if(n%i==0) { printf("%d*",i); n=n/i; } else
break; } } printf("%d",n); } 5.由用户随机输入两个整数,求其最大公约数和最小公倍数。 #include <stdio.h> void main() { int p,r,n,m,temp,e,f; printf("请输入两个正整数 e,f(如:6,7):"); scanf("%d,%d",&e,&f);//输入两个正整数 m=e; n=f; if(n<m)//把大数放在 n 中,把小数放在 m 中 { temp=n; n=m; m=temp; } p=n*m;//P 是原来两个数 n,m 的乘积 while(m!=0)//求两个数 n,m 的最大公约数 { r=n%m; n=m; m=r; } printf("%d 和%d 的最大公约数为:%d\n",e,f,n);//打印最大公约数 printf("%d 和%d 的最小公倍数为:%d\n",e,f,p/n);//打印最小公倍数 }