admin 管理员组

文章数量: 887021


2023年12月16日发(作者:特斯拉降到19万被约)

主教材习题答案及解析1-3章

第1章 初识计算机、程序与C语言

一、单选题

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

A. Dennis M. Ritchie B.Alan Turing C.John Von Neumann D.Ken Thompsom

【参考答案】C

【解析】程序存储思想是数字计算机之父、美籍匈牙利科学家冯·诺依曼提出来的,因此答案选C。

2.电子计算机“ENIAC”于1946年诞生于 大学。

A.英国剑桥 B.美国卡耐基梅隆 C.美国哈佛 D.美国宾夕法尼亚

【参考答案】D

【解析】世界上第一台电子计算机“ENIAC”于1946年诞生于美国宾夕法尼亚大学,是美国奥伯丁武器试验场为了满足计算弹道需要而研制成的。因此答案选择D。

3.电子计算机经历了4个发展时代,微型计算机出现在 时代。

A.电子管 B.晶体管 C.集成电路 D.大规模集成电路

【参考答案】D

【解析】电子计算机发展到大规模集成电路时代,逻辑元器件采用大规模和超大规模集成电路,使得计算机的体积越来越小,1971年微型计算机产生,开创了计算机的新时代。故答案选D。

4.关于软件和程序,下列说法不正确的是 。

A.软件的核心是程序 B.软件就是程序

C.软件=程序+文档 D.软件中文档必不可少

【参考答案】B

【解析】软件和程序是两个经常被混为一谈的概念,其实两者有所区别。主教材中关于二者的关系讲得很清楚:软件=程序+文档,而程序=数据结构+算法。因此答案选B。

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

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

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

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

D.C语言与PASCAL等其他高级语言的编译器是一样的,都完成编译功能。

【参考答案】D

【解析】用相应程序设计语言编写出来的程序叫作源程序;而计算机直接能识别并运行的程序叫做目标程序。由于计算机只能识别二进制码,因此用机器语言编写的源程序就是计算机能直接识别并运行的目标程序,二者之间无需经过任何翻译;而用汇编语言编写的源程序需要经过汇编程序汇编才能得到对应的目标程序;用高级语言编写的源程序经过相应的编译器编译或者用解释的方式得到目标程序,不同语言对应的编译程序或者说编译器不一样。因此答案选D,说法不正确。

6.以下哪一种不是从源程序到目标程序的翻译方式 。

A.编辑 B.编译 C.汇编 D.解释

【参考答案】A

【解析】用汇编语言和高级语言编写的源程序必须经过3种翻译方式中的某一种才能得到对应的目标程序,它们是:编译、汇编和解释。显然编辑不是翻译方式,故选答案A。

7.第一个结构化程序设计语言是 。

1

主教材习题答案及解析1-3章

A.PASCAL B.C C.BASIC D.FORTRAN

【参考答案】A

【解析】高级语言从应用角度分为基础语言、结构化语言、专用语言3大类,PASCAL语言是第一个结构化程序设计语言,因此答案选A。

8.贝尔实验室的Dennis M. Ritchie于1973年用C语言重写了 操作系统。

A.DOS B.UNIX C.WINDOWS D.LINUX

【参考答案】B

【解析】根据C语言的发展简史,答案选B。

9.若计算机有32根地址总线,则其存储器的最大存储容量可达 。

A.32MB B.32GB C.4GB D.8GB

【参考答案】C

【解析】如果计算机有32根地址总线,而每个地址总线上可能的符号是0或1,因此最多可以有232个不同的地址编号,每一个地址号对应于一个字节的存储单元,因此最大存储容量是232B,即22*230B=4GB,因此答案选C。

10.十进制数346所对应的八进制数为 。

A. 235 B.532 C.237 D.732

【参考答案】B

【解析】根据十进制转化为N进制的基本方法:除N取余至商为零再逆序输出余数,这里的N就是8,得到的3个余数依次是2、3、5,将它们逆序组合起来得到的532就是等效的八进制数。所以答案选B。

二、问答题

1.冯·诺依曼体系结构的计算机,必须具有哪些功能?

【参考答案】

冯·诺依曼体系结构的计算机,必须具有如下功能:

(1)把需要的程序和数据送至计算机中。

(2)必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。

(3)能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力。

(4)能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作。

(5)能够按照要求将处理结果输出给用户。

【解析】根据主教材1.1节的知识。

2.简介计算机的五大部件,以及每一部分的主要功能分别是什么?

【参考答案】

冯·诺依曼型计算机硬件由五大部件组成:运算器、控制器、存储器、输入设备和输出设备,主要功能分别如下:

