实验一
1 // 2 // 现代C++标准库、算法库体验 3 // 本例用到以下内容: 4 // 1. 字符串string, 动态数组容器类vector、迭代器 5 // 2. 算法库:反转元素次序、旋转元素 6 // 3. 函数模板、const引用作为形参 7 8 #include <iostream> 9 #include <string> 10 #include <vector> 11 #include <algorithm> 12 13 using namespace std; 14 15 // 声明 16 // 模板函数声明 17 template<typename T> 18 void output(const T &c); 19 20 // 普通函数声明 21 void test1(); 22 void test2(); 23 void test3(); 24 25 int main() { 26 cout << "测试1: \n"; 27 test1(); 28 29 cout << "\n测试2: \n"; 30 test2(); 31 32 cout << "\n测试3: \n"; 33 test3(); 34 } 35 36 // 函数实现 37 // 输出容器对象c中的元素 38 template <typename T> 39 void output(const T &c) { 40 for(auto &i: c) 41 cout << i << " "; 42 cout << endl; 43 } 44 45 // 测试1 46 // 组合使用算法库、迭代器、string反转字符串 47 void test1() { 48 string s0{"0123456789"}; 49 cout << "s0 = " << s0 << endl; 50 51 string s1{s0}; 52 reverse(s1.begin(), s1.end()); // 反转指定迭代器区间的元素 53 cout << "s1 = " << s1 << endl; 54 55 string s2{s0}; 56 reverse_copy(s0.begin(), s0.end(), s2.begin()); // 将指定迭代区间的元素拷贝到指定迭代器开始的目标区间,并且在复制过程中反转次序 57 cout << "s2 = " << s2 << endl; 58 } 59 60 // 测试2 61 // 组合使用算法库、迭代器、vector反转动态数组对象vector内数据 62 void test2() { 63 vector<int> v0{2, 0, 4, 9}; 64 cout << "v0: "; 65 output(v0); 66 67 vector<int> v1{v0}; 68 reverse(v1.begin(), v1.end()); 69 cout << "v1: "; 70 output(v1); 71 72 vector<int> v2{v0}; 73 reverse_copy(v0.begin(), v0.end(), v2.begin()); 74 cout << "v2: "; 75 output(v2); 76 } 77 78 // 测试3 79 // 组合使用算法库、迭代器、vector实现元素旋转移位 80 void test3() { 81 vector<int> v0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 82 cout << "v0: "; 83 output(v0); 84 85 vector<int> v1{v0}; 86 rotate(v1.begin(), v1.begin()+1, v1.end()); // 旋转指定迭代器区间[v1.begin(), v1.end())之间的数据项,旋转后从迭代器v1.begin()+1位置的数据项开始 87 cout << "v1: "; 88 output(v1); 89 90 vector<int> v2{v0}; 91 rotate(v2.begin(), v2.begin()+2, v2.end()); 92 cout << "v2: "; 93 output(v2); 94 95 vector<int> v3{v0}; 96 rotate(v3.begin(), v3.end()-1, v3.end()); 97 cout << "v3: "; 98 output(v3); 99 100 vector<int> v4{v0}; 101 rotate(v4.begin(), v4.end()-2, v4.end()); 102 cout << "v4: "; 103 output(v4); 104 } 105 106
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<algorithm> 5 #include<numeric> 6 #include<iomanip> 7 using namespace std; 8 template<typename T> 9 void output(const T& c) { 10 for (auto& i : c) 11 cout << i << " "; 12 cout << endl; 13 } 14 int rand_int_100() { 15 return rand() % 101; 16 } 17 void test1() { 18 vector<int> v0(10); 19 generate(v0.begin(), v0.end(), rand_int_100); 20 cout << "v0:"; 21 output(v0); 22 vector<int> v1{ v0 }; 23 sort(v1.begin(), v1.end()); 24 cout << "v1:"; 25 output(v1); 26 vector<int> v2{ v0 }; 27 sort(v2.begin() + 1, v2.end() - 1); 28 cout << "v2:"; 29 output(v2); 30 } 31 void test2() { 32 vector<int> v0(10); 33 generate(v0.begin(), v0.end(), rand_int_100); 34 cout << "v0:"; 35 output(v0); 36 auto iter1 = min_element(v0.begin(), v0.end()); 37 cout << "最小值:" << *iter1 << endl; 38 auto iter2 = max_element(v0.begin(), v0.end()); 39 cout << "最大值:" << *iter2 << endl; 40 auto ans = minmax_element(v0.begin(), v0.end()); 41 cout << "最小值:" << *(ans.first) << endl; 42 cout << "最大值:" << *(ans.second) << endl; 43 double avg1 = accumulate(v0.begin(), v0.end(), 0) / v0.size(); 44 cout << "均值:" << fixed << setprecision(2) << avg1 << endl; 45 cout << endl; 46 vector<int> v1{ v0 }; 47 cout << "v0:"; 48 output(v0); 49 sort(v1.begin(), v1.end()); 50 double avg2 = accumulate(v1.begin() + 1, v1.end() - 1, 0) / (v1.size() - 2); 51 cout << "去掉最大值、最小值之后,均值:" << avg2 << endl; 52 53 } 54 int main() { 55 cout << "测试1:\n"; 56 test1(); 57 cout << "测试2:\n"; 58 test2(); 59 }
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 bool is_palindrome(string s) { 6 string s1{ s }; 7 reverse(s1.begin(), s1.end()); 8 if (s1 == s) 9 return true; 10 return false; 11 } 12 int main() { 13 string s; 14 while (cin >> s) 15 cout << boolalpha << is_palindrome(s) << endl; 16 17 }
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 5 bool is_palindrome(std::string s); 6 7 int main() { 8 using namespace std; 9 string s; 10 11 while(cin >> s) // 多组输入,直到按下Ctrl+Z后结束测试 12 cout << boolalpha << is_palindrome(s) << endl; 13 14 } 15 16 // 函数is_palindrom定义 17 // 待补足 18 // ××× 19 bool is_palindrome(std::string s){ 20 std::string b{s}; 21 reverse(s.begin(),s.end()); 22 if(s == b){ 23 return true; 24 }else{ 25 return false; 26 } 27 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main() { 5 cout << " "; 6 vector<char> arr; 7 for(int i = 0;i < 26;i++){ 8 cout << " "; 9 cout << char('a' + i); 10 arr.push_back(char('A' + i)); 11 } 12 cout << endl; 13 for(int i = 1;i <= 26;i++){ 14 cout << setw(2) << setfill(' ') << i; 15 rotate(arr.begin(),arr.begin() + 1,arr.end()); 16 for(auto ele:arr){ 17 cout << " "; 18 cout << ele; 19 } 20 cout << endl; 21 } 22 23 24 return 0; 25 }
1 #include <iostream> 2 #include <vector> 3 #include <iomanip> 4 #include <numeric> 5 #include <time.h> 6 7 using namespace std; 8 9 int calculation(); 10 int rand_int(int range) 11 { 12 srand((unsigned)time(NULL)); 13 return rand() % (range + 1); 14 } 15 char rand_flag() { 16 vector<char> v = { '+', '-', '*', '/' }; 17 return v[rand_int(3)]; 18 } 19 void output(int a, int b, char flag) { 20 cout << a << " " << flag << " " << b << " = "; 21 } 22 23 int main() 24 { 25 int num = 0; 26 double ave = 0; 27 while (++num <= 10) 28 { 29 int ans, given_ans; 30 ans = calculation(); 31 cin >> given_ans; 32 if (ans == given_ans) 33 ave++; 34 } 35 cout << "正确率:" << fixed << setprecision(2) << ave * 10 << "%" << endl; 36 } 37 38 int calculation() 39 { 40 char flag = rand_flag(); 41 if (flag == '+') 42 { 43 int a = rand_int(10), b = rand_int(10); 44 output(a, b, flag); 45 return a + b; 46 } 47 else if (flag == '*') 48 { 49 int a = rand_int(10), b = rand_int(10); 50 output(a, b, flag); 51 return a * b; 52 } 53 else if (flag == '-') 54 { 55 int a = rand_int(10), b = rand_int(10); 56 while (a < b) 57 { 58 int t = a; 59 a = b; 60 b = t; 61 } 62 output(a, b, flag); 63 return a - b; 64 } 65 else 66 { 67 int a = rand_int(10); 68 vector<int> v; 69 int t = 0; 70 while (1) 71 { 72 for (int i = 1; i <= a; i++) 73 { 74 if (a % i == 0) 75 { 76 v.push_back(i); 77 t++; 78 } 79 } 80 if (t == 0) 81 a = rand_int(10); 82 else 83 break; 84 } 85 int b = v[rand_int(t - 1)]; 86 output(a, b, flag); 87 return a / b; 88 } 89 }
总结:比起巩固课上知识,我可能通过别人的代码学到的函数更多……可能我确实太菜了……多敲代码多学点吧……