二级C语言教程课后习题详解_第1页
二级C语言教程课后习题详解_第2页
二级C语言教程课后习题详解_第3页
二级C语言教程课后习题详解_第4页
二级C语言教程课后习题详解_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

新视野教育二级C语言教程课后习题详解

(以修订版教材为准)

第一章c语言的基础知识

第二节熟悉VisualC++

1.C语言源程序名的后缀是B

A).exeB).cC).objD).cp

*C语言源程序的拓展名为.C

2.下列叙述中错误的是D

A)计算机不能直接执行用C语言编写的源程序

B)C程序经C编译后,生成后缀为.obj的文件是一个二进制文件

C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件

D)后缀为.obj和.exe的二进制文件都可以直接运行

*后缀为.obj的目标文件不能宜接运行

3.用C语言编写的代码程序B

A)可立即执行B)是一个源程序

C)经过编译即可执行D)经过编译解释才能执行

第三节标识符

1.按照C语言规定的用户标识符命名规则,不能出现在标识符中的是B

A)大写字母B)连接符C)数字字符D)下划线

*标识符的命名中不能出现连接符

2.以下选项中不合法的标识符是C

A)printB)FORC)&aD)_00

*标识符中不能出现“&”

3.以下叙述中错误的是A

A)用户所定义的标识符允许使用关键字

B)用户所定义的标识符应尽量做到“见名知意”

C)用户所定义的标识符必须以字母或下划线开头

D)用户定义的标识符中,大、小写字母代表不同标识

*用户自定义标识符不允许使用关键字

4.可在C程序中用作用户标识符的一组标识符是A

A)andB)DateC)HiD)case

_2007y-m-dDr.TomBigl

*B答案出现了连接符、C答案出现小数点、D答案出现关键字

5.以下不合法的用户标识符是C

A)j2_KEYB)DoubleC)4dD)_8_

*开头第一个字符不能为数字

6.以下不能定义为用户标识符的是D

A)MainB)_0C)_intD)sizeof

*sizeof为关键字

7.下列选项中,不能用作标识符的是D

A)_1234_B)_1_2C)int_2_D)2_int_

*开头第一个字符不能为数字

8.以下4组用户定义标识符中,全部合法的一组是A

A)_mainB)IfC)txtD)int

enclude-maxREALk_2

sinturbo3C0M_001

*B答案出现连接符、C答案出现数字开头、D答案出现关键字

第五节整数和实数

1.以下选项中正确的整型常量是C

A)10110BB)0386C)OXffaD)x2a2

2.以下关于long、int和short类型数据占用内存大小的叙述中正确的是D

A)均占4个字节B)根据数据的大小来决定所占内存的字节数

C)由用户自己定义D)由C语言编译系统决定

3.以下选项中不属于C语言的类型的是D

A)signedshortintB)unsignedlon<Iint

C)unsignedintD)longshort

4.以下选项中合法的实型常数是C

A)5E2.0B)E-3C).2E0D)1.3E

5.以下选项中,不能作为合法常量的是B

A)1.234e04B)1.234e0.4C)1.234e+4D)1.234e0

6.以下选项中可作为C语言合法常量的是A

A)-80.B)-080C)-8el.OD)-80.0e

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

A)1.2E0.5B)3.14.159EC),5E-3D)E15

8.以下不合法的数值常量是C

A)OilB)leiC)8.0E0.5D)Oxabcd

9.以下选项中,合法的一组C语言数值常量是B

A)028B)12.C).177D)0x8A

5e-3OXa234c1.510,000

—Oxf4.5e0Oabc3.e5

10.下列定义变量的语句错误的是D

A)int_int;B)doubleint_;C)longFor;D)floatUS$;

第六节算术表达式与赋值表达式

习题

1.表达式3.6—5/2+1.2+5%2的值是D

A)4.3B)4.8C)3.3D)3.8

*3.6-2+1.2+1=3.8

2.设有定义:floatx=123.4567;,则执行以下语句后输出的结果是,123.460000

printf("%f\n",(int)(x*100+0.5)/100.0);

*(int)12346.17/100.0=12346/100.0=123.46格式控制为“%f”

