文档库 最新最全的文档下载
当前位置:文档库 › C语言复习题

C语言复习题


1.以下叙述正确的是_____________。
A) C语言比其他语言高级
B) C语言可以不用编译就能被计算机识别执行
C) C语言以接近英语国家的自然语言和数学语言作为语言的表达形式
D) C语言出现得最晚,具有其他语言的一切优点
答案:C
解析:本题考查了C语言的发展和特点。首先,C语言是中级语言,说它比其他语言都要高级是不正确的,所以A选项错误。其次,__个C源程序需要经过编译,连接后才可以执行,所以B选项错误。而C语言之后又出现了Java等更新更高级的语言,所以D选项明显也是错误的。所以答案选C。

2.在一个C语言程序中____________________________________。
A) main函数必须出现在所有函数之前
B) main函数可以在任何地方出现
C) main函数必须出现在所有函数之后
D) main函数必须出现在固定位置
答案:B

解析:本题i要考查了void main()函数在程序中的位置. void main()函数在程序中的位置是任意的,所以答案选B。

3.以下叙述中正确的是_________________________.

A) C程序中注释部分可以出现在程序中任意合适的地方
B) 花括号"{"和"}"只能作为函数体的定界符
C) 构成C程序的基本单位是函数,所有函数名都可以由用户命名
D) 分号是C语句之间的分隔符,不是语句的一部分
答案:A
解析:本题考查了C程序的构成,A选项显然是正确的,因为只要用"/*"和"*/"括起来的部分,C程序就认为是注释,编译时会直接跳过,不会影响源程序。花括号"{"和"}"不仅能作为函数体的界定符,它还能作为复合语句的界定符,所以B选项错误。用户虽然可以对函数命名,但是C程序中的库函数的名称是固定的,用户不能对这些函数进行命名,所以C选项错误.一个语句如果没有分号,它就不能构成一个语句,分号是语句的一部分,所以D选项错误。所以答案选A.

4. 以下叙述中正确的是________________________.
A) C语言的源程序不必通过编译就可以直接运行
B) C语言中的每条可执行语句最终都将被转换成二进制的机器指令
C) C源程序经编译形成的二进制代码可以直接运行
D) C语言中的函数不可以单独进行编译
答案:B
解析:C程序从编写到运行需要经过编译和连接后才能生成可执行的文件,所以A选项中说C语言不经过编译便能运行的说法是明显错误的。
而编译出的二进制编码不经过连接程序与库函数连接起来,是不可能生成可执行文件的,所以C选项错误。而C语言中函数是可以单独进行编译的,所以D选项错误。所以答案选B.

5. 以下不能定义为用户标识符的是__________________________.

A)Main B) _0 C) _int D)sizeof

答案:D
解析:本题i要考查标识符的定义规则,标识符应满足:
①所有标

识符必须由一个字母(a~z,A~Z)或下划线(_)开头;
②标识符的其他部分可以用字母,下划线或数字(0~9)组成:
③大小写字母表示不同意义,即代表不同的标识符;
④标识符只有前32个字符有效:
⑤标识符不能使用C语言的关键词.
A,B,C都满足要求,而D选项的sizeof是一个关键字,用来计算表达式和类型的字节数,它不能用作标识符。所以答案选D.

第一章 练习题
一. 选择题
1.能将高级语言编写的源程序转换为目标程序的是________________________________________________。
A)链接程序 B)解释程序 C)编译程序 D)编辑程序
C
2.以下叙述中正确的是_____________。

A) 构成C程序的基本单位是函数
B) 可以在一个函数中定义另一个函数
C) void main()函数必须放在其他函数之前
D) 所有被调用的函数一定要在调用之前进行定义
A
3.一个C程序的执行是从_____________。
A) 本程序的main函数开始,到main函数结束
B) 本程序文件的第一个函数开始,到本程序文件的最后一个函数结束
C) 本程序的main函数开始,到本程序文件的最后一个函数结束
D) 本程序文件的第一个函数开始,到本程序main函数结束
A
4.一个C语言程序是由_____________。
A) 一个主程序和若干子程序组成 B) 函数组成
C) 若干过程组成 D) 若干子程序组成
B
5.以下叙述正确的是_____________。
A) 在C程序中,main函数必须位于程序的最前面
B) C程序的每行中只能写一条语句
C) C语言本身没有输入输出语句
D) 在对一个C程序进行编译的过程中,可以发现注释中的拼写错误
C
二,填空题
1. 在一个C源程序中,注释部分两侧的分界符分别为_____________和_____________。
/* */
2. 一个C源程序中至少应包括一个_____________。
主程序

3. 在C语言中,格式输入操作是由库函数_____________完成的,格式输出操作是由库函数_____________完成的。
scanf() , printf()

4. C源程序的基本单位是_____________。
函数


/////////////////////////////26
第二章 复习
1.下列叙述中正确的是_________________________.
A) C语言中既有逻辑类型也有集合类型
B) C语言中没有逻辑类型但有集合类型
C) C语言中有逻辑类型但没有集合类型
D) C语言中既没有逻辑类型也没有集合类型
答案:D
解析:本题考查C语言中的数据类型,C语言中有字符型,整型,实型,构造类型,指针类型和空类型等。C语言中没有逻辑类型和集合类型,所以选D选项。

2.以下符合C语言语法的实型常量是______________.

A)1.2E0.5 B)3.14.159E C).5E-3 D)E15
答案:C
解析:本题考查C语言常量中的实型常量的指数形式。字母E或e之前之后必须有数宇,

且E或e后面指数必须为整数.
A选项中e后面的数字是小数,所以错误.
B选项e后面没确数字,所以也是错误的.
D选项e前面没有数字,是错误的.
C选项符合规则,所以答案选C.

3. 若有以下程序:
void main()
{
char a;
a='H'-'A'+'0';
printf("%c\n",a);
}
执行后输出结果是_________________________。
答案:7

4. 有以下程序:
void main()
{
int m=12,n=34;
printf("%d%d",m++,++n);
printf("%d%d\n",n++,++m);
}
程序运行后的输出结果是________________________________________________。

A)12353514 B)12353513 C)12343514 D)12343513

答案:A
解析:本题考查的是自增自减运算的用法。
注意以下规则:
++i,i自增1后再参与其他运算。
--i,i自减1后再参与其他运算.
i++,i参与运算后,i的值再自增1; i--,i参与运算后,i的值再自减1.
分析此题,m++,先显示m,为12:再自增,m变成13;
++n,先自增,n变为35,再显示,为35。
然后n++,n先显示,为35:再自增,n变成36。
++m,m先自增,变成14,再显示,为14.
所以最后显示为12353514,所以答案选A.

5. 若x和y代表整型数,以下表达式中不能正确表示数学关系|x-y|<10 的是____________________________________.

A)abs(x-y)<10 B)x-y>-10 && x-y<10
C)(x-y)<-10||!(y-x)>10 D)(x-y)*(x-y)<100

答案:C
本题考查了关系表达式与逻辑表达式的用法。
选项A中"abs"是求整数绝对值的库函数,显然这种表示是直接按照题意来的,所以A选项正确.
|x-y|<10相当于-10而利用基本的数学知识我们也可以很容易知道D选项是正确的。

而在C选项中,要满足题意的话,x-y<-10时,整个逻辑表达式结果应为"假",即为0,因为x-y<-10成立时,绝对值已经大于10了. 而C项中,假如x-y<-10,表达式中第一部分就为"真",值为1,经过或运算,显然表达式结果为1,与题意相违背,所以C选项是不能表达题中关系的,所以选C.

