本习题适用于工科专业的C++程序设计课程
题解系笔者作业原稿,或有疏漏,还望海涵、不吝赐教。
因是文以肇非义者,责不在予,不任其咎。

第一次课后作业

上机目标:

1.熟悉VS2010等集成开发环境,能够独立地编辑,编译 、链接,生成正确的可执行程序
2.完成简单的输入-输出功能及数据运算功能
3.通过查找资料,自学掌握C++输入输出操纵符的基本使用方法

基础编程题:

1.学生个人信息显示

编写一个学生个人信息的屏幕显示程序。其中同学姓名学号为的真实信息。输出信息格式如下图所示。鼓励在此基础上进行界面改进。

1
2
3
4
5
6
7
8
9
10
11
12
 #include <iostream>
using namespace std;
int main() {
cout<<"==========================================="<<endl;
cout<<"| 学生信息 |"<<endl;
cout<<"==========================================="<<endl;
cout<<"| 姓名:刘渤源 |"<<endl;
cout<<"| 学号: |"<<endl;
cout<<"| 电话: |"<<endl;
cout<<"==========================================="<<endl;
return 0;
}

2. 温度转换

通过键盘输入一个华氏温度,程序将其转化为相应的摄氏温度,转化公式为:C=5/9*(F-32). 输出的摄氏温度保留2位小数点。输出见下图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
double f,c;
cout << "==========================================="<<endl;
cout << "请输入要转换的华氏温度:";
cin>>f;
c=5.0 / 9.0 * (f - 32);
cout << "==========================================="<<endl;
printf("%.2f华氏度等于%.2f摄氏度\n",f,c);
//cout<< f << c << setprecision(2);
cout << "==========================================="<<endl;
return 0;
}

3. 大写字母转换成小写字母

从键盘输入一个大写英文字母,输出相应的小写字母。

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main() {
char letter;
cout << "Please enter a character:";
cin>>letter;
cout << "The lower case of " << letter << " is:";
cout << (char) ( (int) (letter + 32) ) << endl;
return 0;
}

4. 求平方根

输入1 个实数x,计算并输出其平方根(保留1 位小数)。 提示:利用setprecision()设定输出精度。

1
2
3
4
5
6
7
8
9
10
11
12
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double a;
cout << "The input is:";
cin >> a;
cout << fixed << setprecision(1);
cout << "The square root of " << a << " is:" << sqrt(a) << endl;
return 0;
}

5. 数制转换

输入1个10进制整数,输出其8进制和16进制的表示形式。提示:利用hex、oct、dec设定输出进制,showbase设置输出的进制标志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int orig,cach;
cout << "Please enter an integer:";
cin >> orig;
cout << "The hex form of " << orig << " is: " << showbase << hex << orig << endl;
/*
showbase设置输出进制模式
并且影响后续的全部输出
直到遇到下一个showbase
hex 十六进制0x
oct 八进制(以0开头)
dec 十进制
*/
cout << "The oct form of " << orig << " is: " << showbase << oct << orig << endl;
return 0;
}

设计类编程题:

6. 计算旅途时间

输入2 个整数time1 和time2分别表示火车的出发时间和到达时间,计算并输出旅途时间。有效的时间范围是0000 到2359,不需要考虑出发时间晚于到达时间的情况。
例:输入: 711 1410(出发时间是7:11,到达时间是14:10)
输出: The train journey time is 6 hrs 59 mins.

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main() {
short time1,time2;
cout<<"Please enter departure and arrival time in hhmm form:";
cin >> time1 >> time2;
cout << "The train journey time is " << ( (time2 / 100 * 60 + time2 % 100) - (time1 / 100 * 60 + time1 % 100) ) / 60 << " hrs " << ( (time2 / 100 * 60 + time2 % 100) - (time1 / 100 * 60 + time1 % 100) ) % 60 << " mins ";
return 0;

}

7. 数字加密

输入1 个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10 取余,做为该位上的新数字,最后将第1 位和第3 位上的数字互换,第2 位和第4 位上的数字互换,组成加密后的新数。
例:输入: The original number is : 1257
输出: The encrypted number is 4601

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main() {
short a,_1,_2,_3,_4;
cout << "Please enter the original number:";
cin >> a;
_1 = a / 1000;
a -= _1 * 1000;
_2 = a / 100;
a -= _2 * 100;
_3 = a / 10;
_4 = a % 10;
_1 += 9; _1 %= 10;
_2 += 9; _2 %= 10;
_3 += 9; _3 %= 10;
_4 += 9; _4 %= 10;
cout << "The encrypted number is " << _3 << _4 << _1 << _2;
return 0;
}

第二次课后作业

作业目标

熟悉C/C++语言流程控制的相关指令的用法
设计适合的人机交互界面,熟练使用cin, cout,cin.get()等输入输出;
掌握编程的设计过程(数据和算法),锻炼独立调试程序的能力。

基础编程题

1. 输入两个正整数,求它们的最大公约数(使用辗转相除法)和最小公倍数(利用最大公约数的结果)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
int divide(int a, int b) {
int left = 1, div = b;
while(1) {
left = a % div;
if(left == 0)
break;
a = div;
div = left;
}
return div;
}
int main() {
int c, d, yue;
cout << "please input two numbers:";
cin >> c >> d;
yue = (c > d) ? divide(c, d) : divide(d, c);
cout << "最大公约数为" << yue <<endl;
cout << "最小公倍数为" << (c * d / yue) <<endl;
}

2. 输入一个任意正整数,求其中数字7出现的次数。

例:输入 47758796
输出 数据中7的出现的次数为3

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;
int main() {
string a;
int sum=0 , j;
cin >> a;
for (int i = 0; i < a.size(); i++)
if (a[i] == '7')
sum ++;
cout << "数据中7的出现的次数为" << sum << endl;
return 0;
}

计算类编程题:

3. 求1 + 1/2! +…+ 1/n!

输入正整数n(5<n<1000),计算上式前n 项的和 (保留4位小数)。
例:输入: 10
输出: 1 + 1/2! +…+ 1/10!=1.7183

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double n, sum = 0, lower = 1;
int i;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = i; j >= 1; j--){
lower *= j;
}
sum += (1 / lower);
lower = 1;

}
cout << "1" << " + " ;
for (i=2; i < n; i++)
cout << "1/" << i << "!" << " + ";
cout << "1/" << i << "!=";
cout << fixed << setprecision(4) << sum << endl;
return 0;
}

