前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全国二级C知识点总结2-C程序结构

全国二级C知识点总结2-C程序结构

作者头像
用户6755376
发布2019-11-21 00:58:41
5640
发布2019-11-21 00:58:41
举报

本课重要知识点:

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。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机二级C语言 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档