基于过程的程序设计
第1章 C++的初步知识
1. 请根据你的了解,叙述C+的特点。C++对C有哪些发展?
2. 一个 C++程序是由哪几部分构成的?其中的每一部分起什么作用?
3. 从接到一个任务到得到最终结果,一般要经过几个步骤?
4. 请说明编辑、编译、连接的作用。在编译后得到的目标文件为什么不能直接运行?
5. 分析下面程序运行的结果。请先阅读程序,写出程序运行时应输出的结果,然后上机运行程序,验证自己分析的结果是否正确。以下各题与此同。
#include <iostream>
using namespace std;
int main() {
cout << "This " << "is ";
cout << "a " << "C++ ";
cout << "program.";
cout << endl;
return 0;
}
This is a C++ program.
6. 分析下面程序运行的结果。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
a = 10;
b = 23;
c = a + b;
cout << "a+b= ";
cout << c;
cout << endl;
return 0;
}
a+b= 33
7. 分析下面程序运行的结果。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
int f(int x, int y, int z);
cin >> a >> b >> c;
c = f(a, b, c);
cout << c << endl;
return 0;
}
int f(int x, int y, int z) {
int m;
if (x < y)m = x;
else m = y;
if (z < m)m = z;
return(m);
}
1
2
3
1
8.在你所用的C++系统上,输入以下程序,进行编译,观察编译情况,如果有错误请修改程序,再进行编译,直到没有错误,然后进行连接和运行,分析运行结果。
int main() ;
{
int a, b;
c = a + b;
cout >> "a+b= " >> a + b;
}
正确代码:
#include<iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b;
c = a + b;
cout << "a+b= " << c;
return 0;
}
/*
1
2
a+b= 3
*/
9. 输入以下程序,进行编译,观察编译情况,如果有错误,请修改程序,再进行编译,直到没有错误,然后进行连接和运行,分析运行结果。
#include<iostream>
using namespace std;
int main() {
int a, b;
c = add(a, b)
cout << "a+b=" << c <<endl;
return 0;
}
add(int x, int y) {
z = x + y;
return(z);
}
正确代码:
#include<iostream>
using namespace std;
int add(int x, int y);// 1 声明
int main() {
int a, b,c;// 2
cin >> a >> b;// 3 cin >> a >> b >>endl;错误
c = add(a, b);// 4
cout << "a+b=" << c <<endl;
return 0;
}
int add(int x, int y) //5
{
int z;// 6
z = x + y;
return(z);
}
/*
1
2
3
*/
10.输入以下程序,编译并运行,分析运行结果。
#include<iostream>
using namespace std;
int main() {
void sort(int x, int y, int z);
int x, y, z;
cin >> x >> y >> z;
sort(x, y, z);
return 0;
}
void sort(int x, int y, int z) {
int temp;
if (x > y) {
temp = x;x = y;y = temp; //{}内3个语句的作用是将x和y的值互换
}
if (z < x)cout << z << ',' << x << ',' << y << endl;
else if (z < y)cout << x << ',' << z << ',' << y << endl;
else cout << x << ',' << y << ',' << z << endl;
}
第2章 数据的存储、表示形式和基本运算
1. C++为什么要规定对所有用到的变量要“先定义,后使用”。这样做有什么好处?
2. 字符常量与字符串常量有什么区别?
3. 写出以下程序运行的结果。请先阅读程序,分析应输出的结果,然后上机验证。
#include <iostream>
using namespace std;
int main() {
char cl = 'a', c2 = 'b', c3 = 'c', c4 = '\101', c5 = '\116';
cout << cl << c2 << c3 << '\n';
cout << "\t\b" << c4 << '\t' << c5 << '\n';
return 0;
}
#include <iostream >
using namespace std;
int main() {
char cl = 'a', c2 = 'b', c3 = 'c', c4 = '\101', c5 = '\116';
cout << cl << cl << cl << c2 << c2 << c2 <<c3 << c3 << c3 << '\n';
cout << "\t\b" << c4 << '\t' << c5 << '\n';
cout << cl << cl << cl << c2 << c2 << c2 << c3 << c3 << c3 << '\n';
cout << "\t" << c4 << '\t' << c5 << '\n';
return 0;
}
/*
aaabbbccc
A N
aaabbbccc
A N
*/
4.写出以下程序运行的结果。请先阅读程序,分析应输出的结果,然后上机验证。
#include < iostream >
using namespace std;
int main()
{
char cl = 'C', c2 = '+', c3 = '+';
cout << "I say: \"" << cl << c2 << c3 << '\"';
cout << "\t\t" << "He says: \"C ++ is very interesting!\"" << '\n';
return 0;
}
/*
I say: "C++" He says: "C ++ is very interesting!"
*/
I say: "C++" He says: "C ++ is very interesting!"
I say: "C++" He says: "C ++ is very interesting!"
12空格还是16空格????
#include <iostream>
using namespace std;
int main()
{
char cl = 'C', c2 = '+', c3 = '+';
cout << "I say: \"" << cl << c2 << c3 << '\"';
cout << "\t" << "He says: \"C ++ is very interesting!\"" << '\n';
cout << "I say: \"" << cl << c2 << c3 << '\"';
cout << "\t\t" << "He says: \"C ++ is very interesting!\"" << '\n';
return 0;
}
/*
I say: "C++" He says: "C ++ is very interesting!"
I say: "C++" He says: "C ++ is very interesting!"
*/
5. 请写出下列表达式的值。
(1) 3.5*3+2*7-'a'
(2) 26/3+34%3+2.5
(3) 45/2+(int)3.14159/2
(4) a=b=(c=a+=6) //设a的初值为3
(5) a=3*5,a=b=3*2
(6) (int)(a+6.5)%2+(a=b=5) //设a的初值为3
(7) x+a%3*(int)(x+y)%2/4 //设x=2.5,a=7,y=4.7
(8) (float)(a+b)/2+(int)x%(int)y //设a=2,b=3,x=3.5,y=2.5
#include<iostream>
using namespace std;
int main() {
cout << 3.5 * 3 + 2 * 7 - 'a' << endl;// 'a'=97 3.5 * 3 + 2 * 7 - 'a'为-72.5
cout << 26 / 3 + 34 % 3 + 2.5 << endl;// 26 / 3为8 26 / 3 + 34 % 3 + 2.5为11.5
cout << 45 / 2 + (int)3.14159 / 2 << endl;// 45 / 2为22 (int)3.14159 / 2为1 45 / 2 + (int)3.14159 / 2为23
int a = 3, b, c;
a = b = (c = a += 6);// a=3+6=9 b=9 c=9 运算顺序从右往左
cout << a << ',' << b << ',' << c << endl;
int m, n;
m = 3 * 5;
m = n = 3 * 2;// m=6 n=6
cout << m << ',' << n << endl;
int o = 3, p;
cout << (int)(o + 6.5) % 2 + (o = p = 5) << endl;// 3+6.5=9.5 (int)9.5=9 9%2=1 5 1+5=6
float x = 2.5, y = 4.7;
int z = 7;
cout << x + z % 3 * (int)(x + y) % 2 / 4 << endl;
float q = 2, w = 3, e = 3.5, r = 2.5;
cout << (float)(q + w) / 2 + (int)e % (int)r << endl;// 2+3=5 5/2=2.5 3.5%2=1 2.5+1=3.5
return 0;
}
/*
-72.5
11.5
23
9,9,9
6,6
6
2.5
3.5
*/
#include<iostream>
using namespace std;
int main() {
float x = 5.0,a = 2.9,b = 2.1;
int y = 5;
cout << x << endl;
cout << float(y) << endl;
cout << int(a) << endl;
cout << int(b) << endl;
return 0;
}
/*
5
5
2
2
*/
6. 写出下面表达式运算后a的值,设原来a=12。设a和n已定义为整型变量。
(1) a+=a 24
(2) a-=3 9
(3) a*=2+3 60
(4) a/=a+a 0
(5) a%=(n%=2),n的值等于 5 0
(6) a+=a-=a*=a 0
7. 写出程序运行结果。请先阅读程序,分析应输出的结果,然后上机验证。
#include <iostream>
using namespace std;
int main() {
int i, j, m, n;
i = 8;
j = 10;
m = ++i + j++;
n = (++i) + (++j) + m;
cout << i << '\t' << j << '\t' << m << '\t' << n << endl;
return 0;
}
10 12 19 41
8. 将"Chia"译成密码,密码规律是: 用原来的字母后面第4个字母代替原来的字母。例如,字母A后面第4个字母是E,用E代替A。因此,"China"应译为"Glmre"。请编写一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为‘C',’h‘,'i','n','a' 。经过运算,使c1,c2,c3,c4,c5 分别变为'G','l','m','r','e' ,并输出。
#include <iostream>
using namespace std;
int main( )
{
char c1='C', c2 = 'h', c3='i', c4='n', c5='a';
c1+=4;
c2+=4;
c3+=4;
c4+=4;
c5+=4;
cout << "password is:" << c1 << c2 << c3 << c4 << c5 << endl;
return 0;
}
/*
password is:Glmre
*/
第3章 程序设计初步
1.怎样区分表达式和表达式语句?℃语言为什么要设表达式语句?什么时候用表达式,什么时候用表达式语句?
【解】 略。
2.设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用 cin 输入数据,输出计算结果,输出时要求有文字说明,取小数点后两位数字。请编写程序。
3.输入一个华氏温度,要求输出摄氏温度。公式为c=5/9(F-32),输出要有文字说
明,取两位小数。
4.编写程序,用 getchar 函数读入两个字符给cl,c2,然后分别用 putchar 函数和 cout语句输出这两个字符。并思考以下问题:
(1)变量cl,c2应定义为字符型还是整型?抑或二者皆可?
(2)如果要求输出cl和 c2值的 ASCI码,应如何处理?
5.整型变量与字符变量是否在任何情况下都可以互相代替?如
char cl,c2;
与 int cl,c2;是否无条件地等价?
6.什么是算术运算?什么是关系运算?什么是逻辑运算?
【解】 略。
7.C++如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
8.写出下面各逻辑表达式的值。设a=3,b=4,c=5。
(1)a+b>c&&b==c
(2)alb+c&&b-c
(3)!(a>b)&&!c|1!(x=a)&&(y=b)&&0(5)!(a+b)+c-1&& b+c/2
9.有3个整数a,b,c,由键盘输入,输出其中最大的数。
11.给出一个百分制的成绩,要求输出成绩等级'A','B''E'。90 分以上为'A',80~89 分为' B',70~79 分为'C,60~69 分为' D',60 分以下为' E'。
12.给出一个不多于5位的正整数,要求:①求出它是几位数:(位数字:③按逆序打印出各位数字,例如原数为321,应输出123。
②分别打印出每一
13.企业发放的奖金来自利润提成。利润i低于或等于10万元的,可提成10%为奖金;利润i高于 10万元,低于或等于 20万元,即 100000<i≤200000 时,低于10万元的部分按 10%提成,高于10万元的部分可提成7.5%:200000<i<400000时,低于20万的部分仍按上述办法提成(下同),高于20万元的部分按5%提成:400000<i<600000时,高于 40 万元的部分按 3%提成:600000<i<1000000 时,高于60万元的部分按 1.5%提成:i>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润i,求应发奖金总数。
要求:
(1)用if语句编程序;
(2)用 switch 语句编程序。
14.输入4个整数,要求按由小到大的顺序输出。
15.输入两个正整数m和n,求其最大公约数和最小公倍数。
16.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
20.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出 1000 之内的所有完数,并按下面格式输出其因子:
6,its factors are l,2,3
22. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半另加一个。到第 10 天早上想再吃时,就只剩一个桃子了。求第1天共摘了多少桃子。
第4章 利用函数实现指定的功能
1.编写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用两个函数,并输出结果,两个整数由键盘输入。3.编写一个判别素数的函数,在主函数中输入一个整数,输出是否为素数的信息。
4.求 a!+b!+c!的值,用一个函数 fc(n)求n!。a,b,c的值由主函数输入,最终得到的值在主函数中输出。
7.编写一个函数验证哥德巴赫猜想:一个不小于6的偶数可以表示为两个素数之和,如6=3+3,8=3+5,10-3+7……在主函数中输入一个不小于6的偶数n,然后调用函数 gotbaha,在 gotbaha函数中再调用 prime函数,prime 函数的作用是判别一个数是否为素数。在 godbah函数中输出以下形式的结果:
34-3+31
10.用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串"483"n的位数不确定,可以是任意位数的整数。
第5章 利用数组处理批量数据
1.用筛选法求 100之内的素数。
2.用选择法对10个整数排序。
3.求一个3x3 矩阵对角线元素之和。
4.有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。
5.将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改
为1,4,5,6,8.
7.找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小(也可能没有鞍点)。
8.有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。
9. 给出年、月、日,计算该日是该年的第几天。
10.有一篇文章,共有3行文字,4每行最多有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
13.编写一程序,将两个字符串连接起来,结果取代第一个字符串。(1)用字符数组,不用strcat函数(即自己编写一个具有 strcat函数功能的函数):(2)用标准库中的 strcat 函数;
(3)用string 方法定义字符串变量。
14.输入n个字符串,将它们按字母由小到大的顺序排列并输出。
15.输入n个字符串,把其中以字母A打头的字符串输出:
16.输入一个字符串,把其中的字符按逆序输出。如输入LIGHT,则输出 THGIL。
(1)用字符数组方法;
(2)用 string 方法。
17.输入 10个学生的姓名、学号和成绩,将其中不及格者的姓名、学号和成绩输出。
第6章 善于使用指针与引用
本章习题要求用指针或引用方法处理。
1.输入3个整数,按由小到大的顺序输出。
2.输人3个字符串,按由小到大的顺序输出。
3.输入 10 个整数,将其中最小的数与第1个数对换,把最大的数与最后一个数对换。
写3个函数:①输人10个数;②进行处理;③输出10 个数。
5.有"个人围成一圈,顺序排号。从第1个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人原来
图6.25
排在第几号。6.写一函数,求一个字符串的长度。在 main 函数中输人字符串,并输出其长度。7.有一字符串,包含"个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
8.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。
9.写一函数,将一个3x3的整型矩阵转置。10.将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右、从上到下顺序依次从小到大存放),写一数实现。用main 数调用。11.在主函数中输人10个等长的字符串。用另一数对它们排序。然后在主函数输出这10个已排好序的字符串。
12.用指针数组处理第11题,字符串不等长。
14.将几个数按输人时顺序的逆序排列,用函数实现。
15.有一个班4个学生,5门课。①求第1门课的平均分;②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩和平均成绩;③找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上3个要求。16.输入一个字符串,内有数字和非数字字符,如
a123x45617960?302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[01,456放在a[1]……统计共有多少个整数,并输出这些数。17.写一函数,实现两个字符串的比较。即自己写一个 strcmp 函数,函数原型为
int strcmp( char * pl ,char * p2 );
设pl指向字符串sl,p2指向字符串s2。要求当sl=s2时,返回值为0,若sl≠s2,返回它们二者第1个不同字符的 ASCI 码差值(如"BOY"与"BAD",第2个字母不同,"0"与"A"之差为 79 -65=14)。如果 s1>s2,则输出正值,如 sl<s2,则输出负值。18.编写一程序,输人月份号,输出该月的英文月名。例如,输人3,则输出 March,要求用指针数组处理。
19.用指向指针的指针的方法对5个字符串排序并输出。
20.用指向指针的指针的方法对“个整数排序并输出。要求将排序单独写成一个函数。整数和n在主函数中输人。最后在主函数中输出。
第7章 用户自定义数据类型
1.定义一个结构体变量(包括年、月、日),编写程序,要求输入年、月、日,程序能计算并输出该日在本年中是第几天。注意闰年问题。
2.编写一个函数 days,实现上面的计算。由主函数将年、月、日传递给函数 days,计算出该日在本年中是第几天并将结果传回主函数输出。
3.编写一个函数 print,打印一个学生的成绩数组,该数组中有5个学生的数据,每个学生的数据包括num(学号)、name(姓名)、score[3](3门课的成绩)。用主函数输人这些数据,用print 函数输出这些数据。
4.在第3题的基础上,编写一个函数input,用来输入5个学生的数据。
5.有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输人10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩、平均分数)。
6.编写一个函数 creat,用来建立一个动态链表。所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起
前后相连的关系。各结点的数据由键盘输人。7.编写一个函数 print,将第6题建立的链表中各结点的数据依次输出。"8.编写一个函数 del,用来删除动态链表中一个指定的结点(由实参指定某一学号表示要删除该学生结点)。
’9.编写一个函数 insert,用来向动态链表插入一个结点。
10.将以上4个函数组成一个程序,由主程序先后调用这些函数,实现链表的建立、输出、删除和插人,在主程序中指定需要删除和插人的结点。
11.医院内科有A,B,C,D,E,F,G共?位医生,每人在一周内要值一次夜班,排班的要求是:
(1)A医生值班日比C医生晚1天;
(2)D医生值班日比E医生晚两天;
(3)B医生值班日比G医生早3天;
(4)F医生值班日在B医生和C医生值班日之间,且在星期四。
请编写程序,输出每位医生的值班日。值班日以Sunday,Monday,Tuesday,Wednesday,Thurday,Fnday,Saturday 分别表示星期日到星期六(提示:用枚举变量)。
面向对象的程序设计
第8章 类和对象的特性
#include <iostream>
using namespace std;
class Time {
void set_time(void);
void show_time(void);
int hour;
int minute;
int sec;
};
Time t;
int main() {
t.set_time();
t.show_time();
return 0;
}
void set_time(void) {
cin >> t.hour;
cin >> t.minute;
cin >> t.sec;
}
void show_time(void) {
cout << t.hour << ":" << t.minute << ":" << t.sec << endl;
}
解:
答案1:
#include <iostream>
using namespace std;
class Time {
public://成员改为公用的
int hour;
int minute;
int sec;
};
Time t;
// 在 main 函数之前定义 set_time 函数
void set_time(void) {
cin >> t.hour;
cin >> t.minute;
cin >> t.sec;
}
// 在 main 函数之前定义 show_time 函数
void show_time(void) {
cout << t.hour << ":" << t.minute << ":" << t.sec << endl;
}
int main() {
set_time();
show_time();
return 0;
}
/*
2024
12
13
2024:12:13
*/
答案2:
#include <iostream>
using namespace std;
class Time {
public:
void set_time(void);
void show_time(void);
private:
int hour;
int minute;
int sec;
};
Time t;
int main() {
t.set_time();
t.show_time();
return 0;
}
void Time::set_time(void) {
cin >> t.hour;
cin >> t.minute;
cin >> t.sec;
}
void Time::show_time(void) {
cout << t.hour << ":" << t.minute << ":" << t.sec << endl;
}
/*
2024
12
13
2024:12:13
*/
第9章 怎样使用类和对象
#include <iostream>
using namespace std;
class Date {
public:
Date(int, int, int);
Date(int, int);
Date(int);
Date();
void display();
private:
int month;
int day;
int year;
};
Date::Date(int m, int d, int y) : month(m), day(d), year(y) {}
Date::Date(int m, int d) : month(m), day(d) {
year = 2005;
}
Date::Date(int m) : month(m) {
day = 1;
year = 2005;
}
Date::Date() {
month = 1;
day = 1;
year = 2005;
}
void Date::display() {
cout << month << "/" << day << "/" << year << endl;
}
int main() {
Date d1(10, 13, 2005);
Date d2(12, 30);
Date d3(10);
Date d4;
d1.display();
d2.display();
d3.display();
d4.display();
return 0;
}
10/13/2005
12/30/2005
10/1/2005
1/1/2005
第10章 运算符重载
1.定义一个复数类 Complex,重载运算符"+”,使之能用于复数的加法运算。将运算符函数重载为非成员、非友元的普通函数。编写程序,求两个复数之和。2.定义一个复数类 Complex,重载运算符“ +”,“_”,“*”,“/”,使之能用于复数的加、减、乘、除。运算符重载函数作为Complex类的成员函数。编写程序,分别求两个复数之和、差、积和商。
3.定义一个复数类 Complex,重载运算符“+”,使之能用于复数的加法运算。参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意。例如,cl+c2i+c1,c1+i均合法(设i为整数,c1,c2为复数)。编写程序,分别求两个复数之和、整数和复数之和。
4.有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算“+”,使之能用于矩阵相加(如c=a+b)。
5.在第4题的基础上,重载流插人运算符“<<"和流提取运算符“>>”,使之能用于该矩阵的输人和输出。
6.请编写程序,处理一个复数与一个 double 数相加的运算,结果存放在一个 double型的变量 d1中,输出d1的值,再以复数形式输出此值。定义Complex(复数)类,在成员函数中包含重载类型转换运算符:
operator double( )i return real ;7.定义一个 Teacher(教师)类和一个 Student(学生)类,二者有一部分数据成员是相同的,例如num(号码),name(姓名),sex(性别)。编写程序,将一个 Student 对象(学生)转换为 Teacher(教师)类,只将以上3个相同的数据成员移植过去。可以设想为:一位学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说仍然是有用的应当保留并成为其教师数据的一部分。
第11章 继承与派生
1.将例11.1的程序片段补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输人数据的函数,在程序运行时输人num,name,sex,age,addr 的值,程序应输出以上5个数据的值。
2.将例 11.2的程序片段补充和改写成一个完整、正确的程序,用私有继承方式。在程序中应包括输入数据的函数,在程序运行时输人num,name,sex,age,addr 的值,程序应输出以上5个数据的值。
3.将例11.3 的程序修改、补充,写成一个完整、正确的程序,用保护继承方式。在程序中应包括输人数据的函数。
4.修改例11.3的程序,改为用公用继承方式。上机调试程序,使之能正确运行并得到正确的结果。对这两种继承方式作比较分析,考虑在什么情况下二者不能互相代替。5.有以下程序结构,请分析访问属性。
7.有以下程序,请完成下面工作!
(1)阅读程序,写出运行时输出的结果。
(2)然后上机运行,验证结果是否正确。
(3)分析程序执行过程,尤其是调用构造函数的过程。
8.有以下程序,请完成下面工作:
(1)阅读程序,写出运行时输出的结果。
(2)然后上机运行,验证结果是否正确。
(3)分析程序执行过程,尤其是调用构造函数和析构函数的过程,
9.分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类 Teacher_Cadre(教师兼干部)类。要求:
(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。
(2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员 post(职务)。在Teacher_Cadre 类中还包含数据成员wages(工资)。
(3)对两个基类中的姓名、年龄、性别、地址,电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。
(4)在类体中声明成员函数,在类外定义成员函数。(5)在派生类Teacher_Cadre的成员函数show中调用Teacher 类中的 display 函数输出姓名、年龄、性别、职称、地址、电话,然后再用cout 语句输出职务与工资。10.将第11.8节中的程序段加以补充完善,使之成为一个完整的程序。在程序中使用继承和组合。在定义Professor类对象profl时给出所有数据的初值,然后修改profl的生日数据,最后输出profl 的全部最新数据、
第12章 多态性与虚函数
1.在例12.1程序基础上作一些修改。声名Point(点)类,由Point类派生出Circle(圆)类,再由Circle 类派生出Cylinder(圆柱体)类。将类的声明部分分别作为3个头文件,对它们的成员函数的声明部分分别作为3个源文件(.cPp文件),在主函数中用“#include”命令把它们包含进来,形成一个完整的程序,并上机运行。
2.请比较函数重载和虚函数在概念上和使用方式有什么区别。
3.在例12.3的基础上作以下修改,并作必要的讨论。(1)把构造函数修改为带参数的函数,在建立对象时初始化。(2)先不将析构函数声明为virtual,在main 函数中另设一个指向Circle 类对象的指
针变量,使它指向grad1。运行程序,分析结果。(3)不作第(2)点的修改而将析构函数声明为 virtual,运行程序,分析结果。4.编写一个程序,声明抽象基类Shape,由它派生出3个派生类:Circle(圆形)Rectangle(矩形)、Triangle(三角形),用一个函数prntArea 分别输出以上三者的面积,3 个图形的数据在定义对象时给定。
5.编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形)Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分别计算几种图形面积,并求它们之和。要求用基类指针数组,使它每一个元素指向一个派生类对象。
第13章 输入输出流
2.从键盘输入一批数值,要求保留3位小数,在输出时上下行小数点对齐。
4.建立两个磁盘文件 f1.dat 和f2.dat,编写程序实现以下工作!(1)从键盘输人20个整数,分别存放在两个磁盘文件中(每个文件中放10个整数);(2)从f.dat 读入10个数,然后存放到 1.dat 文件原有数据的后面;
(3)从f2.dat 中读人20)个整数,将它们按从小到大的顺序存放到f2.dat(不保留原来的数据)
5.编写程序实现以下功能:
(1)按职工号由小到大的顺序将5个员工的数据(包括号码、姓名、年龄、工资)输出到磁盘文件中保存,
(2)从键盘输人两个员工的数据(职工号大于已有的职工号),增加到文件的末尾。
(3)输出文件中全部职工的数据。
(4)从键盘输人一个号码,在文件中查找有无此职工号,如有则显示此职工是第几个职工,以及此职工的全部数据。如没有,就输出“无此人”。可以反复多次查询,如果输人查找的职工号为0,就结束查询。
6.在例13.17的基础上,修改程序,将存放在c数组中的数据读人并显示出来
第14章 C++工具
2. 将例 14.3 程序改为下面的程序,请分析执行过程,写出运行结果。并指出由于异常处理而调用了哪些析构函数。
#include <iostream>
#include <string>
using namespace std;
class Student {
public:
Student(int n, string nam) {
cout << "constructor - " << n << endl;
num = n;
name = nam;
}
~Student() { cout << "destructor - " << num << endl; }
void get_data();
private:
int num;
string name;
};
void Student::get_data() {
if (num == 0) throw num;
else cout << num << " " << name << endl;
cout << "in get_data()" << endl;
}
void fun() {
Student stud1(110, "tan");
stud1.get_data();
try {
Student stud2(0, "Li");
stud2.get_data();
}
catch (int n) {
cout << "num = " << n << ", error!" << endl;
}
}
int main() {
cout << "main begin" << endl;
cout << "call fun()" << endl;
fun();
cout << "main end" << endl;
return 0;
}
3.学校的人事部门保存了有关学生的部分数据(学号、姓名、年龄、住址),教务部门也保存了学生的另外一些数据(学号、姓名、性别、成绩),两个部门分别编写了本部门的学生数据管理程序,其中都用了Student作为类名。现在要求在全校的学生数据管理程序中调用这两个部门的学生数据,分别输出两种内容的学生数据。要求用C++编程,使用命名空间。