实验1
源代码:
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<algorithm> 5 6 //模版函数声明 7 template<typename T> 8 void output(const T& c); 9 10 void test1(); 11 void test2(); 12 void test3(); 13 14 int main() 15 { 16 std::cout << "测试1:\n"; 17 test1(); 18 19 std::cout << "\n测试2:\n"; 20 test2(); 21 22 std::cout << "\n测试3:\n"; 23 test3(); 24 } 25 26 27 //输出容器对象c中的元素 28 template <typename T> 29 void output(const T& c) 30 { 31 for (auto& i : c) 32 std::cout << i << ' '; 33 std::cout << '\n'; 34 35 } 36 //测试1:组合使用算法库、迭代器、string反转字符串 37 void test1() 38 { 39 using namespace std; 40 string s0{ "0123456789" }; 41 cout << "s0 = " << s0 << endl; 42 43 string s1(s0); 44 //反转s1自身 45 reverse(s1.begin(), s1.end());//修改源容器 46 cout << "s1 = " << s1 << endl; 47 48 string s2(s0.size(), ' '); 49 //将s0反转后结果拷贝到s2,s0自身不变 50 reverse_copy(s0.begin(),s0.end(), s2.begin());//源容器保持不变,括号内前两个为源容器范围,最后一个为新容器起始位置 51 cout << "s2 = " << s2 << endl; 52 53 } 54 55 //测试2:组合使用算法库、迭代器、vector反转动态数组对象vector内数据库 56 57 void test2() 58 { 59 using namespace std; 60 61 vector<int> v0{ 2,0,4,9 }; 62 cout << "v0: ";output(v0); 63 vector<int> v1{ v0 }; 64 reverse(v1.begin(), v1.end()); 65 cout << "v1: ";output(v1); 66 67 vector<int> v2{ v0 }; 68 reverse_copy(v0.begin(), v0.end(), v2.begin()); 69 cout << "v2: ";output(v2); 70 } 71 72 //测试3:组合使用算法库、迭代器、vector实现元素旋转移位 73 void test3() 74 { 75 using namespace std; 76 77 vector<int> v0{ 0,1,2,3,4,5,6,7,8,9 }; 78 cout << "v0: ";output(v0); 79 80 vector<int> v1{ v0 }; 81 //将[v1.begin(), v1.end())区间内元素循环左移1位 82 rotate(v1.begin(), v1.begin() + 1, v1.end()); 83 cout << "v1: ";output(v1); 84 85 vector<int> v2{ v0 }; 86 // 将[v1.begin(), v1.end())区间内元素循环左移2位 87 rotate(v2.begin(), v2.begin() + 2, v2.end()); 88 cout << "v2: ";output(v2); 89 90 91 vector<int> v3{ v0 }; 92 // 将[v1.begin(), v1.end())区间内元素循环右移1位 93 rotate(v3.begin(), v3.end() - 1, v3.end()); 94 cout << "v3: ";output(v3); 95 96 vector<int> v4{ v0 }; 97 // 将[v1.begin(), v1.end())区间内元素循环右移2位 98 rotate(v4.begin(), v4.end() - 2, v4.end()); 99 cout << "v4: "; output(v4); 100 }
运行结果截图:
问题:
1:reverse只反转原容器,而reverse_copy改变目标容器,不对原容器进行操作
2:rotate函数通过第一个参数和第三个参数确定选用数据的范围,以第二个参数作为中间量,随后将第一个参数到第二各参数之间的数据和第二个参数到第三个参数之间的数据调换位置实现元素移动
第一个参数代表起始位置,第二个参数代表移动后的第一个位置,第三个参数表示移动范围内的末尾位置
实验2
源代码:
#include<iostream> #include<vector> #include<algorithm> #include<numeric> #include<iomanip> #include<cstdlib> #include<ctime>//模版函数声明 template<typename T> void output(const T& c);int generate_random_number(); void test1(); void test2();int main() {std::srand(std::time(0));//添加随机种子std::cout << "测试1: \n";test1();std::cout << "\n测试2: \n";test2();}//输出容器对象c中的元素 template<typename T> void output(const T& c) {for (auto& i : c)std::cout << i << ' ';std::cout << '\n'; }// 返回[0, 100]区间内的一个随机整数 int generate_random_number() {return std::rand() % 101; }// 测试1:对容器类对象指定迭代器区间赋值、排序 void test1() {using namespace std;vector<int>v0(10);//创建一个动态数组对象v0,对象大小为10generate(v0.begin(), v0.end(), generate_random_number);//生成随机数填充v0cout << "v0: ";output(v0);vector<int> v1{ v0 };sort(v1.begin(), v1.end());//对整个vector排序cout << "v1: ";output(v1);vector<int> v2{ v0 };sort(v2.begin() + 1, v2.end() - 1);//只对中间部分排序,不包含首尾元素cout << "v2: ";output(v2); }// 测试2:对容器类对象指定迭代器区间赋值、计算最大值/最小值/均值 void test2() {using namespace std;vector<int> v0(10);generate(v0.begin(), v0.end(), generate_random_number);cout << "v0: "; output(v0);// 求最大值和最小值auto min_iter = min_element(v0.begin(), v0.end());auto max_iter = max_element(v0.begin(), v0.end());cout << "最小值: " << *min_iter << endl;cout << "最大值: " << *max_iter << endl;// 同时求最大值和最小值auto ans = minmax_element(v0.begin(), v0.end());cout << "最小值: " << *(ans.first) << endl;cout << "最大值: " << *(ans.second) << endl;// 求平均值double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / v0.size();cout << "均值: " << fixed << setprecision(2) << avg1 << endl;sort(v0.begin(), v0.end());double avg2 = accumulate(v0.begin() + 1, v0.end() - 1, 0.0) / (v0.size() - 2);cout << "去掉最大值、最小值之后,均值: " << avg2 << endl; }
运行结果截图:
问题:
:1:generate的作用是根据generate_random_number填充容器
2:使用minmax_element的代码更加简洁,同时只需遍历的次数更少,并且找最大最小值时是在同一时刻的容器内,避免了容器变化对结果影响
3:lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法。对于不需要复用,且短小的函数,直接传递函数体可以增加代码的可读性。
在本任务中,两者效果完全相同
实验3
源代码:
#include<iostream> #include<string> #include<algorithm> #include<cctype>unsigned char func(unsigned char c); void test1(); void test2();int main() {std::cout<<"测试1:字符串大小写转换\n";test1();std::cout << "\n测试2:字符变换\n";test2();}unsigned char func(unsigned char c) {if (c == 'z')return 'a';if (c == 'Z')return 'A';if (std::isalpha(c))return static_cast<unsigned char>(c + 1);return c; }void test1() {std::string s1{ "Hello World 2049!" };std::cout << "s1 =" << s1 << '\n';std::string s2;for (auto c : s1)s2 += std::tolower(c);std::cout << "s2 = " << s2 << '\n';std::string s3;for (auto c : s1)s3 += std::toupper(c);std::cout << "s3 = " << s3 << '\n';}void test2() {std::string s1{ "I love cosmos!" };std::cout << "s1 = " << s1 << '\n';std::string s2(s1.size(), ' ');std::transform(s1.begin(), s1.end(), s2.begin(), func);std::cout << "s2 = " << s2 << '\n'; }
运行结果截图:
问题:
1:func的功能是实现字符的循环移位(a->b)
2:tolower是将大写字母变成小写,toupper是将小写字母变成大写
3:第一个参数s1.begin()和第二个参数s1.end()决定了原容器的起始位置,第三个参数s2.begin()决定了目标序列的起始位置,第四个参数func决定了功能循环移位
如果改成s1.begin将在原容器进行操作,s2将不再有结果
实验4
源代码:
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 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 // 多组输入,直到按下Ctrl+Z结束测试 13 while (cin >> s) { 14 cout << boolalpha 15 << "区分大小写: " << is_palindrome(s) << "\n" 16 << "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n"; 17 } 18 } 19 20 21 bool is_palindrome(const std::string& s) 22 { 23 int i; 24 for(i=0;i<s.length();i++) 25 { 26 if (s[i] != s[s.length() - i - 1]) 27 { 28 return false; 29 } 30 } 31 return true; 32 } 33 34 bool is_palindrome_ignore_case(const std::string& s) 35 { 36 std::string s1; 37 for (auto c : s) 38 s1 += std::tolower(c); 39 int i; 40 for (i = 0;i < s1.length();i++) 41 { 42 if (s1[i] != s1[s1.length() - i - 1]) 43 { 44 return false; 45 } 46 } 47 return true; 48 49 }
运行结果截图:
问题:
可以在判断中跳过空格
实验5
源代码:
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 5 6 std::string dec2n(int x, int n = 2); 7 8 9 int main() { 10 int x; 11 while (std::cin >> x) { 12 std::cout << "十进制: " << x << '\n' 13 << "二进制: " << dec2n(x) << '\n' 14 << "八进制: " << dec2n(x, 8) << '\n' 15 << "十二进制: " << dec2n(x, 12) << '\n' 16 << "十六进制: " << dec2n(x, 16) << '\n' 17 << "三十二进制: " << dec2n(x, 32) << "\n\n"; 18 } 19 } 20 21 std::string dec2n(int x, int n ) 22 { 23 std::string s ; 24 int i = 0; 25 char c; 26 if (x == 0) 27 { 28 return"0"; 29 } 30 while (x>0) 31 { 32 if(x%n<10) 33 { 34 c = '0'+x % n; 35 } 36 else 37 { 38 c = 'A' + x % n-10; 39 } 40 x /= n; 41 s += c; 42 i++; 43 } 44 std::reverse(s.begin(), s.end()); 45 return s; 46 }
运行结果截图:
实验6
源代码:
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<vector> 5 #include<iomanip> 6 7 using namespace std; 8 9 10 template<typename T> 11 void output(const T& c); 12 13 14 // 输出容器对象c中的元素 15 template <typename T> 16 void output(const T& c) 17 { 18 for (auto& i : c) 19 std::cout << i << ' '; 20 std::cout << '\n'; 21 } 22 23 24 25 26 27 28 int main() 29 { 30 vector<char> v0 = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 31 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 32 'u', 'v', 'w', 'x', 'y', 'z' }; 33 cout << ' ' << ' ' << ' '; 34 35 for (char c : v0) 36 { 37 cout<< c << " "; 38 } 39 cout << endl; 40 vector<char> v1{ v0 }; 41 42 for (char& c : v1) 43 { 44 c = toupper(c); 45 } 46 47 48 int i; 49 for (i = 1;i <=26;i++) 50 { 51 cout << setw(2) << i<<' '; 52 vector<char> vi{ v1 }; 53 // 将[v1.begin(), v1.end())区间内元素循环左移i位 54 rotate(vi.begin(), vi.begin() + i, vi.end()); 55 output(vi); 56 57 } 58 }
运行结果截图:
实验7
源代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<ctime> 4 #include<iomanip> 5 #include<string> 6 7 using namespace std; 8 9 10 void generate_random_number(int& num1,int& num2); 11 int generate_operate(); 12 char get_operate(int k); 13 int calculate_answer(int num1, int num2, int k); 14 15 16 void generate_random_number(int& num1, int& num2) 17 { 18 num1 = rand() % 10+1; 19 num2 = rand() % 10+1; 20 21 } 22 23 int generate_operate() 24 25 { 26 int k = rand() % 4; 27 return k; 28 } 29 30 char get_operate(int k) 31 { 32 switch (k) 33 { 34 case(0):return'+'; 35 case(1):return'-'; 36 case(2):return'*'; 37 case(3):return'/'; 38 default:return 0; 39 } 40 } 41 42 int calculate_answer(int num1, int num2, int k) 43 { 44 switch (k) 45 { 46 case 0: return num1 + num2; 47 case 1: return num1 - num2; 48 case 2: return num1 * num2; 49 case 3: return num1 / num2; 50 default: return 0; 51 } 52 } 53 int main() 54 { 55 srand(time(0)); 56 int total = 10; 57 int num1, num2; 58 int k; 59 double correct_rate; 60 int correct = 0; 61 for (int i = 0; i < total; i++) 62 { 63 64 bool valid = false; 65 int answer; 66 char c; 67 68 69 70 do { 71 generate_random_number(num1, num2); 72 k = generate_operate(); 73 c = get_operate(k); 74 75 if (k == 1 && num1 < num2) 76 { 77 swap(num1, num2); 78 valid = true; 79 } 80 else if (k == 3 && num1 % num2 != 0) 81 { 82 valid = false; // 除法不能整除,无效 83 } 84 else 85 { 86 valid = true; 87 } 88 } while (!valid); // 无效则重新生成 89 90 std::cout << num1 << c << num2 << '='; 91 std::cin >> answer; 92 93 94 if (answer == calculate_answer(num1, num2, k)) 95 { 96 correct++; 97 } 98 99 } 100 correct_rate = double(correct)/10*100; 101 std::cout << "正确率:" << correct_rate << "%"; 102 }
运行结果截图: