C语言习题答案1-7章

更新时间:2024-03-16 04:44:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

程序设计基础(C语言版)习题

第01章 绪论

一.选择题

1.以下叙述中正确的是________。

A)程序设计的任务就是编写程序代码并上机调试 B)程序设计的任务就是确定所用数据结构 C)程序设计的任务就是确定所用算法 D)以上三种说法都不完整 参考答案:D

【解析】 程序设计通常分为问题建模、算法设计、编写代码和编译调试四个阶段。所以选项A)、B)、C)说法都不完整。

2.以下关于简单程序设计的步骤和顺序的说法中正确的是。 A)确定算法后,整理并写出文档,最后进行编码和上机调试

B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档 C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档 D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构 参考答案:B 【解析】设计一个能解决实际问题的计算机程序需要经过以下几个过程:① 建立模型。② 算法设计:给出解决问题的步骤,即算法。③ 算法表达:选择一种表达算法的工具,对算法进行清晰的表达。④ 编写程序:选择一种程序设计语言,把以上算法程序化,这称为编写程序。⑤ 程序调试:对编写好的程序进行调试,修改程序中的错误。⑥ 程序文档编写与程序维护。综上所述,B)选项是符合上述描述的,其他选项不恰当。

3.以下叙述中正确的是________。 A)C程序的基本组成单位是语句 B)C程序中的每一行只能写一条语句 C)简单C语句必须以分号结束 D)C语句必须在一行内写完 参考答案:C

【解析】函数是C程序的基本组成单位;C语言书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。故本题答案为C)。

4.以下叙述中正确的是。

A)C程序中的注释只能出现在程序的开始位置和语句的后面 B)C程序书写格式严格,要求一行内只能写一个语句 C)C程序书写格式自由,一个语句可以写在多行上 D)用C语言编写的程序只能放在一个程序文件中 参考答案:C

【解析】在C语言中,注释可以加在程序中的任何位置,选项A)错误。C程序可以分模块写在不同的文件中,编译时再将其组合在一起,选项D)错误。C程序的书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。所以正确答案为选项C)。

5.以下关于C语言的叙述中正确的是。

A)C语言中的注释不可以夹在变量名或关键字的中间 B)C语言中的变量可以在使用之前的任何位置进行定义

C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 D)C语言的数值常量中夹带空格不影响常量值的正确表示 参考答案:A

【解析】C语言中注释可以放在任何位置,但不能夹在变量名或关键字中间,选项A正确;C语言中的变量要在使用之前定义,C标准规定定义位置在相关程序块的首部,选项B错误;C语言中两侧数据类型可以不一致,系统可进行强制类型转换,选项C错误;C语言数值常量中不允许存在空格,选项D错误。

6.以下关于C语言数据类型使用的叙述中错误的是。 A)若要准确无误差地表示自然数,应使用整数类型 B)若要保存带有多位小数的数据,应使用双精度类型

C)若要处理如\人员信息\等含有不同类型的相关数据,应自定义结构体类型 D)若只处理\真\和\假\两种逻辑值,应使用逻辑类型 参考答案:D

【解析】C语言中没有逻辑类型,若只处理\真\或\假\两种逻辑值,可以使用整型数\或\表示,故选D。

第02章 基本数据类型

一.选择题

1.有以下定义:int a;long b;double x,y;则以下选项中正确的表达式是。 A)a%(int)(x-y) B)a=x!=y; C)(a*y)%b D)y=x+y=x 参考答案:B

【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。D)选项表达式本身就错误,不能给表达式赋值。所以,本题答案为B)。

2.有以下程序

#include main()

{ int s,t,A=10;double B=6; s=sizeof(A); t=sizeof(B); printf(\,%d\\n\,s,t); }

在VC6平台上编译运行,程序运行后的输出结果是 A)2,4 B)4,4 C)4,8 D)10,6 参考答案:C

【解析】sizeof的作用就是返回一个对象或者类型所占的内存字节数。在VC6中整型占4个字节,双精度实型占8个字节,所以选C)。

3.若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是。 A)a=a++,i++; B)i=(a+k)<=(i+k); C)i=a; D)i=!a; 参考答案:C

【解析】C语言中取余运算符两侧的操作数只能是整型(若为char型,则会自动转换成整型)。

4.有以下程序:

#include main()

{ int a=1,b=0;

printf(\,\,b=a+b); printf(\,a=2*b); }

程序运行后的输出结果是________。 A)0,0 B)1,0 C)3,2 D)1,2 参考答案:D

【解析】 执行第一个printf语句时,b=a+b=1,所以输出1,执行第二个printf语句时,a=2*b=2,所以输出结果为2。

5.若有定义语句:int a=3,b=2,c=1;,以下选项中错误的赋值表达式是。 A)a=(b=4)=3; B)a=b=c+1; C)a=(b=4)+c; D)a=1+(b=c=4); 参考答案:A

【解析】在A)选项中,赋值语句b=4先把4赋值给整型变量b,之后执行(b=4)=3是把常量3赋值给常量4,但是由于C语言规定赋值运算符的左侧只能是变量,不能是常量或者表达式,因此A)选项错误。

6.有以下定义:int a;long b;double x,y;则以下选项中正确的表达式是。 A)a%(int)(x-y) B)a=x!=y; C)(a*y)%b D)y=x+y=x 参考答案:B

【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。D)选项表达式本身就错误,不能给表达式赋值。所以,本题答案为B)。

7.若有定义语句:int x=10;,则表达式x-=x+x的值为________。 A)-20 B)-10 C)0 D)10 参考答案:B

【解析】 x-=x+x可化为:x=x-(x+x),由于x初始值为10,所以计算后,x=10-20=-10,因此选B)。

二.填空题

1.以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序拆分并输出。请填空。

#include main() {int x=256;

printf(\}

参考答案:x

【解析】x=256,x=6。

2.以下程序运行后的输出结果是 。

#include main() { int a;

a=(int)((double)(3/2)+0.5+(int)1.99*2); printf(\,a);

}

参考答案:3 【解析】本题中3/2=1,(double)(3/2)=1,(int)1.99*2=1*2=2,因此(int)(1+0.5+2)=(int)3.5=3。

3.若有定义语句:int a=5;,则表达式:a++的值是____。 参考答案:5

【解析】 a++的含义是在使用a值以后,使a值加1,所以a++的值为5。

4.若有语句double x=17;int y;,当执行y=(int)(x/5)%2;之后y的值为____。 参考答案:1

【解析】 y=(int)(x/5)%2=(int)(3.4)%2=3%2=1。

5.设变量a和b已正确定义并赋初值。请写出与a-=a+b等价的赋值表达式 ____。 参考答案:a=-b

【解析】a-=a+b等价于a=a-(a+b),等价于a=-b。

第03章 顺序结构

一.选择题 1.有以下程序

#include main()

{char a,b,c,d;

scanf(\ c=getchar();d=getchar();

printf(\}

当执行程序时,按下列方式输入数据(从第1列开始,代表回车,注意,回车也是一个字符)

12

34 则输出结果是

A)1234 B)12 C)12 D)12 3 34 参考答案:C

【解析】程序根据用户输入分别给字符型变量a、b、c、d赋值为'1'、'2'、''、'3',因此输出到屏幕得到选项C中的格式。

2.有以下程序段:

char ch; int k;

ch=′a′; k=12;

printf(\,%d,\,ch,ch,k); printf(\=%d\\n\,k);

已知字符a的ASCII码值为97,则执行上述程序段后输出结果是 A)因变量类型与格式描述符的类型不匹配输出无定值 B)输出项与格式描述符个数不符,输出为零或不定值 C)a,97,12k=12 D)a,97,k=12 参考答案:D

【解析】输出格式控制符%c表示将变量以字符的形式输出;输出格式控制符%d表示将变量以带符号的十进制整型数输出。所以第一个输出语句输出的结果为a,97,第二个输出语句输出的结果为k=12,所以选项D)为正确答案。

3.有以下程序

#include main()

{ char a[30],b[30]; scanf(\,a); gets(b);

printf(\,a,b); }

程序运行时若输入:

how are you? I am fine <回车> 则输出结果是 A)how are you? I am fine B)how

are you? I am fine

C)how are you? I am fine D)how are you? 参考答案:B 解析】scanf函数会把空格字符作为输入的字符串之间的分隔符,因此字符串a为\。gets()

函数读取字符串时,直至接受到换行符或EOF时才停止,并将读取的结果存放在指针所指向的字符数组中,因此其余输入的内容赋值给b。

二.填空题

1.以下程序运行后的输出结果是 。

#include main()

{ int a=200,b=010; printf(\,a,b); }

参考答案:2008

【解析】整型变量a的值为200,b的值\是用八进制表示的\即十进制的\,最后输出格式均为%d,即十进制格式,所以输出为\。

2.有以下程序(说明:字符0的ASCIl码值为48)

#include main()

{ char c1,c2;

scanf(\,&c1); c2=c1+9;

printf(\,c1,c2); }

