程序设计习题解答
发布时间:2024-09-20
发布时间:2024-09-20
程序设计教程
--用C++语言编程
(第二版习题解答)
目 录
第1章 概述 ................................................................................................................................................. 2 第2章 基本数据类型和表达式 ................................................................................................................. 4 第3章 程序的流程控制――语句 ............................................................................................................. 7 第4章 过程抽象――函数 ....................................................................................................................... 16 第5章 构造数据类型 ............................................................................................................................... 22 第6章 数据抽象――类 ........................................................................................................................... 37 第7章 操作符重载 ................................................................................................................................... 53 第8章 继承――派生类 ........................................................................................................................... 77 第9章 类属(泛型)机制――模板 ....................................................................................................... 87 第10章 输入/输出(I/O) ...................................................................................................................... 93 第11章 异常处理 ................................................................................................................................... 101 第12章 实例--面向对象的Windows应用程序框架 ...................................................................... 102
第1章 概述
1、简述冯 诺依曼计算机的工作模型。
答:冯 诺依曼计算机的工作模型是:待执行的程序从外存装入到内存中,CPU从内存中逐条地取程序中的指令执行;程序执行中所需要的数据从内存或从外设中获得,程序执行中产生的中间结果保存在内存中,程序的执行结果通过外设输出。
2、简述寄存器、内存以及外存的区别。
答:寄存器主要用于记录下一条指令的内存地址、当前指令的执行状态以及暂时保存指令的计算结果供下一(几)条指令使用,其作用主要是减少访问内存的次数,提高指令的执行效率。 内存用于存储计算机程序(指令和数据),内存由许多存储单元构成,每个存储单元都有一个地址,对存储单元的访问是通过其地址来进行的,与寄存器相比,内存的容量要大得多,但指令访问内存单元所花费的时间比访问寄存器要多得多。
外存是大容量的低速存储部件,用于永久性地存储程序、数据以及各种文档等信息,存储在外存中的信息通常以文件形式进行组织和访问,外存储了在容量和速度上与内存不同,另一个区别在于内存中存储的是正在运行的程序和正在使用的数据,外存中存储的则是大量的、并非正在使用的程序和数据。
3、CPU能执行哪些指令? 答:CPU所能执行的指令通常有: 算术指令:实现加、减、乘、除等运算。 比较指令:比较两个操作数的大小。
数据传输指令:实现CPU的寄存器、内存以及外设之间的数据传输。
执行流程控制指令:用于确定下一条指令的内存地址,包括转移、循环以及子程序调用/返回等指令。
4、什么是软件?软件是如何分类的?
答:计算机软件是计算机系统中的程序以及有关的文档。程序是对计算任务的处理对象(数据)与处理规则(算法)的描述;文档是为了便于人理解程序所需的资料说明,供程序开发与维护使用。
软件通常可以分为系统软件、支撑软件和应用软件。系统软件居于计算机系统中最靠近硬件的一级,它与具体的应用领域无关,其他软件一般要通过系统软件发挥作用,如操作系统属于系统软件。支撑软件是指支持软件开发与维护的软件,一般由软件开发人员使用,如软件开发环境就是典型的支撑软件。应用软件是指用于特定领域的专用软件,如人口普查软件、财务
软件等。
5、什么是虚拟机?
答:在由硬件构成的计算机(称为“裸机”)之上,加上一些软件就得到了一个比它功能更强的计算机,称为“虚拟机”。
6、十进制数0.1的二进制表示是什么?
答:(0.1)102,它是无限循环小数。也就是说,十进制数0.1无法精确用二进制表示!
7、简述程序设计范型。
答:基于不同的计算模型来对计算进行描述就形成了不同的程序设计范型。典型的程序设计范型有:过程式、对象式、函数式以及逻辑式等。
过程式程序设计是一种以功能为中心、基于功能分解和过程抽象的程序设计范型。一个过程式程序由一些子程序构成,每个子程序对应一个子功能,它实现了功能抽象。
对象式程序设计是一种以数据为中心、基于数据抽象的程序设计范型。一个面向对象程序由一些对象构成,对象是由一些数据及可施于这些数据上的操作所组成的封装体。
函数式程序设计是围绕函数来进行的,计算过程体现为一系列的函数应用。
逻辑程序设计是把程序组织成一组事实和一组推理规则,在事实基础上运用推理规则来实施计算。
8、简述程序设计的步骤。 答:程序设计一般遵循以下步骤:
明确问题; 系统设计; 用某种语言进行编程; 测试与调试; 运行与维护
9、低级语言与高级语言的不同之处是什么?
答:低级语言是指与特定计算机体系结构密切相关的程序语言,它是特定计算机能够直接理解的语言(或与之直接对应的语言),包括机器语言和汇编语言。低级语言的优点在于:写出的程序效率比较高,包括执行速度快和占用空间少。其缺点是:程序难以设计、理解与维护,难以保证程序的正确性。
高级语言是指人容易理解和有利于人对解题过程进行描述的程序语言。高级语言的优点在于:程序容易设计、理解与维护,容易保证程序正确性。高级语言的缺点是:用其编写的程序相对于用低级语言编写的程序效率要低,翻译成的目标代码量较大。
10、简述编译与解释的区别。
答:编译是指把高级语言程序首先翻译成功能上等价的机器语言程序或汇编语言程序,然后执行目标代码程序,在目标代码程序的执行中不再需要源程序。
解释则是指对源程序中的语句进行逐条翻译并执行,翻译完了程序也就执行完了,这种翻译方式不产生目标程序。一般来说,编译执行比解释执行效率要高。
11、简述C++程序的编译执行过程。在你的C++开发环境中运行1.3.2节中给出的简单C++
程序。 答:首先可以利用某个编辑程序把C++源程序输入到计算机中,并作为文件保存到外存中,文件名为“*.cpp”和“*.h”。然后利用某个C++编译程序对保存在外存中的C++源程序进行编译,编译结果作为目标文件保存到外存,文件名为“*.obj”。然后再通过一个联接程序把由源文件产生的目标文件以及程序中用到的一些系统功能所在的目标文件联接起来,作为一个可执行文件保存到外存,文件名为“*.exe”。最后通过操作系统提供的应用程序运行机制,把可执行文件装入内存,运行其中的可执行程序。
在Visual C++ 6.0环境中,首先要建立一个project(项目);其次往该project中添加、编辑程序模块(源文件);然后选择菜单Build中的Build ... 或Rebuild All;最后选择菜单Build中的Execute ...运行程序。
12、C++的单词分成哪些种类?
答:构成C++的单词有:标识符、关键词、字面常量、操作符以及标点符号等。
13、下面哪一些是合法的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
第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、 如何理解变量?变量定义和声明的作用是什么?
答:在程序中,其值可以改变的量称为变量。变量可以用来表示可变的数据。
程序中使用到的每个变量都要有定义。变量定义指出变量的类型和变量名,另外还可以为
变量提供一个初值。 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 b2 4ac(1) (可利用C++标准库中的求平方根的函数:sqrt(x))
2a
(2)s(s a)(s b)(s c)
a b(3)
c d
31 b2.5 c
4 r3
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构成三角形的三条边。
答: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)<c) //(a>0)&&(b>0)&&(c>0)可以不用判断 10、在你的计算机上运行下面的程序:
#include <iostream> using namespace std; int main()
{ double a=3.3, b=1.1; int i=a/b;
cout << i << endl; return 0; }
结果与你预期的是否相符?如果不符,请解释它的原因。
答:运行结果为2。由于十进制小数3.3和1.1无法用double型精确表示。通过查看结果内存内
的内容,最终结果比3.0略小,所以强制转换成int型后结果为2。
11、不引进第三个变量,如何交换两个整型变量的值? 答:方法一:
a=b^a; b=a^b; a=b^a; 方法二: a=a+b; b=a-b; a=a-b;
12、举例说明把int类型转成float类型可能会丢失精度。
答:如果int型与float型都是4个字节,由于在float型的数据表示中,有若干位用来表示指数,因此,尾数的位数不到4个字节(根据IEEE标准,只有23个二进制位)。如果一个int型的数大于23位(二进制),则无法用float型精确表示。例如: int x=0x01000001;
float y=x; //x的最后一位"1"不是被截掉就是被舍入! cout << x << endl << setprecision(30) << y << endl;
第3章 程序的流程控制――语句
1、 编写一个程序,将华氏温度转换为摄氏温度。转换公式为:
c =
5
(f-32),其中,c为摄氏温度,f为华氏温度 9
解:
#include <iostream> using namespace std; int main() { double c, f;
cout << "Please input an 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。 解:
#include <iostream> using namespace std; int main()
{ int hour, minute; char noon;
cout << "Please input a time in 24-hour format: " << endl; cout << "hour: "; cin >> hour; if (hour<0 || hour>23)
{ cout << "The input hour is wrong!" << endl; return -1; }
if (hour>12)
{ hour =hour - 12; noon = 'p'; } else
noon = 'a';
cout << "minute: "; cin >> minute; if (minute<0 || minute>59)
{ cout << "The input minute is wrong!" << endl; return -1; }
cout << endl << "The time in 12-hour format is : " << hour << ":" << minute; if (noon == 'p')
cout << "pm" << endl; else
cout << "am" << endl; return 0; }
3、 编写一个程序,分别按正向和逆向输出小写字母a~z。 解:
#include <iostream> using namespace std; int main() { char c;
for (c='a'; c<='z'; c++) cout << c << " "; cout << endl;
for (c='z'; c>='a'; c--)
cout << c << " "; cout << endl; return 0; }
4、 编写一个程序,从键盘输入一个正整数,判断该正整数为几位数,并输出其位数。 解:
#include <iostream> using namespace std; int main()
{ unsigned int gzint; int count = 0; while (1)
{ cout << "Please input an integer(greater than zero) : " << endl; cin >> gzint; if (gzint<=0)
cout << "Your input is wrong! Please input again..." << endl; else break; }
while (gzint!=0)
{ gzint = gzint / 10; count++; }
cout << "The number of digits in the interger is : " << count << endl; return 0; }
5、 编写一个程序,对输入的一个算术表达式(以字符#结束),检查圆括号配对情况。输出:
配对、多左括号或多右括号。 解:
#include <iostream> using namespace std; int main() { int count=0; char ch;
cout << "Please input an expression : " << endl; for (cin >> ch; ch != '#'; cin >> ch) { if (ch == '(') count++;
else if (ch == ')') count--; }
if (count == 0)
cout << "配对!" << endl; else if (count > 0)
cout << "多左括号!" << endl; else
cout << "多右括号!" << endl; return 0; }
6、 编写一个程序,输入一个字符串(以字符#结束),对其中的“>=”进行计数。 解:
#include <iostream>
using namespace std; int main() { int count=0;
char ch1='\0',ch2;
cout << "Please input a string(terminated with #): " << endl;
for (cin>>ch2; ch2 != '#' ; cin>>ch2)
{ if (ch2 == '=' && ch1 == '>') count++; ch1 = ch2; }
cout << "Number of >=: " << count << endl; return 0; }
7、 假定邮寄包裹的计费标准如下(重量在档次之间时往上一挡靠):
重量(克) 收费(元)
15 5 30 9 45 12
60 14(每满1000公里加收1元) 60以上 15(每满1000公里加收2元)
编写一个程序,输入包裹重量和邮寄距离,计算并输出收费数额。
解:
#include <iostream>
using namespace std; int main() { int charge; double weight;
cout << "Please input the weight of the package : " << endl; cin >> weight; if (weight <= 0)
cout << "The input weight is wrong!" << endl; else if (weight <= 15) charge = 5;
else if (weight <= 30) charge = 9;
else if (weight <= 45) charge = 12; else
{ double distance;
cout << "Please input the distance : " << endl; cin >> distance; if (distance <= 0)
cout << "The inputed distance is wrong!" << endl; else { distance /= 1000; if (weight <= 60)
charge = 14 + (int)distance; else
charge = 15 + (int)distance * 2; } }
cout << charge << endl; return 0;
}
8、 编写一个程序,计算圆周率。可利用公式:
4 1
111
357
直到最后一项的绝对值小于10-8。 解:
#include <iostream> #include <cmath> using namespace std;
int main()
{ double item=1.0,sum=0.0; int i=1, sign=1;
while (fabs(item) >= 1e-8) { sum += item; sign *= -1; i += 2;
item = sign/(double)i; }
cout << setprecision(8) << sum*4 << endl; return 0; }
9、 编写一个程序,求所有这样的三位数,它们等于它们的各位数字的立方和。例如:
153 = 13 + 33 + 53
解:
#include <iostream> using namespace std; int main()
{ for (int n = 100; n <= 999; n++) { int i,j, k;
i = n/100; //百位数字 j = n%100/10; //十位数字 k = n%10; //个位数字 if (n == i*i*i+j*j*j+k*k*k) cout << n << endl; }
return 0; } 或
#include <iostream> using namespace std; int main()
{ for (int i=1; i<=9; i++) { int n=i*100,m=i*i*i; for (int j=0; j<=9; j++)
{ int n1=n+j*10,m1=m+j*j*j; for (int k=0; k<=9; k++) { if (n1+k == m1+k*k*k)
cout << n1+k << endl; } } }
return 0; }
10、编写一个程序,求a和b的最大公约数。 解:
#include <iostream> using namespace std; int main() { int a, b;
cout << "Please input a, b : " << endl; cin >> a >> b; int c=(a>b)?b:a; while (c > 0)
{ if (a%c == 0 && b%c == 0) break; c--; }
cout << c << endl; return 0; } 或
#include <iostream> using namespace std; int main() { int a, b;
cout << "Please input a, b : " << endl; cin >> a >> b; int c; do
{ c = a-b*(a/b); a = b; b = c;
} while (c != 0); cout << a << endl; return 0;
}
11、编写一个程序,输出十进制乘法表。
解:
#include <iostream> using namespace std; int main()
{ for (int i = 0; i < 10; i++) { if (i != 0) cout << i; cout << "\t";
for (int j = 1; j < 10; j++) if (i * j != 0)
cout << i * j << "\t"; else
cout << j << "\t"; cout << endl; }
return 0; }
12、将下面的for循环重写为等价的while循环。
for (i=0; i<max_length;i++)
if (input_line[i]== '?') quest_count++;
解: i = 0;
while (i < max_length) { if (input_line[i] == '?') quest_count++; i++; }
13、说明下面的三个程序可以用图3-6中的三种控制结构来表示。
第4章 过程抽象――函数
1、 简述子程序的作用。
答:子程序是有名字的一段程序代码,它通常完成一个独立的(子)功能。在程序的其他地方
通过子程序的名字来使用它们。除了能减少程序代码外,采用子程序的主要作用是实现过程抽象,使用者只需知道子程序的功能,而不需要知道它是如何实现的,这有利于大型、复杂程序的设计和理解。
2、 简述局部变量的作用。
答:1、实现信息隐藏,使得函数外无法访问该函数内部使用的数据。
2、减少名冲突,一个函数可以为局部变量定义任何合法名字,而不用担心与其他函数的局部变量同名。
3、 简述变量的生存期和标识符的作用域。
答:变量的生存期指程序运行时一个变量占有内存空间的时间段。C++把变量的生存期分为静
态、自动和动态三种。标识符的作用域是指:一个定义了的标识符的有效范围,即该标识符所标识的程序实体能被访问的程序段。在C++中,根据标识符的性质和定义位置规定了标识符的作用域。作用域分为:全局作用域、文件作用域、局部作用域、函数作用域、函数原型作用域、类作用域、名空间作用域。
4、 全局标识符与局部标识符在哪些方面存在不同? 答:1、作用域不同
2、生存期不同
3、用途不同,全局标识符用于标识共享的实体,而局部标识符用于标识专用的实体。
5、 下面的声明中哪一些是定义性声明?这些定义性声明的非定义性声明是什么? (1)const int i=1;
(2)static double square(double dbl) { return dbl*dbl; } (3)char *str; (4)struct Point;
(5)char* (*pFn)(int(*)(char*,int),char**); 答:1)是。非定义性声明:extern const int i;
2、局部变量的内存空间在栈中分配,函数调用完之后释放,因此,使用局部变量能节省程序的内存空间。
上一篇:向面试官提问技巧