3.设有定义:floata=2,b=4,h=3;,以下C语言表达式与代数式Xh计算结果不相符的是B

A)(a+b)*h/2B)(l/2)*(a+b)*h

C)(a+b)*h*l/2D)h/2*(a+b)

*因为1/2=0,故B答案结果不相符

第七节自加自减运算符、逗号表达式

习题

1.设变量已正确定义为整型,则表达式n=i=2,++i,i++的值为o3

*及达式3的值为整个表达式的值

2.设有定义:intk=0;,以下选项的4个表达式中与其他3个表达式的值不相同的是A

A)k++B)k+=lC)++kD)k+1

*执行1<++,表达式的值为k自加之前的值0

3.有以下程序B

main()

{

charal='M',a2='m';

printf("%c\n",(al,a2));

}

以下叙述中正确的是

A)程序输出大写字母MB)程序输出小写字母m

C)格式说明符不足,编译出错D)程序运行时产生出错信息

*逗号表达式的值为最后一个表达式的值

4.有以下程序:B

main()

{inta=O,b=O;

a=10;/*给a赋值

b=20;给b赋值*/

printf("a+b=%d\n",a+b);/*输出计算结果*/

}

程序运行后的结果是

A)a+b=30B)a+b=10C)30D)程序出错

*本题要注意的是注释部分应该包括:/*给a赋值b=20;给b赋值*/,也就是说“b=20

也被系统作为注释处理

第八节字符

1.以下选项中不属于字符常量的是()。B

A)'C'B)"C"C)'O'D)'\072'

2.已知字母A的ASCH代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母

的表达式是()。B

A)kk>='A'&&kk<='Z'B)!(kk>='A'IIkk<='Z')

C)(kk+32)>='a'&&(kk+32)<='z'D)kk>=65&&kk<91

3.已知字符A'的ASCH代码值是65,字符变量cl的值是'A;c2的值是D。执行语句printf("%d,%d",cl,c2-2);

后,输出结果是()。C

A)A,BB)A,68C)65,66D)65,68

4、以下不合法的字符型常量是B

A)"13'B)\018'C)'65'D)'\n'

5.已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,以下不能将变量c中大写字母转换

为对应小写字母的语句是()。D

A)c=c-'Z'+'z'B)c=c+32

C)c=c-'A'+'a'D)c='A'+c-'a'

第九节位运算

1.变量a中的数据用二进制表示的形式是01011101,变量b中的数据用二进制表示的形式是11110000。

若要求将a的高4位取反,低4位不变,所要执行的运算是A

A)aAbB)albC)a&bD)a«4

2.有以下程序

#include<stdio.h>

main()

{

inta=l,b=2,c=3,x;

x=(aAb)&c;printf(,,%d\n,,,x);

程序的运行结果是D

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

3.有以下程序

main()

{

unsignedchara=2,b=4,c=5,d;

d=alb;d&=c;printf("%d\nn,d);

}

程序运行后的输出结果是B

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

4.若变量已正确定义,则以下语句的输出结果是()。B

s=32;s'=32;printf("%d",s);

A)-1B)0C)1D)32

*两个相同的数进行按位异或,结果为0

5.设有以下语句

inta=l,b=2,c;

c=aA(b«2);

执行后,c的值为D

A)6B)7C)8D)9

第二章数据输出与输入

第二节数据输出

1.有以下程序段

charch;

intk;

ch='a';

k=12;

printf(H%c,%d,",ch,ch,k);

printf(Mk=%d\n",k);

已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是D

A)因变量类型与格式描述符的类型不匹配输出无定值

B)输出项与格式描述符个数不符,输出为零值或不定值

C)a,97,12k=12

D)a,97,k=12

2、有以下程序段:

main()

{intx,y,z;

x=y=1;

z=x++,y++,++y;

printf(t4%d,%d,%d\n,\x,y,z);

程序运行后的输出结果是C

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

*分析过程见教材25页例3

3.有以下程序,其中%u表示按无符号整数输出

main()

(

unsignedshortx=0xFFFF;/*x的初值为十六进制数*/

printf("%u\n",x);

}

程序运行后的输出结果是B

A)-1B)65535C)32767D)0XFFFF

