实验1

1.实验任务1

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <algorithm>
 5 
 6 template<typename T>
 7 void output(const T &c);
 8 
 9 void test1();
10 void test2();
11 void test3();
12 
13 int main(){
14     std::cout << "测试1:\n";
15     test1();
16     
17     std::cout << "\n测试2:\n";
18     test2();
19     
20     std::cout << "\n测试3:\n";
21     test3();
22 }
23 
24 template<typename T>
25 void output(const T &c){
26     for(auto &i : c)
27         std::cout << i << ' ';
28         std::cout << '\n';
29 }
30 
31 void test1(){
32     using namespace std;
33     
34     string s0{"0123456789"};
35     cout << "s0 = " << s0 <<endl;
36     
37     string s1(s0);
38     
39     reverse(s1.begin(), s1.end());
40     cout << "s1 = " << s1 << endl;
41     
42     string s2(s0.size(),' ');
43     
44     reverse_copy(s0.begin(), s0.end(), s2.begin());
45     cout << "s2 = " << s2 << endl;
46 }
47 
48 void test2(){
49     using namespace std;
50     
51     vector<int> v0{2,0,4,9};
52     cout << "v0: ";output(v0);
53     
54     vector<int> v1{v0};
55     reverse(v1.begin(), v1.end());
56     cout << "v1: ";output(v1);
57     
58     vector<int> v2{v0};
59     reverse_copy(v0.begin(), v0.end(), v2.begin());
60     cout << "v2: ";output(v2);
61 }
62 
63 void test3(){
64     using namespace std;
65     
66     vector<int> v0{0,1,2,3,4,5,6,7,8,9};
67     cout << "v0: ";output(v0);
68     
69     vector<int> v1{v0};
70     rotate(v1.begin(), v1.begin()+1, v1.end());
71     cout << "v1: ";output(v1);
72     
73     vector<int> v2{v0};
74     rotate(v2.begin(), v2.begin()+2, v2.end());
75     cout << "v2: ";output(v2);
76     
77     vector<int> v3{v0};
78     rotate(v3.begin(), v3.end()-1, v3.end());
79     cout << "v3: ";output(v3);
80     
81     vector<int> v4{v0};
82     rotate(v4.begin(), v4.end()-2, v4.end());
83     cout << "v4: ";output(v4);
84     
85 }

 

运行测试截图:

image

 回答问题:

问题1:reverse直接修改原容器,reverse_copy不修改原容器

问题2:rotate将[begin, mid)和[mid, end)两个区间的元素交换位置,使mid指向的元素成为新的第一个元素begin是开始的位置;mid是中间的元素;end是结束位置。

 

实验任务2:

源代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <numeric>
 5 #include <iomanip>
 6 #include <cstdlib>
 7 #include <ctime>
 8 
 9 template<typename T>
10 void output(const T &c);
11 
12 int generate_random_number();
13 void test1();
14 void test2();
15 
16 int main() {
17     std::srand(std::time(0));
18     std::cout << "测试1: \n";
19     test1();
20     std::cout << "\n测试2: \n";
21     test2();
22 }
23 
24 template <typename T>
25 void output(const T &c) {
26     for(auto &i: c)
27         std::cout << i << ' ';
28     std::cout << '\n';
29 }
30 
31 int generate_random_number() {
32     return std::rand() % 101;
33 }
34 
35 void test1() {
36     using namespace std;
37     
38     vector<int> v0(10);
39     generate(v0.begin(), v0.end(), generate_random_number);
40     cout << "v0: "; output(v0);
41     
42     vector<int> v1{v0};
43     sort(v1.begin(), v1.end());
44     cout << "v1: "; output(v1);
45     
46     vector<int> v2{v0};
47     sort(v2.begin()+1, v2.end()-1);
48     cout << "v2: "; output(v2);
49 }
50 
51 void test2() {
52     using namespace std;
53     
54     vector<int> v0(10);
55     generate(v0.begin(), v0.end(), generate_random_number);
56     cout << "v0: "; output(v0);
57     
58     
59     auto min_iter = min_element(v0.begin(), v0.end());
60     auto max_iter = max_element(v0.begin(), v0.end());
61     cout << "最小值: " << *min_iter << endl;
62     cout << "最大值: " << *max_iter << endl;
63     
64     auto ans = minmax_element(v0.begin(), v0.end());
65     cout << "最小值: " << *(ans.first) << endl;
66     cout << "最大值: " << *(ans.second) << endl;
67     
68     double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / v0.size();
69     cout << "均值: " << fixed << setprecision(2) << avg1 << endl;
70     
71     sort(v0.begin(), v0.end());
72     double avg2 = accumulate(v0.begin()+1, v0.end()-1, 0.0) / (v0.size()-2);
73     cout << "去掉最大值、最小值之后,均值: " << avg2 << endl;
74 }