存储器存放程序指令和数据;运算器各种完成数据的加工和处理;控制器控制程序的执行;输入设备输入程序和数据;输出设备输出处理结果。

运算器和控制器合称为中央处理器,简称CPU,是计算机最核心的组成部分。

【解析】根据教材1.1节的知识。

3.说说下面的硬件哪些只是输入设备,哪些只是输出设备,哪些既是输入设备又是输出设备?

键盘、光电笔、扫描仪、U盘、SD卡、光盘、打印机、音响、鼠标、摄像头、数码相机、手写输入板、游戏杆、麦克风、显示器、绘图仪、触摸屏、硬盘

【参考答案】

2

主教材习题答案及解析1-3章

输入设备:键盘、光电笔、扫描仪、鼠标、摄像头、数码相机、手写输入板、游戏杆、麦克风;

输出设备:打印机、音响、显示器、绘图仪;

既是输入设备又是输出设备:U盘、SD卡、光盘、触摸屏、硬盘。

【解析】根据输入设备、输出设备、外存储器的功能以及这些硬件本身的功能区分。

4.简述源程序与目标程序的关系。

【参考答案】

程序员用某种编程语言所编写的程序称为源程序;计算机能直接执行的程序称为目标程序。目标程序的操作码和操作数都是0/1序列,而源程序却不一定是0/1序列。源程序必须转换为目标程序计算机才能读懂并执行。

用机器语言编写的源程序就是目标程序;用汇编语言编写的源程序必须用汇编程序经过汇编得到目标程序;用高级语言(不是全部)编写的源程序必须用特定的编译程序经过编译得到目标程序。但并非所有的高级语言编写的源程序都会被编译为目标程序,有的高级语言例如BASIC语言的源程序就是通过解释方式执行程序的,就是边扫描边解释,逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。

【解析】根据教材1.2.2小节的知识。

5.简述C程序的开发过程。

【参考答案】

一个C程序从编写到执行出结果一般需要6个步骤:编辑、预处理、编译、链接、装载和执行。下面是这几个步骤所完成的任务。

(1)编辑

编辑是通过输入设备将C语言源程序录入到计算机中,生成扩展名为“.c”的源文件。

(2)预处理

预处理是指通过预处理器对程序中的预处理指令(它们是为优化代码而设计的)进行转译。每条预处理指令以符号“#”开头。

(3)编译

编译是将C语言源文件和预处理生成的中间文件转换为机器可识别的目标代码(即二进制代码),生成相应的“.obj”文件。

(4)链接

链接是对目标代码中的符号引用和定义转换,把编译得到的多个二进制代码片段(例如程序中使用的库函数,它们也被编译成二进制码片段)连接成完整的可执行文件,扩展名为“.exe”。

(5)装载

装载器将可执行文件装入内存储器中等待执行。

(6)执行

在中央处理器(CPU)的控制下,对装入内存的可执行文件的指令逐条执行,运行结果在显示器上显示或者保存至文件中。

【解析】根据教材1.3.3小节的知识。

3

主教材习题答案及解析1-3章

第2章 初识C源程序及其数据类型

一、单选题

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

A. R&D B._filename C.for D.$X;

【参考答案】B

【解析】此题考查的是标识符的命名规则:标识符是以字母或下划线开头,后面跟字母、数字、下划线的任意字符序列。答案A中的变量名使用了“&”号,不符合要求;答案C是关键字,而用户自定义标识符不能使用关键字;答案D的变量名以“$”开头,不符合以字母或下划线开头的要求;答案B则是合法的标识符。因此本题选择答案B。

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

A.234E3.1 B.E3 C. 234. D.234

【参考答案】C

【解析】此题考查的是实型常量的表示方法:实型常量只采用十进制表示,其表示方式分为小数形式和指数形式两种。答案A采用指数形式,但指数部分3.1不是整数,故不合法;答案B同样采用指数形式,但尾数部分被省略了,也不合法;答案C采用小数形式,其小数部分可以省略;答案D表示的是整型常量。因此本题选择答案C。

3. 下列不合法的常量是 。

A.'x4A' B." " C. .8e0 D.'483'

【参考答案】D

【解析】此题考查的是各种数据类型常量的表示方法:答案A是一个转义字符常量,“x”后跟1~2位十六进制ASCII码;答案B是一个字符串常量;答案C是一个指数形式实型常量;答案D也是转义字符,“”后应该跟1~3位八进制ASCII码,但这里的“8”超出了八进制的数字范围0~7,故不合法。因此本题选择答案D。

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

A.012 B.0x12 C.12 D.120

【参考答案】D

【解析】此题考查的是不同进制的整型常量的表示方法。答案A表示八进制整数012,相当于十进制整数10;答案B表示十六进制整数0x12,相当于十进制整数18;答案C就是十进制整数12;答案D是十进制整数120。因此本题选择答案D。

5.下列哪一个字符与其他三个字符不相等 。

A.'a' B.'A' C.'x41' D.’101’

【参考答案】A

【解析】此题考查的是字符常量其转义字符的表示方法。答案A表示字符'a',其对应的ASCII码是97;答案B表示字符'A',其对应的ASCII码是65;答案C是字符的十六进制ASCII码表示,其对应的ASCII码是4*16+1,即65;答案D是字符的八进制ASCII码表示,其对应的ASCII码是1*82+1,也为65。因此本题选择答案C。

6.下列哪个选项属于C语言中的合法字符串常量 。

A.how are you B."china" C.' hello ' D.$abc$

【参考答案】B

【解析】此题考查的是字符串常量的表示方法:字符串常量是用一对双引号将零个或多个字符序列括起来。答案A中没有双引号,不对;答案C采用的是单引号,也不对;答案D采用“$”符号,也不符合要求;只有答案B用了双引号。因此本题选择答案B。

4

主教材习题答案及解析1-3章

7.在C语言中,不同数据类型占用内存的字节长度是 。

A.相同的 B.由用户自己定义的

C.任意的 D.与编译环境有关的

【参考答案】D

【解析】此题考查的知识点是:对于某种数据类型在内存中究竟占多少字节,在C语言标准中并未严格规定,而是与具体的C语言编译环境有关。例如:对于int类型,在Visual

Studio 2010编译环境下占4个字节,但是在Turbo C下只占2个字节。因此本题选择答案D。

8.下列4组数据类型中,C语言允许的一组是 。

A.整型、实型、逻辑型、双精度型

B.整型、实型、字符型、空类型

C.整型、双精度型、集合型、指针类型

D.整型、实型、复数型、结构体类型

【参考答案】B

【解析】此题考查的知识点是:C语言的数据类型种类。根据教材图2_1可知,逻辑型、集合型、复数型都不是C语言的数据类型。因此本题选择答案B。

9.C语言short型数据占2个字节,则unsigned short型数据的取值范围是 。

A.0~255 B.0~65535 C.-256~255 D.-32768~32767

【参考答案】B

【解析】此题考查的知识点是:整型数据类型在计算机内存中的二进制存储格式。无符号短整型的最小表示二进制数0,最大表示二进制数“1111 1111 1111 1111”,即216-1=65535。因此本题选择答案B。

10.有如下输入语句:scanf(“x=%d,y=%d”,&x,&y); 为使变量x的值为10,y的值为20,从键盘输入数据的正确形式是 。

A.10

20<回车> B.10,20<回车>

C.x=10,y=20<回车> D.x=10

y=20<回车>

【参考答案】C

【解析】此题考查的知识点是格式输入函数scanf的用法。这里“x=”、“,”和“y=”称为输入分隔符。用户要严格按输入分隔符的格式输入信息,函数scanf略去与输入分隔符相同的字符,再按格式转换说明符进行数据转换输入到相应的变量中。因此本题选择答案C。

二、填空题

1. C程序的基本单位是 ① ,一个C程序有 ② 个主函数。

【参考答案】① 函数 ② 一

【解析】此题考查C语言源程序的组成结构:C语言源程序由一个或多个函数组成,函数是组成C程序的基本单位。一个C程序有且只有一个名为main的函数,称为主函数。

2. C语言源程序文件的扩展名是 ③ ,经编译后形成的文件的扩展名是 ④ 。

【参考答案】③ .c ④ .obj

【解析】此题考查C语言源程序的开发过程:C语言源程序是扩展名为.c的文本文件;源程序经过编译形成的目标文件,扩展名为.obj;最后,目标文件经过链接操作形成可执行文件。

3.C语言程序中需要进行输入/输出处理时,必须包含的头文件是 ⑤ 。

【参考答案】 ⑤ stdio.h

【解析】此题考查C语言源程序中的头文件包含的含义。在调用scanf、printf等标准输入、输出库函数之前,必须要用一条编译预处理命令#include 将头文件stdio.h包含5

主教材习题答案及解析1-3章

到C语言源程序中。

4.用printf输出一个double型数据,如果希望输出形式为指数格式,应该用格式转换说明符 ⑥ ,如果希望输出形式为小数形式,可以用格式转换说明符 ⑦ 或 ⑧ ,区别是:前者小数点后6位不够时补0,后者会去掉小数点后无效的0。

【参考答案】 ⑥ %e ⑦ %f ⑧ %g

【解析】此题考查函数printf的格式转换说明符的用法。具体请参见教材表2_7。

5.有scanf输入一个double型变量时,需要使用格式转换说明符 ⑨ ,并且要使用运算符 ⑩ 取得该变量的地址。