若程序运行时从键盘输入48<回车>,则输出结果为 。 参考答案:09

【解析】本题中通过ASCII码对字符变量赋值,由于字符0的ASCII码是48,因此字符变量c1为0,c2的ASCII码比c1大9,因此c2为9。

第04章 选择结构

一.选择题

1.若变量已正确定义,在if(W)printf(\,k);中,以下不可替代W的是。 A)a<>b+c B)ch=getchar() C) a==b+c D)a++ 参考答案:A

【解析】在C语言中,表示不等于不能用\,而只能使用\。其他选项均满足题目的要求。

2.当变量c的值不为2、4、6时,值也为\真\的表达式是。 A)(c==2)||(c==4)||(c==6)

B)(c>=2&& c<=6)||(c!=3)||(c!=5) C)(c>=2&&c<=6)&&!(c%2) D)(c>=2&& c<=6)&&(c%2!=1) 参考答案:B 【解析】满足表达式(c>=2&& c<=6)的整型变量c的值是2,3,4,5,6。当变量c的值不为2,4,6时,其值只能为3或5,所以表达式c!=3和c!=5中至少有一个为真,即不论c为何值,

选项B)中表达式的值都为\真\。正确答案为B)。

3.已知字母A的ASCII码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是。

A)kk>=′A′&& kk<=′Z′ B)!(kk>=′A′||kk<=′Z′)

C)(kk+32)>=′a′&&(kk+32)<=′Z′ D)isalpha(kk)&&(kk<91) 参考答案:B

【解析】C语言的字符以其ASCII码的形式存在,所以要确定某个字符是大写字母,只要确定它的ASCII码在'A'和'Z'之间就可以了,选项A)和C)符合此要求。在选项D)中,函数isalpha用来确定一个字符是否为字母,大写字母的ASCII码值的范围为65到90,所以如果一个字母的ASCII码小于91,那么就能确定它是大写字母。本题答案选B)。

4.有以下程序:

#include < stdio.h> main()

{ int a=l,b=2,c=3,d=0; if(a==l && b++==2) if(b!=2||c--!=3)

printf(\,%d,%d\\n\,a,b,c); else printf(\,%d,%d\\n\,a,b,c); else printf(\,%d,%d\\n\,a,b,c); }

程序运行后的输出结果是________。 A)1,2,3 B)1,3,2 C)l,3,3 D)3,2,1

参考答案:C

【解析】 程序首先执行第一个判断语句,a==1成立;b++==2,先判断b是否为2,再进行b加1操作,执行后b的值为3。继续执行第二个判断语句,注意程序此时进行逻辑或运算,b!=2的值为真,因此条件表达式b!=2||c--!=3的值为真,程序便不再执行第二个逻辑语句c--!=3,而直接进行输出操作。因此,本题正确答案为C)。

5.执行以下程序段后,w的值为________。

int w='A',x=14,y=15; w=((x‖y)&&(w<'a')); A)-1 B)NULL C)1 D)0

参考答案:C

【解析】根据题目所给条件可知,x||y为1,w<'a'为1,1&&1结果为1。因此正确答案为C)。

6.若变量已正确定义,有以下程序段:

int a=3,b=5,c=7; if(a>b) a=b; c=a; if(c!=a) c=b;

printf(\,%d,%d\\n\,a,b,c); 其输出结果是 A)程序段有语法错 B)3,5,3 C)3,5,5 D)3,5,7

参考答案:B

【解析】两个if语句的判断条件都不满足,程序只执行了c=a这条语句,所以变量c的值等于3,变量b的值没能变化,程序输出的结果为3,5,3。所以正确答案为选项B)。

7.有以下程序段:

int a,b,c;

a=10; b=50; c=30; if(a>b)a=b, b=c; c=a;

printf(\=%d b=%d c=%d\\n\,a,b,c); 程序的输出结果是________。 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 参考答案:A

【解析】该题考查if条件语句,当条件为真时,将b值赋给a,c值赋给b;当条件为假时,将a值赋给c。该题中if条件为假,所以将a的值赋给c,故a=10 b=50 c=10。

8.有以下程序:

#include main()

{ int x=1,y=2,z=3; if(x>y)

if(y

程序的运行结果是________。 A)331 B)41 C)2 D)1

参考答案:D

【解析】该题目考查if条件语句。else语句和最近的一个if语句配对。由于x>y为假,所以直接执行最后一行代码。

9.有以下程序:

#include 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(\=%d,b=%d\\n\,a,b); }

程序的运行结果是 A)a=1,b=0 B)a=2,b=2 C)a=1,b=1 D)a=2,b=1 参考答案:D

【解析】本题考查了 switch结构的内容。在C语言中,程序执行完一个case标号的内容后,如果没有break语句,控制结构会转移到下一个case继续执行,因为case 常量表达式只是起语句标号作用,并不是在该处进行条件判断。本题程序在执行完内部switch结构后,继续执行了外部switch结构的 case 2分支。最后a和b的值分别为2和1。

二.填空题

1.在C语言中,当表达式值为0时表示逻辑值\假\,当表达式值为 时表示逻辑值\真\。 参考答案:非0

【解析】本题一定要明确一个概念,即:所有非0的数(并不只是\),在c语言中都表示逻辑值为\真\。

2.设x为int型变量,请写出一个关系表达式__ ,用以判断x同时为3和7的倍数时,关系表达式的值为真。

参考答案:(x%3==0)&&(x%7==0)

【解析】x%3==0能保证x是3的倍数,x%7==0能保证x是7的倍数,(x%3==0)&&(x%7==0)能保证x是3的倍数并且x是7的倍数。

3.有以下程序

#include 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(\}

程序运行后的输出结果是__ 。 参考答案:4

【解析】a==1为真,b!=2为假,c!=3为假,所以d=4。

4.有以下程序

#include main() { int x;

scanf(\,&x);

if(x>15)printf(\,x-5); if(x>10)printf(\,x); if(x>5)printf(\,x+5); }

若程序运行时从键盘输入12<回车>,则输出结果为 。 参考答案:1217 【解析】本题中输入12时,第一条if的条件x>15不满足因此不执行,第二条if的条件x>10满足因此输出12,第三条if的条件x>5满足因此输出17。

5.以下程序运行后的输出结果是 。

#include main()

{ int x=10,y=20,t=0; if(x==y)t=x;x=y;y=t; printf(\,x,y); }

参考答案:20 0

【解析】本题中if选择的条件x==y不满足,因此直接执行后面的x=y和y=t,则x的值为20,y的值为0。

第05章 循环结构

一.选择题

1.以下不构成无限循环的语句或语句组是 A)n=0;

do{++n;}while(n<=0); B)n=0;

while(1){n++;} C)n=10;

while(n);{n--;} D)for(n=0,i=1;;i++) n+=i;

参考答案:A

【解析】项A)中变量n的值,先自加1,再进行循环条件判断,此时循环条件n<=0不成立,跳出循环。所以正确答案为A)。

2.有以下程序

#include main()

{ int y=10; while(y--);

printf(\=%d\\n\,y); }

程序执行后的输出结果是 A)y=0 B)y=-1

C)y=l D)while构成无限循环 参考答案:B

【解析】当y减为1时判断while(y--),此时满足条件,但是y变成0。下次循环判断while(y--)时,因为y为0不满足条件跳出循环,但是此时也要执行y--,所以y变成了-1。 打印输出时输出-1。

3.有以下程序:

#include main()

{ int i=5; do

{ if(i%3==1) if(i%5==2)

{ printf(\,i); break; } i++;

} while(i!=0); printf(\; }

程序的运行结果是________。 A)*7 B)*3*5 C)*5 D)*2*6

参考答案:A

【解析】整个程序中只有对i增加的语句而没有对i减少的语句,所以2、3都不可能出现,选项B)和D)错误。而i=5时第一个if语句的表达式为假,所以选项C)也错误。

4.以下程序段中的变量已正确定义:

for(i=0;i<4;i++,i++)

for(k=l;k<3;k++);printf(\; 程序段的输出结果是________。 A)******** B)**** C)** D)*

参考答案:D

【解析】 本题考察for循环语句,注意第二个for语句的后面有一个分号,即printf函数不属于循环体,无论循环执行多少次,printf(\语句只执行一次。因此,本题正确答案为D)。

5.有以下程序

#include main()

{ int a=1,b=2;

for(;a<8;a++){b+=a;a+=2;} printf(\}

程序运行后的输出结果是

A)9,18 B)8,11 C)7,11 D)10,14 参考答案:D

【解析】初始值a=1,b=2,第一次循环:b=b+a=2+1=3,a=a+2=1+2=3,a=a+1=3+1=4;第二次循环:b=b+a=3+4=7,a=a+2=4+2=6,a=a+1=6+1=7;第三次循环:b=b+a=7+7=14,a=a+2=7+2=9,a=a+1=9+1=10,故本题答案选D。

6.有以下程序:

#include main()