运行测试截图:

image

 回答问题:

问题1:generate的作用是在区间中生成随机数

问题2:优势是效率高,简洁

问题3:lambda表达式适用于逻辑简单、仅在局部使用、无需复用的场景

 

实验任务3:

源代码:

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

运行测试截图:

image

 回答问题:

问题1:func功能是将字母转化为后一个字母,如果是z或Z,则转为a或A

问题2:tolower:将大写字母转换为对应的小写字母;toupper:将小写字母转换为对应的大写字母

问题3:第1个参数:源区间的起始迭代器;第2个参数:源区间的结束迭代器;第3个参数:目标区间的起始迭代器;第4个参数:用于元素变换的可调用对象;如果把第3个参数 s2.begin() 改成 s1.begin(),会修改 s1 自身的内容

 

实验任务4:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cctype>
 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     while (cin >> s) {
13         cout << boolalpha
14              << "区分大小写: " << is_palindrome(s) << "\n"
15              << "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n";
16     }
17     return 0;
18 }
19 
20 bool is_palindrome(const std::string &s) {
21     int left = 0, right = s.size() - 1;
22     while (left < right) {
23         if (s[left] != s[right]) {
24             return false;
25         }
26         left++;
27         right--;
28     }
29     return true;
30 }
31 
32 bool is_palindrome_ignore_case(const std::string &s) {
33     int left = 0, right = s.size() - 1;
34     while (left < right) {
35         if (tolower(s[left]) != tolower(s[right])) {
36             return false;
37         }
38         left++;
39         right--;
40     }
41     return true;
42 }

运行测试截图:

image

 回答问题:将 cin >> s 替换为 std::getline(cin, s)

 

实验任务5:

源代码:

 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 std::string dec2n(int x, int n) {
20     if (x == 0) {
21         return "0";
22     }
23     
24     std::string res;
25     
26     while (x > 0) {
27         int mod = x % n;
28         char c;
29         if (mod < 10) {
30             c = '0' + mod;
31         } else {
32             c = 'A' + (mod - 10);
33         }
34         res.push_back(c);
35         x /= n;
36     }
37     
38     std::reverse(res.begin(), res.end());
39     return res;
40 }

运行测试截图:

image

 

实验任务6:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <iomanip>
 4 
 5 int main(){
 6     std::cout << std::setw(2) << " "; 
 7     for (char c = 'a'; c <= 'z'; ++c) {
 8         std::cout << std::setw(2) << c;
 9     }
10     std::cout << std::endl;
11 
12     for(int i = 1; i <= 26; ++i){
13         std::cout << std::setw(2) << i; 
14         for (char c = 'A'; c <= 'Z'; ++c) {
15             char cipher = (c - 'A' + i) % 26 + 'A';
16             std::cout << std::setw(2) << cipher;
17         }
18         std::cout << std::endl;
19     }
20 
21     return 0;
22 }

运行测试截图:

image

 

实验任务7:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <cstdlib>
 4 #include <ctime>
 5 #include <iomanip>
 6 
 7 using namespace std;
 8 
 9 int generate_question(int &a, int &b, char &op){
10     a = rand() % 10 + 1;
11     b = rand() % 10 + 1;
12     int op_type = rand() % 4;
13     int result = 0;
14 
15     switch (op_type){
16         case 0:
17             op = '+';
18             result = a + b;
19             break;
20         case 1:
21             op = '-';
22             if (a < b) swap(a, b);
23             result = a - b;
24             break;
25         case 2:
26             op = '*';
27             result = a * b;
28             break;
29         case 3:
30             op = '/';
31             while (a % b != 0) {
32                 a = rand() % 10 + 1;
33                 b = rand() % 10 + 1;
34                 if (a < b) swap(a, b);
35             }
36             result = a / b;
37             break;
38     }
39     return result;
40 }
41 
42 int main(){
43     srand(time(0));
44     int correct = 0;
45 
46     for (int i = 0; i < 10; ++i) {
47         int a, b, user_ans, correct_ans;
48         char op;
49         correct_ans = generate_question(a, b, op);
50 
51         cout << a << " " << op << " " << b << " = ";
52         cin >> user_ans;
53 
54         if (user_ans == correct_ans) {
55             correct++;
56         }
57     }
58 
59     double accuracy = (double)correct / 10 * 100;
60     cout << "正确率:" << fixed << setprecision(2) << accuracy << "%" << endl;
61 
62     return 0;
63 }

运行测试截图:

image

 

posted @ 2025-10-18 01:12  雅ya  阅读(11)  评论(1)    收藏  举报