4. 用二分法求方程2x3-4x2+3x-6=0在(a,b)之间的根(根的误差<1E-3)。

例:输入 Please input the lower and upper boundaries: 3 10
输出 No root in this region!
Please input the lower and upper boundaries: 1 5
The root is 2.00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
double lo, up, f_lo, f_up, x, fx=100;
double epsi = 1e-3;
cout << "Please input the lower and upper boundaries:";
cin >> lo >> up;
f_lo = 2*lo*lo*lo - 4*lo*lo + 3*lo - 6;
f_up = 2*up*up*up - 4*up*up + 3*up - 6;
if (f_lo * f_up > 0) {
cout << "No root in this region!" <<endl;
}
else {
while ( abs(lo - up) > epsi && abs(fx) > epsi) {
x = (up + lo) / 2;
fx = 2*x*x*x - 4*x*x + 3*x -6;
if ( fx * f_lo < 0) {
up = x;
f_up = fx;
}
else if (fx * f_up < 0) {
lo = x;
f_lo = fx;
}
}
cout << "The root is:" << fixed << setprecision(2) << x <<endl;
}
return 0;
}

设计类编程题:

5. 计算机自动出0-9之间的加法和减法(+ -)计算题;由用户输入结果,然后自动批改结果是否正确。(随机数方式,搜素rand()函数的使用)

例:自动生成 3+9= 12(用户输入结果后回车),
显示: Correct!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int a, b, inp;
int main() {
srand(time(NULL));
a = rand() % 10;
b = rand() % 10;
cout << a << ( (a % 2 == 0) ? '+' : '-' )<< b << "=";
cin >> inp;
if(a % 2 == 0 && inp == a + b) {
cout << "Correct!" <<endl;
}
else if (a % 2 != 0 && inp == a - b) {
cout << "Correct!" <<endl;
}
else
cout << "Incorrect!Try again!" << endl;
return 0;
}

6. 日期显示:输入今天的日期,输出明天的日期。(需考虑所有可能)

例:输入 2024-12-31,
输出 2025-01-01,
输入 2000-02-28,
输出 2000-02-29

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int big[6] = {3, 5, 7, 8, 10, 12};
int main() {
string date, mm, dd, yy;
int mon, day, year, flag = 0;
cin >> date;
//2024-10-19
mm = date.substr(5, 2);//10
dd = date.substr(8, 2);//19
yy = date.substr(0, 4);//2024
mon = stoi(mm);
day = stoi(dd);
year = stoi(yy);
if(mon > 12 || mon < 1 || day > 31 || day < 1){
cout << "Input Error!" << endl;
}
else if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
if (mon == 2) {
if (day < 29)
day++;
else {
mon++;
day = 1;
}

}
else {
for (int i = 0; i <= 5; i++)
if (mon == big[i])
flag = 1;
if (flag == 1) {
if (day < 31)
day++;
else {
if (mon == 12) {
year++;
mon = 1;
day = 1;
}else {
mon++;
day = 1;
}

}

}
else {
if (day < 30)
day++;
else {
mon++;
day = 1;
}
}
}
}
else {
if (mon == 2) {
if (day < 28)
day++;
else if(day >= 29)
cout << "Input Error!" <<endl;
else {
mon++;
day = 1;
}

}
else {
for (int i = 0; i <= 5; i++)
if (mon == big[i])
flag = 1;
if (flag == 1) {
if (day < 31)
day++;
else {
if (mon == 12) {
year++;
mon = 1;
day = 1;
}else {
mon++;
day = 1;
}

}

}
else {
if (day < 30)
day++;
else {
mon++;
day = 1;
}
}
}

}

//格式化处理
cout << year << "-" << setw(2) << setfill('0') << mon << "-";
cout << setw(2) << setfill('0') << day << endl;
return 0;
}

7. 实现一个简单的二级菜单,用户可以选择不同的操作(使用system(“cls”) 指令可以清屏,程序功能参考下面的表格)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
using namespace std;
int main() {
int inp = 0;
while (true) {
system("cls");
cout << "-----Main Menu-----" << endl;
cout << "1. File Operations" << endl;
cout << "2. Exit" << endl;
cout << "select an option: ";
cin >> inp;
if (inp == 1) {
while (true) {
system("cls");
cout << "-----File Operation Menu-----" << endl;
cout << "1. Open File" << endl;
cout << "2. Save File" << endl;
cout << "3. Close File" << endl;
cout << "4. Back to Main menu" << endl;
cout << "select an option: ";
cin >> inp;
switch (inp) {
case 1:
cout << "Opening File..." << endl;system("pause");
break;
case 2:
cout << "Saving File..." << endl;system("pause");
break;
case 3:
cout << "Closing File..." << endl;system("pause");
break;
case 4:
break;
default:
cout << "Invalid option. Please try again." << endl;
}

if (inp == 4) break;
}
}
else if (inp == 2) {
cout << "Exiting program..." << endl;
system("pause");
return 0;
}
else {
cout << "Invalid option. Please try again." << endl;
}

system("pause");
}
}

第三次作业

作业目标

熟练掌握函数和数组编程(形参为基本数据类型和数组)
每道题需提供包括主函数和自定义函数的完整程序

1.编写函数,计算表达式 $$ \sum_{k=0}^{n} k! $$ 的值($$ n \lessgtr b $$),形参n的值由主程序输入并传递,函数返回值为s.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
long long func(short n) {
long long s = 0, temp = 1;
for(int i = 0; i <= n; ++i) {
if(i == 0) {
s += 1;
}else {
for(int j = i; j >= 1; --j) {
temp *= j;
}
s += temp;
temp = 1;
}

}
return s;
}
int main() {
short n;
cout << "Please enter one number:";
cin >> n;
cout << func(n) <<endl;
return 0;
}

2. 编写数字加密和解密函数。测试值由主程序输入。

2.1 编写数字加密函数 int encrypt(int n). 其输入为一个四位数,返回为加密后的数。其加密方法为: 
将该数每一位上的数字加9,然后除以10 取余,作为该位上的新数字,
将第1 位和第3 位上的数字互换,第2 位和第4 位上的数字互换,组成加密后的新数。
例:输入 1257 输出 The encrypted number is 4601
2.2 编写数字解密函数 int decrypt(int n), 其输入为一个使用2.1 encrypt 函数加密后的四位数,返回为解密后的数
  例:输入 4601 输出 The decrypted number is 1257

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
int encrypt(int n) {
int num[4], ink_glass, i=0;
for ( ; i <= 3; ++i) {
num[3 - i] = n % 10;
n /= 10;
}
for (i = 0; i <= 3; ++i) {
num[i] += 9;
num[i] %= 10;
}
ink_glass = num[0];
num[0] = num[2];
num[2] = ink_glass;
ink_glass = num[1];
num[1] = num[3];
num[3] = ink_glass;
return num[0]*1000 + num[1]*100 + num[2]*10 + num[3];
}
int decrypt(int n) {
int num[4], ink_glass, i;
for(i = 0; i <= 3; ++i) {
num[3-i] = n % 10;
n /= 10;
}
ink_glass = num[0];
num[0] = num[2];
num[2] = ink_glass;
ink_glass = num[1];
num[1] = num[3];
num[3] = ink_glass;
for(i = 0; i <= 3; ++i) {
num[i] += 1;
}
return num[0]*1000 + num[1]*100 + num[2]*10 + num[3];
}
int main() {
int n;
cin >> n;
cout << "The encrypted number is " << (n = encrypt(n)) <<endl;
cout << "The decrypted number is " << decrypt(n) <<endl;

}

3. 数组元素的和

分别编写基于迭代的arrsumi(a,n)和递归的arrsumr(a,n)函数,返回值为数组所有元素的和,其中a是在主函数定义的数组,n为数组的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#define MAXI 0xEEEE
using namespace std;
int arrsumi(int a[], int n) {
int sum = '\0';
for(int i = 0; i <= n-1; ++i) {
sum += a[i];
}
return sum;
}
int sum = 0;
int arrsumr(int a[], int n) {

if(n > 0)
sum = a[n] + arrsumr(a, n - 1);
else
return a[0];
return sum;

}
int main() {
int a[MAXI], n;
cout << "Please enter the number of elements:";
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
cout << "The sum of all elements is:" << arrsumr(a, n - 1) << "\t" << arrsumi(a, n) <<endl;
return 0;

}

4.数组转置

在主函数中定义一个n(1<=n<=6)维方阵,并从键盘读入数组元素;编写函数transpose(a,n)实现数组a转置;在主函数中输出转置后的方阵。

1
2
3
4
5
6
7
8
9
10
11
例:输入    
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#define MAXI 6
using namespace std;
int b[MAXI][MAXI], n;
void transpose(int a[][6], int n) {
int temp;
for (int i = 0; i < n; ++i) {
for(int j = 0; j < i; ++j) {
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
}
int main() {
int a[MAXI][MAXI];
cin >> n;
for (int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
cin >> a[i][j];
}
}
transpose(a, n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << a[i][j] << '\t';

}
cout <<endl;
}

return 0;
}

5.移动数组中的零

编写一个函数,给定一个数组,将所有的零移到数组的末尾,同时保持其他非零元素的相对顺序不变。

例:输入 4 2 3 0 5 0 1
输出 4 2 3 5 1 0 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#define MAXI 0xEEEE
using namespace std;
int main() {
int a[MAXI] = {0}, temp;
for(int i = 0; i < 7; ++i) {
cin >> a[i];
}
for(int i = 0; i < 7-1; ++i) {
if(a[i] == 0) {
for(int j = i; j < 7-1; ++j){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}

}
}
for(int i = 0; i < 7; ++i) {
cout << a[i] << " ";
}
cout <<endl;
// 下述代码基于输出控制,未改变数组本身
// 输出结果不变
// for(int i = 0; i < 7; ++i) {
// cin >> a[i];
// if(a[i] == 0) {
// temp++;
// continue;
// }else {
// cout << a[i] << ' ';

// }
// }
// for(int i = 0; i < temp; ++i) {
// cout << "0" << ' ';
// }
// cout << endl;
return 0;

}

6.分数四则运算:输入两个分数进行加、减、乘、除运算,编写一个分数四则运算函数输出计算结果。

输入:
分数1 操作符 分数2 (操作符为 + - * /)
输出:
计算结果
要求:
计算结果使用分数表示,并且为最简形式。例如结果为2/6,则被简化为1/3

1
2
3
4
5
例:	输入:  1/6 + 1/3   
输出: 1/6 + 1/3=1/2

输入: 1/6 - 1/3
输出: 1/6 - 1/3=-1/6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
int divide(int a, int b) {
int left = 1, div = b;
while(1) {
left = a % div;
if(left == 0)
break;
a = div;
div = left;
}
return div;
}
int main() {
int a, b, c, d, down, upp, yue;
char m, cal;
cin >> a >> m >> b >> cal >> c >> m >> d;
switch(cal) {
case '+':
down = b * d;
upp = a * d + b * c;
break;
case '-':
down = b * d;
upp = a * d - b * c;
break;
case '*':
down = b * d;
upp = a * c;
break;
case '/':
down = b * c;
upp = a * d;
}
yue = (down > upp) ? divide(down, upp) : divide(upp, down);
down /= yue;
upp /= yue;
if(upp > 0 && down > 0)
cout << a << m << b << " " << cal << " " << c << m << d << "=" << upp << m << down<<endl;
else
cout << a << m << b << " " << cal << " " << c << m << d << "=" << (-1)*upp << m << (-1)*down<<endl;

}

7.学生信息输入与处理