6.以下程序运行后的输出结果是_________________________.
void main()
{
int a,b,c;
a=1O;
b=20;
c=(a%b<1)||(a/b>1);
printf("%d%d%d\n",a,b,c);
}

答案:10 20 0
解析:本题考查的是算数表达式和逻辑表达式的用法,同时考察了基本的优先级关系。
这道题c=(a%b<1)||(a/b>1)中,首先应算出括号中表达式的值. a%d=10%20,值为10,10>1,所以a%b再看a/b,a/b=10/20,由于是整型,则a/b=0, 所以a/b>1值为0. 根据逻辑或的用法,可得(a%b<1)||(a/b>1)=0,则c=0. 所以答案就为10 20 0。

7. 已有定义: int x=3,y=4,z=5; 则表达式!(x+y)+z-1 && y+z/2的值是_________________________.

A)6 B)0 C)2 D)1

答案:D
解析:本题考查C语言中的优先级问题。本题表

达式!(x+y)+z-1 && y+z/2 中运算符的优先级由高到低为(),!,/,+,-,&&, 因此计算时,先计算x+y=7, 然后计算!7, 为0, 0+z-1=4, y+z/2=4+2=6:最后4 && 6=1,所以答案选D。

1.若有条件表达式(exp)?a++:b--,则以下表达式中能完全等价于表达式(exp)的是____________________________________。

A)(exp==0) B)(exp!=0)
C)(exp==1) D)(exp!=1)

B
2.设以下变量均为int类型,则值不等于7的表达式是______________.

A)(x=y=6,x+y,x+1) B)(x=y=6,x+y,y+1)
C)(x=6,x+1,y=6,x+y) D)(y=6,y+1,x=y,x+1)
C

3.设C语言中,一个int型数据在内存中占2个字节,则unsigned int型数据的取值范围为____________________________________.

A)O~255 B)0~32767 C)0~65535 D)0~2147483647
C

4.设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是__________________________.

A)n=(n*100+0.5)/100.0 B)m=n*100+0.5,n=m/100.0
C)n=n*100+0.5/100.0 D)n=(n/100+0.5)*100.0
B

5.sizeof(float)是_____________。

A)一个双精度型表达式 B)一个整型表达式
C)一种函数调用 D)一个不合法的表达式
B

6.设有说明:char w; int x; float y;double z;
则表达式w*x+z-y值的数据类型为_________________________;

A)float B)char C)int D)double
D

7.语句printf("a\bre\'hi\'y\\\bou\n");的输出结果是__________________________________________________。(说明:'\b'是退格符)

A)a\bre\'hi\'y\\\bou B)a\bre\'hi\'y\bou
C)re'hi'you D)abre'hi'y\bou
C

8.下列程序的输出结果是__________________________ 。
void main()
{
double d=3.2;
int x,y;
x=1.2;
y=(x+3.8)/5.0;
printf("%d \n",d*y);
}
A)3 B)3.2 C)0 D)3.07
C

9.已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句c2='A'+'6'-'3'后,c2的值为 __________________________________________________。
A)D B)68 C)不确定的值 D)C
A

10.以下不正确的叙述是____________________________________。

A)在C程序中,逗号运算符的优先级最低
B)在C程序中,APH和aph是两个不同的变量
C)若a和b类型相同,在计算了赋值表达式a=b后b中的值将放入a中,而b中的值不变
D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值
D

11.有以下程序:
void main()
{
int a=1,b=2,m=0,n=0,k;
k=(n=b>a)||(m=a+b);
printf("%d,%d\n",k,m);
}

程序运行后的输出结果是______________ 。

A)0,0 B)0,1 C)1,0 D)1,1

12.假定w,x,y,z,m 均为int型变量,有如下程序段:

w=1; x=2; y=3; z=4;
m=(wm=(mm=(m则该程序运行后,m的值是_________________________________________________。


A)4 B)3 C)2 D)1
D

二,填空题

1.若a是int型变量,且a的初值为6, 则计算表达式a+=a-=a*a后a的值为____________________________________ 。 -60

相当于 a=6-6*6=-30, a=-30+(-30) 最后结果为-60
分析时以中间的a为分析开始点,它的左右的操作符同等优先级,按"从右到左结合",现完成右边的操作,在进行左边的操作.

又如, a的初值为4, 则计算表达式a+=a-=a*a后a的值为-24

2.在C语言中的实型变量分为两种类型,它们是_____________ 和 ______________________________________.

3.在C语言中(以16位PC机为例),一个char型数据在内存中所占的字节数为____________________________________;
一个int型数据在内存中所占的字节数为_____________ . 1,2 ????????

4.若有语句:
int i=-1,j=i%4;
printf("%d\n",j);

则输出结果是 ________________________________________________ 。 -3

5.若有定义:int b=7;float a=2.5,c=4.7; 则下面表达式的值为_____________. 5.500000

a+(int)(b/3*(int)(a+c)/2)%4

6.若a为整型变量,则表达式(a=4*5,a*2),a+6的值为______________. 26

7.以下程序输出的结果是__________________________。 0 ?????????????????????????????

void main()
{
int a=5,b=4,c=3,d;
d=(a>b>C);
printf("%d\n",d);
}

8.int x=3,y=2; floata=2.5,b=3.5:则表达式(x+y)%2+(int)a/(int)b的值为_____________________________________. 1

9.以下程序的输出结果是____________________________________________________________。 2,1
void main()
{
int a=1, b=2;
a=a+b; b=a-b; a=a-b;
printf("%d,%d\n",a,b);
}

/////////////////////////////41
第三章 复习
1.有以下语句段:

int n1=10,n2=20;
printf("_____________",n1,n2);

要求按以下格式输出n1和n2的值,每个输出行从第一列开始,请填空.
n1=10
n2=20

答案:n1=%d\nn2=%d

解析:考察printf()函数的使用以及转义字符的用法。

2. 若有以下下程序段:
int m=0xabc,n=0xabc;
m-=n;
printf("%x\n",m);
执行后输出结果是______________。

A)0X0 B)0x0 C)0 D)0XABC
答案:C

解析:以0x开头表示十六进制的整型常量,在使用函数printf()输出十六进制常量时不会输出0x前缀。所以C选项正确。

3.有以下程序段:
int m=0,n=0;
char c='a';
scanf("%d%c%d",&m,&c,&n);
printf("%d,%C,%d\n",m,c,n);

若从键盘上输入:10A1O<回车>,则输出结果是 __________________________.
A)10,A,10 B)10,a,10 C)10,a,0 D)10,A,0
答案:A

解析:在有多个输入项时,且格式控制字符全是同数据类型的格式说明符时,只能用空格,跳格键或回车作为分隔符。但假如数据类型不同,则不需要以这些分隔符作区分。从键盘上输入的第一个数据10存入整型变量m,字符A存入字符变量c,第二

个10存入整型变量n,所以选项A正确。

4.有以下程序:
void main()
{
int m,n,p;
scanf("m=%dn=%dp=%d",&m,&n,&p);
printf("%d%d%d\n",m,n,p);
}
若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,则正确的输入是_____________。
A)m=123n=456p=789 B)m=123 n=456 p=789
C)m=123,n=456,p=789 D)123 456 789
答案:A
解析:本题i要考查了scanf和printf的用法。在输入数据时,双引号中的部分其类型与个数必须与控制字符串中格式字符的类型,个数一致。同时注意这里的"m=","n=","p="是非格式控制字符,在输入数据时应输入与这些字符相同的字符。所以答案选A.

