本课重要知识点:
1.知识点:if语句
l if(表达式),其中表达式可以是任意合法的C语言表达式。
例1:(2011-09-19)下列条件语句中输出结果与其他语句不同的是(D)
A.if(a) printf(“%d\n”,x); else printf(“%d\n”,y);
B.if(a==0) printf(“%d\n”,y); else printf(“%d\n”,x);
C.if(a!=0) printf(“%d\n”,x); else printf(“%d\n”,y);
D.if(a==0) printf(“%d\n”,x); else printf(“%d\n”,y);
【解析】作为if语句的条件,a等价于a!=0,因此 A和C是等价的。
例2:(2011-03-26)if语句的基本形式是:if(表达式)语句,以下关于“表达式”值的叙述中正确的是(D)
A)必须是逻辑值 B)必须是整数值 C)必须是正数 D)可以是任意合法的数值
【解析】表达式不限于关系表达式、逻辑表达式,也可以是任意的数值类型,其中非0为真,0为假。故选D。
l 对于单个if语句,其后跟随的受if控制的只能是1个语句或者是1个复合语句。
例1:(2009-09-17)设有定义:int a=1,b=2,c=3;以下语句中执行效果与其它三个不同的是(C)
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控制的只能是1个语句或者是1个复合语句。故C项,if(a>b)条件成立时,语句c=a;才被执行,而无论if(a>b)条件成立与否,语句a=b;b=c;都会被执行。A、B、D项,只有if(a>b)条件成立时,语句c=a; a=b;b=c; 才被执行。
例2:(2011-03-26)以下程序运行后的输出结果是 200
main()
{ int x=10,y=20,t=0;
if(x==y)t=x;x=y;y=t;
printf("%d %d\n",x,y);
}
【解析】x=10,y=20,所以x==y为false,t=x;不执行,直接执行x=y;y=t;x为20,y为0。注意和if(x==y){t=x;x=y;y=t;}区别。
l 当多个if(表达式)单分支形式并行出现时,其执行顺序是:先判断第一if单分支的条件,如果为真,执行其后面的语句,执行完后,继续向下执行。判断第二个if单分支语句,依次类推。如果第一个if表达式的值为假,则不执行其后的语句,而去判断第二个if单分支条件。
例1:(2011-03-26)有以下程序
main()
{ int x;
scanf("%d",&x);
if(x>15) printf("%d",x-5);
if(x>10) printf("%d",x);
if(x>5) printf("%d\n",x+5);
}若程序运行时从键盘输入12<回车>,则输出结果为 1217
【解析】输入12,比较不大于15所以不执行if(x>15)内的语句;大于10执行printf("%d",x);输出12;大于5执行printf("%d",x+5);输出17。
2.知识点:if语句的嵌套
l 内嵌结构中,else总是与前面最近的且未曾配对的if语句配对,组成一对if-else语句。
例2:(2010-09-18)有以下程序
#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);
}程序运行后的输出结果是(A)
A)0 B)1 C) 2 D)3
【解析】else总是与前面最近的且未曾配对的if语句配对,组成一对if-else语句。即else b+=3;
与if(a) b+=2;配对。if(!a)不成立,不执行b++;else if(a==0)不成立,不执行if(a) b+=2;
else b+=3;故直接执行printf(“%d\n”,b);,输出结果为0。
3.知识点:条件表达式
l 一般形式:表达式1?表达式2:表达式3
l 执行过程:表达式1的值为真,条件表达式取表达式2的值;表达式1的值为假,条件表达式取表达式3的值。
例1:(2009-09-19)以下程序段中,与语句:k=a>b?(b>c?1:0):0;功能相同的是(A)
A)if((a>b)&&(b>c)) k=1; B)if((a>b)||(b>c)) k=1;
else k=0; else k=0;
C) if(a<=b) k=0; D) if(a>b) k=1;
else if(b<=c) k=1; else if(b>c) k=1;
else k=0;
【解析】条件运算符的结合性是从右至左。当b>c时,b>c?1:0的值为1,k=a>b?1:0,同时当a>b时,a>b?1:0的值为1,此时k=1。否则k=0。故答案为A。
4.知识点:switch语句
l switch语句的圆括号中的表达式的值必须是整型或字符型,不能为实型。
l case后的表达式可以是求得整型和字符型的常量表达式,但不能含有变量。
l default的位置对程序的执行没有影响。
例1:(2010-09-19)若有定义语句int a,b;double x;则下列选项中没有错误是(C)
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语句的圆括号中的表达式的值必须是整型或字符型,不能为实型。x是double型,x%2不合法,A项错误。(int)x%2.0不合法,B项错误。(int)x%2值为整型,故C项正确。case后面的表达式可以是求得整型量和字符型量的常量表达式,故D项错误。
例2:(2009-09-18)有以下程序
#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);
}程序运行后的输出结果是(A)
A)3 B)5 C)7 D)9
【解析】当k=1时,没有匹配的case,执行default语句,c=c+k=0+1=1。继续往下执行case 2后边的语句,c++,c变为2,遇到break语句,于是退出内层switch结构。当k=2时,找到匹配的case 2,执行c++; c变为3,遇到break语句,于是退出内层switch结构。执行外层循环for结构的k++,k变为3,k<3不成立,跳出for语句。最后输出结果为3。
l 当switch语句和循环语句(for、while)时,要注意switch里面的break语句退出的位置。解决这一问题的方法是:首先划分结构,确定循环的语句体包括哪些语句。然后,在继续划分循环体内的语句,如果循环体内的语句只有一条switch语句,其内部出现了break,遇到break,要结束当前switch语句的执行,继续执行下一次循环。
例1:(2011-03-26)有以下程序
main()
{ int s;
scanf("%d",&s);
while(s>0)
{ switch(s)
{case1:printf("%d",s+5);
case2:printf("%d",s+4);break;
case3:printf("%d",s+3);
default:printf("%d",s+1);break;
}
scanf("%d",&s);
}
} 运行时,若输入1 2 3 4 5 0<回车>,则输出结果是(A)
A)6566456 B)66656 C)66666 D)6666656
【解析】while循环s<=0时退出循环,输入1 2 3 4 5 0,只有当输入0时退出循环,switch中当s=1时,执行case 1,case 2,由于case 1后面没有break,会继续执行case 2,遇到break,退出switch;当s=2时,执行case 2,退出switch;当s=3时,执行case 3,default,由于case 3后面没有break,会继续执行default,遇到break,退出switch;当s=4和5时,执行default,退出switch。所以输入1时,输出65;输入2时,输出6;输入3时,输出64;输入4时,输出5;输入5时,输出6。故选择A。
5.知识点:while,do-while,for三种循环结构
例1:(2011-09-20)有以下程序:
#include <stdio.h>
main()
{ inta=7;
while(a--);
printf(“%d\n”,a);
}程序运行后的输出结果是 (B)
A.- 1 B.0 C.1 D.7
【解析】此类题一定要注意标点符号的位置,while(a--);该行末尾的分号即为一条空语句,来作为while的循环体。
例1:(2010-09-20)有以下程序
#include <stdio.h>
main()
{int a=1,b=2;
while(a<6) {b+=a;a+=2;b%=10;}
printf(“%d,%d\n”,a,b);
}程序运行后的输出结果是(B)
A)5,11 B)7,1 C)7,11 D)6,1
例2:(2011-03)有以下程序段
main()
{ …
while( getchar()!='\n');
…
}以下叙述中正确的是(C)
A)此while语句将无限循环
B) getchar()不可以出现在while语句的条件表达式中
C)当执行此while语句时,只有按回车键程序才能继续执行
D)当执行此while语句时,按任意键程序就能继续执行
【解析】while条件表达式getchar()!='\n'只要输入的字符不是回车,就一直执行循环,而循环内是一个空语句,所以按回车键程序才能继续执行,选择C。
l 循环体部分可以只有一条空语句,不做任何操作。
例3:(2010-09-21)有以下程序
#include <stdio.h>
main()
{int y=10;
while(y--);
printf(“y=%d\n”,y);
}程序执行后的输出结果是(B)
A)y=0 B)y=-1 C)y=1 D)while构成无限循环
【解析】while(y--)后面的分号是一个空语句,当y--不等于0时执行空语句,当y—等于0时,执行printf函数输出y值,当y—等于0时退出循环,此时y值变成-1。
l 如果第一次判断表达式的值为0,则循环一次也不执行。即while循环体最少执行0次。
例4:(2011-03)当执行下列程序时,输入1234567890<CR>,则其中while循环体将执行 0 次。
#include <stdio.h>
main()
{char ch;
while((ch=getchar()==’0’)) printf(‘#’);
}
【解析】ch=getchar(),ch第一次读入的值为’1’,故while((ch=getchar()==’0’))不成立,循环一次也不执行。
l while循环与switch结构
例5、(2011-03)有以下程序
main()
{ int s;
scanf("%d",&s);
while(s>0)
{ switch(s)
{case1:printf("%d",s+5);
case2:printf("%d",s+4);break;
case3:printf("%d",s+3);
default:printf("%d",s+1);break;
}
scanf("%d",&s);
}
} 运行时,若输入1 2 3 4 5 0<回车>,则输出结果是(A)
A)6566456 B)66656 C)66666 D)6666656
【解析】:while循环s<=0时退出循环,输入1 2 3 4 5 0,只有当输入0时退出循环,switch中当s=1时,执行case 1,case 2,由于case 1后面没有break,会继续执行case 2,遇到break,退出switch;当s=2时,执行case 2,退出switch;当s=3时,执行case 3,default,由于case 3后面没有break,会继续执行default,遇到break,退出switch;当s=4和5时,执行default,退出switch。所以输入1时,输出65;输入2时,输出6;输入3时,输出64;输入4时,输出5;输入5时,输出6。故选择A。
6.知识点:do-while语句
例1:(2009-09-09)以下程序运行后的输出结果是 5 。
#include <stdio.h>
main()
{int a=1,b=7;
do{
b=b/2; a+=b;
}while(b>1);
printf(“%d\n”,a);}
l do-while循环体最少执行1次。
例2:(2007-09)若变量已正确定义,有以下程序段
i=0;
do printf(“%d,”,i); while(i++);
printf(“%d\n”,i); 其输出结果是 (B)
A)0,0 B)0,1 C)1,1 D)程序进入无限循环
【解析】执行do-while循环,输出i的值为0,接着判断循环条件i++,i++的值为0,i的值为1,故答案是B。
7.知识点:for语句
例1:(2011-03)有以下程序
main()
{ char b,c; int i;
b='a'; c='A';
for(i=0;i<6;i++)
{ if(i%2) putchar(i+b);
else putchar(i+c);
}
printf("\n");
} 程序运行后的输出结果是(B)
A)ABCDEF B)AbCdEf C)aBcDeF D)abcdef
【解析】:for循环执行6次,每次判断i能否被2整除,如果不能,则输出i+b,如果可以则输出i+c,注意if(i%2)是求表达式i%2是否为true,即其结果是不是非0。所以i为0时,输出0+A=A,i为1时,输出1+a=b,i为2时,输出2+A=C,i为3时,输出3+a=d,i为4时,输出4+A=E,i为5时,输出5+a=f。故选B。
l 表达式1、表达式2、表达式3可以缺省,但两个分号不能省略。
表达式1省略的情况如下:
例2:(2010-03-21)有以下程序
#include <stdio.h>
main()
{int a=1,b=2;
for(;a<8;a++) {b+=a;a+=2;}
printf(“%d,%d\n”,a,b);
}程序运行后的输出结果是(D)
A)9,18 B)8,11 C)7,11 D)10,14
l 表达式1和表达式3也可以是逗号表达式。
例3:(2009-04-20)以下程序段中的变量已正确定义
for(i=0;i<4;i++,i++)
for(k=1;k<3;k++) printf(“*”);程序段的输出结果是 (B)
A)******** B)**** C)** D)*
【解析】外层for循环,表达式3是逗号表达式,即i自加2。.
l for循环与switch结构
例4:(2009-09-29)有以下程序
#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”);
}程序运行后的输出结果是(C)
A)3 3 4 4 B) 2 0 5 0 C)3 0 40 C)0 3 0 4
例5、(2011-03)有以下程序段
int i,n;
for(i=0;i<8;i++)
{ n=rand()%5;
switch (n)
{ case1:
case 3:printf("%d\n",n);break;
case 2:
case 4:printf("%d\n",n);continue;
case 0:exit(0);
}
printf("%d\n",n);
} 以下关于程序段执行情况的叙述,正确的是(D)
A)for循环语句固定执行8次
B)当产生的随机数n为4时结束循环操作
C)当产生的随机数n为1和2时不做任何操作
D)当产生的随机数n为0时结束程序运行
【解析】:rand()是随机产生一个整数,rand()%5即随机得到0-4这五个数字,for循环控制随机产生8次,当得到1,3时执行printf("%d\n",n)并退出switch,当得到2,4时执行printf("%d\n",n)并继续循环,当得到0时,exit(0)正常结束程序。所以循环不一定执行8次,故选择D。
l for循环与数组
例6:(2010-09-09)有以下程序
#include <stdio.h>
main()
{int i,n[]={0,0,0,0,0};
for(i=1;i<=4;i++)
{n[i]=n[i-1]*3+1; printf(“%d ”,n[i]);}
}程序运行后的输出结果是 1 4 13 40 。
l 注意区 赋值语句和判断语句
例 7:(2011-03)若i和k都是int类型变量,有以下for语句
for(i=0,k=-1;k=1;k++) printf("*****\n");
下面关于语句执行情况的叙述中正确的是 (D)
A)循环体执行两次 B)循环体执行一次
C)循环体一次也不执行 D)构成无限循环
【解析】:for循环的表达式1和表达式3可以是一个简单的表达式也可以是逗号表达式,本题表达式1是一个逗号表达式,i赋值为0,同时k赋值为-1。所以判断表达式2:k=1是k赋值为1,故无限循环,选择D。
8.知识点:循环嵌套
例1:(2010-03-20)有以下程序
#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);
}程序运行后的输出结果是 (A)
A)m=6 B)m=2 C)m=4 D)m=5
例2:(2011-03)有以下程序
main()
{ int x=1,y=0;
if(!x) y++;
else if(x==0)
if (x) y+=2;
else y+=3;
printf("%d\n",y);
}程序运行后的输出结果是(D)
A)3 B)2 C)1 D) 0
【解析】:if-else的嵌套,注意else总是与前面最近的且未配对的if语句配对组合。if(!x)中x为1,!x为0为false,即if(!x) 后的语句不执行,else if(x==0),x为1也不等于0,也不成立,故else if内的语句也不执行,而if (x) y+=2;else y+=3;均为else if内的语句。所以直接输出y为0,故选D。
9.知识点:break语句
l 功能:跳出整个switch语句;跳出循环体,防止死循环。
l break语句只能出现在switch、while、do-while、for循环中,不能出现在其他地方。
l 作用范围:所在循环体从属的最内层循环,而不是外层的某个循环。
6.知识点:continue语句
l 功能:结束本次循环,接着判断是否继续下一次循环。
l continue语句只能出现在while、do-while、for循环中。
l 作用范围:所在循环体从属的最内层循环,而不是外层的某个循环。
例1:(2009-04-09)以下程序运行后的输出结果是 s=0
#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);
}
【解析】k=1,if((k%2)!=0)条件成立,执行continue语句,结束本次循环,判断表达式k>10,值为0,故跳出do-while循环,执行printf(“s=%d\n”,s);则输出结果为s=0。