4.以下叙述中不正确的是A

A)调用printf函数时,必须要有输出项

B)使用putchar函数时,必须在之前包含头文件stdio.h

C)在C语言中,整数可以以十进制、八进制或十六进制的形式输出

D)使用putchar函数可以不要输出项

5.设有以下程序

main()

(

intc=35;printf("%d",c&c);

)

程序运行后的输出结果是C

A)0B)70C)35D)53

*两个相同的数进行按位与时,结果等于本身

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

main()

{

intx=0210;printf("%X\n",x);

)

*将八进制数转为十六进制数输出

第三节数据输入

1.以下程序运行时若从键盘输入:102030〈回车〉。输出结果是一。A

#include<stdio.h>

main()

(

inti=O,j=O,k=O;

scanf(,,%d%*d%d,,,&i,&j,&k);

A)10,30,0B)10,20,30C)0,0,0D)程序出错

*注意%*d为跳过输入的数据

2.已知字符A的ASCH代码值为65,以下程序运行时若从键盘输入:B33〈回车输出结果是B

#include"stdio.h"

main()

chara,b;

a=getchar();scanf("%dn,&b);

a=a-'A'+'O';

b=b*2;

printf("%c%c",a,b);

A)程序段有语法错B)1BC)165D)1b

*a=a-'A'+'O';即a=66-65+48b=b*2;即b=33*2得出结果后找到对应的字符输出

3.有以下程序

main()

intm=0256,n=256;

printf(H%o%o\n'\m,n);

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

A)02560400B)0256256C)256400D)400400

*m为八进制数n为十进制数%O指输出八进制数输出是不带前导

4.有以下程序

main()

{

inta=666,b=888;

printf("%d\n",a,b);

)

程序运行后的输出结果是()。B

A)错误信息B)666C)888D)666,888

*%d只与输出列表中的变量a对应,注意区别prinlf("%d\n”,(a,b));

5.设有以下程序

main()

(

intx=102,y=012;

printf("%2d,%d\n",x,y);

执行后输出结果是C

A)10,01B)02,12C)102,10D)02,10

*%d为输出十进制整数,所以要将八进制转为十进制

6.执行以下程序时输入1234567<CR>,则输出结果是。1234

#include<stdio.h>

main()

{

inta=l,b;

scanf("%2d%2d",&a,&b);printf(u%d%d\n",a,b);

第三章选择结构

第一节关系运算与逻辑运算

I.已知字母A的ASCH代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母

的表达式是B

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

C)(kk+32)>='a'&&(kk+32)<='z'D)isalpha(kk)&&(kk<91)

*isalpha(kk)检查kk是否为字母,是,返回1,否,返回0

2.当变量c的值不为2、4、6时,值也为“真”的表达式是B

A)(c==2)II(c—4)II(c==6)B)(c>=2&&c<=6)II(c!=3)II(c!=5)

C)(c>=2&&c<=6)&&!(c%2)D)(c>=2&&c<=6)&&(c%2!=1)

3.以下选项中,当x为大于1的奇数时,值为0的表达式D

A)x%2==lB)x/2C)x%2!=0D)x%2==0

4.以下关于逻辑运算符两侧运算对象的叙述中正确的是()。D

A)只能是整数0和1B)只能是整数0或非0整数

C)可以是结构体类型的数据D)可以是任意合法的表达式

5.设有定义:intk=l,m=2;floatf=7;,则以下选项中错误的表达式是C

A)k=k>=kB)-k++C)k%int(f)D)k>=f>=m

*强制类型转换的格式必须为:(类型名)表达式

6.设有定义:inta=2,b=3,c=4;,则以下选项中值为0的表达式是A

A)(!a==l)&&(!b==0)B)(!a==l)ll(!b==0)

C)a&&bD)all(b+b)&&(c-a)

第二节if语句

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

inta=3,b=5,c=7;

if(a>b)a=b;c=a;

if(c!=a)c=b;

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

其输出结果是B

A)程序段有语法错B)3,5,3C)3,5,5D)3,5,7

*if表达式后的语句只能是一个语句或者一个复合语句