5.以下程序运行时若从键盘输入:10 20 30<回车>,输出结果是_____________.
#include
void main()
{
int i=0,j=0,k=0;
scanf("%d%*d%d",&i,&j,&k);
printf("%d%d%d\n",i,i,k);
}
答案:10300
解析:本题考查的是输入函数中格式说明符的用法。本题最重要的是弄清楚'*'的作用。'*'表示按规定格式输入但不赋予相应变量,作用是跳过相应的数据。这样很明显,当输入到20时,由于'*'的作用,20被跳过。于是30赋给j,而k的值不变。所以答案为10300。

6.有以下程序:
void main()
{
int x=102,y=012;
printf("%2d,%2d\n",x,y);
}
执行后输出结果是 ,,。
A)10,01 B)002,12 C)102,10 D)02,10
答案:C
解析:本题i要考查输出函数格式说明符的用法。在输出说明符中,可以用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则左端补以空格或0. 本题首先要把012化为十进制数,即为10,然后根据上述规则,102多于定义的宽度,按实际位数输出,为102;而10刚好是2位,所以也可以显示。所以最后结果显示102,100所以答案选C.

////////////////////////////////p43

一,选择题
1.下列程序执行后的输出结果是 ________________________________________________.
void main()
{
char x=0xFFFF;
printf("%d \n",x--);
}

A)-32767 B)FFFE C)-1 D)-32768
C
2.若有以下程序段(n所赋的是八进制数):
int m=32767,n=032767;
printf("%d,%o/n",m,n);
执行后输出结果是_____________。

A)32767,32767 B)32767,032767
C)32767,77777 D)32767,077777
A
3.有以下程序:
#include
void main()
{ printf("%d\n",NULL);}
程序运行后的输出结果是____________________________________.
A)0 B)1
C)-1 D)NULL没定义,出错
A

4.若变量已正确说明为float类型,要通过语句scanf("%f%f%f",&a,&b,&c);给a赋予10.0,b赋予22.0,c赋予33.0,不正确的输入形式是_____________.

A)10<回车>
22<回车>
33<回车>

B)10.0, 22.0, 33.0<回车

>
C)10.0<回车>
22.0 33.0<回车>

D)10 22<回车>
33<回车>
B

5.以下程序段的输出结果是_____________.
int a=1234;
printf("%2d\n",a);
A)12 B)34 C)1234 D)提示出错
C

6.设有如下程序段:
int x=2002, y=2003;
printf("%d\n",(x,y));

则以下叙述中正确的是_____________。

A)输出语句中格式说明符的个数少于输出项的个数,不能正确输出
B)运行时产生出错信息
C)输出值为2002
D)输出值为2003
D
7.已知i,j,k为int型变量,若从键盘输入:1,2,3<回车>,使i的值为1,j的值为2,k的值为3,以下选项中正确的输入语句是____________.
A)scanf("'%2d%2d%2d",&i,&j,&k);
B)scanf("%d%d%d",&i,&j,&k);
C)scanf("%d,%d,%d",&i,&j,&k);
D)scanf("i=%d,j=%d,k=%d",&i,&j,&k);
C
二,填空题
1.若有程序:
void main()
{
int i,j;
scanf("i=%d,j=%d";&i,&j);
printf("i=%d,j=%d\n",i,j);
}
要求给i赋10,给j赋20,则应该从键盘输入________________________________________________。i=10,j=20

2. 已知字符A的ACSII码值为65,以下语句的输出结果是 ______________.B 66
char ch='B';
printf("%c %d\n",ch,ch);

3.下列程序的输出结果是16.00,请填空.
void main()
{
int a=9, b=2;
float x=_____________,y=1.1,z; 6.6
z=a/2+b*x/y+1/2;
printf("%5.2f\n", z);
}

4.以下程序的输出结果是_____________。 261
void main()
{ int a=177;
printf("%O\n",a);
}

5.以下程序的输出结果是_____________。 0
void main()
{
unsigned short a=65536; int b;
printf("%d\n",b=a);
}

6.以下程序运行后的输出结果是______________________________________. 3

void main()
{
int p=30;
printf("%d\n",(p/3>0?p/10:p%3));
}

第四章 复习P63

1. 以下程序的输出结果是_____________。
void main()
{
int n=0,m=1;x=2;
if(!n) x-=1;
if(m) x-=2;
if(x) x-=3;
printf("%d\n",K);
}

答案:-4
解析:本题考查的是if语句的用法.if(表达式)语句"的判断条件是表达式值为非0,则执行语句;为0则不执行语句。本题中,"!n"的值为1,所以执行语句"x-=1;",x的值变为1, 同理依次往下推算,最后可得答案为-4.

2.下列条件语句中,功能与其他语句不同的是________________________.
A)if(a) printf("%d\n",x);
else prinf("%d\n",y);
B)if(a==0) prinff("%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);
答案:D
解析:本题考查if语句的用法。A,B,C的功能都是a值为0时,输出y; a值不为0时, 输出x. 所以答案选D.

3. 有以下程序:
void main()
{
int x=0,y=5,z=3;
while(z-->0 && ++x<

5) y=y-1;
printf("%d,%d,%d\n",x,y,z);
}

程序执行后的输出结果是____________.
A)3,2,0 B)3,2,-1 C)4,3,-1 D)5,-2,-5
答案:B
解析:本题考查的是while语句和逻辑运算符的用法。注意z--和++x的含义。在z值变为0之前,各个变量的值都比较好分析; z减为0时,x为3,y值为2, 继续判断,执行表达式"z-->0 && ++x<5"时,z--首先取出值0,然后自减,变为-1。而"z-->O"这个表达式的值变为0,于是整个"z-->0&&++x<5"表达式的值就为0,不用继续判断表达式"++x<5",然后跳出循环。于是x,y,z的值就为3,2,-1,所以选择B选项。

4.有以下程序:
void 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\n",b);
}

程序运行后的输出结果是____________.
A)3 B)4 C)5 D)6
答案:B

解析:本题考查的是循环结构和选择结构的嵌套使用。要输出b值,实际上就是要弄清楚执行循环的次数。首先b=1,a=1,经过判断后,对2求余,发现余数为1,则执行"a+=5",a值变为6,再执行continue,进入下一个循环,b值自增,变为2. 依此类推,当b的值变为4时,此时a的值为8,满足a>=8的条件,执行break,中断整个循环。所以输出b值为8,答案选B。

5.以下程序运行后的输出结果是____________.
void main()
{
char c1,c2;
for(c1='0',c2='9';c1printf("%c%c",c1,c2);
printf("\n");
}
答案:0918273645
解析:本题i要考查for语句的用法。本题的实质就是两个字符不断循环显示,其中一个字符递增,一个字符递减,直至递增字符不小于递减字符的值,循环结束。只要按着循环的规则一条一条地执行,即可得出答案为 09182736450

6.有以下程序:
void main()
{ int i;
for(i=0;i<3;i++)
switch(i)
{
case 0: printf("%d",i);
case 2: printf("%d",i);
default: printf("%d",i);
}
}
程序运行后的输出结果是____________.

A)022111 B)021021 C)000122 D)012
答案:C
解析:本题考查了for语句和switch语句的使用。注意switch语句中没有break语句,即假如i=0,就要从case:O一直执行到default。经过分析可得答案为000122。
P65
一.选择题
1.以下for循环的执行次数是____________.
for(x=0,y=0;(y=123)&&(x<4);x++);

