课后习题浓缩版.docx

上传人:b****1 文档编号:23115460 上传时间:2023-04-30 格式:DOCX 页数:82 大小:72.04KB
下载 相关 举报
课后习题浓缩版.docx_第1页
第1页 / 共82页
课后习题浓缩版.docx_第2页
第2页 / 共82页
课后习题浓缩版.docx_第3页
第3页 / 共82页
课后习题浓缩版.docx_第4页
第4页 / 共82页
课后习题浓缩版.docx_第5页
第5页 / 共82页
点击查看更多>>
下载资源
资源描述

课后习题浓缩版.docx

《课后习题浓缩版.docx》由会员分享,可在线阅读,更多相关《课后习题浓缩版.docx(82页珍藏版)》请在冰豆网上搜索。

课后习题浓缩版.docx

课后习题浓缩版

课后习题

第1章计算机组成与程序设计语言

一、单选题

1.“程序存储思想”是提出来的。

A.丹尼尔•里奇B.冯•诺依曼C.贝尔D.马丁•理查德

【参考答案】B

【解析】根据教材1.1节的知识,正确答案为B。

2.若计算机有24根地址总线,则其存储器必定有个字节的存储空间。

A.224B.216C.232.D.不能确定

【参考答案】A

【解析】根据教材1.1节的知识,地址总线的多少决定了地址的多少,也就是字节的多少。

如果有16根地址总线,则存储器最多有216个字节;因此按照同样的计算方法,有24根地址总线,则存储器最多有224个字节,因此答案为A。

3.第一个体现结构化程序设计思想的高级程序设计语言是。

A.Fortran语言B.C语言C.Pascal语言D.Java语言

【参考答案】C

【解析】根据教材1.4节的知识:

1970年,第一个结构化程序设计语言——Pascal语言出现,标志着结构化程序设计时期的开始,因此答案为C。

5.以下关于源程序与目标程序的关系,不正确的是。

A.用机器语言编写的源程序就是目标程序

B.用汇编语言编写的源程序需要经过汇编程序汇编为目标程序

C.用C语言编写的源程序需要经过编译程序编译为目标程序

D.不同高级语言的编译器应该是一样的,都负责将源程序编译为目标程序

【参考答案】D

【解析】根据教材1.3节的知识,可知答案A和B是正确的说法;根据教材1.4节的知识,用高级语言编写的源程序不是计算机最终能识别并运行的目标程序,需要一种机制,可以把每一条指令转化为一组低级的机器语言指令,编译器提供了这种转化机制。

不同的高级语言所需要的编译程序也是不同的。

因此答案C的说法是正确的。

答案D说法不正确,为所选答案。

 

第2章基本数据类型

一、单选题

1.以下哪一个可以作为正确的变量名。

A.3XB.file_1C.intD.X+Y;

【参考答案】B

【解析】此题考查的是合法的用户自定义标识符的概念,因为变量名就是一个用户自定义标识符。

根据标识符的定义,必须以字母或下划线开头,后接字母、数字、下划线的任意序列,因此答案A的开头不符合要求,答案D中出现了加号不符合要求;而对于用户自定义标识符还要求不选用关键字,故答案C也是错的,只有答案B正确。

2.下列哪一个是合法的实型字面常量。

A.8E3.1B.E5C.234.D.234

【参考答案】C

【解析】实型的字面值常量有两种表示方法:

小数形式和指数形式。

小数形式要求必须有小数点,左右两边是数字序列,最前面可以有正负号,而且左或右的数字也可以缺省;指数形式中必须有E(或e),并且E的左右两边都不能缺省。

E左边为一个小数形式的实数或整数,E右边只能是整数。

根据这些知识,答案A的错误在于E右边写成了小数;答案B的错误在于E左边缺少内容;答案D的错误在于没有小数点,是一个整数;故答案C正确,是缺省了右边数字的小数形式的实数。

3.下列哪一个整数值最大。

A.012B.0x12C.12D.120

【参考答案】D

【解析】此题实际考查的是整型字面值常量的表示,可以用八进制、十进制、十六进制表示。

将这4个答案所表示的数字统一到十进制来理解就可以了。

答案A以0开头,是八进制表示,012就是十进制的10;答案B以0x开头,是十六进制表示,0x12就是十进制的18;答案C和D本来就是十进制表示了,因此比较后,答案D正确。

4.下列哪一个字符与其他3个字符不相等。

