1
程序设计教程
--用 C++语言编程
(习题解答)
目 录
第 1 章 概述................................................................................................................................................ 2
第 2 章 基本数据类型和表达式 ................................................................................................................ 4
第 3 章 程序的流程控制――语句 ............................................................................................................ 6
第 4 章 过程抽象――函数 ...................................................................................................................... 15
第 5 章 构造数据类型.............................................................................................................................. 20
第 6 章 数据抽象――类.......................................................................................................................... 30
第 7 章 操作符重载.................................................................................................................................. 46
第 8 章 继承――派生类.......................................................................................................................... 69
第 1 章 概述
1、简述寄存器、内存以及外存的区别。
2
答:寄存器主要用于记录下一条指令的内存地址、当前指令的执行状态以及暂时保存指令的计算结果
供下一(几)条指令使用,其作用主要是减少访问内存的次数,提高指令的执行效率。
内存用于存储计算机程序(指令和数据),内存由许多存储单元构成,每个存储单元都有一个地址,
对存储单元的访问是通过其地址来进行的,与寄存器相比,内存的容量要大得多,但指令访问内存单
元所花费的时间比访问寄存器要多得多。
外存是大容量的低速存储部件,用于永久性地存储程序、数据以及各种文档等信息,存储在外存
中的信息通常以文件形式进行组织和访问,外存储了在容量和速度上与内存不同,另一个区别在于内
存中存储的是正在运行的程序和正在使用的数据,外存中存储的则是大量的、并非正在使用的程序和
数据。
2、简述冯•诺依曼计算机的工作模型。
答:冯•诺依曼计算机的工作模型是:待执行的程序从外存装入到内存中,CPU 从内存中逐条地取程
序中的指令执行;程序执行中所需要的数据从内存或从外设中获得,程序执行中产生的中间结果保存
在内存中,程序的执行结果通过外设输出。
3、CPU 能执行哪些指令?
答:CPU 所能执行的指令通常有:
算术指令:实现加、减、乘、除等运算。
比较指令:比较两个操作数的大小。
数据传输指令:实现 CPU 的寄存器、内存以及外设之间的数据传输。
执行流程控制指令:用于确定下一条指令的内存地址,包括转移、循环以及子程序调用/返回等指令。
4、什么是软件?软件是如何分类的?
答:计算机软件是计算机系统中的程序以及有关的文档。程序是对计算任务的处理对象(数据)与处
理规则(算法)的描述;文档是为了便于人理解程序所需的资料说明,供程序开发与维护使用。
软件通常可以分为系统软件、支撑软件和应用软件。系统软件居于计算机系统中最靠近硬件的一
级,它与具体的应用领域无关,其他软件一般要通过系统软件发挥作用,如操作系统属于系统软件。
支撑软件是指支持软件开发与维护的软件,一般由软件开发人员使用,如软件开发环境就是典型的支
撑软件。应用软件是指用于特定领域的专用软件,如人口普查软件、财务软件等。
5、简述软件生存周期。
3
答:一个软件从无到有,一直到最后的消亡(报废),通常要经历一个过程,这个过程称为软件生存周
期。它分成若干阶段:软件需求分析、软件设计、编程实现、测试以及运行与维护。软件需求分析的
主要任务是明确待实现的软件要解决什么问题,即做什么,给出软件的需求说明。软件设计是根据软
件的需求说明给出抽象的解决方案(设计说明),它包括概要设计和详细设计。概要设计是指软件的整
体结构设计;详细设计是指抽象的数据结构和算法描述。编程实现是指根据软件设计说明,采用某种
程序设计语言编写程序。测试是对编写好的程序进行测试,确认其是否满足所规定的需要。运行与维
护是指使用软件并在使用过程中发现和改正程序中的错误。
6、机器语言、汇编语言以及高级语言的不同之处是什么?
答:机器语言采用指令编码和数据的存储位置来表示操作以及操作数。机器语言写的程序可以直接在
计算机上执行。
汇编语言是用符合名来表示操作和操作数位置,以增加程序的易读性,它与机器语言一一对应。
用汇编语言写的程序必须通过汇编程序翻译成机器语言程序才能执行。
高级语言是指人容易理解和有利于人对解题过程进行描述的程序语言,一条语句可能会对应多条
机器指令。用高级语言书写的程序需要通过编译程序或解释程序翻译成机器语言程序才能在计算机上
运行。
7、简述编译与解释的区别。
答:编译是指把高级语言程序首先翻译成功能上等价的机器语言程序或汇编语言程序,然后执行目标
代码程序,在目标代码程序的执行中不再需要源程序。
解释则是指对源程序中的语句进行逐条翻译并执行,翻译完了程序也就执行完了,这种翻译方式
不产生目标程序。一般来说,编译执行比解释执行效率要高。
8、简述程序设计的步骤。
答:程序设计一般遵循以下步骤:
明确问题; 系统设计; 用某种语言进行编程; 测试与调试; 运行与维护
9、下面哪一些是合法的 C++标识符?
extern, _book, Car, car_1, ca1r, 1car, friend, car1_Car, Car_Type, No.1, 123
答:合法的 C++标识符:_book, Car, car_1, ca1r, car1_Car, Car_Type
10、简述 C++程序的编译执行过程。在你的 C++开发环境中运行 1.3.2 节中给出的简单 C++程序。
答:首先可以利用某个编辑程序把 C++源程序输入到计算机中,并作为文件保存到外存中,文件名为
“*.cpp”和“*.h”。然后利用某个 C++编译程序对保存在外存中的 C++源程序进行编译,编译结果作
4
为目标文件保存到外存,文件名为“*.obj”。然后再通过一个联接程序把由源文件产生的目标文件以
及程序中用到的一些系统功能所在的目标文件联接起来,作为一个可执行文件保存到外存,文件名为
“*.exe”。最后通过操作系统提供的应用程序运行机制,把可执行文件装入内存,运行其中的可执行
程序。
在 Visual C++环境中,首先要建立一个 project(项目);其次往该 project 中添加、编辑程序模块
(源文件);然后选择菜单 Build 中的 Build ... 或 Rebuild All;最后选择菜单 Build 中的 Execute ...运行
程序。
第 2 章 基本数据类型和表达式
1、 C++提供了哪些基本数据类型?检查你的计算机上各种类型数据所占内存空间的大小(字节数)。
答:C++提供了以下 5 种基本数据类型:整数类型、实数类型、字符类型、逻辑类型以及空值类型。
一台计算机上各种数据类型的数据所占用的内存大小(字节数)可以通过“sizeof(类型名)”来计
算。
2、 下面哪一些是合法的 C++字面常量,它们的类型是什么?
-5.23, 1e+50, -25, 105, 20
.20, e5, 1e-5, -0.0e5, '\n'
-000, 'A', '5', '3.14', false
red, '\r', '\f' "Today is Monday.", "\""
答:字面常量是指在程序中直接写出常量值的常量。-5.23, 1e+50,-25, 20 ,.20, 1e-5, -0.0e5,
'\n', -000, 'A', '5', '\r', '\f' , "Today is Monday.", "\""都是字面常
量。其中:
整数类型常量:-25, 20, -000
实数类型常量:-5.23, 1e+50 , .20, 1e-5, -0.0e5
字符常量: '\n', 'A', '5', '\r', '\f'
字符串常量:"Today is Monday.", "\""
3、 什么是符号常量?符号常量的优点是什么?
答:符号常量是指有名字的常量。程序中使用符号常量有以下优点:
1) 增加程序易读性
2) 提高程序对常量使用的一致性
3) 增强程序的易维护性
4、 如何理解变量?变量定义和声明的作用是什么?
答:在程序中,其值可以改变的量称为变量。变量可以用来表示可变的数据。
5
程序中使用到的每个变量都要有定义。变量定义指出变量的类型和变量名,另外还可以为变量提
供一个初值。
C++中使用变量之前,必须对使用的变量进行声明(变量定义属于一种声明,即:定义性声明),
变量声明指出了一个变量的类型,使得编译程序能对变量的操作进行类型检查并做相应的类型转
换。
整个程序中,某变量的定义只能由一个,但它的声明可以有多个。
5、 什么是表达式?其作用是什么?
答:表达式是由操作符、操作数以及圆括号所组成的运算式。在程序设计语言中,对数据操作的具体
实施是通过表达式来描述的。
6、 操作符的优先级和结合性分别是指的什么?
答:运算符的优先级和结合性决定表达式中各个运算符的运算次序。操作符的优先级规定了相邻的两
个操作符谁先运算:优先级高的先计算;如果相邻的两个操作符具有相同的优先级,则需根据操
作符的结合性来决定先计算谁,操作符的结合性通常分为左结合和右结合:左结合表示从左到右
计算,右结合表示从右到左计算。
7、 表达式中的类型转换规则是什么?下面的表达式计算时如何进行操作数类型转换?
(1)3/5*12.3
(2)'a'+10*5.2
(3)12U+3.0F*24L
1)3 与 5 同类型,不转换,结果为 0,转换成double型后与 12.3 做乘法。
2)10 转换成double型与 5.2 做乘法,’a’转换成double型后与前者结果做加法。
3)3.0F与 24L均转换成double型后做乘法,12U转换成double型后与前者结果做加法。
答:表达式中类型转换规则是:基于单个操作符依次进行转换。
8、 将下列公式表示成 C++的表达式:
+−
b
(1)
4
ac
2 −
b
a
2
(可利用 C++标准库中的求平方根的函数:sqrt(x))
(2)
(3)
sbsass
(
)(
)(
−
−
−
c
)
ba
⋅
dc
⋅
⋅
1
+
3
b
5.2
+
c
+
4
3r
⋅
⋅
π
3
答:1)(-1*b+sqrt(b*b-4*a*c))/(2*a)
2)sqrt(s*(s-a)*(s-b)*(s-c))
3)((a*b)/(c*d))*(3/(1+(b/(2.5+c))))+(4*pi*r*r*r/3)
9、写出下列条件的 C++表达式
(1)i 能被 j 整除。
(2)ch 为字母字符。
(3)m 为偶数。
(4)n 是小于 100 的奇数。
(5)a、b、c 构成三角形的三条边。
6
答:1)i%j==0
2)((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))
3)m%2==0
4)(n<100)&&(n%2!=0)
5)(a>0) && (b>0) && (c>0) && (a+b>c) && (b+c>a) && (c+a>b)
或
((a+b)>c)&&(abs(a-b)0)&&(b>0)&&(c>0)可以不用判断
10、在你的计算机上运行下面的程序:
#include
using namespace std;
int main()
{ double a=3.3, b=1.1;
int i=a/b;
cout << i << endl;
return 0;
}
结果与你预期的是否相符?如果不符,请解释它的原因。
答:运行结果为 2。由于十进制小数转成double型编码的问题导致精确度不够,通过查看结果内存内的
内容,最终结果比 3.0 略小(为 3.0-4.44089e-016),所以强制转换成int型后结果为 2。
11、不引进第三个变量,如何交换两个整型变量的值?
答:方法一:
a=b^a;
b=a^b;
a=b^a;
方法二:
a=a+b;
b=a-b;
a=a-b;
第 3 章 程序的流程控制――语句
7
1、 编写一个程序,将华氏温度转换为摄氏温度。转换公式为:
c =
5
9
解:
(f-32),其中,c 为摄氏温度,f 为华氏温度
#include
using namespace std;
int main()
{ double c, f;
cout << "Please input a F-temperature : " << endl;
cin >> f;
c = (f - 32) * 5 / 9;
cout << "The C-temperature is : " << c << endl;
}
return 0;
2、 编写一个程序,将用 24 小时制表示的时间转换为 12 小时制表示的时间。例如,输入 20 和 16(20
点 16 分),输出 8:16pm;输入 8 和 16(8 点 16 分),输出 8:16am。
解:
if (hour<0 || hour>23)
#include
using namespace std;
int main()
{ int hour, minute;
char noon;
cout << "Please input a time in 24-hour format: " << endl;
cout << "hour: "; cin >> hour;
{ cout << "The input hour is wrong!" << endl;
}
{ hour =hour - 12;
}
else
cout << "minute: "; cin >> minute;
{ cout << "The input minute is wrong!" << endl;
if (minute<0 || minute>59)
noon = 'a';
exit(-1);
if (hour>12)
noon = 'p';
8
exit(-1);
if (noon == 'p')
}
cout << endl << "The time in 12-hour format is : " << hour << ":" << minute;
else
return 0;
}
cout << "pm" << endl;
cout << "am" << endl;
3、 编写一个程序,分别按正向和逆向输出小写字母 a~z。
解:
cout << c << " ";
#include
using namespace std;
int main()
{ for (char c='a'; c<='z'; c++)
cout << endl;
cout << endl;
}
for (c='z'; c>='a'; c--)
cout << c << " ";
return 0;
4、 编写一个程序,从键盘输入一个正整数,判断该正整数为几位数,并输出其位数。
解:
int count = 0;
#include
using namespace std;
int main()
{ unsigned int gzint;
while (1)
{ cout << "Please input a integer(greater than zero) : " << endl;
cin >> gzint;
if (gzint<=0)
cout << "Your input is wrong!Please input again..." << endl;
else