{ int i,j;

for(i=3;i>=1;i--)

{ for(j=1;j<=2;j++)printf(\,i+j); printf(\; } }

程序的运行结果是________。 A)2 3 4 B)4 3 2 3 4 5 5 4 3 C)2 3 D)4 5 3 4 3 4 4 5 2 3

参考答案:D

【解析】该题目主要考查for嵌套循环,要注意循环变量i和j的取值范围。输出结果为变量i和j的和。

7.有以下程序

#include 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(\}

程序运行后的输出结果是

A)m=6 B)m=2 C)m=4 D)m=5 参考答案:A

【解析】第一次循环i=1,j=3和j=2时都能执行m*=i*j,此时得到m的值为6;然后进行第二次循环i=2,j=3时会执行break语句,内部循环直接结束,此时i再加1,也会导致退出外部循环,所以最终结果m的值为6。

8.设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是________。

A)n=0;while((ch=getchar())!='\\n')n++; B)n=0;while(getchar()!='\\n')n++; C)for(n=0;getchar()!='n';n++);

D)n=0;for(ch=getchar();ch!='\\n';n++); 参考答案:D

【解析】 A)项每进行一次循环判断一个字符是否为回车,如果不是就进行下一次判断,因此可以统计出输入字符个数;B)项与A)项的判断相似,仅为是否将读入的数据赋值给一个变量,因此并不影响判断结果;C)想用for循环来判断,与B)项的判断完全相同,可以统计出输入字符个数;D)项中ch=getchar()是给变量ch赋初值,如果输入回车,则程序只循环一次,如果输入一个非回车的字符,则程序进入死循环。因此,本题正确答案为D)。

9.有以下程序

#include 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(\}

程序运行后的输出结果是

A)m=6 B)m=2 C)m=4 D)m=5 参考答案:A

【解析】第一次循环i=1,j=3和j=2时都能执行m*=i*j,此时得到m的值为6;然后进行第二次循环i=2,j=3时会执行break语句,内部循环直接结束,此时i再加1,也会导致退出外部循环,所以最终结果m的值为6。

10.有以下程序

#include main() { int s;

scanf(\,&s); while(s>0) { switch(s)

{ case 1:printf(\,s+5);

case 2:printf(\,s+4);break; case 3:printf(\,s+3);

default:printf(\,s+1);break; }

scanf(\,&s); } }

运行时,若输入123450<回车>,则输出结果是 A)6566456 B)66656 C)66666 D)6666656 参考答案:A 【解析】switch语句执行完一个case后面的语句后,流程控制转移到下一个case语句继续执行,遇到break会跳出本次循环。本题中输入1时会输出65,输入2时会输出6,输入3时会输出64,输入4时会输出5,输入5时会输出6,在输入0时不满足循环条件,程序执行结束。

11.有以下程序段

int i,n;

for(i=0;i<8;i++) { n=rand()%5; switch(n) { case 1:

case 3:printf(\,n);break; case 2:

case 4:printf(\,n);continue; case 0: exit(0); }

printf(\,n);

}

以下关于程序段执行情况的叙述,正确的是 A)for循环语句固定执行8次

B)当产生的随机数n为4时结束循环操作 C)当产生的随机数n为1和2时不做任何操作 D)当产生的随机数n为0时结束程序运行 参考答案:D

【解析】当产生的随机数n为1或2时,由于没有遇到break,因此程序将分别顺序执行case 3与case 4;当n为3时,程序输出n的值后跳出switch语句;当n为4时,程序输出n的值后将继续执行下一次循环;当n为0时,程序执行exit函数结束运行。

二.填空题 1.有以下程序

#include main()

{ int m,n;

scanf(\ while(m!=n)

{ while(m>n)m=m-n; while(m

printf(\}

程序运行后,当输入14<空格>7<回车>时,输出结果是_____。 参考答案:7

【解析】执行while(mn)的循环,得到m=7,n=7。此时所有循环结束,m=7。

2.以下程序运行后的输出结果是____。

#include main()

{ int a=1,b=7; do{

b=b/2; a+=b; } while(b>1);

printf(\,a);} 参考答案:5

【解析】 第一次循环执行后,b=3,a=4,满足条件b>1,循环继续;第二次循环执行后,b=1,a=5,不满足条件b>1,结束循环。所以输出的a值为5。

3.有以下程序:

#include main()

{ int f,fl,f2,i; f1=0;f2=1;

printf(\ %d \,f1,f2); for (i=3;i<=5;i++)

{ f=f1+f2;printf(\,f); f1=f2;f2=f; }

printf(\; }

程序运行后的输出结果是____。 参考答案:0 1 123 【解析】 第一个printf语句输出结果为0 1。循环体总共循环三次,第一次循环结果为,f=1,f1=1,f2=1;第二次循环结果为f=2,f1=1,f2=2;第三次循环结果为f=3,f1=2,f2=3。

4.若有定义:int k;,以下程序段的输出结果是____。

for(k=2;k<6;k++,k++) printf(\,k); 参考答案:##2##4 【解析】在for循环语句中,自变量k的自增表达式为k++,k++。这是一个逗号表达式,所以输出结果为##2##4。

5.以下程序运行后的输出结果是____。

#include main()

{ int k=1,s=0; do{

if((k%2)!=0)continue; s+=k; k++; }while(k>10);

printf(\=%d\\n\,s); }

参考答案:s=0

【解析】continue语句用于跳出本次循环,直接进行下一次循环。进行if判断时k的值为1不能够被2整除,因此执行continue退出本次循环,不对s进行任何操作,直接进行循环条件判断,此时k的值为1不满足循环条件,退出while循环,输出s的值为0。

第06章 数组

一.选择题

1.下列选项中,能正确定义数组的语句是

A)int num[0..2008]; B)int num[];

C)int N=2008; D)#define N 2008 int num[N]; int num[N]; 参考答案:D

【解析】选项A不符合C语言的语法要求;选项B中没有指定数组的大小;选项C中数组大小不能用变量来指定。

2.下列定义数组的语句中,正确的是。

A)int N=10; B)#define N 10 C)int x[0..10]; D)int x[]; int x[N]; int x[N]; 参考答案:B

【解析】A)中的N是一个变量,不可以用变量来定义数组,所以选项A)错误。C)中把所有的下标均列出不正确,此处只需指明数组长度即可。D)中在定义时没有指明数组长度不正确,如果不指明长度就应在定义时对数组元素进行赋值,而此选项没有,所以错误。故本题答案为B)。

3.若要定义一个具有5个元素的整型数组,以下错误的定义语句是 A)int a[5]={0}; B)int b[]={0,0,0,0,0}; C)int c[2+3]; D)int i=5,d[i]; 参考答案:D

【解析】在进行数组的定义时,不能使用变量对数组的长度进行定义。其他选项均符合数组定义标准。

4.以下错误的定义语句是。

A)int x[][3]={{0},{1},{1,2,3}};

B)int x[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; C)int x[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; D)int x[][3]={1,2,3,4}; 参考答案:C

【解析】本题考查的是二维数组的定义和初始化方法。C语言中,在定义并初始化二维数组时,可以省略数组的第一维的长度,但是不能省略第二维的长度。故选项C)错误。

5.若有定义:int a[2][3];,以下选项中对a数组元素正确引用的是。 A)a[2][!1] B)a[2][3] C)a[0][3] D)a[1>2][!1] 参考答案:D

【解析】C语言中数组下标是从0开始的,所以二维数组a[2][3]的第一维下标取值为0、1;第二维的下标取值为0、1、2,因而选项A)、B)、C)都是错误的,选项D)表示的是数组元素a[0][0]。所以正确答案为D)。

6.有以下程序:

#include #include main()

{ char a[10]=\;

printf(\,%d\\n\,strlen(a),sizeof(a));

}

程序运行后的输出结果是________。 A)7,4 B)4,10 C)8,8 D)10,10 参考答案:B

【解析】 strlen()用来返回字符串的长度,而sizeof()返回的是一个对象或者类型所占的内存字节数,即数组所占的内存。

二.填空题

1.以下程序运行后的输出结果是 。

#include main()

{ int i,n[5]={0}; for(i=1;i<=4;i++)

{ n[i]=n[i-1]*2+1;printf(\,n[i]);} printf(\; }

参考答案:13715

【解析】本题中已知n[0]为0,根据循环的执行可以得到n[1]为1,n[2]为3,n[3]为7,n[4]为15,因此输出结果是13715。

2.有以下程序

#include main()

{ int i,n[]={0,0,0,0,0}; for(i=l;i<=4;i++)

{n[i]=n[i-1]*3+1;printf(\,n[i]);} }

程序运行后的输出结果是 。 参考答案:1 4 13 40

【解析】第一次循环结果为:n[1]=0*3+1,即n[1]的值为1,打印输出1 ;第二次循环结果为:n[2]=1*3+1,即n[2]的值为4,打印输出4 ;第三次循环结果为:n[3]=4*3+1,即n[3]的值为13,打印输出13 ;第四次循环结果为:n[4]=13*3+1,即n[4]的值为40,打印输出40。

3.有以下程序

#include main()

{ int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3]={0},i;

for(i=0;i<3;i++) b[i]=a[i][2]+a[2][i]; for(i=0;i<3;i++) printf(\ printf(\}

程序运行后的输出结果是____。 参考答案:101418

【解析】当i=0时,b[0]=a[0][2]+a[2][0]=3+7=10;当i=1时,b[1]=a[1][2]+a[2][1]=6+8=14;当i=2时,b[2]=a[2][2]+a[2][2]=9+9=18,则打印结果为101418。

4.有以下程序

#include main()

{ int n[2],i,j;

for(i=0;i<2;i++)n[i]=0; for(i=0;i<2;i++)

for(j=0;j<2;j++)n[j]=n[i]+1; printf(\,n[1]); }

结果为:__________

参考答案:3

【解析】通过第一次 for(i=0;i<2;i++) n[i]=0;的循环语句可知,已经将数组n 中的两个元素都赋初值为0。接下来的循环中,第一次循环,外循环 i=0 的前提下:内循环j=0时,运行完n[0]=n[0]+1后n[0]为1;j=1时,运行完n[1]=n[0]+1后,n[1]为2。第二次循环,外循环i=1的前提下,内循环j=0时,运行完n[0]=n[1]+1后n[0]为3;j=1时,运行完n[1]=n[1]+1后,n[1]为3。

5.以下fun函数的功能是在N行M列的整型二维数组中,选出一个最大值作为函数值返回,请填空。(设M,N已定义)

int fun(int a[N][M])

{ int i,j,row=0,col=0; for(i=0; i

if(a[i][j]>a[row][co1]){row=i;col=j;} return( ____ ); }

参考答案:a[row][col]

【解析】通过程序可以看出,外循环是行,内循环是列。先在行不变的情况下找一行内最大的数据进行记录。通过语句 if(a[i][j]>a[row][col]) { row=i; col=j;}可知,如果变量a[i][j]大于a[row][col],将i赋给了row,将j赋给了col,所以a[row][col]是记录当前最大值的变量。

6.有以下程序

#include main()

{ int i,j,a[][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++)

for(j=i;j<3;j++)printf(\ printf(\}

程序运行后的输出结果是____。 参考答案:123569

【解析】当i=0时,j=0、1、2时满足条件,则打印a[0][0]、a[0][1]、a[0][2];当i=1时,j=1、2时满足条件,则打印a[1][1]、a[1][2];当i=2时,j=2时满足条件,则打印a[2][2],所以打印结果为123569。

7.有以下程序:

#include main()

{ char a[20]=\?\,b[20];

scanf(\,b);printf(\,a,b); }

程序运行时从键盘输入:How are you?<回车> 则输出结果为____。

参考答案:How are you? How

【解析】用%s格式输入字符串时,空格和回车都作为输入数据的分隔符,不能被读入,因此数组b的输出结果为How。

第07章 指针

一.选择题 1.有以下程序:

#include main()

{ int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r;

printf(\,%d,%d,%d\\n\,m,n,*p,*q); }

程序运行后的输出结果是________。 A)1,2,1,2 B)1,2,2,1 C)2,1,2,1 D)2,1,1,2 参考答案:B

【解析】 m和n的值不变,输出结果为1,2。指针*p和*q交换了指向的位置,即*p=&n,*q=&m,输出结果分别为2,1。

2.以下程序段完全正确的是

A)int*p; scanf(\,&p); B)int*p; scanf(\,p);

C)int k,*p=&k; scanf(\,p); D)int k,*p; *p=&k; scanf(\,p); 参考答案:C

【解析】A)选项输入的是指针型变量p的地址,变量一定义就已分配好了地址不能再指定了,所以A错误。B)选项没有指定指针p应该指向的变量,没给变量赋初值。D)选项中,p是地址,*p是地址内存放的数据,它把整型变量k的地址赋给了*p,所以错误。

3.以下定义语句中正确的是。 A)int a=b=0;

B)char A=65+1,b=′b′; C)float a=1,*b=&a,*c=&b; D)double a=0.0;b=1.1; 参考答案:B

【解析】本题考查变量的定义方法。如果要一次进行多个变量的定义,则在它们之间要用逗号隔开。因此选项A)和D)错误;在选项C)中,变量c是一个浮点型指针,它只能指向一个浮点型数据,不能指向指针变量b;所以正确答案为B)。

4.若有定义语句:double x,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是________。

