课后习题浓缩版.docx
- 文档编号:23115460
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:82
- 大小:72.04KB
课后习题浓缩版.docx
《课后习题浓缩版.docx》由会员分享,可在线阅读,更多相关《课后习题浓缩版.docx(82页珍藏版)》请在冰豆网上搜索。
课后习题浓缩版
课后习题
第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.10C.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)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课后 习题 浓缩
![提示](https://static.bdocx.com/images/bang_tan.gif)