2.当把以下4个表达式用作if语句的控制表达式时,有一个选项与其他3个选项含义不同,这个选项

是D

A)k%2B)k%2==lC)(k%2)!=0D)!k%2==l

*前三个是对k%2后的结果进行判断,而D答案是对k进行逻辑非后再除二取余

3.下列条件语句中,功能与其他语句不同的是D

A)if(a)printf("%d\n",x);elseprintf("%d\n",y);

B)if(a==O)printf("%d\n",y);elseprintf("%d\n",x);

C)if(a!=0)printf("%d\n",x);elseprintf("%d\n",y);

D)if(a==O)printf("%d\n",x);elseprintf("%d\n",y);

*前三个都是当a不等于0时输出x,a等于0时输出y,D答案相反

4.设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是C

A)if(x++);B)if(x>y&y!=O);

C)if(x>y)x--D)if(y<0){;}

elsey++:elsex++;

*无语句结束标志

第三节嵌套的if语句

1.在嵌套使用if语句时,C语言规定else总是C

A)和之前与其具有相同缩进位置的if配对B)和之前与其最近的if配对

C)和之前与其最近的且不带else的if配对D)和之前的第一个if配对

2.有以下程序

main()

{inta=5,b=4,c=3,d=2;

if(a>b>c)

printf("%d\n",d);

elseif((c-l>=d)==1)

printf("%d\n",d+l);

else

printf("%d\n",d+2)

}

执行后输出结果是D

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

*无语句结束标志“;”

第四节条件表达式、switch语句、goto语句

1.以下程序段中与语句k=a>b?(b>c?l:0):0;功能等价的是A

A)if((a>b)&&(b>c))k=l;B)if((a>b)ll(b>c))k=l;

elsek=0;elsek=0;

C)if(a<=b)k=0;D)if(a>b)k=l;

elseif(b<=c)k=l;elseif(b>c)k=l;

elsek=0;

2.下列叙述中正确的是D

A)break语句只能用于switch

B)在switch语句中必须使用default

C)break语句必须与switch语句中的case配对使用

D)在switch语句中,不一定使用break语句

"break还能用于循环体中

3.有以下程序段

intk=0,a=l,b=2,c=3;

k=a<b?b:a;k=k>c?c:k;

执行该程序段后,k的值是B

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

4.有以下程序

#include<stdio.h>

main()

(

intx=l,y=O,a=O,b=O;

switch(x)

(

case1:

switch(y)

(

case0:a++;break;

case1:b++;break;

)

case2:a++;b++;break;

case3:a++;b++;

}

printf("a=%d,b=%d\n",a,b);

)

程序的运行结果是D

A)a=l,b=0B)a=2,b=2C)a=l,b=lD)a=2,b=l

*考点:switch后有无break

5.以下程序的输出结果是C

main()

{inta=5,b=4,c=6,d;

printf(M%d\n',,d=a>b?(a>c?a:c):(b));

A)5B)4C)6D)不确定

第四章循环结构

第一节while语句

习题

1.有以下程序

main()

{inty=10;

while(y—);printf("y=%d\n",y);

}

程序执行后的输出结果是B

A)y=0B)y=-lC)y=lD)while构成无限循环

*此题考点为循环体语句为空语句,当y—表达式的值为0时结束循环,故y的值为

2.有以下程序

main()

(

intk=5;

while(—k)printf("%d”,k-=3);

printfCXn1');

)

执行后的输出结果是A

A)1B)2C)4D)死循环

*①k=5时,执行--k后,k-4,表达式的值为4,为真,执彳了输出语句k-=3,k=l,输出1

②再次执行一k表达式,k=0,表达式的值为0,结束循环

第二节do-while语句

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

i=0;

do

printf("%d,”,i);

while(i++);

printf("%d\n”,i)

其输出结果是B

A)0,0B)0,1C)1,1D)程序进入无限循环

*执行第一个输出语句时,输出i的值为0;执行while语句,循环体语句为空,i++表达式的值为0是i

的值为1,执行最后一个输出语句时输出i的值为1

2.有以下程序段

intn,t=l,s=O;

