实验1 现代C++编程初体验

任务1:

源代码task1.cpp

 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 << "测试2:\n" ;
18     test2();
19     
20     std::cout << "测试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     reverse(s1.begin(),s1.end());
39     cout << "s1=" << s1 << endl;
40     
41     string s2(s0.size(),' ');
42     reverse_copy(s0.begin(),s0.end(),s2.begin());
43     cout << "s2=" << s2 << endl;
44     
45 }
46 
47 void test2(){
48     using namespace std;
49     
50     vector<int> v0{2,0,4,9};
51     cout << "v0:" ; output(v0);
52     
53     vector<int> v1{v0};
54     reverse(v1.begin(),v1.end());
55     cout << "v1:" ; output(v1);
56     
57     vector<int> v2{v0};
58     reverse_copy(v0.begin(),v0.end(),v2.begin());
59     cout << "v2:" ; output(v2);
60      
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 }

运行结果截图

5d9f6f27ae15dc7d84ff4cf790d58e90

回答问题

问题1: reverse 和 reverse_copy 有什么区别?
答:reverse是对原序列进行反转操作,会改变原序列的元素顺序
reverse_copy是将原序列反转复制到新的序列,不会改变原序列的元素顺序
问题2: rotate 算法是如何改变元素顺序的?它的三个参数分别代表什么?
rotate算法通过循环移动区间内的元素实现元素顺序的改变
第一个参数和第三个参数表示移动区间,第二个参数将区间分为两个部分,前面一部分后移,后面一部分前移,第二个参数变成新区间的起始,第一个参数对应的元素在第三个参数对应元素的后面
 
任务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 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     
21     std::cout << "测试2:\n";
22     test2(); 
23 } 
24 
25 template<typename T>
26 void output(const T &c){
27     for(auto i:c)
28         std::cout << i << ' ';
29     std::cout << '\n';
30 }
31 
32 int generate_random_number(){
33     return std::rand() % 101;
34 } 
35 
36 void test1(){
37     using namespace std;
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     auto min_iter = min_element(v0.begin(),v0.end());
59     auto max_iter = max_element(v0.begin(),v0.end());
60     cout << "最小值: " << *min_iter << endl;
61     cout << "最大值: " << *max_iter << endl;
62     
63     auto ans= minmax_element(v0.begin(),v0.end());
64     cout << "最小值: " << *(ans.first) << endl;
65     cout << "最大值: " << *(ans.second) << endl;
66     
67     double avg1 = accumulate(v0.begin(),v0.end(),0.0)/v0.size();
68     cout << "均值: " << fixed << setprecision(2) << avg1 << endl;
69     
70     sort(v0.begin(),v0.end());
71     double avg2 = accumulate(v0.begin()+1,v0.end()-1,0.0)/(v0.size()-2);
72     cout << "去掉最大值、最小值之后,均值: " << avg2 << endl;
73 }

运行结果截图

06a231666b813f9e71762175edef3520

回答问题

问题1: generate 算法的作用是什么?
批量生成元素并填充序列
问题2: minmax_element 和分别调用 min_element 、 max_element 相比,有什么优势?
花费时间更少,代码更简洁
问题3:查询 generate 第3个参数 [](){return std::rand()%101;} 用法,与使用自定义函数
generate_random_number 相比,lambda表达式适用场景是什么?
lambda适用于逻辑简单且使用一次,需捕捉外部变量,希望代码在调用处附近,与函数对象结合的场景
 
任务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 << "测试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(),s2.begin(),func);
52     std::cout << "s2= " << s2 << '\n';
53 }

运行结果截图

be5b35ce5b20c9a48a63849e106d69a5

回答问题

问题1:自定义函数 func 功能是什么?
将原字符转换为在ASCLL码中的下一个字符,“z”转换为“a”,“Z”转换为“A”
问题2: tolower 和 toupper 功能分别是什么?
tolower将原字符串中的大写字母转换为小写,toupper将原字符串中的小写字母转换为大写
问题3: transform 的4个参数意义分别是什么?如果把第3个参数 s2.begin() 改成 s1.begin() ,有何区
别?
第一个参数和第二个参数表示变换的区间,按照第四个参数的规则变换,将变换后的序列存储在第二个参数内
改成s1.begin(),s1序列的元素将会被改变
 