【参考答案】 ⑨ %lf ⑩&

【解析】 此题考查函数scanf及其格式转换说明符的用法。输入double型变量必须用“%lf”,而输入float型变量要用“%f”,不能混淆。另外,输入变量必须给出变量地址,不要忘写取地址符“&”。

三、读程序写结果

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

#include

int main()

{ int i=010,j=10,k=0x10;

printf("%d,%d,%dn",i,j,k);

return 0;

}

【参考答案】 8,10,16

【解析】此题考查整型常量的不同进制表示。“010”是八进制表示,相当于十进制数8;“10”是十进制表示;“0x10”是十六进制表示,相当于十进制数16。所以,用格式转换说明符“%d”进行输出:变量i输出8、变量j输出10、变量k输出16。

2. 写出下面程序的运行结果。

#include

int main()

{ int a=96;

double x=12.345;

char ch='A';

printf("%-4d%,%4dn",a,a);

printf("%10.2f,%10.2en",x,x);

printf("%c,%cn",ch,ch+32);

return 0;

}

【参考答案】

96 , 96

12.35, 1.23e+001

A,a

【解析】此题考查各种类型变量的格式输出。

格式控制字符串""%-4d%,%4dn""中的“%-4d”表示以最小宽度4输出整数,前面的“-”号表示向右对齐输出,而“%4d”则是以最小宽度4、向左对齐输出整数,格式控制字符串中的其它字符原样输出。因此,第一个“96 ”后面有2个空格,第二个“ 96”前面有26

主教材习题答案及解析1-3章

个空格。

格式控制字符串"%10.2f,%10.2en"中的“%10.2f”表示输出以小数形式输出实型数据,其输出的最小宽度为10(包括小数点、指数符号、正负号等),保留2位小数,“%10.2e”表示以指数形式输出实型数据,输出最小宽度和小数位数同上。因此,“ 12.35”前面有5个空格,“1.23e+001”的前面有1个空格。

格式控制字符串"%c,%cn"中的“%c”表示输出字符型数据。这里要注意字符型数据对应于ASCII码,字符本质上也是整数。ch+32相当于字符变量ch的ASCII码+32,即'A'的ASCII码65+32,结果为97,即小写字母'a'。通常,将大写字母字符转换成小写字母字符就可将该字符+32这个简单的方法。

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

#include

int main( )

{ char a,b,c,d;

a=getchar();

b=getchar();

scanf("%c%c",&c,&d);

putchar(a);

putchar(b);

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

return 0;

}

如果从键盘输入(从下面一行的第一列开始)

1<回车>

234<回车>

则程序的输出结果?

【参考答案】 1

23

【解析】 此题考查字符类型输入、输出函数的用法。根据程序,第一行用户输入的字符'1'赋给变量a;接下来的<回车>符赋给了变量b;第二行用户输入的字符'2'赋给了变量c,字符'3'赋给了变量d,而后面的输入“4<回车>”则在输入缓冲区中没有被用到。所以,putchar(a)输出1,putchar(b)输出一个换行,printf("%c%c",c,d)输出23。

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

#include

int main()

{ int a;

float b,c;

scanf("%3d%3f%4f",&a,&b,&c);

printf("a=%4d,b=%f,c=%gn",a,b,c);

return 0;

}

如果从键盘输入(从下面一行的第一列开始)

1234567.89<回车>

则程序的输出结果?

【参考答案】 a= 123,b=456.000000,c=7.89

【解析】 此题考查变量的输入、输出的格式转换符及修饰符的综合运用。语句7

主教材习题答案及解析1-3章

“scanf("%3d%3f%4f", &a, &b, &c);”说明变量a、b、c的输入宽度分别是3、3、4 ,则输入的前3位“123”赋给a,“456”赋给b,“7.89”赋给c。用printf输出时,“%4d”表示输出整数的最小宽度是4,所以“ 123”前面有一个空格,“%f”输出float型数据会保留小数点后六位,即“456.000000”,而“%g”则输出“7.89”,后面不会输出无意义的0。

四、编程题

1.编写程序,用sizeof测试以下数据类型在内存中所占空间大小: char、int 、short 、long、unsigned int 、float 、double 、long double,输出时给出较清晰的提示信息。

【参考答案】

#include

int main( )

{

printf("sizeof(char)=%dn",sizeof(char));

printf("sizeof(int)=%dn",sizeof(int));

printf("sizeof(short)=%dn",sizeof(short));

printf("sizeof(long)=%dn",sizeof(long));

printf("sizeof(unsigned int)=%dn",sizeof(unsigned int));

printf("sizeof(float)=%dn",sizeof(float));

printf("sizeof(double)=%dn",sizeof(double));

printf("sizeof(long double)=%dn",sizeof(long double));

return 0;

}