scanf(u%d",&n);

do{s=s+t;t=t-2;)while(t!=n);

为使此程序段不陷入死循环,从键盘输入的数据应该是D

A)任意正奇数B)任意负偶数C)任意正偶数D)任意负奇数

3.以下程序的功能是:将输入的正整数按逆序输出。例如,若输入135,则输出531,请填空。n/=10

#include<stdio.h>

main()

(

intn,s;

printf("Enteranumber:");scanf("%d",&n);

printf(nOutput:");

do

(

s=n%10;printf(n%d",s);

}while(n!=0);

printf(n\nu);

)

*答案:n=n/10

分析:假如输入的值为135,那么n=135

(1)n=135,do:s=n%10,那么s的值为5,输出s的值为5。接着我们要输出3才能将n逆序输

出。在学习%和/的时候总结过:135/10=13,135%10=5,因此我们试着将后面的空填上

n=n/10,那么n的值为13,判断(n!=0)为真。

(2)n=13,do:s=n%10,那么s的值为3,输出s的值为3。执行n=n/10后n的值为1,判断(n!=0)

为真。

(3)n=l,do:s=n%10,那么s的值为1,输出s的值为10执行n=n/10后n的值为0,判断(n!=0)

为假,结束循环。

(4)已经得到逆序的结构为:531,说明我们所要填的空就是n=n/10。

4.有以下程序

main()

(

intk=5,n=0;

do

(

switch(k)

{case1:case3:n+=l;break;

default:n=0;k—;

case2:case4:n+=2;k—;break;

)

printf("%d”,n);

}while(k>0&&n<5);

)

程序运行后的输出结果是

A)235B)0235C)02356D)2345

*本题注意的是在循环第次进入switch语句的时候是执行的default后面的语句块,由

于没有break,所以还会执行case2:case4:后面的语句。

第三节for语句

I.有以下程序

#include<stdio.h>

main()

(

intx=8;

for(;x>0;x-)

(

if(x%3)

(

printf("%d,n,x-);

continue;

)

printf(H%d,

)

)

程序的运行结果是D

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

*考点:for循环、if语句、continue

分析:

(1)x=8,x>0为真,判断:x%3的值2为真,执行输出语句,输出x—的值为8,x为7。遇

到后面的continue语句结束本论循环,接着执行for结构中的表达式3,x—后x的值为

6o

(2)x=6,x>0为真,判断:x%3的值0为假,执行if后面的语句,输出一x的值为5,x为5。

接着执行for结构中的表达式3,x—后x的值为4。

(3)x=4,x>0为真,判断:x%3的值1为真,执行输出语句,输出x—的值为4,x为3。遇

到后面的continue语句结束本论循环,接着执行for结构中的表达式3,x—后x的值为

2o

(4)x=2,x>0为真,判断:x%3的值2为真,执行输出语句,输出x—的值为2,x为1。遇

到后面的continue语句结束本论循环,接着执行for结构中的表达式3,x—后x的值为

Oo

⑸x=0,x>0为假,结束循环。

(6)最终输出的结果为:8,5,4,2

2.以下不构成无限循环的语句或者语句组是A

A)n=0;B)n=0;

do{++n;}while(n<=0);while(l){n+4-;}

C)n=10;D)for(n=0,i=l;;i++)n+=i;

while(n);{n-;}

*构成死循环的情况:1、表达式的值永远为真;2、缺省表达式2.

第四节循环结构的嵌套

1.有以下程序

main()

(

inti,n=O;

for(i=2;i<5;i++)

(

do

(

if(i%3)continue;

n++;

}while(!i);

n++;

)

printf(Hn=%d\n",n);

)

程序执行后的输出结果是D

A)n=5B)n=2C)n=3D)n=4

*执行过程:

(1)、n=0,i=2时,iv5为真,i%3为真,执行continue,结束本次循环,!i为假,执行最后n++,n=l,执

行i++

(2)、

2.有以下程序

main()

(

inti,j,x=O;

for(i=0;i<2;i++)

{

x++;

for(j=0;j<=3;j++)

(

if(j%2)continue;

x++;

)

x++;

)

printf("x=%d\nu,x);

)

程序执行后的输出结果是B

A)x=4B)x=8C)x=6D)x=12

