🍉C++学习笔记(一) 🍊C++学习笔记(二) 🍅C++学习笔记(三)

1、 有一个函数如下:
x (x<5) y = x+6 (5<=x<15) x-6 (x>=15)
输入 x 的值,计算出相应的 y 值。

代码
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
#include<iostream>
#include<string>
#include<string.h>
using namespace std;

class Test01 {
public:
void test01();
int gety();
void setx();
private:
int x;
int y; //私有变量仅允许同类访问

};

void Test01::test01() {
//this->x;
//this->y;
if (x < 5) {
y = x;
}
else if (x >= 5 && x < 15) {
y = x + 6;
}
else {
y = x - 6;
}

}

int Test01::gety() {
return y;
}
void Test01::setx() {
cout << "请输入x值:\n" << endl;
cin >> x;

}

int main() {
Test01 t01;
t01.setx();
t01.test01();
//t01.y; //错误 ,不能访问私有变量
cout << "获取此时类中私有变量y的值" << t01.gety() << endl;

}

}
1
2
获取此时类中私有变量y的值11
获取输入x后的计算结果11

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
#include<string>
#include <algorithm>
#include <cctype>

using namespace std;

class Test02 {
public:
void setStr();
string getStr();
void test02();

private:
string str;
};

// 修改后的 test02 函数
void Test02::test02() {
//// 输出原始字符串
//for (auto it = str.begin(); it != str.end(); ++it) {
// cout << *it << " ";
//}
//cout << endl;

// 使用 transform 转换字符串为大写
for (auto& c : str) {
c = toupper(c);
}
}

string Test02::getStr() {
return str;
}

void Test02::setStr() {
getline(cin, str); // 使用 getline 以允许输入包含空格的字符串
}

int main() {
Test02 t02;
t02.setStr();
t02.test02();

// 输出转换后的字符串
cout << t02.getStr() << endl;

return 0;
}

1
11111

3、 求一个 3×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
58
59
60
61
62
63
64
65
66
67
#include <iostream>
using namespace std;

class Test03 {
public:
void setmatrixr();
void getmatrix();
int getsum();
void test03();

private:
int matrix[3][3] = {};
int sum=0;
};

void Test03::test03() {
// 计算主对角线元素之和

for (int i = 0; i < 3; ++i) {
sum += matrix[i][i];
}
}

void Test03::getmatrix() {
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
cout << matrix[i][j] <<" ";
}
cout << "\n" << endl;
}
}
int Test03::getsum() {
return sum;
}

void Test03::setmatrixr() {
for (int i = 0; i < 3; ++i) {
for (int j = 0;j < 3; ++j) {
cin >> matrix[i][j];
// 如果不是该行的最后一个元素,输出一个空格作为分隔符,在一行内出入所有数组元素
if (j < j - 1) {
cout << " ";
}
}

}

// 使用 getline 以允许输入包含空格的字符串
}

//int main() {
// // 假设矩阵按行优先顺序存储
// //int matrix[3][3] = {
// // {1, 2, 3},
// // {4, 5, 6},
// // {7, 8, 9}
// //};
// Test03 t03;
// t03.setmatrixr();
// t03.test03();
// t03.getmatrix();
//
// // 输出结果
// cout << "主角线之和为" << t03.getsum() << endl;
//
// return 0;
//}
1
1111

4、 求 100~999 之间的水仙花数。所谓水仙花数,是指一个 3 位数,它的每位数
字的立方之和等于该数。例如,因为 153=1+5+3,所以 153 为水仙花数。

代码
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>
using namespace std;

class Test04 {
public:
void findNarcissisticNumbers();
private:
int number;
};

void Test04::findNarcissisticNumbers() {
for (number = 100; number <= 999; number++) {
int originalNumber = number;
int sum = 0;
while (originalNumber > 0) {
int digit = originalNumber % 10;
sum += digit * digit * digit;
originalNumber /= 10;
}
if (sum == number) {
cout << number << " 是水仙花数。" << endl;
}
}
}

//int main() {
// Test04 t04;
// t04.findNarcissisticNumbers();
// return 0;
//}
1
11

5、 输入百分制成绩,并把它转换成五级分制,转换公式为:

代码
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>
using namespace std;