A.’a’B.‘A’C.’\x41’D.’\101’

【参考答案】A

【解析】此题实际考查的字符字面常量的几种表示:

以一对单引号为定界符,里面可以直接是一个字符,也可以是以反斜杠开头的转义字符,而反斜杠后又有3种形式:

直接跟一个字符表示某种用处,如’\n’表示换行;3位八进制数;以x开头后面跟两位十六进制数。

本题中,字符A的ASCII码为65,八进制的101和十六进制的41都是65,这三者是相等的,表示同一个字符A,只有答案A表达的是字符a,为所选项。

5.假设已有定义:

typedefintINTEGER;inta=1;INTEGETb=2;下面4条赋值语句中错误的是。

A.a=b*20;B.b=b+1;

C.INTEGER=a+b;D.a=’a’;

【参考答案】C

【解析】此题主要考查typedef的作用以及变量的相关知识。

typedef的作用是给已有类型起个别名,本题中的INTEGER就是类型名int的别名,实质上是一个类型名而不是变量名,根据这一理解,再加上赋值语句要求赋值号的左边只能是变量,因此,答案C即为所选答案。

答案A、B是正确的赋值语句不必多解释,答案D也是正确的赋值,因为右边的’a’在这条赋值语句中取其ASCII码值97,相当于a=97。

6.一个C程序的执行总是。

A.从main()函数开始B.从任意一条语句开始

C.从任何一个函数开始D.从第一个函数开始,直到最后一个函数结束。

【参考答案】A

【解析】main()函数是系统调用程序的入口,因此程序的执行总是从main函数开始,正常情况下也是结束于main()函数,当然,可能会因异常提前终止,也可能因调用类似exit函数而在main函数结束之前结束程序的运行。

二、编程题

1.编写程序,测试以下类型在内存中所占空间大小:

char、int、short、long、unsignedint、float、double、longdouble,输出时给出较清晰的提示信息。

【参考答案】

#include

intmain()

{

printf("sizeof(char)=%d\n",sizeof(char));

printf("sizeof(int)=%d\n",sizeof(int));

printf("sizeof(short)=%d\n",sizeof(short));

printf("sizeof(long)=%d\n",sizeof(long));

printf("sizeof(unsignedint)=%d\n",sizeof(unsignedint));

printf("sizeof(float)=%d\n",sizeof(float));

printf("sizeof(double)=%d\n",sizeof(double));

printf("sizeof(longdouble)=%d\n",sizeof(longdouble));

return0;

}

【解析】此题考查的是通过sizeof运算符求各种类型的数据在内存中所占空间的大小,同时,会用printf输出想要输出的提示信息及运算结果,对C语言源程序的结构有个大致的了解,会完整地定义main函数。

2.编写程序,定义一个int型变量a,一个float型变量b,一个double型变量c,a变量初始化,b变量赋值,c变量的值从键盘输入,调用printf函数输出三个变量的值及它们在内存中的首地址,输出时给出较清晰的提示信息。

【参考答案】

#include

intmain()

{

inta=20;

floatb;

doublec;

b=12.345f;

scanf("%lf",&c);

printf("addressofais:

%x,valueofais:

%d\n",&a,a);

printf("addressofbis:

%x,valueofbis:

%f\n",&b,b);

printf("addressofcis:

%x,valueofcis:

%f\n",&c,c);

return0;

}

【解析】此题考查的是常量与变量的基本使用,会定义各种基本类型的变量,对变量获得值用字面值常量进行初始化或赋值,从键盘读入变量的值,注意scanf的正确使用,正确使用格式串并对相应的变量取地址。

通过printf中格式串的设置及对应输出项的不同,输出变量的地址及变量的值,从而理解二者的区别。

第3章表达式与运算符

一、单选题

1.关系运算符对两侧的运算对象的要求是。

A.只能是0或1B.两个运算对象必须属于同一种数据类型

C.只能是0或非0值D.可以是任意合法的表达式,两者类型不一定相同 

【参考答案】D

【解析】在C语言中,关系运算符两侧的运算对象为任意合法的表达式,类型上也可以不同,任何类型的值,总能解释为0和非0两种值,0为假,非0为真,但关系表达式最终的计算结果只有两种,如果是假,结果为0;如果是真,结果为1。

2.数学公式5

+b4/(2d-1)-|c|的C语言表达形式是。

A.5*sqrt(a)+pow(b,4)/(2*d-1)-fabs(c)B.5*sqrt(a)+pow(4,b)/(2*d-1)-fabs(c)

C.5**a/2+pow(b,4)/(2*d-1)-fabs(c)D.5*sqrt(a)+b^4/(2*d-1)-c

【参考答案】A

【解析】该题的数学式中有根号、平方、绝对值符号,在C语言中它们分别用库函数sqrt、pow和fabs来表示,所以答案C、D首先被排除,答案A和B的差别只有一点,就是pow函数内的参数次序正好相反,查pow函数的原型:

doublepow(doublex,doubley),其功能是计算xy的值,因此,b4的正确表示是pow(b,4),故答案A正确。

3.为表示关系x大于等于y,y大于等于z,正确的C语言表达式是。

A.x>=y>=zB.(x>=y)AND(y>=z)

C.x>=y&&y>=zD.(x>=y)&(y>=z)

【参考答案】C

【解析】此题对于初学者非常容易选择答案A,但是A答案的这种表达虽然语法上正确,但是逻辑上是错误的,当y不在z和x之间的时候也能得到1,例如:

x=10,z=1,y=-9,x>=y即10>=-9得到真值为1,第二步计算就变成1>=1,结果仍为1,因此切忌用答案A的形式来表达某值在一段范围内。

答案B的错误在于出现了C语言中没有的运算符AND,答案D的错误在于混淆了位与运算符&和逻辑与运算符&&,所以,答案C正确。

4.假设下面所有的变量均已定义为double型,下列赋值表达式不正确的是。

A.z*=2.8/4B.x=--xC.x=y=zD.x=3.5%2

【参考答案】D

【解析】该题考查赋值运算符及相关的算术运算符的使用,答案A是复合赋值运算符,先计算右边的除法,当两个数据的类型不同的时候,先将4转化为4.0再进行运算得结果0.7,再执行z=z*0.7的赋值运算,正确;答案B先对右边的部分进行运算,变量x先执行自减,将表达式的结果赋值给x,实际上直接写成--x能达到同样的效果,这种用法不常见,但是语法上是正确的;答案C是连续赋值,按从右到左的顺序执行,最终效果是x、y和z三个变量的值相等,也是正确的;答案D的错误在赋值号右边,运算符“%”要求两个运算对象都必须为整数,3.5不是整数,故答案D为所选。

5.若执行语句:

intb,a=12,n=5;表达式a%=(b=2,n%=b)+4结果是。

A.16B.2C.1D.4

【参考答案】B

【解析】本题主要考查复合赋值运算符及逗号运算符的优先级及运算方法。

此题先计算圆括号内的逗号表达式,结果为1,接着表达式就成为:

a%=1+4,根据计算方法,先对复合赋值运算符右边部分进行计算,得到5,最后一步:

a%=5,结果为2,所以选择答案B。

二、填空题

1.已知inta=5,b=4,c=6,d;,执行语句d=a>b?

(a>c?

a:

c):

b后,d的值为________。

【参考答案】6

【解析】条件运算符是C语言里唯一的三目运算符,允许发生嵌套。

此题中,最后一步是赋值运算,赋值运算符的优先级低于条件运算符。

括号部分先计算,因此,第一步计算(a>c?

a:

c),即(5>6?

5:

6)得到结果6,第二步计算a>b?

6:

b,即:

5>4?

6:

4,得到结果6,第三步计算d=6,因此变量d的值为6。

2.已知floatx=2.5,y=4.7;inta=7;,则表达式x+a%3*(int)(x+y)%2/4的值为________。

【参考答案】2.5

【解析】此题考查的是算术运算符的运用,双目算术运算符中,有两个比较特殊:

“%”要求两个运算对象均为int型,“/”当两个运算对象均为整型时结果一定是商的整数部分。

“+”、“-”、“*”、“/”四个运算符当运算对象的类型不一致时,将进行自动类型转化——低类型自动转为高类型,最后高类型的两个值进行运算。

此题第一步计算(x+y)得到7.2,第二步用(int)进行强制类型转化,得到7,第三步计算a%3得到结果1,第四步计算1*7得到7,第五步计算7%2得到结果1,第六步计算1/4得到0,最后一步计算2.5+0,先类型自动转化变为2.5+0.0,再求两个同类型值的和得到最终结果2.5。

3.设有语句:

inta=5,b=7;执行语句:

a+=a++||b++后,a=________,b=________。

【参考答案】7,7

【解析】此题比较综合,由于复合赋值运算符优先级最低,因此先计算赋值号右边表达式a++||b++,这里对a和b都进行后缀++运算,因此,本题的第一步取a的原值5,此为非0值即代表逻辑真,根据“||”运算符的断路功能,“||”右边的b++将不作运算,变量b将保持原值7,整个逻辑表达式的结果为1。

注意,变量a在逻辑表达式计算结束以后将按后“++”的要求进行自增1的运算,在赋值之前,变量a的值为6,最后的复合赋值表达式就是:

a+=1,即:

a=a+1,因此变量a的最终结果为7。

4.已知x、a为int型变量,表达式x=(a=3,a*2,a+6)的值为_______。

【参考答案】9

【解析】此题比较简单,但容易出错。

逗号运算符原本优先级低于赋值运算符,但是通过括号提升了优先级,故此题最终的表达式是一个赋值表达式。

第一步,先计算逗号表达式的值,即求3,6,9的值为9,这里有人容易将结果算成12,要注意,a*2这一步只是访问了原来a的值3,并没有改变a,所以最后一步a+6的时候应该是3+6而不是6+6;最后将9赋值给变量x,因此整个表达式的结果就是9,同时变量x的值为9,变量a的值为3。

此题如果去掉括号,结果仍为9,但那时应该理解成最后一步是逗号表达式的结果为9。

第4章程序流程控制

一、单选题

1.若变量已正确定义,语句“if(a>b)k=0;elsek=1;”和______等价。

A.k=(a>b)?

1:

0;B.k=a>b;

C.k=a<=b;D.k=a<=b?

0:

1;

【参考答案】C

【解析】此题较灵活,首先是需要正确理解双分支if语句,当a>b时k=0而当a<=b时,k=1。

其次需要理解条件运算符和关系运算符的计算方法,答案A的计算结果正好与题干相反,当a>b时k=1而当a<=b时,k=0,故不是正确答案;答案D的结果与答案A实际上是一样的。

答案B,当a>b时关系表达式的结果为真,得到值1,否则为0,这与答案A、D的结论是一样的。

只有答案C,当a<=b时关系表达式的结果为1,赋值给变量k,否则将0赋值给k,与题干中的一致。

2.已知:

inta=0,b=2;对于下列if语句正确的是______。

if(a=b)printf(“AisequaltoB\n”);

A.输出:

AisequaltoB,a等于b;B.无输出

C.输出:

AisequaltoB,但a不等于b;D.编译出错

【参考答案】A

【解析】此题是初学者在编程使用if语句的条件是最容易犯的一个逻辑错误,本意应该是判断a是不是等于b,如果相等则输出对应的提示信息。

此处误将判相等的运算符“==”写成了赋值运算符“=”,而C语言中的条件是以0表示假非0表示真,因此即使写错了,语法上是正确的,故此处先进行赋值,使a的值等于b的值,同时2就是赋值表达式的结果,if(a=b)实质上就是if

(2),这里的2是非0值,因此条件为真,执行输出语句,故选择答案A。

3.下列程序段执行后,变量w的值为______。

intx=0,y=10,z=20,w=100;

if(x)w=x;

elseif(y)w=y;

elseif(z)w=z;

A.0B.10C.20D.100

【参考答案】B

【解析】此题主要考查嵌套if语句的使用,以及对C语言中逻辑真和假的正确理解。

首先,if(x)相当于if(x!

=0),而x变量的值为0,因此这个条件为假,进入第一个else分支,if(y)相当于if(y!

=0),而y变量的值为10,因此条件为真,故执行w=y;语句,使w重新获得了值10覆盖了初始化得到的100,下一个else分支自然是不会执行的,因此w的最终结果是10。

4.下面程序段的运行结果是______。

intn,s=0;

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

s+=n;

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

A.n=3,s=6B.n=3,s=3C.n=4,s=4D.有语法错误

【参考答案】C

【解析】此题考查的是for语句的灵活性。

for语句中的表达式1为初始化语句,只执行一次,表达式2用于控制循环的条件,条件为真则执行循环体;表达式3是在循环体执行结束后自动执行的语句。

此题有两处容易出错:

第一处,循环体为空,而不是s+=n;;第二处,for语句中的表达2为n++<=2,这里用到了后缀++,因此,在判断n<=2结束后,该条件的真与假将决定循环体是否执行,循环是否结束,但是++运算是一定要执行的。

当n为3的时候,n<=2的条件为假,循环将结束,但是++运算还是会执行的,因此最终n的值为4。

下面的s+=n;语句是循环结束后的第一条赋值语句只执行一次,因此,s的值为4。

5.假设i已定义为整型变量,以下程序段中,while循环的循环次数是______。

i=0;

while(i<10)

{if(i%2)continue;

if(i==5)break;

i++;

}

A.1B.10C.6D.死循环,不能确定次数

【参考答案】D

【解析】此题考查的是循环语句中break与continue语句的使用。

continue是提前结束本次循环,直接进行下一次的判断以决定是否执行下一次循环;break是从循环体内直接结束循环。

本题,第一次判断while的条件0<10值为真,进入循环体后不满足i%2!

=0的条件,因此不执行continue,直接进入i==5的判断,结果为假,不执行break;i++为无条件语句被执行,i值变为1,再回到while条件去判断,再次进入循环体,此时,i%2==1为真,执行continue直接跳过循环体内后面的语句,所以下次回到循环条件判断的时候,i的值仍然为1,很显然为死循环,因此选答案D。

6.下面有关switch语句的不正确描述是______。

A.switch后面的圆括号内的表达式可以是整型或字符型

B.switch结构中每个case必须以break结束

C.switch结构可能执行多个分支中的语句

D.switch中每个case后的常量的值必须唯一

【参考答案】B

【解析】此题考查的是switch语句的语法及执行过程。

switch后面圆括号内的表达式要求值为离散的类型,像double、float这类值连续的类型就不可以了,除了可以是int、char类型以外,还可以是自定义类型枚举类型,因此答案A的说法是正确的;答案B错误,因为在switch语句中,为实现多分支的效果,一般情况下在case语句块的最后一条语句用break,但是有时也需要多个常量控制执行同样的语句,这时某些case语句块的最后就不必用break;答案C说法正确,在某些case语句块的最后就不用break时,就达到了可能执行多个case分支的效果;答案D正确,每个case后的常量值一定要唯一,如果重复,则会引起歧义。

二、读程序写结果

1.写出下面程序的输出结果。

#include

intmain()

{

inti,j=0,s=0,n=4;

for(i=1;i<=n;i++)

{

j=j+i;

s=s+j;

}

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

return0;

}

【参考答案】s=20

【解析】此题的关键是循环体中变量j和变量s的作用。

每一次循环结束时,j=1+2+…+i,因此循环4次,每次结束时j的值分别是:

1、3、6、10,而变量s是将j的值求和,因此,前面4个值相加得到20,因此本题的执行效果实际上是:

s=1+(1+2)+(1+2+3)+(1+2+3+4)。

2.说出下面程序的功能,并写出输出结果中的前5个数。

#include

intmain(void)

{

intyear;

for(year=2004;year<2500;year+=4)

if(year%100!

=0||year%400==0)

printf("%6d",year);

return0;

}

【参考答案】本程序的功能是:

输出2001年至2500年之间所有的闰年年号。

输出结果中的前5个数为:

20042008201220162020

【解析】此题的关键是首先理解for语句,year的初值为2004,year自增的步长为4,这就说明year都是能被4整除的数,这是循环执行的大前提,再看for的循环体为一条if语句,输出语句执行的条件是year%100!

=0或者year%400==0,这正是闰年判断的条件,因此此题的功能就非常清楚了。

3.写出下面程序的输出结果。

#include

intmain()

{

intx=1,y=2;

for(;x<10;x++)

{

x+=2;

if(x>7)break;

if(x==6)continue;

y*=x;

}

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

return0;

}

【参考答案】96

【解析】此题主要考查在循环体中使用break和continue语句。

第一次进入循环体,x自增2后结果为3,两个if条件均不满足,故执行y*=x;得到y=6;回到for语句自动执行x++,使x的值为4,由于4<10,第二次进入循环体,执行x+=2;后,x的值为6,这时符合第二个if条件,因此跳过y*=x;语句直接回到for语句自动执行x++,使x的值为7,第三次进入循环体,执行x+=2;后,x的值为9,这时符合第一个if条件,执行break从循环中退出,因此循环结束时x的值为9,而y的值为6。

4.写出下面程序的输出结果。

#include

intmain()

{

inta=1,b=1,c=1;

switch(a)

{case1:

switch(b)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1