*程序执行过程:(1)、x=0,i=0时,i<2为真,执行x++,x=l

j=O,jv=3为真,j%2为假,执行x++,x=2,再执行j++

j=l,jv=3为真,j%2为真,执行conlinue,再执行j++

j=2,j<=3为真,j%2为假,执行x++,x=3,再执行j++

j=3,j<=3为真,j%2为真,执行continue,再执行j++

j=4,jv=3为假,结束内层循环,执行最后一个x++,x=4,再执行i++

(2)、x=4,i=l时,i<2为真,执行x++,x=5

j=O,j<=3为真,j%2为假,执行x++,x=6,再执行j++

j=l,jv=3为真,j%2为真,执行continue,再执行j++

j=2,jv=3为真,j%2为假,执行x++,x=7,再执行j++

j=3,j<=3为真,j%2为真,执行coming再执行j++

j=4,j<=3为假,结束内层循环,执行最后一个x++,x=8,再执行i++

(3)、x=8,i=2时,i<2为假,结束循环,输出x

3.下面程序的功能是输出以下形式的金字塔图案

*

***

main()

(

inti,j;

for(i=l;i<=4;i++)

(

for(j=l;j<=4-i;j++)printf(u");

for(j=l;j<=;j++)printf("*n);

printf(n\nn);

)

)

在下划线处应填入的是B

A)iB)2*i-lC)2*i+lD)i+2

*分析:

通过观察可以知道:第一行只有一个*号,却在*的前面有三个空格。第二行有三个*号,*

号前面有两个空格。第三行有五个*号,在*号前面仅仅有•个空格。第四行有七个*号,没

有空格。从中可以得到如下规律:

用i代表行数,共有4行:

i=l时,有4-i个空格,有2*i-l个*号

i=2时,有4-i个空格,有2*i-l个*号

i=3时,有4-i个空格,有2*i-l个*号

i=4时,有4-i个空格,有2*i-l个*号

结合程序即可得到正确结果。

第五节break和continue语句在循环中的应用

1.以下叙述中正确的是C

A)break语句只能用于switch语句体中

B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环

C)break语句只能用在循环体内和switch语句体内

D)在循环体内使用break语句和continue语句的作用相同

第六节循环结构的分析方法

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

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

for(k=l;k<3;k++);primf("*”);

程序段的输出结果是()D

A)********B)****c)**D)*

*循环体为空语句

第五章函数

第一节函数的定义、库函数

I.在C语言中,函数返回值的类型最终取决于A

A)函数定义时在函数首部所说明的函数类型

B)return语句中表达式值的类型

C)调用函数时主函数所传递的实参类型

D)函数定义时形参的类型

第二节函数的调用与函数说明

1.有以下程序

#include<stdio.h>

intf(intx)

(

inty;

if(x==0llx==l)return(3);

y=x*x-f(x-2);

returny;

}

main()

(

intz;

z=f(3);

printf("%d\n",z);

)

程序的运行结果是C

A)0B)9C)6D)8

*解析:

intfflntx)4-------------------

{inty;,

'A/VwWV*J*

或x=O||x=l"

return3#

V\AAAAA<WV>AAA<V'彳

y=x*x-f(x-2);*J

returnvy

},

z<3)^—-------------------

将f(3)的值的赋值给变量z,当执行至ijf函数时将3的值传递给变量x,则x得到的值为3,执

行函数中的语句,则x==Ollx==l表达式的值为假值,则不返回3值,执行后面的语句

y=x*x-f(l).先执行f(l)函数,则将1的值传递给变量x,所以变量x得到的值为1,执行后

面的语句x==Ollx==l表达式的值为真值,返回3值,最后计算y=3*3-3=6,所以最后的答案

为6,选择答案C。

2.以下叙述中错误的是C

A)改变函数形参的值,不会改变对应实参的值

B)函数可以返回地址值

C)可以在函数内部定义函数

D)调用sin函数需要包含头文件math.h

*函数不可以嵌套定义

3.若程序中定义了以下函数

doublemyadd(doublea,doubleb)

(

return(a+b);

}

并将其放在调用语句之后,则在调用之前应进行函数声明,以卜选项中错误的是A

A)doublemyadd(doublea,b);B)doublemyadd(double,double);

C)doublemyadd(doubleb,doublea);D)doublemyadd(doublex,doubley);

*参数名可以缺省,类型名不能缺省

第三节函数的数据传递

1.有以下程序

voidf(intv,intw)

(

intt;

t=v;v=w;w=t;

)

main()

intx=l,y=3,z=2;

if(x>y)

f(x,y);

elseif(y>z)

f(y,z);

else

f(x,z);

printf("%d,%d,%d\n",x,y,z);

)

执行后输出结果是c

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

*分析:f函数的功能是:交换两个变量的值,但是变量v和w为普通变量,所以只是在f

函数中改变了变量的值,但是在主函数中并没有改变实参的值。所以变量X、y、z的并没

有改变。所以主函数中x、y、z的值还是原来变量的值,即1,3,2.故选答案C。

2.以下程序的输出结果是。I3

#include<stdio.h>

voidfun(intx)

(

if(x/2>0)

fun(x/2);

printf(n%d”,x);

)

main()

(

fun(3);

printf(M\nM);

)

*分析:

fun/Sy1

fiin/l)----------A霞f("%d"Rw

printff14?

先执行fun(3)把x/2的值为1,真值,执行fun(l),再次调用fun函数,则输出的x的值,

即1。输出结束,fun(l),函数结束,则执行后面的这•条printf函数,即输出3的值。最后

的结果为:13.

第六章指针

第一节变量的地址和指针

1.以下叙述中错误的是C

A)改变函数形参的值,不会改变对应实参的值

B)函数可以返回地址值

C)可以给指针变量赋一个整数作为地址值

D)当在程序的开头包含文件stdio.h时、可以给指针变量赋NULL

2.以下定义语句中正确的是D

A)inta=b=O;B)charA=65+l,b=*b';

C)floata=l,*b=&a,*c=&b;D)doublea=0.0;b=l.l;

*A答案b未定义、C答案c是一级指针、D答案分号是C语言语句的结束标志

3.设已有定义:floatx;则以下对指针变量p进行定义且赋初值的语句中正确的是D

A)float*p=1024;B)int*p=(floatx);

C)floatp=&x;D)float*P=&x;

*分析:A答案门oat*p=1024,将个常量1024赋值给指针,赋值号两边的类型错误。B

答案int*p=(floatx);将一个float类型的变量x赋值给指针变量p是错误的°C答案float

p=&x;将x的地址赋值给变量p是错误的。D答案float*p=&x;将变量x的地址赋值给指针

P,因此是正确的。

第二节指针变量赋值及运算

I.设有定义:intn=0,*p=&n,**q=&p;,则以下选项中,正确的赋值语句是D

A)p=l;B)*q=2;C)q=p;D)*p=5;

*分析:intn=0,*p=&n,**q=&p;定义了一个普通变量n赋初始值为0,一个一维指针p

指向了n的地址,一个二维指针q指向了p的地址。

A答案p=l,将常量1赋值给•维指针是错误的,类型不一致。

B答案*q=2,因为q是二维指针,因此*q可以理解为一维的指针,将2赋值给*q类型不一

致。

C答案q=p,q和q的类型不一致,因此不能直接赋值。

D答案*p=5,p是一维指针,*p就相当于•个普通变量,因此可以将5赋值给*p。

2.有以下程序

main()

(

inta=l,b=3,c=5;

int*pl=&a,*p2=&b,*p=&c;

*p=*pl*(*p2);

printf("%d\n",c);

)

执行后的输出结果是c

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

*分析:inta=l,b=3,c=5;int*pl=&a,*p2=&b,*p=&c;pl指向了a的地址,p2指向了b的

地址,p指向了c的地址。*p=*pl*(*p2);计算*pl和*p2的乘积,注意中间的*号表示乘号。

即*p=l*3值为3,由于p指向了c的地址,*p的值为3那么c的值为3。

3.设有定义:intnl=0,n2,*p=&n2,*q=&nl;,以下赋值语句中与n2=nl;语句等价的是A

A)*p=*q;B)p=q;C)*p=&n1;D)p=*q;