编写4个函数实现下列功能(通过参数传递实现):
(1)函数input( )—输入20个学生姓名和高考总分;
(2)函数sort( ) —按高考总分从高到低的顺序排序,姓名顺序也随之调整;
(3)函数display( )—显示所有学生姓名及其高考总分;
(4)函数search( ) —根据姓名用顺序查找方法找出该学生,查找成功返回学生下标,否则返回-1;
(5)主函数——①调用input( )输入学生姓名及成绩;②调用函数sort( )进行排序;③调用display( )输入排序后的学生姓名及成绩;④输入一个姓名,调用函数search( ),根据返回值判定是否查找成功,若查找成功,输出该学生姓名及高考总分,否则显示查找失败。
提示:高考分数储存于一维整形数组,学生姓名为储存为二维字符数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <cstring>
#define MAXSTU 20
#define MAXLEN 100
using namespace std;
char name[MAXSTU][MAXLEN];
int score[MAXSTU];
void input() {
for(int i = 0; i < 20; ++i) {
cin >> name[i] >> score[i];
}

}
void sort(int score[]) {
int temp = 0, k;
char temp_1[MAXSTU][MAXLEN];
for(int i = 0; i < 20; ++i) {
k = i;
for(int j = i + 1; j < 20; ++j) {
if(score[k] < score[j]) {
k = j;

}
}
if(k != i) {
temp = score[k];
score[k] = score[i];
score[i] = temp;
for(int p = 0; ; ++p) {
temp_1[1][p] = name[i][p];
name[i][p] = name[k][p];
name[k][p] = temp_1[1][p];
if(name[i][p] == '\0')
break;
}
}
}
}
int search(char find[]) {
int i = 0;
for( ; i < 20; ++i) {
if( strcmp(find, name[i]) == 0 ){
return i;
}

}
if(i == 20) {
return -1;
}

}
void display() {
for(int i = 0; i < 20; ++i) {
cout << "Name:" << name[i] << "\t" << "Score:" << score[i] << endl;
}
}
int main() {
input();
sort(score);
display();
char sear[MAXLEN];
cout << "Search:";
cin >> sear;
if( search(sear) == -1 )
cout << "查找失败" ;
else cout << "Name:"<< sear << "\t"<< "Score:" << search(sear) <<endl;
return 0;
}

8.基于菜单驱动的字符串处理

定义两个CPP源程序文件:fmain.cpp 和 fstring.cpp。
fmain.cpp中包含主函数,实现字符串处理功能的菜单选项和字符串的输入与结果的输出(将第二次作业中的菜单修改为基于函数进行菜单驱动,字符串处理在二级菜单)。
fstring.cpp中包含两个函数delchar(s,c)和strreverse (s),实现删除字符和字符串反转功能。
delchar(s,c):输入字符串s和要删除的字符c,此函数将字符串s中出现的所有c字符删除;返回删除c后的字符串。
strreverse (s):此函数实现将字符串s反转;并返回反转后的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
fmain.cpp

#include <iostream>
using namespace std;
const int MAX = 0xFFFF;
char *delchar(char s[], char c);
char *strreverse(char s[]);
char s[MAX], c = '\0', tempp[MAX];
int n = 0;//字符串长度
int delflag = 0;
int main() {
bool flag1 = 1, flag2 = 1;
short temp;
n = strlen(s);
//不可以用sizeof()因为
//定义时开辟内存0xFFFF bytes
system("cls");
while(flag1) {
system("cls");
cout << "主菜单" <<endl;
cout << "1. 字符串处理" <<endl;
cout << "0. 退出" <<endl;
cout << "请选择一个选项:";
cin >> temp;
if(temp == 1) {
flag2 = 1;a
while(flag2) {
system("cls");
cout << "字符串处理" <<endl;
cout << "1. 删除字符" <<endl;
cout << "2. 字符串翻转" <<endl;
cout << "0. 返回主菜单"<<endl;
cout << "请选择一个选项:";
cin >> temp;
switch(temp) {
case 1:
cout << "请输入字符串和要删去的字符"<<endl;
cout << "请输入字符串:";
cin >> s;
n = strlen(s);
cout << "请输入要删除的字符:" ;
cin >> c;
delchar(s, c);
if(delflag == 1)
cout << "删除字符后的字符串:" << s <<endl;
else
cout << "Not Found Character!" <<endl;

system("pause");
break;
case 2:
cout << "请输入需要翻转的字符串:";
cin >> s;
n = strlen(s);
strreverse(s);
cout << "翻转后的字符串为:" << tempp <<endl;
system("pause");
break;
case 0:
flag2 = 0; break;
default: cout << "Invalid Command!" <<endl;
system("pause");
}
}
}
else if(temp == 0){
flag1 = 0;
cout << "退出程序" <<endl;
}

else cout << "Invalid input." <<endl;
}

}

fstr.cpp

#include <iostream>
extern char tempp[];
extern int n, delflag;
char *delchar(char s[], char c) {
delflag = 0;
char temp = '\0';
// int n = sizeof(s) / sizeof(s[0]);
/*
函数参数中的 char s[] 会退化为指针,
sizeof(s) 只返回指针的大小,而不是数组的大小。
课上PPT中在局部作用域或全局作用域声明的数组(如 int arr[]),
sizeof(arr) 返回的是整个数组的大小。
*/
for(int i = 0; i < n; ++i){
if(s[i] == c) {
delflag = 1;
int j;
for(j = i; j < n - 1; ++j){
temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
}
s[j] = '\0';
}
}
return s;
}

char *strreverse(char s[]) {


for (int i = 0; i < n; ++i){
tempp[i] = s[n - i - 1];
}
tempp[n] = '\0';
return tempp;
}

第四次作业

作业目标

理解指针的概念,掌握一维指针,指针数组,多级指针。
掌握地址(指针)传递时的函数形参的正确定义和动态内存分配的方法。
掌握结构体的定义与使用,能够对结构体数组进行数据的查询与排序。

1.编写函数update(),将具有N个元素的一维字符型数组从下标为k的元素开始全部设置为“*”, 如果k>=N,返回NULL,否则返回字符数组首地址。在主函数根据返回值输出更新后的结果或更新失败的提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstring>
using namespace std;
int n;
char *update(char s[], int k) {
int n;
n = strlen(s);
if(k >= n || k < 0) {
return NULL;
}
else {
for(int i = k; i < n; ++i) {
s[i] = '*';
}
return s;
}

}
int main(){
char s[100];
int k;
cout << "Please enter a sentence:";
cin >> s; //cin.getline();
cout << "Please enter the value of K:";
cin >> k;
cout << ( ( update(s, k) == NULL ) ? "Update Failed!" : s );
return 0;


}

2. 基于字符数组的字符串排序:在主函数中输入10个不等长的字符串放入二维字符数组中,编写函数sort()利用指针数组对其排序,在主函数中输出排好序的字符串。