class Test05 {
public:
void convertGrade();
private:
int score;
};

void Test05::convertGrade() {
cout << "请输入百分制成绩:\n";
cin >> score;
if (score >= 90 && score <= 100) {
cout << "成绩等级:A(优秀)" << endl;
}
else if (score >= 80 && score < 90) {
cout << "成绩等级:B(良好)" << endl;
}
else if (score >= 70 && score < 80) {
cout << "成绩等级:C(中等)" << endl;
}
else if (score >= 60 && score < 70) {
cout << "成绩等级:D(合格)" << endl;
}
else if (score < 60) {
cout << "成绩等级:E(不合格)" << endl;
}
else {
cout << "输入的成绩无效,请输入0-100之间的数值。" << endl;
}
}

//int main() {
// Test05 t05;
// t05.convertGrade();
// return 0;
//}
1
11

6、 斐波拉契数列递归实现的方法如下:
int Funct( int n )
{
if(n==0) return 1;
if(n==1) return 1;
retrurn Funct(n-1) + Funct(n-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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
using namespace std;

/*
6. 斐波拉契数列递归实现的方法如下:
int Funct(int n)
{
if (n == 0) return 1;
if (n == 1) return 1;
retrurn Funct(n - 1) + Funct(n - 2);
}


请问,如何不使用递归,来实现上述函数?
*/
class Test06 {
public:
int Funct(int n);
};

int Test06::Funct(int n) {
/*

if (n == 0) return 1;
if (n == 1) return 1;
return Funct(n - 1) + Funct(n - 2);
*/

if (n == 0 || n == 1) {
return 1;
}

int a = 1, b = 1, c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;

}

int main() {
Test06 t06;
int n;
cout << "请输入斐波那契数列的项数n:";
cin >> n;
cout << "斐波那契数列的第 " << n << " 项是:" << t06.Funct(n) << endl;
return 0;
}
1
11

7、 编写一个程序,将一个数组中的值按逆序重新存放。例如,原来顺序为
8,6,5,4,1。要求改为 1,4,5,6,8。

代码
1
2
3
4
```
<!-- endtab -->
<!-- tab 输出:-->
```s

8、 编写一个程序根据输入的三角形的三条边判断是否能组成三角形,如果可以
则输出它的面积和三角形类型(等边、等腰、直角三角形)。

代码
1
2
3
4
```
<!-- endtab -->
<!-- tab 输出:-->
```s

9、 从键盘输入若干个学生成绩,统计并输出最高成绩和最低成绩,当输入负数
时结束输入。

代码
1
2
3
4
```
<!-- endtab -->
<!-- tab 输出:-->
```s

10、 编写函数将化氏温度转换为摄氏温度,公式为 C=(F-32)*5/9;并在主函
数中调用。

代码
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 Test10 {
public:
double convertFahrenheitToCelsius(double fahrenheit);
};

double Test10::convertFahrenheitToCelsius(double fahrenheit) {
// 使用公式 C = (F - 32) * 5/9 转换华氏温度到摄氏温度
return (fahrenheit - 32) * 5.0 / 9.0;
}

int main() {
Test10 t10;
double fahrenheit;
cout << "请输入华氏温度:";
cin >> fahrenheit;

// 调用 convertFahrenheitToCelsius 函数并输出结果
double celsius = t10.convertFahrenheitToCelsius(fahrenheit);
cout << "对应的摄氏温度是:" << celsius << endl;

return 0;
}
1
11

  1. 输入一个自然数,输出其各因子的连乘形式,如输入 12,则输出 12=122*3。

    代码
    1
    2
    3
    4
    ```
    <!-- endtab -->
    <!-- tab 输出:-->
    ```s
  2. N 个整数从小到大排列,输入一个新数插入其中,使 N+1 个整数仍然有序。

代码
1
2
3
4
```
<!-- endtab -->
<!-- tab 输出:-->
```s
  1. 在 100~200 之间找出满足用 3 除余 2,用 5 除余 3 和用 7 除余 2 的所有整
    数。
代码
1
2
3
4
```
<!-- endtab -->
<!-- tab 输出:-->
```s
  1. 输入 10 个同学的成绩,统计 80 分以上和不及格的人数,并输出平均值。
  2. 编写一个函数来检验输入的一个字符是大写字母还是小写字母或不是 26 个
    英文字母。
  3. 编写一个程序,从键盘输入半径和高,输出圆柱体的底面积和体积。
  4. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
  5. 编写程序,形成如下矩阵,并输出。
    11111
    21111
    A = 32111
    43211
    54321
  6. 用递归函数完成以下运算:
    sum(n)=12+22+…+n2
    函数的原型如下:
    long sum(int n);
    该函数完成 12+22+…+n2 的运算,并返回运算结果,其中 n>0。
    提示:你可以使用递归表达式:sum(n)=sum(n-1)+n2
  7. 编写一个程序,将整数转换成字符串:void itoa(int,char);
    微信公众号:王道在线 王道论坛网址:WWW.CSKAOYAN.COM
  8. 编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如
    输入 2004 年 12 月 31 日 23 时 59 分 59 秒,则输出 2005 年 1 月 1 日 0 时 0 分 0
    秒。
  9. 编写一个程序,交换两个数,不用第三块儿内存。
  10. 有一段文本,统计其中的单词数。例如:
    As a technology , “HailStorm” is so new that it is still only known by
    its code name. 注意:单词间的间隔不一定是一个空格。
  11. 国际象棋有 8×8 格,每个格子可放一个棋子。皇后的规则是可以横、竖、
    斜移动。在一个棋盘放置 8 个皇后,并使它们互相无法威胁到彼此。
  12. 有一字符串 a,内容为:My name is Li jilin.,另有字符串 b,内容为:
    Mr. Zhang Haoling is very happy.写一函数,将字符串 b 中从第 5 个到第 17
    个字符复制到字符串 a 中,取代字符串 a 中第 12 个字符以后的字符。输出新的
    字符串。
  13. 有一分数序列:1/2,1/4,1/6,1/8……,用函数调用的方法,求此数列前 20
    项的和。
  14. 已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此
    结点,然后删除。
  15. 用冒泡法对 10 个整数排序。
  16. 有一个 16 位的整数,每 4 位为一个数,写函数求他们的和。比如:
    整数 1101010110110111(十进制为 54711),和 1101+0101+1011+0111(十进制
    为 36)
  17. 设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从
    1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个
    人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
    微信公众号:王道在线 王道论坛网址:WWW.CSKAOYAN.COM
    C++类、对象、继承、多态相关
  18. 声明一个类 String,其数据成员为 char head[100],构造函数 String(char
    *Head)实现 head 的初始化,成员函数 void reverse()实现 head 内字符串的
    逆序存放,成员函数 void print()实现 head 内字符串的输出。
  19. 定义盒子 Box 类,要求具有以下成员:可设置盒子形状;可计算盒子体积;
    可计算盒子的表面积。
  20. 声明一个 Tree(树)类,有成员 ages(树龄),成员函数 grow(int years)用
    以对 ages 加上 years,showAge()用以显示 tree 对象的 ages 值。在主函数中定
    义 Tree 类对象,并调用成员函数(自行指定实参数据)。
  21. 有一个学生类 Student,包括学生姓名、成绩,设计一个友元函数,输出成
    绩对应的等级:
    (1) 大于等于 90:优;
    (2) 80~90:良;
    (3) 70~79:中;
    (4) 60~69:及格;
    (5) 小于 60:不及格。
  22. 定义一个复数类,用友元函数实现对双目运算符“+”的运算符重载,使其
    适用于复数运算。
  23. 有一个 Time 类,包含数据成员 minute(分)和 sec(秒),模拟秒表,每次走
    一秒,满 60 秒进一分钟,此时秒又从 0 开始算。要求输出分和秒的值。(提示:
    重载单目运算符++)。
  24. 设计一个三角形类 Triangle,包含三角形三条边长的私有数据成员,另有
    一个重载运算符“+”,以实现求两个三角形对象的面积之和。
  25. 使用函数重载的方法定义两个重名函数,分别求出整型数的两数之和和浮点
    数的两数之和,并在主函数中调用。
  26. 定义一个抽象类 Shape 用以计算面积,从中派生出计算长方形、梯形、圆形
    面积的派生类。程序中通过基类指针来调用派生类中的虚函数,计算不同形状的
    面积。
  27. 定义计数器类 Counter。要求具有以下成员:计数器值;可进行增值和减值
    记数;可提供记数值。
    微信公众号:王道在线 王道论坛网址:WWW.CSKAOYAN.COM
  28. 声明一个哺乳动物 Mammal 类,再由此派生出狗 Dog 类,二者都定义 speak( )
    成员函数,基类中定义为虚函数。声明一个 Dog 类的对象,调用 speak()函数,
    观察运行结果。
  29. 编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求:
    a) 抽象出一个基类 Base;
    b) 在其中说明一个虚函数用来求面积;
    c) 利用派生类定义“三角形、正方形、圆形”;
    d) 编写主函数并测试。
    C++字符串(std::string)、STL(标准模板库)相关
    (这一部分的作业,请参考 C++ Primer 5 的练习)
  30. 编写一段程序,从标准输入中一次读入一整行,存入 std::string 中,然后
    修改该程序,使其一次读入一个词。(练习 3.2)
  31. 请说明std::string类的输入运算符和getline函数分别是如何处理空白字
    符的。(练习 3.3)
  32. 编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接
    成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。(练
    习 3.5)
  33. 编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字
    符串剩余的部分。(练习 3.10)
  34. 编写一段程序,创建一个含有 10 个整数的 vector 对象,然后使用迭代器将
    所有元素的值都变成原来的两倍。输出 vector 对象的内容,检验程序是否正确。
    (练习 3.23)
  35. 编写一段程序,比较两个 std::string 对象。再编写一段程序,比较两个 C
    风格字符串的内容。(练习 3.39)
  36. 对于下面的程序任务,vector、deque 和 list 哪种容器最为合适?解释你
    的选择的理由。如果没有哪一种容器优于其他容器,也请解释理由。(练习 9.1)
    (1) 读取固定数量的单词,将他们按字典序插入到容器中。
    (2) 读取未知数量的单词,总是将新单词插入到末尾。删除操作在头部进行。
    (3) 从一个文件读取未知数量的整数。将这些数排序,然后将他们打印到标
    准输出。
    微信公众号:王道在线 王道论坛网址:WWW.CSKAOYAN.COM
  37. 对 6 种创建和初始化 vector 对象的方法,每一种都给出一个实例。解释每
    个 vector 包含什么值。(练习 9.11)
  38. 如何从一个 list初始化一个 vector?从一个 vector
    该如何创建?编写代码验证你的答案。(练习 9.13)
  39. 编程程序,将一个 list 中的 char*指针(指向 C 风格字符串)元素赋值给
    一个 vector 中的 string。(练习 9.14)
  40. 编写程序,从标准输入读取 string 序列,存入一个 deque 中。编写一个循
    环,用迭代器打印 deque 中的元素。(练习 9.18)
  41. 编写程序,从一个 list拷贝元素到两个 deque 中,其中值为偶数的所
    有元素都拷贝到一个 deque 中,而奇数元素都拷贝到另一个 deque 中。(9.20)
  42. 假定你希望每次读取一个字符存入一个 std::string 中,而且知道最少需要
    读取 100 个字符,应该如何提高程序的性能?(9.42)
  43. 编写一个函数,接受一个表示名字的 std::string 参数和两个分别表示前缀
    (如“Mr.”或“Ms.”)和后缀(如“Jr.”“III”)的字符串。使用迭代器及
    insert 和 append 函数将前缀和后缀加到给定的名字中,生成新的 string 并返
    回。(9.45)
  44. 定义一个 map,关键字是家庭的姓,值是一个 vector,保存家中孩子(们)
    的名。编写代码,实现添加新的家庭以及向已有家庭中添加新的孩子。(11.7)
  45. 编写一个程序,在一个 vector 而不是一个 set 中保存不重复的单词。使用
    set 的优点是什么?(练习 11.8)
  46. 可以用什么类型来对一个 map 进行下标操作?下标运算符返回的类型时什
    么?请给出一个具体例子,即定义一个 map,然后写出一个可以用来对 map 进行
    下标操作的类型以及下标运算符将会返回的类型。(11.26)
  47. 用冒泡法对 10 个整数排序。(用 STL 的 vector 容器实现)