A)无限循环 B)循环次数不定 C)4次 D)3次
C
2.若有如下语句:
int x=3;
dO{ printf("%d\n",x-=2);}while(!(--x));
则上面程序段_____________。

A)输出的是1 B)输出的是1和-2
C)输出的是3和0 D)是死循环
B

3.若运行以下程序时,从键盘输入ADesriptor(表示回车),则下面程序的运行结果是_________________________.
#include
void main()
{char c;
int v0=1, v1=0, v2=0;
do { switch (c=getchar ( ) )
{ case 'a':

case 'A':
case 'e': case 'E':
case 'i': case 'I':
case 'o': case 'O':
case 'u': case 'U':v1+=1;
default: v0+=1; v2+=1;
}
}while (c!='\n');
printf ("v0=%d, v1=%d, v2=%d\n",v0,v1,v2);
}

A)v0=7,v1=4,v2=7 B)v0=8,v1=4,v2=8
C)v0=11,v1=4,v2=11 D)v0=12,v1=4,v2=12
D

4.下面有关fox,循环的正确描述是_________________________.

A)for循环只能用于循环次数已经确定的情况
B)for循环是先执行循环体语句,后判断表达式
C)在for循环中,不能用break语句跳出循环体
D)for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来
D

5.C语言中while和do-while循环的主要区别是_________________________.

A)do-while的循环体至少无条件执行一次
B)while的循环控制条件比do-while的循环控制条件更严格
C)do-while允许从外部转到循环体内
D)do-while的循环体不能是复合语句
A

6.有如下程序:
void main()
{ float x=2.0, y;
if(x<0.0) y=0.0;
else if(x<10.0) y=1.0/x;
else y=1.0;
printf("%f\n",y);
}
该程序的输出结果是_________________________.

A)0.000000 B)0.250000 C)0.500000 D) 1.000000
C
7,有以下程序:
void main()
{int a=5,b=4,c=3,d=2;
if(a>b>c)
printf("%d\n",d);
else if((c-1>=d)==1)
printf("%d\n",d+1);
else
printf("%d\n",d+2)
}
执行后输出结果是_________________________.

A)2 B)3 C)4 D)编译时有错,无结果
B

8.以下程序的输出结果是____________.
void main()
{int a, b;
for(a=1,b=1;a<=100;a++)
{ if(b>=10) break;
if(b%3==1)
{ b+=3; continue; }
}
printf("%d\n",a);
}

A)101 B)6 C)5 D)4
D

二.填空题
1. 以下程序运行后的输出结果是______________. yes
void main()
{
int a=1,b=3,c=5;
if(c=a+b) printf("yes\n");
else printf("no\n");
} .

2.以下程序运行后的输出结果是____________. 1 3 2
void main()
{int i,m=0,n=0,k=0;
for(i=9;i<=11;i++)
switch(i/10)
{ case 0: m++;n++;break;
case 10: n++; break;
default: k++;n++;
}
printf("%d %d %d\n",m,n,k);
}
3.执行以下程序后,输出'#'号的个数是____________________________________. 6
#include
void main()
{int i,j;
for(i=1; i<5; i++)
for(j=2; j<=i; j++) putchar('#');
}

4.设有以下程序:
void main()
{int n1,n2;
scanf("%d",&n2);
while(n2!=0)
{ n1=n2%10;
n2=n2/10;
printf("%d",n1);
}
}
程序运行后,如果从键盘上输入1298,则输出结果为____________. 8921

5.以下程序的输出结果是______________. 5
void main()
{int s,i;

for(s=0,i=1;i<3;i++,s+=i);
printf("%d\n",s);
}
////////////////////////////////////////86

第五章 复习

1.以下能正确定义一维数组的选项是______________.
A)int a[5]={0,1,2,3,4,5}; B)char a[]={0,1,2,3,4,5};
C)char a={'A','B','C'}; D)int a[5]="0123";
答案:B
解析:本题考查的是对数组的初始化. A选项a[5]只有5个元素,却赋了6个值,赋值数大于元素个数,会产生错误,所以A选项错误.

C选项是应该对数组赋值,可是a不能表示数组,所以C选项错误.
D选项中整型数组是不可以被一个字符串直接赋值的.
B选项括号中虽然不是字符型变量,但字符型数组实质上与整型数组是相同的,这里赋的值就相当于相应字符的ASCII码,所以B选项正确。


2.以下程序运行后的输出结果是____________.
void main()
{int i,n[]={0,0,0,0,0};
for(i=1;i<=4;i++)
{ n[i]=n[i-1]*2+1;
printf("%d",n[i]);
}
答案:1 3 7 15
解析:本题考查的是一维数组。这个程序的功能是改变a[i]的值并输出,弄清楚n[i]=n[i-1]*2+1的含义很容易就可以得出答案。

3.有以下程序:
void main()
{
int p[8]={ll,12,13,14,15,16,17,18},i=0,j=0;
while(i++<7)
if(p[i]%2) j+=p[i];
printf("%d\n",j);
}
程序运行后的输出结果是____________.
A)42 B)45 C)56 D)60
答案:B

解析:本题综合考查了C语言的运算符,循环结构,选择结构以及数组。
首先,要理解while(i++<7)的含义,实际上在循环条件判断时加入了循环次数的变化,特别要注意第一次循环开始时,i自增就变为1了,如果认为i值还是0,那么会导致选择答案C。
然后再看if(p[i]%2),是把求余的值作为条件选择的判断条件,只有值为非0时,才会执行后面的语句,所以相当于p[2],p[4],p[6]参加了后面的运算.
j+=p[i]相当于j=j+p[i],于是最后计算的结果相当于 p[2]+p[4]+p[6],所以相当于13+15+17=45,所以答案选B。

4.以下能正确定义二维数组的是________________________.
A)int a[][3); B)int a[][3]=2{2*3};
C)int a[2][3]; D)int a[2][3]={{1},{2},{3,4}};
答案:C
解析:本题考查的是二维数组的定义和初始化。二维数组虽然可以不定义长度,但只是在初始化时元素个数确定,而A项定义时并没有初始化,所以系统无法给数组指定长度,所以A选项错误。

整型数组赋初值只能将所赋值放在花括号之内,所以选项B也是错误的。

对于D项,这个二维数组实际上是2行3列,但却给它赋了3行的值,所以D选项错误.
C是标准的定义方式,是正确的.

5.以下程序运行后的输出结果是__________________________。
void main()
{
int a[4][4]c{{1,2,3,4},{5,6,7,8},{11,12,13,14},{15,16,17,181}};
int i=0,j=0,s=O;
while(i++<4)
{
if(i==2 || i==4) continue;
j=0;
do{ s+=a[i][j]; j++; } while(i<

4);
}
printf("%d\n",s);
}
答案:92
解析:本题考查了二维数组的使用以及选择结构和循环结构。注意"if(i==||i==4) continue;"实际上是控制i=1或3时进行下面的do-while循环,"do{s==a[i][j];j++} while(j<4);" 相当于a[i]中的元素进行累加,于是整个程序就可以转换为5+6+7+8/15+16+17+18=92,所以答案为92。

6. 有以下程序:
void main()
{
char a[7]="a0\0a0\0";int i,j;
i=sizeof(a); j=strlen(a);
printf("%d%d\n",i,j);
}
程序运行后的输出结果是____________.
A)2 2 B)7 6 C)7 2 D)6 2
答案:C
解析:本题i要考查了sizeof和strlen的用法。sizeof是长度运算符,用于测试数据类型(或变量)所分配的内存字节数,a[7]中有7个字符, 'a','0','\0','a','0','\0','\0',(注意最后一个'\0',是字符串结束标志,系统自动加上的),而每个字符占一个字节,所以sizeof(a)的值为
7,而strlen是统计字符串的实际长度,遇到\0,就停止统计,所以strlen(a)的值为2,所以答案选C。

一.选择题
1.有以下语句:int b; char c[10]; 则正确的输入语句是____________.
A)scanf("%d%s",&b,&c); B)scanf("%d%s",&b,c);
C)scanf("%d%s",b,c); D)scanf("%d,%s",b,&c);
B
2.以下不正确的定义语句是____________.
A)double x[5]={2.0,4.0,6.0,8.0,10.0};
B)int y[5]={0,1,3,5,7,9};
C)char c1[]={'1','2','3','4','5'};
D)char c2[]={'\x10','\xa','\x8'};
B

3.若有说明:int a[][3]={1,2,3,4,5,6,7}; 则a数组第一维的大小是____________.
A)2 B)3 C)4 D)无确定值
B

4.若二维数组a有m列,则在a[i][j]前的元素个数为____________. ???????????????????????????????

A)j*m+1 B)i*m+j C)i*m+j-1 D)i*m+j+1
B

5.定义如下变量和数组:
int k;
int a[3][3]={1,2,3,4,5,6,7,8,9);

则下面语句的输出结果是____________.

for(k=0;k<3;k++) printf("%d",a[k][2-k]);

A)3 5 7 B)3 6 9 C)1 5 9 D)1 4 7
A
1 2 3
4 5 6
7 8 9


6.下列程序执行后的输出结果是____________.
void main()
{ char arr[2][4];
strcpy(arr,"you"); strcpy(arr[1],"me");
arr[0][3]='&';
printf("%s \n",arr);
}
A)you&me B)you C)me D)err
A
y o u _

y o u _
m e

y o u &
m e

7.有以下程序:
void main()
{ char a[]={'a','b','c','d','e','f','g','h','\0'}; int i,j;
i=sizeof(a); j=strlen(a);
printf("%d,%d\b"i,j);
}
程序运行后的输出结果是____________.

A)9,9 B)8,9 C)1,8 D)9,8
D

8. 以下能正确定义数组并正确赋初值的语句是____________. ?????????????????????????????
A)int N=5,b[N][N];
B)int a[1][2]={{1},{3}};
C)int c[2][]={{1,2},{3,4}};
D)int d[3][2]={{1,2},{3,4}};
D

9.有以下程序:
void main()
{ int m[][3];{1,4,7,2,5,8,3,6,9};
int i,i,k=2;
for(i=0;i<3;i++)
{ print

f("%d ",m[k][i]); }
}

执行后输出结果是____________.
A)4 5 6 B)2 5 8 C)3 6 9 D)7 8 9
C
1 4 7
2 5 8
3 6 9

10.以下程序的输出结果是____________.
void main()
{ char w[][10]={"ABCD","EFGH","IJKL","MNOP"},k;
for(k=1;k<3;k++) printf("%s\n",w[k]);
}
A)ABCD
FGH
KL
M

B)ABCD
EFG
IJ

C)EFG
JK
O

D)EFGH
IJKL

D

二.填空题
1.在调用C语言的库函数对字符串进行操作时,应包含的头文件是____________.
string.h

2.构成数组的各个元素必须有相同的____________.
数据类型

3.以下程序的功能是将字符串s中的数字字符放入d数组中,最后输出d中的字符串。
阅如,输入字符串:abc123edf456gh,执行程序后输出:123456。填空。
void main()
{char s[80],d[80];
int i,j;
gets(s);
for(i=j=0;s[i]!='\0';i++)
if(_____________ ) //you need fill this blank!!!!!!!!!!!!!!!
{ d[j]=s[i];
j++;
}
d[i]='\0';
puts(d);
}



s[i]>='0' && s[i]<='9'

4.以下程序运行后的输出结果是____________.
void main()
{ int i,j,a[][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
for(j=i+1;j<3;j++)
a[j][i]=0;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
原始数组:
1 2 3
4 5 6
7 8 9
赋值后:
1 2 3
0 5 6
0 0 9
输出时:
1 2 3
0 5 6
0 0 9

5.以下程序的输出结果是____________.
void main()
{ char s[]="abcdef";
s[3]='\0';
printf("%s\n",s);
}
abc

///////////////////////113
第六章 函数 复习

1.若程序中定义了以下函数:
double myadd(double a,double b)
{ return(a+b);}
并将其放在调用语句之后,则在调用之前应该对该函数进行说明。以下选项中错误的说明是____________.
A)double myadd(double a,b); B)double myadd(double,double);
C)double myadd(double b,double a); D)double myadd(double x,double y);
A
解析:本题考查了函数的声明,有参函数声明的一般形式为:类型标识符函数名(类型标识符形参1,类型标识符形参2,...);注意结尾处的分号,在函数声明中,形参的名字并不重要,形参可以为任何合法标识符,甚至可以省略不写,重要的是类型标识符. B,C,D都符合要求,而A选项显然与标准形式不符,所以A项是错误的。

2.有以下程序:
int f(int a)
{ return a%2; }
void main()
{ int s[8]={1,3,5,2,4,6},i,d=0;
for (i=0;f(s[i]));i++) d+=s[i];
printf("%d\n",d);
}
程序运行后的输出结果是____________.
A)9 B)11 C)19 D)21
A
解析:本题数组元素充当了实参,把值传递给形参,与基本常量的值传

递没有本质的区别.而函数f实现了返回2余数的功能,for(i=0;f(s[i]);i++)用来控制循环,只要f(s[i])为0就停止循环,所以到i=3以后就停止循环. d+=s[i]实现了对选定元素的累加,即为s[0]+s[1]+s[2]=1+3+5=9。所以答案选A。

3.以下程序运行后的输出结果是____________.
void swap(int x,int y)
{ int t;
t=x; x=y;y=t;
printf("%d %d ",x,y);
}
void main()
{
int a=3,b=4;
swap(a,b);
printf("%d %d\n",a,b);
}
答案:4 3 3 4
解析:本题考查了实参和形参的关系。当调用swap函数时,实参a,b把值3,4传递给swap中的x,y,使x=3,y=4。在swap函数中,语句"t=x;x=y;y=t;"使x和y值交换,于是首先显示"4 3",然后返回到i函数继续执行输出语句,由于实参的值是没有随形参的值变化而变化的,所以a,b的值仍分别为3和4,于是继续输出"3 4".所以答案为4 3 3 4.

4. 有以下程序:
int f1(int x,int y){return x>y?x:y;}
int f2(int x,int y){return x>y?y:x;}
void main()
{
int a=4,b=3,c=5,d=2,e,f,g;
e=f2(f1(a,b),f1(c,d));
f=f1(f2(a,b),f2(c,d));
g=a+b+c+d-e-f;
printf("%d,%d,%d\n",e,f,g);
}
程序运行后的输出结果是____________.
A)4,3,7 B)3,4,7 C)5,2,7 D)2,5,7
答案:A

解析:f1函数的作用就是取两个值中的较大值, 而f2函数的作用是取两个值当中的较小值。这样可以算出f1(a,b)=4,f1(c,d)=5,f2(a,b=3,
f2(c,d)=2,e=f2(4,5)=4,f=f1(3,2)=3,g=4+3+5+2-4-3=7。所以答案选A。

5. 以下程序运行后的输出结果是____________.
fun(int a)
{int b=0; static int c=3;
b++; c++;
return(a+b+c);
}
void main()
{int i,a=5;
for(i=0;i<3;i++) printf("%d %d ",i,fun(a));
printf("\n");
}
答案:0 10 1 11 2 12
解析:本题考查了静态变量的用法,注意静态变量能在每次调用后保留其值并在下一次调用时继续使用。所以当i=0,第一次调用c时, a+b+c=5+1+4=10;而当i=1,第二次调用时, c值由于保留上次的结果4, 再递增为5,于是就得到a+b+c=5+1+5=11; 同理可得, i=2时,
a+b+c=5+1+6=12。所以答案为0 10 1 11 2 12。

6.填空: 通过函数求f(x)的累加和,其中f(x)=x*x+1
void main()
{
printf("The sum=%d\n",SunFun(10));
}
SunFun(int n)
{
int x,S=0;
for(x=0;x<=n;x++) s+=f( _____________ );
return s;
}
f(int x)
{return ______________;}

答案:x, x*x+1
解析:本题考查了函数的嵌套调用。首先在main函数里,调用SunFun函数,并将10传递给n,含义为求f(x)从1到10的累加和. for循环便实现了这个累加的过程,经过分析,可以得到f()括号中的参数应是x. 然后进入f函数,发现它的功能是实现f(x)=x*x+1,于是可以得到第二个空内应该填x*x+1

一.选择题

1.若使用一维数组名作函数实参,则以下正确的说法是____________.
A)必须在主调函

数中说明此数组的大小
B)实参数组类型与形参数组类型可以不匹配
C)在被调用函数中,不需要考虑形参数组的大小
D)实参数组名与形参数组名必须一致
A
2.凡是函数中未指定存储类别的局部变量,其隐含的存储类别为____________.
A)自动(auto) B)静态(static)
C)外部(extem) D)寄存器(register)
A
3.以下正确的描述是: 在C语言程序中____________.
A)函数的定义可以嵌套,但函数的调用不可以嵌套
B)函数的定义不可以嵌套,但函数的调用可以嵌套
C)函数的定义和函数的调用均不可以嵌套
D)函数的定义和函数的调用均可以嵌套
B
4.以下叙述中正确的是____________.
A)全局变量的作用域一定比局部变量的作用域范围大
B)静态(static)类别变量的生存期贯穿于整个程序的运行期间
C)函数的形参都属于全局变量。
D)未在定义语句中赋初值的auto变量和static变量的初值都是随机值
B

5.若用数组名作为函数的实参,传递给形参的是____________.
A)数组的首地址 B)数组第一个元素的值
C)数组中全部元素的值 D)数组元素的个数
A
6.有如下程序:

void f(int x,int y)
{ int t;
if(x>y) {t=x;x=y;y=t;}
}
void main()
{
int a=4,b=3,c=5;
f(a,b);
f(a,c);
f(b,c);
printf("%d,%d,%d\n",a,b,c);
}
执行后输出结果是_____________。
A)3,4,5 B)5,3,4 C)5,4,3 D)4,3,5
D
7.以下程序的输出结果是____________.
fun(int x, int y, int z)
{ z=x*x+y*y; )
void main()
{ int a=31;
fun(5,2,a);
printf("%d",a);
}
A)0 B)29 C)31 D)无定值
C
8.以下程序的输出结果是____________.
int x=3;
void incre()
{ static int x=1;
x*=x+1;
printf(" %d",x);
}
void main()
{ int i;
for(i=1;i}

A)3 3 B)2 2 C)2 6 D)2 5
C

9.有以下程序:
void swapl(int c[])
{
int t;
t=c[0];C[0]=C[1];C[1]=t;
}
void swap2(int cO,int c1)
{
int t;
t=c0;c0=C1;c1=t;
}
void main()
{
int a[2]={3,5),b[2]-{3,5);
swapl(a);
swap2(b[0],b[1]);
printf("%d %d %d %d\n",a[0],a[1],b[0],b[1]);
}
其输出结果是_____________。
A)5 3 5 3 B)5 3 3 5 C)3 5 3 5 D)3 5 5 3
B
10.下列程序执行后的输出结果是____________.
void func1(int i);
void func2(int i);
char st[]="hello,friend!";
void func1(int i)
{
printf("%C",st[i]);
if(i<3){i+=2;func2(i);}
}
void func2(int i)
{
printf("%c",st[i]);
if(i<3){i+=2;func1(i);}
}
void main()
{ int i=0;
func1(i);
printf("\n");}

A)hello B)hel C)hlo D)hlm
C

11.有如下程序:
int func(int a,int b)
{return(a+b);}

void main()
{int x=2,y=5,z=8,r;
r=func(func(x,y),z);
printf("%d\n",r);
}

该程序的输出结果是____________.
A)12 B)13 C)14 D)15
D

12.有如下程序:
long fib(int n)
{
if(n>2) return(fib(n-1)+fib(n-2));
else return(2);
}
void main()
{ printf("%d\n",fib(3));}

该程序的输出结果是____________.

A)2 B)4 C)6 D)8
B

二. 填空题
1.函数fun的功能是计算x的n次方
double fun(double x,int n)
{
int i;
double y=1;
for(i=1;i<=n;i++) y=y*x;
return y;
}
主函数中已经正确定义m,a,b变量并赋值,并调用fun函数计算:m=a*a*a*a+b*b*b*b-(a+b)*(a+b)*(a+b)。实现这一计算的函数调用语句为
____________.
f(a,4)+f(b,4)-f(a+b,4)

2.以下程序输出的最后一个值是____________.
int ff(int n)
{ static int f=1;
f=f*n;
return f;
}
void main()
{
int i;
for(i=1;i<=5;i++) printf("%d\n",ff(i));
}
120

3.以下程序的运行结果是____________.
#include
void main()
{int k=4,m=1,p;
p=func(k,m); printf("%d,",p);
p=func(k,m); printf("%d \n",p);
}
func(int a, int b)
{ static int m=0, i=2;
i+=m+1;
m=i+a+b;
return m;
}
8,17

4.以下程序运行后的输出结果是____________.
fun(int x)
{
if(x/2>0) fun(x/2);
printf("%d ",x);
}
void main()
{fun(6);}
1 3 6

5.若有以下程序:
int f(int x, int y)
{return(y-x)*x;}
void main()
{
int a=3,b=4,c=5,d;
d=f(f(3,4),f(3,5));
printf("%d\n",d);
}
执行后输出的结果是____________.

9

/////////////////125
1.有以下程序:

void 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\n",j);
}
程序运行后的输出结果是____________.
A)42 B)45 C)56 D)60
本题综合考查了C语言的运算符,循环结构,选择结构以及数组,属于考查综合能力的题。首先,要理解while(i++<7)
的含义,实际上在循环条件判断时加入了循环次数的变化,特别要注意第一次循环开始时,i自增就变为1了,如果粗心大意,认为i值还是0,就会导致选择答案C.
然后再看if(p[i]%2),是把求余的值作为条件选择的判断条件,只有值为非0时,才会执行后面的语句,所以相当于p[2],p14],p[6]参加了后面的运算。
j+=p[i]相当于j=j+p[i],于是最后计算的结果相当于p[2]+p[4]+p[6],相当于13+15+17=45,所以答案选B。



1.设有以下定义:
int a=0;
double b=1.25;
char c='A';
#define d 2
则下面语句中错误的是____________.
A)a++; B)B++; C)c++; D)d++;
答案:D
本题要注意两点:
①自增运算符适用于变量;
②宏替换时,把标识符代表的字符串原封不动地替换过

去。所以D选项相当于2++,所以D选项的语句是错误的。

2.以下叙述中正确的是____________.
A) 预处理命令行必须位于源文件的开头
B) 在源文件的一行上可以有多条预处理命令
C) 宏名必须用大写字母表示
D) 宏替换不占用程序的运行时间

答案:D
本题考查宏定义的一些注意事项,对于宏定义的位置,只要求预处理命令必须写在函数之外,其作用域为预处理命令起到源程序结束,并没有要求必须位于源文件开头。所以A选项错误。
而预处理命令不允许一行有多条,所以B选项错误。
对于宏名,大小写都可以,只是一般为了区分宏名和变量采用大写,所以C选项错误。从而D选项是正确的。

3. 有以下程序:
#define N 20
fun(int a[],int n,int m)
{ int i,i;
for(i=m;i>=n;i--) a[i+1]=a[i];
}
void main()
{
int i,a[N]={1,2,3,4,5,6,7,8,9,10};
fun(a,2,9);
for(i=0;i<5;i++) printf("%d",a[i]);
}

程序运行后的输出结果是______________.

A)10234 B)12344 C)12334 D)12234
答案:C
本题的宏定义给数组指定了一个大小,最重要的还是理解函数fun的作用。函数的作用经过分析可以发现,它是将数组中从a[10]到a[3)的元素,每个元素依次赋予它前面一个元素的值,例如a[5]=a[4]。这样新的数组元素的值就应该是a[20)={1,2,3,3,4,5,6,7,8,9,10,10}。
主函数中,"for(i=0;i<5;i++) printf("%d",a[i];"的功能是输出a[0]到a[4]的值。所以答案为12334。

4.有以下程序:
#define P 3
void F(int x)
{ return( P*K*K);}
void main()
{printf("%d\n",F(3+5));}

程序运行后的输出结果是____________.

A)192 B)29 C)25 D)编译出错
答案:D
本题有一定的技巧,注意不要一开始就直接把数据代进去算,注意函数的类型是void,那么它应该没有返回值。但是在函数定义时却有return语句,编译会产生错误,所以选D。

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

#define S(x) 4*x*x+1
void main()
{
int i=6,j=8; printf("%d\n",S(i+j));
}
答案:81

本题只要弄清楚宏替换的规则即可做出,S(i+j)即S(6+8),相当于4*6+8*6+8+1。即, x为6+8, x*x 为6+8 * 6+8

?????????????????????????????????????此部分需要验证!!!!!!!!!!!!!!!!!!!!!!!
函数部分的练习题

一.选择题
1.以下叙述中不正确的是____________.
A) 预处理命令行都必须以#号开始
B) 在程序中凡是以#号开始的语句行都是预处理命令行
C) C程序在执行过程中对预处理命令行进行处理
D) 以下是正确的宏定义:#define IBM__PC
C

2.以下程序的运行结果是____________.
#define MIN(x,y) (x)<(y)?(x):(y)
void main()
{int i=10,j=15,k;
k=10*MIN(i,j);
printf("%d\n",k);
}
A)10 B)15 C)100 D)150
B

3

.有以下程序:
#define ADD(x) x+x
void main()
{
int m=1,n=2,k=3;
int sum=ADD(m+n)*k;
printf("sum=%d",sum);
}
该程序的运行结果是____________.
A)sum=9 B)sum=10 C)sum=12 D)sum=18
B
4.有如下程序:
#define N 2
#define M N+1
#define NUM 2*M+1
void main()
{
int i;
for(i=1;i}
该程序中的for循环执行的次数是____________.
A)5 B)6 C)7 D)8
B

5.对下面程序段:
#define A 3
#define B(a) ((A+1)*a)
. . .
x=3*(A+B(7));
. . .

正确的判断是_____________。
A)程序错误,不许嵌套宏定义
B)x=93
C)x=21
D)程序错误,宏定义不允许有参数
B

二. 填空题

1.下面程序的运行结果是____________.
#define N 10
#define s(x) x*x
#define f(x) (x*x)
void main()
{int i1,i2;
i1=1000/s(N); i2=1000/f(N);
printf("%d %d\n",i1,i2);
}
1000 10

2.下面程序的运行结果是____________.
#define DOUBLE(r) r*r
void main()
{ int x=1,y=2,t;
t=DOUBLE(x+y);
printf("%d",t);
}
5

3.下面程序的输出结果是____________.
#define MCRA(m) 2*m
#define MCRB(n,m) 2*MCRA(n)+m
void main()
{int i=2,j=3;
printf("%d\n",MCRB(j,MCRA(i)));
}
16

p157

1.以下语句或语句组或语句组中,能正确进行字符串赋值的是__________________。
A)char *sp; *sp="right!"; B)char s[10]; s="hght!";
C)char s[10]; *s="right!"; D)char *sp="right!";
答案:D
解析:本题考查了对字符型指针和字符数组用字符串初始化时的格式。字符数组初始化时只能在定义时初始化,不可以先定义数组,然后再用一条语句将字符串赋给指针,所以答案B,C错误。字符指针虽然可以初始化时先定义,再将字符串赋给它,但要注意赋值时的格式: sp="right!",所以答案A错误。答案选D。

2. 设有定义:int n=0,*p=&n,*q=&p;则以下选项中,正确的赋值语句是____________.
A)p=1; B) *q=2; C) q=p; D)*p=5;
答案:D

解析:本题最重要的是搞清楚各个变量的类型,p是指针变量,q是指向指针的指针。因此,A选项是错误的,不可以直接给指针赋予整数值. *q还是一个指针,所以它也不能被整数直接赋值,所以B项是错误的。选项C错误,因为变量q是指向指针的指针,它应该用一个指针变量的地址为其赋值.
D选项符合要求,所以答案选Do

3.有以下程序:
void main()
{
int a[3][2),*p,i;
p=&a[0][0];
for(i=0;i<9;i++) p[i]=i;
for(i=0;i<3;i++) printf("%d",a[1][i]);
}
程序运行后的输出结果是_____________。

A)0 1 2 B)1 2 3 C)2 3 4 D)3 4 5
答案:D
解析:p是指向a[3][3]的指针,首先通过语句"for(i=0;i<9;i++) p[i]=i;" 将at[3][3]的元素从头到尾依次赋予1~9的值

。然后通过语句"for(i=0;i<3;i++) printf("%d",a[1][i]; 输出数组第二行的元素的值,所以得到"3 4 5", 所以选D。

4.若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是____________.
A) p+1 B)*(p+3) C)*(p+1)+3 D)*(p[0]+2)

答案:D
解析:本题考查了指向二维数组的指针的用法. p+1指向一维数组c[1],不能引用数组元素,所以A项错误.
B项表示的是c[4]的地址,所以也是错误的.
C项指向元素c[1][3],但其值仍然只是地址,所以C项仍是错误的.
p[0]+2是c[0][2]的地址,加上前面的"*",表示c[0][2]这个元素,所以D项是正确的。

5. 有以下程序:
void main()
{
int a[3][2];{0),(*ptr)[2],i,j;
for(i=0;i<2;i++)
{ ptr=a+i;
scanf("%d",ptr);
ptr++;
}
for(i=0;i<3;i++)
{
for(j=O;j<2;j++) printf("%2d",a[i][i]);
printf("\n");
}
}
若运行时输入:1 2 3<回车>,则输出结果是____________.

A)产生错误信息
B)1 0
2 0
0 0
C)1 2
3 0
0 0
D)1 0
2 0
3 0