函数原型为:void sort(char *s [ ],int n);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cstring>
using namespace std;

void sort(char *s[], int n) {
char *temp;
for(int i = 0; i < n - 1; ++i) {
for(int j = i; j < n -1; ++j){
if(strcmp(s[j], s[j+1]) > 0){
temp = s[j];
s[j] = s[j+1];
s[j+1] = temp;
}
}
}
}
int main(){
char arr[10][100], *s[10];
for(int i = 0; i < 10; ++i) {
cout << "请?输º?入¨?第̨²" << i + 1 << "个?字Á?符¤?串ä?";
cin >> arr[i];
s[i] = &arr[i][0];
}
sort(s, 10);
for(int i = 0; i < 10; ++i) {
cout << s[i] <<endl;
}
}

3. 动态数组的内存管理:编写一个程序,在main()函数中使用 new 为一个包含 n 个整数的数组分配内存,并使用 delete[] 释放该数组的内存。

输入一个整数n,表示数组的大小。
使用 new 创建一个包含n个整数的动态数组。
从用户处输入 n 个整数,并将其存储到动态数组中。
输出动态数组中的所有元素。
使用 delete[] 释放分配的内存。
在完成上面程序的基础上,对以上程序的部分功能运用函数实现:
设计函数createarray(), 使用引用传递方式,创建一个包含n个整数的动态数组;
设计函数inputarray(), 从用户处输入 n 个整数,并将其存储到动态数组中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
int *createarray(int &m) {
int *po = new int [m];
return po;
}
void inputarray(int *a, int &m) {
int temp;
for(int i = 0; i < m; ++i) {
cout << "请输入第" << i + 1 << "个元素";
cin >> temp;
a[i] = temp;
}
}
int main() {
int n, *p;
int &n_1 = n;
cout << "Please enter the number of elements:";
cin >> n;
p = createarray(n_1);
inputarray(p, n_1);
for (int i = 0; i < n; i++) {
cout << p[i] <<endl;
}
delete [] p;
}

4. 考研初试成绩包括外语、政治、数学和专业课四科成绩(其中,外语和政治满分100分,数学和专业课满分150分)。某校复试分数要求是同时满足:外语、政治不低于50分;数学和专业课不低于90分;总分不低于350分。

编程实现5名考生考研成绩统计功能。
① 定义结构体类型StuInfo记录每个考生信息,包括:考号(1~5)、姓名、各科成绩、初试总分和是否满足复试要求标记;
② 编写函数Cal_Mark(),计算每个考生的初试总分,并将不满足复试要求的考生标记为‘F’ ,满足复试要求的考生标记为‘P’;
③ 编写函数SelectionSort(),用简单选择排序法按初试总分从高到低排序;
④ 编写主函数,在主函数中从键盘输入所有考生的考号、姓名和四科成绩,通过参数传递调用上述两个函数,最后在主函数中按初试总分从高到低顺序输出满足复试要求的考生信息组成的复试名单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
using namespace std;
struct StuInfo {
int id;
char name[100];
int mark[4];
int sum;
char yeah;
}stu[5], temp;
void Cal_Mark(int mark[], int seq) {
stu[seq].sum = mark[0] + mark[1] + mark[2] + mark[3];
stu[seq].yeah = (stu[seq].sum >= 350) ? 'P' : 'F';
}
void SelectionSort() {
int k;
for(int i = 0; i < 4; ++i) {
k = i;
for(int j = i + 1; j < 5; ++j) {
if(stu[k].sum < stu[j].sum) {
k = j;
}
}
if(k != i) {
temp = stu[k];
stu[k] = stu[i];
stu[i] = temp;
}
}
}
int main() {
for(int i = 0; i < 5; ++i) {
cout << "Student ID:" <<endl;
cin >> stu[i].id;
cout << "Name:" <<endl;
cin >> stu[i].name;
cout << "Marks: (政治,英语,数学,专业课)" <<endl;
cin >> stu[i].mark[0];
cin >> stu[i].mark[1];
cin >> stu[i].mark[2];
cin >> stu[i].mark[3];
Cal_Mark(&stu[i].mark[0], i);
}
SelectionSort();
for(int i = 0; i < 5; ++i) {
if(stu[i].yeah == 'P'){
cout << "考号: " << stu[i].id <<endl;
cout << "姓名: " << stu[i].name <<endl;
cout << "总分:" << stu[i].sum <<endl;
cout << "政治: " << stu[i].mark[0] <<endl;
cout << "英语: " << stu[i].mark[1] <<endl;
cout << "数学: "<< stu[i].mark[2] <<endl;
cout << "专业课" << stu[i].mark[3] <<endl;
cout <<endl;
}

}
}

5. 定义一个 Student 结构体,包含姓名和成绩(整型)。创建一个动态数组来存储5个学生的信息,编写一个排序函数sort(),首先根据成绩进行降序排序,如果成绩相同,则按姓名升序排序,在main()函数中进行结构体信息的输入与输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <cstring>
using namespace std;
const int n = 5;
struct Student {
char name[100];
int sum;
}temp;
Student *stu = new Student [5];
void Sort() {
int k;
for(int i = 0; i < n - 1; ++i) {
k = i;
for(int j = i + 1; j < n; ++j) {
if(stu[k].sum < stu[j].sum) {
k = j;
}

}
if(k != i) {
temp = stu[k];
stu[k] = stu[i];
stu[i] = temp;
}
}
for(int i = 0; i < n - 1; ++i) {
if(stu[i].sum == stu[i + 1].sum) {
if(strcmp(stu[i].name, stu[i + 1].name) > 0) {
temp = stu[i];
stu[i] = stu[i + 1];
stu[i + 1] = temp;
}

}
}
}
int main() {


for(int i = 0; i < n; ++i) {
cin >> stu[i].name >> stu[i].sum;
}
Sort();
for(int i = 0; i < n; ++i) {
cout << stu[i].name << " " << stu[i].sum <<endl;
}

}

第五次作业

作业目标

理解类的基本语法,包括类的定义、成员变量、成员函数等,培养初步的面向对象设计思维
理解构造函数的作用,学会通过构造函数进行对象的初始化,并理解析构函数在对象销毁时释放资源的作用
了解类的封装性,通过访问控制符(public、private、protected)来控制数据的访问权限。