A)scanf(\,x,y); B)scanf(\,&y); C)scanf(\,px,py); D)scanf(\,x,y); 参考答案:C

【解析】 本题考查scanf函数,其格式为:scanf(\控制格式\,地址表列)。其中地址表列中应为要赋值变量的地址。本题要为变量x和y赋值,并定义了两个指针分别指向x和y,因此取得变量x和y的地址的方法有两种,一种是使用取地址符号\,即&x和&y,另一种是使用指针变量,即px和py。选项A)和D)中地址表列表示错误;选项B)中控制格式与地址表列之间应用逗号分开。因此,本题正确答案为C)。

5.有以下程序:

#include main()

{ int a[ ]={1,2,3,4},y,*p=&a[3]; --p;y=*p;printf(\=%d\\n\,y); }

程序的运行结果是 A)y=0 B)y=1 C)y=2 D)y=3

参考答案:D

【解析】在程序中指针变量p初始指向a[3],执行p减1后,p指向a[2],语句y=*p的作用是把a[2]的值赋给变量y,所以输出为y=3。正确答案为D)。

6.下列函数的功能是________。

fun(char *a,char *b)

{ while((*b=*a)!='\\0') {a++;b++;}} A)将a所指字符串赋给b所指空间 B)使指针b指向a所指字符串

C)将a所指字符串和b所指字符串进行比较 D)检查a和b所指字符串中是否有'\\0' 参考答案:A 【解析】 表达式*b=*a是将a所指的字符赋给b所指的空间,然后,指针a和b依次后移,直到到达指针a所指字符串的结尾。

7.设有定义:char *c;,以下选项中能够使字符型指针c正确指向一个字符串的是________。

A)char str[]=\;c=str; B)scanf(\,c); C)c=getchar(); D)*c=\; 参考答案:A

【解析】 选项B)、D)中,没有为字符串分配空间,因此不能用c指向字符串。选项C)中getchar()函数返回一个字符,不能将字符赋给字符指针c。选项A)中首先定义了字符数组str,然后将str的首地址赋给指针c,这样就使指针c指向了字符串\。

8.有以下程序

#include main()

{ char s[]=\;

printf(\,*s+2); }

程序运行后的输出结果是

A)tuv B)字符t的ASCII码值 C)t D)出错 参考答案:C

【解析】*s+2 相当于(*s)+2即先取出s所指的数据然后对其加2,s是字符串的首地址,所以*s即s[0]就是字符\,所以在它的ASCII码上加上数字2就变成了字母\的ASCII码,所以以%c格式输出,即为选项C)。

9.下列语句组中,正确的是

A)char *s;s=\ B)char s[7];s=\C)char *s;s={\ D)char s[7];s={\ 参考答案:A

【解析】若s被定义为指针,选项A表示将指针s指向一个字符串,选项C表示为指针s赋一个字符串的值,显然选项A正确,选项C错误;若s被定义为数组,且要为该数组直接赋值,则必须在定义时进行,因此选项B和选项D都错误。

二.填空题

1.以下程序的功能是:借助指针变量找出数组元素中的最大值及其元素的下标值。请填空。

#include main()

{int a[10],*p,*s;

for(p=a;p-a<10;p++)scanf(\

for(p=a,s=a;p-a<10;p++) if(*p>*s) s=______; printf(\}

参考答案:p 【解析】s指向当前最大的元素,当*p>*s时,表示当前p所指向的那个元素比s指向的元素大,则s应该记录当前最大的元素的地址。

2.有以下程序

#include main()

{ int a[]={1,2,3,4,5,6},*k[3],i=0; while(i<3) { k[i]=&a[2*i];

printf(\ i++; } }

程序运行后的输出结果是______。 参考答案:135

【解析】当i=0时,k[0]=&a[0];当i=1时,k[1]=&a[2];当i=2时,k[2]=&a[4],则打印结果为135。

3.以下程序的功能是:借助指针变量找出数组元素中最大值所在的位置并输出该最大值。请在输出语句中填写代表最大值的输出项。

#include main()

{ int a[10],*p,*s;

for(p=a;p-a<10;p++) scanf(\,p);

for(p=a,s=a;p-a<10;p++) if(*p>*s) s=p; printf(\=%d\\n\,______ ); }

参考答案:*s

【解析】因为题目中有 if(*p>*s) s=p;语句,可知如果p所指的元素的值比s所指的元素的值大,就把指针p的地址赋予指针s,即s指向当前值最大的元素,所以最后应该输出的元素的值为*s。

本文来源:https://www.bwwdw.com/article/0zj8.html

Top