任务4
源代码task4.cpp
 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 
 5 bool is_palindrome(const std::string &s);
 6 bool is_palindrome_ignore_case(const std::string &s);
 7 
 8 int main(){
 9     using namespace std;
10     string s;
11     
12     while(cin >> s){
13         cout << boolalpha
14         << "区分大小写: " << is_palindrome(s) << '\n'
15         << "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n";
16     }
17 }
18 
19 bool is_palindrome(const std::string &s){
20     std::string s1(s);
21     reverse(s1.begin(),s1.end());
22     if(s1 == s) return true;
23     else return false;
24 }
25 
26 bool is_palindrome_ignore_case(const std::string &s){
27     std::string s2;
28     for(auto c : s)
29         s2 += std::tolower(c);
30     std::string s3(s2);
31     reverse(s3.begin(),s3.end()); 
32     if(s3 == s2) return true;
33     else return false;
34 }

运行结果截图

1f17b91fbde54c44ca0fcbd7282951aa

回答问题

问题:使用 cin >> s 输入时,输入的字符串中不能包含空格。如果希望测试字符串包含空格(如 hello
oop ),代码应如何调整?
将cin >> s换成getline(cin,s)
 
任务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         std::cout << "二进制: " << dec2n(x) << '\n';
12         std::cout << "八进制: " << dec2n(x,8) << '\n';
13         std::cout << "十二进制: " << dec2n(x,12) << '\n';
14         std::cout << "十六进制: " << dec2n(x,16) << '\n';
15         std::cout << "三十二进制: " << dec2n(x,32) << "\n\n";
16     }
17 } 
18 
19 std::string dec2n(int x,int n){
20     int m = x%n ;
21     std::string s;
22     if(x == 0){
23         s = '0';
24     }
25     else {
26     while(x != 0){
27         if(m < 10) s += m + '0';
28         else s+=m-10+'A';
29         x /= n;
30         m = x % n;
31     }
32     std::reverse(s.begin(),s.end());
33 }
34     return s;
35 }

运行结果截图

f8ee2f4b6b4996f904bb5516e0725d71

 

任务6

源代码task6.cpp

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

运行结果截图

7c674b61d54424f7d6b02d6b577c54ea

 

任务7

源代码task7.cpp

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<iomanip>
 4 #include<ctime>
 5 using namespace std;
 6  
 7 int main(){
 8     srand(static_cast<unsigned int>(time(0)));
 9     int count = 0;
10     for(int i = 0;i < 10; i ++){
11         int num1 = rand() % 10 + 1;
12         int num2 = rand() % 10 + 1;
13         int op = rand() % 4 ;
14         int correctresult,userresult;
15         char op1;
16         bool flag = true;
17         switch(op){
18             case 0:
19                 op1 = '+' ;
20                 correctresult = num1 + num2;
21                 break;
22             case 1:
23                 op1 = '-' ; 
24                 correctresult = num1 - num2;
25                 if (correctresult < 0) flag = false;
26                 break;
27             case 2:
28                 op1 = '*' ;
29                 correctresult = num1 * num2;
30                 break;
31                 
32             case 3:
33                 op1 = '/' ;
34                 correctresult = num1 / num2;
35                 if(num2 == 0 || num1 % num2 != 0) flag = false;
36                 break; 
37             default: 
38                 flag = false;
39                 break;
40             }
41             if( ! flag){
42             i-- ;
43             continue;
44         }
45         cout << num1 << " " << op1 << " " << num2 << " " << "= " ;
46         cin >> userresult;
47         if(userresult == correctresult) count ++;
48     }
49     double accuracy = static_cast<double> (count) / 10 * 100 ;
50     cout << fixed << setprecision(2) << "正确率: " << accuracy << "%" << endl;
51 }

运行结果截图

d024cf5b50b87c653133b5005964977d

 

posted @ 2025-10-16 21:33  陈志立  阅读(9)  评论(1)    收藏  举报