【解析】对于某种数据类型在内存中究竟占多少字节,在C语言标准中并未严格规定,而是与具体的C语言编译环境有关。在实际编程中,应当用sizeof(数据类型)来获得该数据类型所占的字节数。本程序就是sizeof()运算符的应用练习。

2.编写程序,从键盘输入一个圆柱体的底面半径r和高h,计算并输出该圆柱体的体积和表面积(要求结果精确到小数点后3位)。

【参考答案】

#include

int main( )

{

const double pi=3.14159; /*定义只读常量pi*/

double r,h; /*定义变量r,h作为半径和高*/

double volume, area;

printf("please input radius and height:");

scanf("%lf%lf",&r, &h); /*从键盘输入r和h的值*/

volume=pi*r*r*h; /*计算体积*/

area=2*pi*r*r+2*pi*r*h; /*计算表面积*/

printf("volume=%.3f, area=%.3fn", volume, area); /*输出体积和表面积*/

return 0;

}

【解析】该题综合运用基本数据类型常量、变量的定义、输入、输出等知识进行编程。其中,圆周率pi定义为const只读变量;输出格式保留小数点后3位用格式“%.3f”。

3. 公民身份号码是一种由18位数字组成的特征组合码,其排列顺序从左至右依次为:8

主教材习题答案及解析1-3章

6位数字地址码、8位数字出生日期码,3位数字顺序码和1位数字校验码(校验码若为10则用字符'X'来表示)。编写程序,从键盘输入一个身份证号码,由程序输出该号码的各组成信息。例如:

若用户输入为:

452223X<回车>

则程序输出为:

地址码:452223

出生日期:1995年8月14日

顺序码:004

校验码:X

【参考答案】

#include

int main( )

{

int addrcode; /*定义变量addrcode作为地址码*/

int year, month, day; /*定义变量year, month, day作为生日的年、月,日*/

int seqno; /*定义变量seqno作为顺序码*/

char checkcode; /*定义变量checkcode作为校验码*/

printf("请输入身份证号码:");

scanf("%6d%4d%2d%2d%3d%1c",&addrcode, &year, &month, &day, &seqno,

&checkcode); /*从键盘输入身份证号*/

printf("地址码:%dn", addrcode); /*输出地址码*/

printf("出生日期:%d年%d月%d日n", year, month, day); /*输出生日*/

printf("顺序码:%03dn", seqno); /*输出顺序码*/

printf("校验码:%cn", checkcode); /*输出校验码*/

return 0;

}

【解析】该题综合运用格式输入、输出函数等进行编程。先根据身份证号码的格式说明,定义与之相匹配的输入格式,即scanf函数中的格式控制字符串,关键语句为:

scanf("%6d%4d%2d%2d%3d%1c",&addcode, &year, &month, &day, &seqno,

&checkcode);

其中,%6d、%4d、%2d、%2d、%3d为整数域宽修饰符,分别用来控制输入6位数字地址码、8位数字出生日期码(4位年、2位月、2位日)、3位数字顺序码,对应的整型变量为addrcode、year、month、 day、 seqno。另外,注意到1位校验码可能为字符'X',因此将checkcode定义为char型,其输入控制格式为%1c。

接着,用输出函数printf输出身份证号码的各组成信息。请注意,输出顺序码的格式为%03d,它表示输出的整数域宽为3,若该数不足3位则在前面补足0,这就能满足本题输出格式的要求。

9

主教材习题答案及解析1-3章

第3章 表达式与运算符

一、单选题

1.设有语句:int a=7; float x=2.5, y=4.7;,则表达式x+a%3*(int) (x+y)%2/4的值是 。

A.2.5 B.2.75 C.2.0 D.0.0

【参考答案】A

【解析】此题考查的是算术混合运算表达式的理解和计算。先根据优先级和结合性划分子表达式,即给该表达式打上小括号“( )”,结果为:x+((((a%3)*((int) (x+y)))%2)/4)

然后,将变量a,x,y的值分别代入计算,其中,((int) (x+y))的值为7,(a%3)的值为1,则:((((a%3)*((int) (x+y)))%2)/4)相当于(((1*7)%2)/4),其中有整数除,结果为0。最后,x+0的结果为double型,即原表达式的值为2.5。

2.在下面四个运算符中,优先级别最低的是 。

A.! B.&& C.= = D.=

【参考答案】D

【解析】此题考查的是运算符的优先级:C语言运算符的优先级有明确定义(见教材附录D)。单目运算符的优先级总是高于双目运算符,而双目运算符的优先级从高到低是:算术运算符、条件运算符、逻辑运算符、赋值或复合赋值运算符。答案A是单目运算符(逻辑非),答案B是逻辑运算符(逻辑与),答案C是关系运算符(相等),答案D是赋值运算符。因此本题选择答案D。

3.在以下的运算符中,运算对象必须是整型数的是 。

A.+ B.% C.++ D.( )

【参考答案】B

【解析】此题考查的是运算符对运算对象类型的要求。答案A “+”加运算符的运算对象可以是整型,也可以实型;答案C“++”自增运算符的运算对象也可以是整型或实型;答案D“( )”运算符的作用改变优先级,其运算对象可以是任何数据类型;只有答案B “%”求余运算符的运算对象只能是整型。因此本题选择答案B。

4.逻辑运算符对运算对象的要求是 。

A.只能是逻辑值 B.两个运算对象必须属于同一种数据类型

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

【解析】此题考查的是逻辑运算符对运算对象类型的要求。C语言用非0值表示逻辑“真”、用0值表示逻辑“假”,因此对逻辑运算符的两侧的运算对象类型没有特别要求,可以是任意合法的表达式,两者类型可以不相同。因此本题选择答案D。

5.设a,b,c,d均为0,执行(m=a==b)&&(n=c!=d)后,m,n的值为 。

A.0,0 B.0,1 C.1,0 D.1,1

【参考答案】C

【解析】此题考查的是混合运算表达式的理解和计算,涉及运算符的综合概念。先计算&&左边的表达式“m=a==b”,这里关系运算符“==”的优先级高于赋值运算符“=”,故可理解为m=(a==b),计算(a==b),即0==0,该关系表达式为真(1),即m=1,m的值为1,左边表达式的值也为1;由于左边表达式不为0,不符合“逻辑短路”的条件,C语言程序将继续计算&&右边的表达式“n=c!=d”,同理,“!=”的优先级高于 “=”,故可理解为n=(c!=d),计算c!=d,即0!=0,该关系表达式为假(0),则n=0,n的值为0。因此本题选择答案C。

10

主教材习题答案及解析1-3章

6.设a,b,c都是int型变量,且a=3,b=4,c=5,则下列表达式中值为0的是 。

A.'a' && 'b' B.a<=b