1.编写一个 Book 类,用于表示书籍。

要求如下:
类的私有成员变量包括书名 (title)、作者 (author) 和页数 (pages)。
提供一个构造函数,接受书名、作者和页数三个参数,并初始化相应的成员变量。
提供一个成员函数 display(),输出书籍的详细信息(书名、作者和页数)。
在 main() 函数中,创建一个 Book 对象,使用构造函数初始化对象,并调用 display() 函数输出书籍的信息。
例:

1
2
3
4
5
6
输入:请输入书名: C++程序设计
输入:请输入作者: 翁惠玉
输入:请输入页数: 312
输出:书名: C++程序设计
输出:作者: 翁惠玉
输出:页数: 312
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstring>
#define MAXI 0xFFFF
using namespace std;
class Book{
private:
char title[MAXI];
char author[MAXI];
int pages;
public:
Book(char *title, char *author, int pages);
void display();
};
Book::Book(char *title, char *author, int pages) {
strcpy(this->title, title);
strcpy(this->author, author);
this -> pages = pages;
}
void Book::display() {
cout << "书名: " << title <<endl;
cout << "作者: " << author <<endl;
cout << "页数:" << pages <<endl;
}
int main() {
char title[MAXI], author[MAXI];
int pages;
cout << "请输入书名: ";
cin.get(title, 100);
cin.get();
cout << "请输入作者: ";
cin.get(author, 100);
cin.get();
cout << "请输入页数: ";
cin >> pages;
Book dut(title, author, pages);
dut.display();
return 0;
}

2.编写一个 Rectangle 类,用于表示矩形。

要求如下:
类的私有成员变量包括矩形的宽度 (width) 和高度 (height)。
提供两个重载的构造函数:
第一个构造函数接受两个参数,分别表示宽度和高度,并初始化相应的成员变量。
第二个构造函数只接受一个参数,表示边长,初始化为正方形(宽度和高度相等)。
提供成员函数 area(),计算并返回矩形的面积。
在 main() 函数中创建 Rectangle 对象,使用不同的构造函数,并输出矩形的面积。
例:

1
2
3
4
5
输入:请输入矩形的宽度: 3
输入:请输入矩形的高度: 5
输出:矩形的面积: 15
输入:请输入正方形的边长: 4
输出:正方形的面积: 16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
class Rectangle{
private:
int width;
int height;
public:
Rectangle(int width, int height);
Rectangle(int a);
int area();
};
Rectangle::Rectangle(int width, int height) {
this -> width = width;
this -> height = height;
}
Rectangle::Rectangle(int a) {
this -> width = a;
this -> height = a;
}
int Rectangle::area() {
return (this->height) * (this->width);
}
int main() {
int height, width, a;
cout << "请输入矩形的宽度: ";
cin >> width;
cout << "请输入矩形的高度: ";
cin >> height;
Rectangle tan1(width, height);
cout << "矩形的面积: " << tan1.area() <<endl;
cout << "请输入正方形的边长: ";
cin >> a;
cout << "正方形的面积: ";
Rectangle tan2(a);
cout << tan2.area() <<endl;
return 0;
}

3. 编写一个 Point 类,用于表示二维平面上的点。要求如下:

类的私有成员变量包括 x 和 y,表示点的坐标。
提供一个构造函数,接受两个参数(x 和 y)来初始化点的坐标。
提供一个拷贝构造函数,用于复制另一个 Point 对象,拷贝构造函数中输出提示信息,例如:“拷贝构造函数被调用”。
提供一个成员函数 display(),输出点的坐标。
在 main() 函数中,提示用户输入点的坐标,创建一个 Point 对象,使用拷贝构造函数创建另一个对象,并调用 display() 函数输出两个对象的坐标。
例:

1
2
3
4
5
输入:请输入点的 x 坐标: 5
输入:请输入点的 y 坐标: 4
输出:原始点: 点的坐标: (5, 4)
输出:拷贝构造函数被调用
输出:拷贝的点: 点的坐标: (5, 4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
class Point {
private:
int x;
int y;
public:
Point(int x, int y);
Point(Point &p);
void display();
};
Point::Point(int x, int y) {
this -> x = x;
this -> y = y;
}
Point::Point(Point &p) {
x = p.x;
y = p.y;
cout << "拷贝构造函数被调用" <<endl;
}
void Point::display(){
cout << "(" << x << ", " << y << ")" <<endl;
}
int main() {
int x, y;
cout << "请输入点的 x 坐标: " ;
cin >> x;
cout << "请输入点的 y 坐标: " ;
cin >> y;
Point p(x, y);
cout << "原始点: 点的坐标: ";
p.display();
Point p1(p);
cout << "拷贝的点: 点的坐标: ";
p1.display();
return 0;
}

4.编写一个 Circle 类,用于表示一个圆。

类应具备以下功能:
一个私有的 double 类型数据成员radius,用于存储圆的半径。
友元函数:实现一个名为 calculateArea 的友元函数,该函数接受一个 Circle 类型的对象,并返回该圆的面积。面积的计算公式为:面积 = π × radius²,其中 π 取值为 3.14159。
在 main 函数中: 创建一个 Circle 对象,半径由用户输入。调用 calculateArea 函数计算该圆的面积,并输出结果。

例:
输入:请输入圆的半径: 3
输出:圆的面积是: 28.2743

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#define PI 3.14159
using namespace std;
class Circle{
private:
double radius;
public:
friend double calculateArea(Circle c);
Circle(double r){radius = r;}
};
double calculateArea(Circle c){
return PI * c.radius * c.radius;
}
int main() {
double r;
cout << "请输入圆的半径: ";
cin >> r;
Circle c(r);
cout << "圆的面积是: " << calculateArea(c) <<endl;
return 0;
}

5.设计一个 Temperature 类,表示温度。

实现以下功能:
包含成员变量 celsius(摄氏温度)。
提供构造函数初始化摄氏温度。
提供一个常成员函数 getCelsius(),返回摄氏温度。
提供一个常成员函数 toFahrenheit(),将摄氏温度转换为华氏温度并返回。
在 main() 函数中,输入摄氏温度,输出摄氏温度和对应的华氏温度。
例:

1
2
3
输入:请输入摄氏温度: 32
输出:摄氏温度: 32°C
输出:华氏温度: 89.6°F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
class Temperature{
private:
double celsius;
public:
double getCelsius() const;
double toFahrenheit() const;
Temperature(double tem) {celsius = tem;}
};
double Temperature::getCelsius() const{
return celsius;
}
double Temperature::toFahrenheit() const{
return celsius * 1.8 + 32;
}
int main(){
double tem;
cout << "请输入摄氏温度: ";
cin >> tem;
Temperature c(tem);
cout << "摄氏温度: " << c.getCelsius() << "°C" <<endl;
cout << "华氏温度: " << c.toFahrenheit() << "°F" <<endl;
return 0;
}

6.设计一个 Library 类,用于管理图书馆的图书数量。

该类包含静态成员变量 bookCount,用于记录图书数量,以及静态成员函数 getBookCount(),返回当前图书数量。实现以下功能:
提供构造函数,每次创建 Library 对象时将图书数量初始化。
提供静态成员函数 addBooks(int count),用于增加图书数量。
提供静态成员函数 removeBooks(int count),用于减少图书数量(确保数量不会为负)。
提供静态成员函数 getBookCount(),返回当前的图书数量。
在 main() 函数中通过用户输入进行图书数量的增加和减少,输出图书数量的变化。
例:

1
2
3
4
5
输入:请输入要增加的图书数量: 5
输出:增加图书数量: 5本,当前总数: 5本
输入:请输入要减少的图书数量: 3
输出:减少图书数量: 3本,当前总数: 2本
输出:当前图书数量: 2本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
class Library{
private:
static int bookCount;
public:
static void addBooks(int);
static void removeBooks(int);
static int getBookCount() {return bookCount;}
};
int Library::bookCount = 0;
void Library::addBooks(int count){
//cout << bookcount;
bookCount += count;
cout << "增加图书数量: " << count << "本,当前总数: " << bookCount << "本" <<endl;
}
void Library::removeBooks(int count){
bookCount -= count;
cout << "减少图书数量: " << count << "本,当前总数: " << bookCount << "本" <<endl;
}
int main() {
int count;
cout << "请输入要增加的图书数量: ";
cin >> count;
Library::addBooks(count);
cout << "请输入要减少的图书数量: ";
cin >> count;
Library::removeBooks(count);
cout << "当前图书数量: " << Library::getBookCount() << "本" <<endl;
return 0;

}

第六次作业

  1. 定义一个平面上的点类Point 包含私有的两个浮点型数据成员x和y。定义一个圆类Circle,包括一个Point类的圆心和圆的半径r。定义一个三角形类Triangle, 包含三个Point类对象a,b,c为其顶点。
    设计 Point,Circle类和Triangle显示信息的成员函数display;Circle类和Triangle类包括计算周长的perimeter的成员函数;根据需求设计实现其它成员函数。
    主函数中定义一个圆心为(0,0)半径为5的圆和顶点为(0,0),(1,1),(2,0)的三角形。并输出它们的信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <cmath>
#define PI 3.14159
using namespace std;
class Point{
private:
float x, y;
public:
float getx() {return x;}
float gety() {return y;}
Point(float m, float n) : x(m), y(n) {}
};
class Circle{
private:
Point cen;
float r;
public:
void display() {
cout << "Circle Center: Point: (" << cen.getx() << ", " << cen.gety() <<")" <<endl;
cout << "Radius: " << r <<endl;
cout << "Perimeter: " << perimeter() <<endl;
}
float perimeter();
Circle(float x, float y, float ra) : cen(x, y), r(ra) {}
};
class Triangle{
private:
Point a, b, c;
public:
void display(){
cout << "Triangle Vertices:" <<endl;
cout << " Point: (" << a.getx() << ", " << a.gety() <<")" <<endl;
cout << " Point: (" << b.getx() << ", " << b.gety() <<")" <<endl;
cout << " Point: (" << c.getx() << ", " << c.gety() <<")" <<endl;
cout << "Perimeter: " << perimeter() <<endl;
};
float perimeter();
Triangle(float ax, float ay, float bx, float by, float cx, float cy) : a(ax, ay), b(bx, by), c(cx, cy) {}

};
float Circle::perimeter(){
return 2 * PI * r;
}
float Triangle::perimeter(){
return sqrt( (b.getx() - a.getx()) * (b.getx() - a.getx()) + (b.gety() - a.gety()) * (b.gety() - a.gety()) ) + sqrt( (c.getx() - a.getx()) * (c.getx() - a.getx()) + (c.gety() - a.gety()) * (c.gety() - a.gety()) ) + sqrt( (c.getx() - b.getx()) * (c.getx() - b.getx()) + (c.gety() - b.gety()) * (c.gety() - b.gety()) );
}
int main(){
Circle ro(0, 0, 5);
Triangle tr(0, 0, 1, 1, 2, 0);
ro.display();
tr.display();
return 0;
}
  1. 定义抽象基类Shape,从Shape派生长方形类Rectangle和圆类Circle,实现每个派生类的具体方法getArea()和getPerim()求出其面积和周长。程序输出如下图所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#define PI 3.1415926
using namespace std;
class Shape{
public:
virtual void getArea() = 0;
virtual void getPerim() = 0;
};
class Rectangle: public Shape{
private:
float a, b;
public:
Rectangle(float m, float n) : a(m), b(n) {}
void getArea(){
cout << "Rectangle Area: " << a*b <<endl;
}
void getPerim(){
cout << "Rectangle Perimeter: " << 2 * (a + b) <<endl;
}
};
class Circle : public Shape{
private:
float r;
public:
Circle(float ra) : r(ra) {}
void getArea(){
cout << "Circle Area: " << PI * r * r <<endl;
}
void getPerim(){
cout << "Circle Circumference: " << 2 * PI * r <<endl;
}
};
int main(){
Rectangle re(5, 10);
Circle ro(5);
re.getArea();
re.getPerim();
ro.getArea();
ro.getPerim();
return 0;

}
  1. 虚基类Person的定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Person {
protected:
string name;
int age;
public:
Person(const string& name = "", int age = 0) : name(name), age(age)
{ cout << "Person 构造函数: " << name << endl; }
virtual ~Person()
{ cout << "Person 析构函数: " << name << endl; }
virtual void displayInfo() const {
cout << "姓名: " << name << ", 年龄: " << age << endl;
}
};

从Person派生出Teacher(增加:教授科目)和Student类(增加:专业),再从 TeacherStudent 派生出TA类(没有新增数据成员) ,分别实现不同的信息显示,写出这三个类的实现。
当使用以下主函数时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// 主函数
int main() {
Person* roles[3];
roles[0] = new Teacher("张三老师", 40, "程序设计");
roles[1] = new Student("李四学生", 20, "自动化");
roles[2] = new TA("王五助教", 25, "程序设计", "自动化");

for (int i = 0; i < 3; ++i) {
roles[i]->displayInfo();
delete roles[i];
}
return 0;
}
```cpp
#include <iostream>
#include <string>
#define MAXI 0xFFFF
using namespace std;
class Person {
protected:
string name;
int age;
public:
Person(const string& name = "", int age = 0) : name(name), age(age) {
cout << "Person 构造函数: " << name << endl;
}
virtual ~Person() {
cout << "Person 析构函数: " << name << endl;
}
virtual void displayInfo() const {
cout << "姓名: " << name << ", 年龄: " << age << endl;
}
};
class Teacher : virtual public Person{
protected:
string sub;
public:
Teacher(const string& name = "", int age = 0, const string& sub = "") : Person(name, age), sub(sub) {
cout << "Teacher 构造函数: " << name << endl;
}
virtual ~Teacher() {
cout << "Teacher 析构函数: " << name << endl;
}
virtual void displayInfo() const {
cout << "教师: " << name << ", 年龄: " << age << " 科目: " << sub <<endl;
}
};
class Student : virtual public Person{
protected:
string pro;
public:
Student(const string& name = "", int age = 0, const string&sub = "") : Person(name, age), pro(sub) {
cout << "Student 构造函数: " << name << endl;
}
virtual ~Student() {
cout << "Student 析构函数: " << name << endl;
}
virtual void displayInfo() const {
cout << "学生: " << name << ", 年龄: " << age << " 专业: " << pro <<endl;
}

};
class TA : public Teacher, public Student{
public:
TA(const string& name = "", int age = 0, const string&sub = "", const string&pro = "") : Person(name, age), Teacher(name, age, sub), Student(name, age, pro) {
cout << "TA 构造函数: " << name << endl;
}
virtual ~TA() {
cout << "TA 析构函数: " << name << endl;
}
virtual void displayInfo() const {
cout << "助教: " << name << ", 年龄: " << age << " 科目: "<< sub << " 学生专业: " << pro <<endl;
}
};
int main(){
Person* roles[3];
roles[0] = new Teacher("张三老师", 40, "程序设计");
roles[1] = new Student("李四学生", 20, "自动化");
roles[2] = new TA("王五助教", 25, "程序设计", "自动化");
for (int i = 0; i < 3; ++i) {
roles[i]->displayInfo();
delete roles[i];
}
return 0;

}
  1. 编写程序实现将一个文本文件的内容复制到另一个文本文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
using namespace std;
int main(){
fstream ifile, ofile;
char line[10000];
ifile.open("file.txt", ios::in | ios::binary);
ofile.open("output.txt", ios::out);
if(!ifile){
cerr << "Failed in opening file!" <<endl;
return 1;
}
while(ifile.good() && ifile >> line){
ofile << line <<endl;
}
ifile.close();
ofile.close();

}
  1. 创建一个名为student的结构体,包含学号number,姓名name,三门课程的成绩score [3] 和平均成绩,编写两个互为独立的程序,一个程序实现将结构体数组元素以二进制形式整体写入文件,另一个程序实现将文件中的结构体数据逐个读入并输出到屏幕。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//stu_file1.cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct student{
int number;
char name[10];
int score[3];
float aver;
}stu[2]{ {2401, "Liu", 100, 100, 100, 100}, {2402, "Chen", 100, 200, 200, 250} };
int main(){
fstream fout;
fout.open("output.dat", ios::out | ios::binary);
while(!fout) {
cerr << "Failed in opening file!" <<endl;
return 1;
}
fout.write((char*)stu, sizeof(stu));
fout.close();
}

//stu_file2.cpp
#include <iostream>
#include <fstream>
using namespace std;
struct student{
int number;
char name[10];
int score[3];
float aver;
}stu[2];
int main(){
fstream fin;
char s[1000] = "\0";
fin.open("output.dat", ios::in | ios::binary);
while(!fin){
cerr << "Failed in opening file!" <<endl;
return 1;
}

fin.read((char*)stu, sizeof(stu));
cout << stu[0].number <<endl;
cout << stu[0].name <<endl;
cout << stu[0].score[0] <<endl;
cout << stu[0].score[1] <<endl;
cout << stu[0].score[2] <<endl;
cout << stu[0].aver <<endl;
cout << stu[1].number <<endl;
cout << stu[1].name <<endl;
cout << stu[1].score[1] <<endl;
cout << stu[1].score[1] <<endl;
cout << stu[1].score[2] <<endl;
cout << stu[1].aver <<endl;

fin.close();
}
  1. 建立一个文件,用来存放前20个自然数及其平方根,然后输入1~20的任意一整数,查寻其平方根并显示在屏幕上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstring>
using namespace std;
int main(){
fstream ifile, ofile;
char n[100], s[100], str[100][100], p = 0, flag = 0;
ofile.open("output.txt", ios::out);
for(int i = 1; i <= 20; ++i){
ofile << i <<endl;
ofile << sqrt(i) <<endl;
}
ofile.close();
cout << "Please enter a number:";
cin >> n;
ifile.open("output.txt", ios::in);
if(!ifile){
cerr << "Failed in opening file!" <<endl;
return 1;
}
while(ifile.good() && ifile >> s){
strcpy(str[p], s);
p++;
}

for(int i = 0; i <= 39; ++i){
if(i % 2 == 0){
if(strcmp(str[i], n) == 0){
flag = i;
}

}
}
cout << flag / 2 + 1 << " " << sqrt(flag / 2 + 1) <<endl;
ifile.close();


}
题目版权归大连理工大学控制科学与工程学院所有,仅供学习使用。