task 1.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 void test2() { 47 using namespace std; 48 49 vector<int> v0{ 2,0,4,9 }; 50 cout << "v0:";output(v0); 51 52 vector<int> v1{ v0 }; 53 reverse(v1.begin(), v1.end()); 54 cout << "v1:";output(v1); 55 56 vector<int> v2{ v0 }; 57 reverse_copy(v0.begin(),v0.end(), v2.begin()); 58 cout << "v2:";output(v2); 59 } 60 61 void test3() { 62 using namespace std; 63 64 vector <int> v0{ 0,1,2,3,4,5,6,7,8,9 }; 65 cout << "v0:";output(v0); 66 67 vector<int> v1{ v0 }; 68 rotate(v1.begin(), v1.begin() + 1, v1.end()); 69 cout << "v1:";output(v1); 70 71 vector<int> v2{ v0 }; 72 rotate(v2.begin(), v2.begin() + 2, v2.end()); 73 cout << "v2:";output(v2); 74 75 vector<int> v3{ v0 }; 76 rotate(v3.begin(), v3.end() - 1, v3.end()); 77 cout << "v3:";output(v3); 78 79 vector<int> v4{ v0 }; 80 rotate(v4.begin(), v4.end() - 2, v4.end()); 81 cout << "v4:";output(v4); 82 }
Q1:reverse直接反转原容器的元素;reverse_copy将原容器的元素反转后再复制到新容器,原容器保持不变
Q2:给定一串字符的开头和末尾,再给定一个新的开头(从给定字符区间里选一个),新开头之前的字符就会移动到末尾;第一个参数表示序列的起始元素,第二个参数表示循环移动后新的起始元素的位置,第三个元素表示序列的末尾
task 2.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 39 vector<int> v0(10); 40 generate(v0.begin(), v0.end(), generate_random_number); 41 cout << "v0:";output(v0); 42 43 vector<int> v1{ v0 }; 44 sort(v1.begin(), v1.end()); 45 cout << "v1:";output(v1); 46 47 vector<int> v2{ v0 }; 48 sort(v2.begin() + 1, v2.end() - 1); 49 cout << "v2:";output(v2); 50 } 51 52 void test2(){ 53 using namespace std; 54 55 vector<int> v0(10); 56 generate(v0.begin(), v0.end(), generate_random_number); 57 cout << "v0:";output(v0); 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 }
Q1:generate将generate_random_number这个函数随机生成的1-100的数复制给v0的元素
Q2:使用min_element和max_element要历经两遍v0,分别找出最大值和最小值;minmax_element只要历经一遍v0,同时找出最小值和最大值
Q3:lambda表达式适用于逻辑简单且使用次数少的情景,比如generate_random_number在这段代码里只出现了两次,都是作为函数生成器的作用
task 3.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 << "\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(), s2.begin(), func); 52 std::cout << "s2=" << s2 << '\n'; 53 }
Q1:func函数的功能是将大小写字母转化为他们ASCII值+1的字母,如果遇到z和Z则转化为a和A
Q2:tolower将大写字母转化为小写形式,toupper将小写字母转化为大写形式
Q3:第一个参数是要转换的字符串的开头,第二个参数是要转换的字符串的末尾,第三个参数是要存放位置的开始,第四个参数是要对每个字符做怎样的处理;如果将s2.begin()换成s1.begin()变换后的字符串会直接覆盖s1原本的内容
task 4.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 << "区分大小写:" << is_palindrome(s) << "\n" << "不区分大小写:" << is_palindrome_ignore_case(s) << "\n\n"; 14 } 15 } 16 17 bool is_palindrome(const std::string& s) { 18 std::string s1(s.size(), ' '); 19 reverse_copy(s.begin(), s.end(), s1.begin()); 20 21 int i; 22 for (i = 0;i < s.size();i++) { 23 if (s[i] != s1[i]) { 24 return 0; 25 break; 26 } 27 } 28 29 if (i == s.size() - 1) 30 return 0; 31 } 32 33 bool is_palindrome_ignore_case(const std::string& s) { 34 std::string s1; 35 for (auto c : s) 36 s1 += std::tolower(c); 37 38 std::string s2(s1.size(), ' '); 39 reverse_copy(s1.begin(), s1.end(), s2.begin()); 40 41 int i; 42 for (i = 0;i < s1.size();i++) { 43 if (s1[i] != s2[i]) { 44 return 0; 45 break; 46 } 47 } 48 49 if (i == s1.size() - 1) 50 return 0; 51 }
Q:可以将cin<<s改成getline(cin,s)
task 5.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 << "二进制: " << 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 std::string s; 24 25 while (x != 0) { 26 int r; 27 r = x % n; 28 if (r >= 10) 29 s += static_cast<char>('A'+ r -10); 30 else 31 s += static_cast<char>(r + '0'); 32 x = x / n; 33 } 34 35 std::reverse(s.begin(), s.end()); 36 37 return s; 38 }
task 6.cpp
1 #include<iostream> 2 #include<iomanip> 3 #include<algorithm> 4 5 void putout(const std::string& s); 6 7 int main() { 8 std::string s1,s2; 9 int i; 10 11 for (i = 0;i < 26;i++) 12 s1 += static_cast<char>('a' + i); 13 14 std::cout << " "; 15 putout(s1); 16 17 for (auto c : s1) 18 s2 += std::toupper(c); 19 20 for (i = 1;i <= 26;i++) { 21 std::cout << std::setfill(' ') << std::setw(2) << i; 22 std::rotate(s2.begin(), s2.begin() + 1 , s2.end()); 23 putout(s2); 24 } 25 } 26 27 void putout(const std::string& s) { 28 for (auto c : s) 29 std::cout << ' ' << c; 30 std::cout << '\n'; 31 }
task 7.cpp
1 #include<iostream> 2 #include<cstdlib> 3 #include<ctime> 4 #include<vector> 5 #include<iomanip> 6 7 using namespace std; 8 9 int main() { 10 srand(time(0)); 11 12 int correct = 0; 13 for (int i = 0;i < 10;i++) { 14 int x = rand() % 10 + 1; 15 int y = rand() % 10 + 1; 16 int z = rand() % 4; 17 int ans; 18 string s{ '+','-','*','/' }; 19 20 if (z == 0) 21 ans = x + y; 22 23 if (z == 1) { 24 if (x < y) 25 swap(x, y); 26 ans = x - y; 27 } 28 29 if (z == 2) 30 ans = x * y; 31 32 if (z == 3) { 33 if (x % y != 0) { 34 vector<int> v; 35 for (int k = 1;;k++) { 36 x = k * y; 37 if (x > 10) break; 38 v.push_back(x); 39 } 40 x = v[rand() % v.size()]; 41 } 42 ans = x / y; 43 } 44 45 int answer; 46 std::cout << x << " " << s[z] << " " << y << " " << "= "; 47 std::cin >> answer; 48 49 if (ans == answer) 50 correct++; 51 } 52 53 double rate = correct / 10.00 * 100; 54 std::cout << "正确率:" <<fixed<<setprecision(2)<< rate << '%' << '\n'; 55 }