C.a||b+c&&b-c D.!(a

【参考答案】D

【解析】此题考查的是关系和逻辑运算符的用法。答案A表达式中字符'a'和'b'都不为0,所以表达式的值为真(1);答案B表达式相当于3<=4,该条件成立,值也是1;答案C表达式相当于(a) || (b+c&&b-c),其左边a=3为真,该式整体是逻辑或“||”表达式,因此产生逻辑短路现象,右边不用计算,表达式的值一定是1;答案D表达式相当于!((a

7.设x是double型变量,则能将x的值四舍五入保留到小数点后两位的表达式是 。

A.(x*100.0+0.5)/100.0 B.(int)(x*100+0.5)/100.0

C.x*100+0.5/100.0 D.(x/100+0.5)*100.0

【参考答案】B

【解析】此题考查的是算术运算符和强制类型转换的用法。可以采用特例分析,假设x=3.4567,则答案A的计算结果是3.4617;答案B的计算结果是3.46;答案C的计算结果是345.675;答案D的计算结果是53.4567。显然本题选择答案B。本题中四舍五入的表达式在编程中经常用到,希望读者好好理解,举一反三。

8、若执行语句:int b,a = 12, n = 5;,表达式 a % = (b=2, n %=b) + 4结果是 。

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

【参考答案】B

【解析】此题考查的是逗号、算术、符合赋值等混合运算表达式的理解和计算,涉及运算符的综合概念。先根据优先级和结合性为表达式打上小括号,有:a % =((b=2, n %=b) + 4)

其中,逗号表达式(b=2, n %=b)的计算顺序是:先将b赋值为2,再计算n%=b,即n=(n%b)或n=(5%2),则n的值变为1,整个逗号表达式的值也为1。因此,原表达式变为:a %=(1+4),即a=12%5,结果为2。因此本题选择答案B。

9.表达式(int)((double)7/2)-7%2的值是 。

A.1 B.1.0 C.2 D.2.0

【参考答案】C

【解析】此题考查的是类型转换和算术混合运算表达式的计算方法。计算过程如下:(int)((double)7/2)-7%2相当于表达 (int)(3.5)-7%2,又相当于表达式3-1,其结果为2。因此本题选择答案C。

10.若d是double型变量,表达式“d=1, d=5, d++”的值是 。

A.1.0 B.2.0 C.5.0 D.6.0

【参考答案】C

【解析】此题考查的是逗号表达式的计算方法。逗号表达式“d=1, d=5, d++”从左到右依次计算,以最后一项“d++”的值作为整个表达式的值。这时d=5.0,而“d++”是“后++”,则“d++”的值是d自增之前的值5.0。因此本题选择答案C。

二、填空题

1.用运算符 ① 可以计算某一数据类型的变量所占的内存字节数。

【参考答案】① sizeof

【解析】此题考查的是sizeof ( )计算字节数运算符的用法,例如:在实际编程中,应当用sizeof(数据类型)来获得该数据类型所占的字节数。

11

主教材习题答案及解析1-3章

2.能表述“10x<20或x<0”的C语言表达式是 ② 。

【参考答案】② x>=10&&x<20 || x<0

【解析】此题考查关系、逻辑表达式的正确使用方法。注意:C语言表达式与数学表达式的区别。

3.若有int x=1,y=1,表达式(!x || y--)的值等于 ③ 。

【参考答案】③ 1

【解析】此题考查的是带“后”自增、自减运算符的表达式的计算。“(!x || y--)”相当于“(!x || y); y=y-1”,则表达式(!x || y--)的值就是(!x || y)的值,故答案是1。

4.数学公式5a+cb3/2-|2d+1| 的C语言表达形式是 ④ 。

【参考答案】④ 5*sqrt(a)+c*b*b*b/2.0-fabs(2*d+1)

【解析】此题考查的是如何用C语言表达式表示数学公式。注意:C语言表达式与数学公式的区别:首先是注意常用数学函数的使用;其次“b3”要写成b*b*b或pow(b, 3),但不能写成b^3(这表示按位异或运算);最后还要注意整数除的问题,因此“/2”最好写成“/2.0”。

5.已知: int a=1, b=2, n=1;,执行 (a > b) && ( n=2 );之后,n的值为 ⑤ 。

【参考答案】⑤ 1

【解析】此题考查逻辑运算中的“逻辑短路”现象。由于条件表达式(a>b)的结果为假(0),对于逻辑与运算符&&,只要第一操作数为假(0),无论第二操作数真假如何,该运算符的运算结果都为假,故第二操作数就无需计算了,即产生逻辑短路。因此,赋值表达式n=2不会被执行,故n的值仍为1。

6. 已知x, a为int型变量,则表达式x=(a=5, a*2, a+7)的值为 ⑥ 。

【参考答案】⑥ 12

【解析】此题考查的是逗号表达式的计算。逗号表达式a=5, a*2, a+7的值是其最后一项的值,这时a的值5,a+7的值为12。故答案是12。

7. 若有int n = 2;执行语句:n += n- = n*n后, n= ⑦ 。

【参考答案】⑦ -4

【解析】此题考查的是复合赋值运算符的优先级和结合性问题。首先“*”的优先级最高,先要将n*n打上小括号;接着“+=”和“-=”的优先级相同,但复合赋值运算符是“右结合”的,所以要从右向左打小括号,则该表达式的语义为:n += (n- = (n*n))

首先,计算表达式(n*n)的值为4;然后,计算表达式(n- = (n*n)),即(n-=4),n的值变为-2,表达式(n- = (n*n))的值也是-2;最后,计算表达式n +=-2,n的值变为-4。故答案是-4。

8. 若有变量定义char ch='A' , 则putchar(ch+35)的输出结果是 ⑧ 。

【参考答案】⑧ d

【解析】此题考查的是表达式中的自动类型转换。字符型与整型相加,C语言先自动将ch转换成整型,即'A'对应的ASCII码65,65+35的结果是100,对应于小写字母字符'd'的ASCII码。因此,putchar(ch+35)输出的结果是d。

三、读程序写结果

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

#include

int main( )

{

int a=3, b=5;

a += a++ || ++b;

12

主教材习题答案及解析1-3章

printf("a=%d, b=%dn", a, b);

return 0;

}

【参考答案】

a=5, b=5

【解析】此题考查的运算符与表达式的综合运用。表达式“a += a++ || ++b;”相当于“a

+= ((a++) || (++b));”。因为“a++”是将a当前的值3作为该表达式的值,再进行自增运算,所以“(a++) || (++b)”相当于“3 || (++b); a=a+1”。该表达式的值总是1,由于“逻辑短路”现象,“++b”不再运算。这时的原表达式相当于“a+=1; a=a+1”,a的值增加了2,变为5,而b的值没变。故得到上述答案。

2. 写出下面程序的运行结果。

#include

int main( )

{

int i=10,j=5,x,y;

printf("%d n", i++ - ++j);

printf("i=%d, j=%dn", i, j);

x=i++;

y=++i*j--;

printf("x=%d, y=%dn", x, y);

return 0;

}

【参考答案】

4

i=11, j=6

x=11, y=78

【解析】此题考查的自增、自减运算符的使用。第一个printf中的表达式“i++ - ++j;”相当于“j=j+1; i-j; i=i+1”,即j先自增1变为6,然后计算i-j得4作为原表达式的值,最后i再自增1变为11。因此,一行输出表达式的值4,第二行输出i和j的值分别为11和6。接着,表达式“x=i++;”相当于“x=i; i=i+1;”,运行后:x为11,i为12;表达式“y=++i*j--;”相当于“i=i+1; y=i*j; j=j-1”,运行后:i为13,y为13*6即78,j=5。故输出x和y的值为11和78,故得到上述答案。

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

#include

int main( )

{

int a=0, b=1, c=2;

c+=b+=a++;

printf("a=%d, b=%d, c=%dn", a, b, c);

return 0;

}

【参考答案】

a=1, b=1, c=3

【解析】此题考查的自增、复合赋值混合表达式。由于a++为后缀++,表达式

13

主教材习题答案及解析1-3章

“c+=b+=a++;”相当于“c+=b+=a; a=a+1;”,再根据优先级和结合性,该表达式“c+=b+=a”的语义为:c+=(b+=a)。计算b+=a,b的值变为1,计算c+=b,c的值变为3。最后,a自增1,变为1。故得到上述答案。

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

#include

int main( )

{

int a=3,b=4,c=5,d;

d=a>b?(a>c?a:c):(b

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

return 0;

}

【参考答案】

d=5

【解析】此题考查的条件运算符与表达式的使用。这里有嵌套的条件表达式,根据条件表达式的“右结合”性,从右向左:“(a>c?a:c)”的值是5,“(bb?(a>c?a:c):(b

四、编程题

1.编写程序,从键盘任意输入四个整数,要求输出其中的最大值和最小值。(提示:利用条件运算符)

【参考答案】

#include

int main( )

{

int a,b,c,d;

int max,min;

printf("please input 4 integers:");

scanf("%d%d%d%d", &a, &b, &c, &d); /*输入4个整数*/

max=min=a; /*初始化最大、最小值*/

max=max>b?max:b; /*max与变量b比较,较大的数存在max*/

min=min

max=max>c?max:c; /*max与变量c比较,较大的数存在max*/

min=min

max=max>d?max:d; /*max与变量d比较,较大的数存在max*/

min=min

printf("max=%d, min=%dn",max,min);

return 0;

}

【解析】此题的关键是反复利用条件运算符进行比较,将当前的最大值和最小值保存到max和min中,所以,当变量比较完成后,max和min就是最终的最大值和最小值。该题体现了求最值的基本算法思路,这点在后续的章节中还要再次用到。

2.已知华氏温度F与摄氏温度C之间的转换关系为:

14

主教材习题答案及解析1-3章

5C=(F−32)

9编写程序,输入一个华氏温度,输出其对应的摄氏温度,并四舍五入保留到小数点后两位。

【参考答案】

#include

int main( )

{

float f,c;

printf("Input:nF=");

scanf("%f", &f); /*输入华氏温度*/

c=5.0/9.0*(f-32); /*计算设施温度*/

printf("C=%.2fn",c); /*按格式输出*/

return 0;

}

【解析】此题考察C语言数学表达式及格式输入、输出的使用。这里,要注意整除问题,如“5/9”要写成“5.0/9.0”或“5.0/9”;四舍五入小数点后两位可用格式“%.2f”,或自己定义表达式来计算。

3.编写程序,从键盘输入一个三位正整数,然后按数位的逆序输出该数。例如:

若用户从键盘输入:123<回车>

则程序在屏幕输出:321

【参考答案】

#include

int main( )

{

int n; /*定义变量n表示三位正整数*/

int a,b,c; /*定义变量a、b、c分别表示n的个位、十位、百位上的数字*/

int rn; /*定义变量rn表示n的逆序数*/

printf("Input a positive integer(100~999):");

scanf("%d", &n); /*输入n*/

a=n%10; /*计算n的个位上的数字*/

b=n/10%10; /*计算n的十位上的数字*/

c=n/100; /*计算n的百位上的数字*/

rn=a*100+b*10+c; /*计算n的逆序数*/

printf("%dn",rn); /*输出rn*/

return 0;

}

【解析】此题考察利用C语言解决基本数学问题的能力。对于一个三位整数n,本程序综合运用整数除、求余等操作计算出其个、十、百位上的数字,并赋值给变量a、b、c。另外,用表达式a*100+b*10+c可以计算出n的逆序数。本程序用到的算法非常有用,在后面的学习中还会遇到,请读者仔细理解并掌握。

15


本文标签: 答案 表达式 输出 程序 输入