*分析:intnl=0,n2,*p=&n2,*q=&nl;首先定义了两个整型变量nl和n2,并为nl赋值为

0,定义了两个指针变脸p和q,p指向了n2的地址,q指向了nl的地址。可以用“间接访

问运算符”来引用相应的存储单元,因此*P就是n2的值,*q就是nl的值。与n2=nl等价

的就是*P=*q,故选择A答案。

4.有以下程序

#include<stdio.h>

main()

(

intn,*p=NULL;

*p=&n;

printf(,'Inputn:");scanf("%d",&p);

printf("outputn:“);printf("%d\n",p);

}

该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是A

A)intn,*p=NULL;B)*p=&n;

C)scanf(H%dH,&p)D)printf(n%d\nn,p);

*分析:通过一个空指针去访问一个存储单元时,将会得到一个出错信息。

第三节函数之间地址值的传递

1.以下程序的功能是:利用指针指向3个整型变量,并通过指针运算找出3个数中的最大值,输出到

屏幕上,请填空:*pmax=x;(或者max=x)

main()

(

intx,y,z,max,*px,*py,*pz,*pmax;

scanf(H%d%d%dn,&x,&y,&z);

px=&x;

py=&y;

pz=&z;

pmax=&max;

if(*pmax<*py)

*pmax=*py;

if(*pmax<*pz)

*pmax=*pz;

printf(Hmax=%d\n",max);

)

*进行比较之前对其进行赋初值

2.voidf(inty,int*x)

{y=y+*x;*x=*x+y;}

main()

{intx=2,y=4;

f(y,&x);

printf(n%d%d\nM,x,y);

执行后输出的结果是。84

*分析:

(1)首先函数从main函数开始执行,在main函数中定义了两个变量x=2,y=4,调用函数

f(y,&x),这里传入的一个是y的值,一个是x的地址。

(2)执行函数f,形参y的值为4,x指针指向实参x的地址。执行:y=y+*x,那么y=4+2,

值为6,*x=*x+y那么*x=2+6,由于调用函数传入的是地址,因此形参*x的值变化那么实参

x的值也相应变化为80

⑶函数执行完毕,继续执行main函数中的输出语句,输出x,y的值为8,4。

3.以下程序的输出结果是o35

#include<stdio.h>

voidswap(int*a,int*b)

(

int*t;

t=a;a=b;b=t;

)

main()

{

inti=3,j=5,*p=&i,*q=&j;

swap(p,q);

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

)

*分析:

(1)函数从main函数开始执行,定义了两个变量x和y,值为3和5,指针p和q分别指向

了x和y的地址,调用函数swap(p,q),传入的实参为p和q。

(2)执行函数swap,形参a和B分别指向了变量x和y的地址。执行函数体,t=a;a=b;b=t;

是典型的交换形式,这样通过交换后指针a指向了变量y的地址,指针b指向了变量x的

地址。但是实参P和q没有变换。

(3)继续执行main函数中的输出语句,输出*p和*q的值为:35

4.有以下函数

intfun(char*s)

(

char*t=s;

while(*t++);

return(t-s);

)

该函数的功能是B

A)比较两个字符的大小B)计算s所指字符串占用内存字节的个数

C)计算s所指字符串的长度D)将s所指字符串复制到字符串t中

5.程序中对fun函数有如下说明C

void*fun();

此说明的含义是

A)fun函数无返回值

B)fun函数的返回值可以是任意的数据类型

C)fun函数的返回值是无值型的指针类型

D)指针fun指向一个函数,该函数无返回值

第七章数组

第一节一维数组

1.有以下程序段

intj;floaty;charname[50];

scanf("%2d%f%su,&j,&y,name);

当执行上述程序段,从键盘上输入555667777abe后,y的值为B

A)55566.0B)566.0C)7777.0D)566777.0

*时j进行输入时,格式控制为%2d,所以j的值取的是55,对y进行输入时,遇到空格默认结束,所以

y的值为566.0

2.有以下程序

main()

(

charch[]="uvwxyz",*pc;

pc=ch;printf("%c\n",*(pc+5));

)

程序运行后的输出结果是A

A)zB)0C)元素ch[5]地址D)字符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论