实验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 }
运行测试截图:
回答问题:
问题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 }
运行测试截图:
回答问题:
问题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 }
运行测试截图:
回答问题:
问题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 }
运行测试截图:
回答问题:将 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 }
运行测试截图:
实验任务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 }
运行测试截图:
实验任务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 }
运行测试截图: