实验一

task1:

代码:

 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 
49 void test2() {
50     using namespace std;
51 
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());
57     cout << "v1: "; output(v1);
58 
59     vector<int> v2{v0};
60     reverse_copy(v0.begin(), v0.end(), v2.begin());
61     cout << "v2: "; output(v2);
62 }
63 
64 void test3() {
65     using namespace std;
66 
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 
72     rotate(v1.begin(), v1.begin()+1, v1.end());  
73     cout << "v1: "; output(v1);
74 
75     vector<int> v2{v0}; 
76  
77     rotate(v2.begin(), v2.begin()+2, v2.end());  
78     cout << "v2: "; output(v2);
79 
80     vector<int> v3{v0};
81 
82     rotate(v3.begin(), v3.end()-1, v3.end()); 
83      cout << "v3: "; output(v3);
84 
85     vector<int> v4{v0};
86 
87     rotate(v4.begin(), v4.end()-2, v4.end()); 
88     cout << "v4: "; output(v4);
89 }

运行结果:

屏幕截图 2025-10-15 090758

问题:

(1 reverse会改变原来的字符串,reverse_copy不会改变
(2 rotate是将一个区间内的元素一个个向某一方向移动,第一和第三个参数代表着区间范围,第二个参数代表方向和距离

task2:

代码:

 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 void test1();
13 void test2();
14 
15 int main() {
16     std::srand(std::time(0));  
17     std::cout << "测试1: \n";
18     test1();
19 
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 void test1() {
32     using namespace std;
33 
34     vector<int> v0(10);
35     generate(v0.begin(), v0.end(), [](){return std::rand()%101;});
36     cout << "v0: "; output(v0);
37 
38     vector<int> v1{v0};
39     sort(v1.begin(), v1.end());
40     cout << "v1: "; output(v1);
41 
42     vector<int> v2{v0};
43     sort(v2.begin()+1, v2.end()-1); 
44     cout << "v2: "; output(v2);
45 }
46 
47 void test2() {
48     using namespace std;
49 
50     vector<int> v0(10);  
51     generate(v0.begin(), v0.end(),[](){return std::rand()%101;}); 
52     cout << "v0: "; output(v0);
53 
54     auto min_iter = min_element(v0.begin(), v0.end());
55     auto max_iter = max_element(v0.begin(), v0.end());
56     cout << "最小值: " << *min_iter << endl;
57     cout << "最大值: " << *max_iter << endl;
58 
59     auto ans = minmax_element(v0.begin(), v0.end());
60     cout << "最小值: " << *(ans.first) << endl;
61     cout << "最大值: " << *(ans.second) << endl;
62 
63     double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / v0.size();
64     cout << "均值: " << fixed << setprecision(2) << avg1 << endl;
65 
66     sort(v0.begin(), v0.end());
67     double avg2 = accumulate(v0.begin()+1, v0.end()-1, 0.0) / (v0.size()-2);
68     cout << "去掉最大值、最小值之后,均值: " << avg2 << endl;
69 }

运行结果:

屏幕截图 2025-10-15 091017

问题:

(1 generate能通过第三个参数填充第一、二个参数间的元素
(2 代码更简洁,运行速度更快,只需要遍历一遍就行
(3 两种代码都是使用随机数填充

task3:

代码:

 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 }

运行结果:

屏幕截图 2025-10-15 091212

问题:

(1 将字符串中的字符都往后一位,z变到a
(2 tolower将所有元素变为大写,toupper将所有元素变为小写
(3 第一、二个参数是要变形的原字符串首位,第三个参数是变形后字符串保存的位置,第四个参数是变形方式;将s2.begin()改成s1.begin()后相当于在原来的字符串上直接修改,不另外保存

task4:

代码:

 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 
20 bool is_palindrome(const std::string &s)
21 {
22     std::string s1(s);
23     reverse(s1.begin(),s1.end());
24     return s==s1; 
25 }
26 
27 bool is_palindrome_ignore_case(const std::string &s)
28 {
29     std::string s1,s2;
30     for(auto c:s)
31         s1 += std::tolower(c);
32     for(auto c:s)
33         s2 += std::tolower(c);
34     reverse(s2.begin(),s2.end());
35     return s1==s2;
36 }

屏幕截图 2025-10-15 093933

问题:

使用 std::getline(std::cin, str)

task5:

代码:

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

运行结果:

屏幕截图 2025-10-15 095659

task6:

代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <iomanip>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int main() 
 8 {
 9     string s;
10     string s1;
11     for (char c = 'a'; c <= 'z'; c++) {
12         s+=c;
13     }
14     cout<<right<<setw(2)<<" ";
15     for(auto c: s)
16     {
17         cout << right << setw(2) <<c;
18         s1 += toupper(c);
19     }
20     cout<<endl;
21     for(int i=1;i<=26;i++)
22     {
23         cout << right << setw(2) << i;
24         rotate(s1.begin(),s1.begin() + 1,s1.end());
25         for(auto c: s1)
26         {
27             cout << right << std::setw(2) <<c;
28         }  
29     cout<<endl;
30     }
31     return 0;
32 }

运行结果:

屏幕截图 2025-10-15 101146

task7:

代码:

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

运行结果:

屏幕截图 2025-10-15 101425

 

posted @ 2025-10-15 10:15  yueTO  阅读(3)  评论(0)    收藏  举报