实验1

任务1

源代码task1.cpp

 1 // 现代C++标准库、算法库体验
 2 // 功能:使用reverse/reverse_copy/rotate操作string和vector,体验标准库便捷性
 3 #include <iostream>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 
 8 // 模板函数声明:输出容器元素(支持string、vector等可迭代容器)
 9 template<typename T>
10 void output(const T &c);
11 // 测试函数声明
12 void test1(); // 测试string反转
13 void test2(); // 测试vector反转
14 void test3(); // 测试vector旋转
15 
16 int main() {
17     std::cout << "测试1: \n";
18     test1();
19     std::cout << "\n测试2: \n";
20     test2();
21     std::cout << "\n测试3: \n";
22     test3();
23     return 0;
24 }
25 
26 // 模板函数定义:输出容器元素
27 template <typename T>
28 void output(const T &c) {
29     for (auto &i : c)
30         std::cout << i << ' ';
31     std::cout << '\n';
32 }
33 
34 // 测试1:string反转(reverse直接修改,reverse_copy拷贝不修改原串)
35 void test1() {
36     using namespace std;
37     string s0{"0123456789"};
38     cout << "s0 = " << s0 << endl;
39 
40     string s1(s0);
41     reverse(s1.begin(), s1.end()); // 反转s1自身
42     cout << "s1 = " << s1 << endl;
43 
44     string s2(s0.size(), ' ');
45     reverse_copy(s0.begin(), s0.end(), s2.begin()); // 反转s0并拷贝到s2,s0不变
46     cout << "s2 = " << s2 << endl;
47 }
48 
49 // 测试2:vector反转(验证算法对不同容器的通用性)
50 void test2() {
51     using namespace std;
52     vector<int> v0{2, 0, 4, 9};
53     cout << "v0: "; output(v0);
54 
55     vector<int> v1{v0};
56     reverse(v1.begin(), v1.end()); // 反转v1
57     cout << "v1: "; output(v1);
58 
59     vector<int> v2{v0};
60     reverse_copy(v0.begin(), v0.end(), v2.begin()); // 反转v0拷贝到v2
61     cout << "v2: "; output(v2);
62 }
63 
64 // 测试3:vector元素旋转(循环左移/右移)
65 void test3() {
66     using namespace std;
67     vector<int> v0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
68     cout << "v0: "; output(v0);
69 
70     vector<int> v1{v0};
71     rotate(v1.begin(), v1.begin()+1, v1.end()); // 左移1位([begin, begin+1)与[begin+1, end)交换)
72     cout << "v1: "; output(v1);
73 
74     vector<int> v2{v0};
75     rotate(v2.begin(), v2.begin()+2, v2.end()); // 左移2位
76     cout << "v2: "; output(v2);
77 
78     vector<int> v3{v0};
79     rotate(v3.begin(), v3.end()-1, v3.end()); // 右移1位([begin, end-1)与[end-1, end)交换)
80     cout << "v3: "; output(v3);
81 
82     vector<int> v4{v0};
83     rotate(v4.begin(), v4.end()-2, v4.end()); // 右移2位
84     cout << "v4: "; output(v4);
85 }

运行结果截图:

image

 任务2

task2.cpp

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <numeric>
 5 #include <iomanip>
 6 #include <cstdlib>
 7 #include <ctime>
 8 
 9 // 模板函数声明
10 template<typename T>
11 void output(const T &c);
12 
13 int generate_random_number();
14 
15 void test1();
16 void test2();
17 
18 int main() {
19     std::srand(std::time(0)); // 添加随机种子
20     std::cout << "测试1: \n";
21     test1();
22 
23     std::cout << "\n测试2: \n";
24     test2();
25 }
26 
27 // 输出容器对象c中的元素
28 template <typename T>
29 void output(const T &c) {
30     for(auto &i: c)
31         std::cout << i << ' ';
32     std::cout << '\n';
33 }
34 
35 // 返回[0, 100]区间内的一个随机整数
36 int generate_random_number() {
37     return std::rand() % 101;
38 }
39 
40 // 测试1:对容器类对象指定迭代器区间赋值、排序
41 void test1() {
42     using namespace std;
43 
44     vector<int> v0(10); // 创建一个动态数组对象v0, 对象大小为10
45     generate(v0.begin(), v0.end(), generate_random_number); // 生成随机数填充v0
46     cout << "v0: "; output(v0);
47 
48     vector<int> v1{v0};
49     sort(v1.begin(), v1.end()); // 对整个vector排序
50     cout << "v1: "; output(v1);
51 
52     vector<int> v2{v0};
53     sort(v2.begin()+1, v2.end()-1); // 只对中间部分排序,不包含首尾元素
54     cout << "v2: "; output(v2);
55 }
56 
57 // 测试2:对容器类对象指定迭代器区间赋值、计算最大值/最小值/均值
58 void test2() {
59     using namespace std;
60 
61     vector<int> v0(10); 
62     generate(v0.begin(), v0.end(), generate_random_number); 
63     cout << "v0: "; output(v0);
64 
65     // 求最大值和最小值
66     auto min_iter = min_element(v0.begin(), v0.end());
67     auto max_iter = max_element(v0.begin(), v0.end());
68     cout << "最小值: " << *min_iter << endl;
69     cout << "最大值: " << *max_iter << endl;
70 
71     // 同时求最大值和最小值
72     auto ans = minmax_element(v0.begin(), v0.end());
73     cout << "最小值: " << *(ans.first) << endl;
74     cout << "最大值: " << *(ans.second) << endl;
75 
76     // 求平均值
77     double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / v0.size();
78     cout << "均值: " << fixed << setprecision(2) << avg1 << endl;
79 
80     sort(v0.begin(), v0.end());
81     double avg2 = accumulate(v0.begin()+1, v0.end()-1, 0.0) / (v0.size()-2);
82     cout << "去掉最大值、最小值之后,均值: " << avg2 << endl;
83 }

运行结果截图:

 

image

 任务3

task3.cpp

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cctype>
 5 
 6 unsigned char func(unsigned char c);
 7 void test1();
 8 void test2();
 9 
10 int main() {
11     std::cout << "测试1: 字符串大小写转换\n";
12     test1();
13 
14     std::cout << "\n测试2: 字符变换\n";
15     test2();
16 }
17 
18 unsigned char func(unsigned char c) {
19     if(c == 'z')
20         return 'a';
21 
22     if(c == 'Z')
23         return 'A';
24 
25     if(std::isalpha(c))
26         return static_cast<unsigned char>(c+1);
27 
28     return c;
29 }
30 
31 void test1() {
32     std::string s1{"Hello World 2049!"};
33     std::cout << "s1 = " << s1 << '\n';
34 
35     std::string s2;
36     for(auto c: s1)
37         s2 += std::tolower(c);
38     std::cout << "s2 = " << s2 << '\n'; 
39 
40     std::string s3;
41     for(auto c: s1)
42         s3 += std::toupper(c);
43     std::cout << "s3 = " << s3 << '\n'; 
44 }
45 
46 void test2() {
47     std::string s1{"I love cosmos!"};
48     std::cout << "s1 = " << s1 << '\n';
49 
50     std::string s2(s1.size(), ' ');
51     std::transform(s1.begin(), s1.end(),
52                    s2.begin(),
53                    func);
54     std::cout << "s2 = " << s2 << '\n';
55 }

运行结果截图:

image

 任务4:

task4.cpp

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cctype> // 用于tolower函数
 5 
 6 bool is_palindrome(const std::string &s);
 7 bool is_palindrome_ignore_case(const std::string &s);
 8 
 9 int main() {
10     using namespace std;
11     string s;
12 
13     // 多组输入,直到按下Ctrl+Z结束测试
14     while(cin >> s) {
15         cout << boolalpha 
16              << "区分大小写: " << is_palindrome(s) << "\n"
17              << "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n";
18     }
19 }
20 
21 // 函数is_palindrome定义(区分大小写)
22 bool is_palindrome(const std::string &s) {
23     int left = 0;
24     int right = s.size() - 1;
25     // 双指针从首尾向中间比较
26     while (left < right) {
27         if (s[left] != s[right]) {
28             return false;
29         }
30         left++;
31         right--;
32     }
33     return true;
34 }
35 
36 // 函数is_palindrome_ignore_case定义(不区分大小写)
37 bool is_palindrome_ignore_case(const std::string &s) {
38     int left = 0;
39     int right = s.size() - 1;
40     while (left < right) {
41         // 转成小写后比较
42         if (tolower(s[left]) != tolower(s[right])) {
43             return false;
44         }
45         left++;
46         right--;
47     }
48     return true;
49 }

运行结果截图:

image

 任务5:

task5.cpp

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 
 5 std::string dec2n(int x, int n = 2);
 6 
 7 int main() {
 8     int x;
 9     while(std::cin >> x) {
10         std::cout << "十进制: " << x << '\n'
11                   << "二进制: " << dec2n(x) << '\n'
12                   << "八进制: " << dec2n(x, 8) << '\n'
13                   << "十二进制: " << dec2n(x, 12) << '\n'
14                   << "十六进制: " << dec2n(x, 16) << '\n'
15                   << "三十二进制: " << dec2n(x, 32) << "\n\n"; 
16     }
17 }
18 
19 // 函数dec2n定义(十进制转n进制,默认二进制)
20 std::string dec2n(int x, int n) {
21     // 处理x=0的特殊情况
22     if (x == 0) {
23         return "0";
24     }
25     // 定义进制字符集(0-9、A-Z覆盖36进制)
26     const std::string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
27     std::string result;
28 
29     // 循环取余计算每一位
30     while (x > 0) {
31         int remainder = x % n;
32         result += chars[remainder]; // 拼接当前位字符
33         x = x / n; // 更新x为商
34     }
35 
36     // 计算结果是逆序的,需反转
37     std::reverse(result.begin(), result.end());
38     return result;
39 }

运行结果截图:

image

 任务6:

task6.cpp

 1 #include <iostream>
 2 #include <string>
 3 
 4 int main() {
 5     // 原始小写字母表
 6     const std::string original = "abcdefghijklmnopqrstuvwxyz";
 7     int len = original.size(); // 字母表长度(26)
 8 
 9     // 循环生成0-26位移位表(共27行,第26行回到原表)
10     for (int i = 0; i <= 26; i++) {
11         // 移位逻辑:截取i到末尾 + 截取0到i-1(左移i位)
12         std::string shifted = original.substr(i) + original.substr(0, i);
13         // 输出序号和移位后的字母表
14         std::cout << i << shifted << std::endl;
15     }
16 
17     return 0;
18 }

运行结果截图:

image

 任务7:

task7.cpp

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <ctime>
 4 #include <iomanip>
 5 
 6 int main() {
 7     // 设置随机种子,确保每次运行题目不同
 8     std::srand(std::time(0));
 9     int correct = 0; // 正确题数
10     const int total = 10; // 总题数
11 
12     // 生成10道题
13     for (int i = 0; i < total; i++) {
14         int a, b, ans, user_ans;
15         char op;
16 
17         // 生成1-10的随机操作数
18         a = std::rand() % 10 + 1;
19         b = std::rand() % 10 + 1;
20 
21         // 随机选择运算符(0:加,1:减,2:乘,3:除)
22         int op_type = std::rand() % 4;
23         switch (op_type) {
24             case 0:
25                 op = '+';
26                 ans = a + b;
27                 break;
28             case 1:
29                 op = '-';
30                 // 确保减法:被减数 >= 减数
31                 if (a < b) {
32                     std::swap(a, b);
33                 }
34                 ans = a - b;
35                 break;
36             case 2:
37                 op = '*';
38                 ans = a * b;
39                 break;
40             case 3:
41                 op = '/';
42                 // 确保除法:a能被b整除,且结果<=10
43                 // 重新计算a:a = b * 随机数(1到10/b)
44                 a = b * (std::rand() % (10 / b) + 1);
45                 ans = a / b;
46                 break;
47         }
48 
49         // 输出题目并获取用户答案
50         std::cout << a << op << b << "=";
51         std::cin >> user_ans;
52 
53         // 判断对错
54         if (user_ans == ans) {
55             correct++;
56         }
57     }
58 
59     // 计算并输出正确率(保留两位小数,百分号格式)
60     double accuracy = (correct * 1.0 / total) * 100;
61     std::cout << "正确率: " << std::fixed << std::setprecision(2) << accuracy << "%" << std::endl;
62 
63     return 0;
64 }

运行结果截图:

image

 

 

 

posted @ 2025-10-17 18:00  ccmtxwbdhym  阅读(3)  评论(1)    收藏  举报