答案:B
解析:本题的关键是搞清楚两个循环的功能。第一个循环是给数组赋值,注意循环只有两次并且由"ptr=a+i;"可知是给每行第一个元素赋值,那么可以推出a[3][2]=(1,0,2,0,0,0)。
第二个循环是输出a[3][2]的值,注意每输出两个元素会换行一次,所以最后得到B所显示的结果。本题假如第一次循环次数变成3次,就会出现D选项的结果。

6.以下程序:
void main()
{ char *s[]={"one","two","three"},*p;
p=s[1];
printf("%c,%s\n",*(p+1),s[0]);
}
执行后输出结果是____________.
A)n,two B)t,one C)w,one D)o,two

答案:C
解析:本题考查了指针数组. s是一个指针数组,它的元素里存放的是3个字符串的地址。p=s[1]意为p指向字符串"two",p+1就是字符串中第二个字母"w"的地址,所以*(p+1)就是字符"w". s[0]存放的是字符串"one"的地址。最后以字符格式和字符串格式分别输出*(p+1)和s[0],所以最后答案选C。

7.有以下程序:
void f(int*x,int *y)
{
int t;
t=*x;*x=*y;*y=t;
}
void main()
{
int a[8]={1,2,3,4,5,6,7,8),i,*p,*q;
p=a; q=&a[7];
while(p{ f(p,q);
p++;
q--;
}
for(i=0;i<8;i++) printf("%d,",a[i]);
}
程序运行后的输出结果是____________.

A)8,2,3,4,5,6,7,1, B)5,6,7,8,1,2,3,4,
C)1,2,3,4,5,6,7,8, D)8,7,6,5,4,3,2,1,
答案:D
解析:本题考查了指针作为函数参数的用法。函数f的作用是输入两个变量的指针,对这两个变量进行交换。主程序中,"p=a;q=&a[7]表明一个指针指向数组的头,一个指向数组的尾。然后进入while循环,循环的功能是把每一次循环时p,q指针指向

的元素交换值。所以交换后的结果为:8,7,6,5,4,3,2,1.
所以最后显示的结果如D所示。



8.以下程序中,fun函数的功能是求3行4列二维数组每行元素中的最大值。请填空.
void fun(int,int,int(*)[4],int*);
void main()
{int a[3][4]={{12,41,36,28},{19,33,45,27},{3,27,19,1}},b[3],i;
fun(3,4,a,b);
for(i=0;i<3;i++)
printf("%4d",b[i]);
printf("\n");
}
void fun(int m,int n,int ar[][4],int *br)
{
int i,i,K;
for(i=0;i{ x=ar[i][0];
for(j=0;j{
if(x}
_____________=x;
}
}
答案:br[i]

这道填空题要求完成一个函数,使之实现将每行最大值赋给b[i]的功能。在函数调用时,给a[3][4]的值传递给形参数组ar[3][4],保存最大值的数组地址传递给br.然后分析循环,for(i=0;i

指针部分练习题

一.选择题
1.下面说明不正确的是____________.
A)char a[10]="china"; B)char a[10],*p=a; p="china";
C)char *a; a="china"; D)char a[10],*p; p=a="china";
D
2.下面程序段的运行结果是____________.
char *s="abcde";
s+=2; printf("%d",s);
A)cde B)字符'c'
C)字符'c'的地址 D)无确定的输出结果
C

3.下面程序段的运行结果是____________.
char *format="%s,a=%d,b=%d\n";
int a=11,b=10;
a+=b;
printf(format,"a+=b",a,b);

A)for,"a+=b",ab B)format,"a+=b',
C)a+=b,a=11,b=10 D)以上结果都不对
C
4.有以下程序段:
int *p,a=10, b=1;
p=&a;
a=*p+b;

执行该程序段后,a的值为____________.

A)12 B)11 C)10 D)编译出错
B

5.若有以下定义和语句:
int a=4,b=3,*p,*q,*w;
p=&a; q=&b; w=q; q=NULL;

则以下选项中错误的语句是____________.
A) q=0; B)w=p; C)*p=a; D)*p=*w;
A

6.以下程序段中,能够通过调用函数fun,使main函数中的指针变量p指向一个合法的整型单元的是__________。???????????????????????
A)
int fun(int *p)
{ int s;
p=&s;
return 0;
}
void main()
{ int *p;
fun(p);
}


B)
int fun(int **p)
{ int s;
*p=&s;
}
void main()
{ int *p;
fun(&p);
}


C)
#include
void main()
{int *p;
fun(&p);
}

int fun(int **p)
{ *p=(int *)malloc(2);
}

D)
#include
void main()
{ int *p;
fun(p);
}
int fun(int *p)
{
p=(int *)malloc(sizeof(int));
}


C ???????????????????


7.有以下程序:
int *f(int *x,int *y)
{
if(*x<*y) return x;
else return y;
}
void main()
{
int a=7,b=8,*p,*q,*r;
p=&a;q=&b;
r=f(p,q);
printf("%d,%d,%d",*p,*q,*r);
}

执行后的输出结果是____________.
A)7,8,8 B)7,8,7 C)8,7,7 D)8,7,8
B



8.有以下程序:
void main()
{
int a[][3]={{1,2,3},{4,5,0}},(*pa)[3],i;
pa=a; ??????????????????????????????????????
for(i=0;i<3;i++)
if(i<2) pa[1][i]=pa[1][i]-1;
else pa[1][i]=1;
printf("%d\n",a[0][1]+a[1][1]+a[1][2]);
}
执行后的输出结果是____________.
A)7 B)6 C)8 D)无确定值
A
9.有以下程序:
void main()
{
char str[]="xyz",*ps=str;
while(*ps)ps++;
for(ps--;ps-str>=0;ps--) puts(ps);
}
执行后的输出结果是____________.
A)yz
xyz

B)z
yz

C)z
yz
xyz
D)x
xy
xyz

C
//OK


10.在说明语句int *f();中,标识符f代表的是____________.
A)一个用于指向整型数据的指针变量
B)一个用于指向一维数组的行指针
C)一个用于指向函数的指针变量
D)一个返回值为指针型的函数名 .
D

11.不合法的main函数命令行参数表示形式是____________.
A)main(int a,char *c[]) B)main(int arc,char **arv)
C)main(int argc, char *argv) D)main(int argv,char *argc[])

C

12.有以下程序:
#include
main(int argc,char *argv[])
{
int i,len=0;
for(i=1;ilen+=strlen(argv[i]);
printf("%d\n",len);
}
程序编译连接后生成的可执行文件是ex1.exe,若运行时输入带参数的命令行是:
ex1 abcd efg 10<回车>
则运行的结果是_____________。
A)22 B)17 C)12 D)9
D
注意,从第二个字符串开始计算,共9个字符.


二.填空题
1.设函数findbig已定义为求3个数中的最大值。以下程序将利用函数指针调用findbig函数。请填空。
int findbig(int a,int b,int c)
{
int bigone=a;
if(b>bigone) bigone=b;
else if(c>bigone) bigone=c;
return bigone;
}
void main()
{
int findbig(int,int,int);
int (*f)(int,int,int),x,y,z,big;
f=_____________________________; //findbig; //blank needs tobe filled
scanf("%d%d%d",&x,&y,&z);
big=(*f)(x,y,z);
printf("big=%d\n",big);
}

2.以下程序运行后输入:3,abcde回车>,则输出结果是____________.
#include
void move(char *str, int n)
{ char temp;
int i;
temp=str[n-1l;
for(i=n

相关文档