实验一
##实验任务一
##代码
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <algorithm> 5 template<typename T> 6 void output(const T &c); 7 void test1(); 8 void test2(); 9 void test3(); 10 int main() { 11 std::cout << "测试1: \n"; 12 test1(); 13 std::cout << "\n测试2: \n"; 14 test2(); 15 std::cout << "\n测试3: \n"; 16 test3(); 17 } 18 template <typename T> 19 void output(const T &c) { 20 for(auto &i : c) 21 std::cout << i << ' '; 22 std::cout << '\n'; 23 } 24 void test1() { 25 using namespace std; 26 string s0{"0123456789"}; 27 cout << "s0 = " << s0 << endl; 28 string s1(s0); 29 30 reverse(s1.begin(), s1.end()); 31 cout << "s1 = " << s1 << endl; 32 string s2(s0.size(), ' '); 33 reverse_copy(s0.begin(), s0.end(), s2.begin()); 34 cout << "s2 = " << s2 << endl; 35 } 36 void test2() { 37 using namespace std; 38 vector<int> v0{2, 0, 4, 9}; 39 cout << "v0: "; output(v0); 40 41 42 vector<int> v1{v0}; 43 reverse(v1.begin(), v1.end()); 44 cout << "v1: "; output(v1); 45 vector<int> v2{v0}; 46 reverse_copy(v0.begin(), v0.end(), v2.begin()); 47 cout << "v2: "; output(v2); 48 } 49 void test3() { 50 using namespace std; 51 vector<int> v0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 52 cout << "v0: "; output(v0); 53 vector<int> v1{v0}; 54 rotate(v1.begin(), v1.begin()+1, v1.end()); 55 cout << "v1: "; output(v1); 56 vector<int> v2{v0}; 57 rotate(v2.begin(), v2.begin()+2, v2.end()); 58 cout << "v2: "; output(v2); 59 vector<int> v3{v0}; 60 rotate(v3.begin(), v3.end()-1, v3.end()); 61 cout << "v3: "; output(v3); 62 vector<int> v4{v0}; 63 rotate(v4.begin(), v4.end()-2, v4.end()); 64 cout << "v4: "; output(v4); 65 }
##运行结果
##问题回答
1.reverse直接在原容器内反转,而reverse_copy原容器保持不变,提前创建新容器,将原容器内容反转后放入新容器;
2.rotate通过重新排列迭代器范围内的元素实现循环移动,
第一个参数first:旋转范围内的起始位置
第二个参数middle:旋转后成为新的第一个元素的位置,向左移动begin()+n,向右移动end()-n
第三个参数last:旋转范围内的结束位置
##实验任务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 int generate_random_number(); 12 void test1(); 13 void test2(); 14 int main() { 15 std::srand(std::time(0)); 16 std::cout << "测试1: \n"; 17 test1(); 18 std::cout << "\n测试2: \n"; 19 test2(); 20 } 21 22 template <typename T> 23 void output(const T &c) { 24 for(auto &i: c) 25 std::cout << i << ' '; 26 std::cout << '\n'; 27 } 28 29 int generate_random_number() { 30 return std::rand() % 101; 31 } 32 33 void test1() { 34 using namespace std; 35 vector<int> v0(10); 36 generate(v0.begin(), v0.end(), generate_random_number); 37 cout << "v0: "; output(v0); 38 vector<int> v1{v0}; 39 sort(v1.begin(), v1.end()); 40 cout << "v1: "; output(v1); 41 vector<int> v2{v0}; 42 sort(v2.begin()+1, v2.end()-1); 43 cout << "v2: "; output(v2); 44 } 45 46 void test2() { 47 using namespace std; 48 vector<int> v0(10); 49 generate(v0.begin(), v0.end(), generate_random_number); 50 cout << "v0: "; output(v0); 51 auto min_iter = min_element(v0.begin(), v0.end()); 52 auto max_iter = max_element(v0.begin(), v0.end()); 53 cout << "最小值: " << *min_iter << endl; 54 cout << "最大值: " << *max_iter << endl; 55 auto ans = minmax_element(v0.begin(), v0.end()); 56 cout << "最小值: " << *(ans.first) << endl; 57 cout << "最大值: " << *(ans.second) << endl; 58 double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / v0.size(); 59 cout << "均值: " << fixed << setprecision(2) << avg1 << endl; 60 sort(v0.begin(), v0.end()); 61 double avg2 = accumulate(v0.begin()+1, v0.end()-1, 0.0) / (v0.size()-2); 62 cout << "去掉最大值、最小值之后,均值: " << avg2 << endl; 63 }
##运行结果
##问题
1.generate的作用我认为是用指定的生成器函数为容器指定范围内的每个元素赋值;
2.minmax_element效率更高,只遍历一次容器,并且代码就一行更简洁;
3.效果等同 lambda表达式在这里是一个匿名函数对象,它的行为与generate_random_number完全一致,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 { 13 std::cout << "test1: string caps switch\n"; 14 test1(); 15 std::cout << '\n'; 16 17 std::cout << "test2: char switch\n"; 18 test2(); 19 } 20 21 unsigned char func(unsigned char c) 22 { 23 if (c == 'z') 24 return 'a'; 25 if (c == 'Z') 26 return 'A'; 27 28 if (isalpha(c)) 29 return static_cast<unsigned char>(c + 1); 30 31 return c; 32 } 33 34 void test1() 35 { 36 using namespace std; 37 string s1{ "Hello World 2077!" }; 38 cout << "s1 = " << s1 << endl; 39 40 string s2; 41 for (auto& c : s1) 42 s2 += tolower(c); 43 cout << "s2 = " << s2 << endl; 44 45 string s3; 46 for (auto& c : s1) 47 s3 += toupper(c); 48 cout << "s3 = " << s3 << endl; 49 } 50 51 void test2() 52 { 53 using namespace std; 54 string s1{ "Long Live The Republic!" }; 55 cout << "s1 = " << s1 << endl; 56 57 string s2(s1.size(),' '); 58 transform(s1.begin(), s1.end(), s2.begin(), func); 59 cout << "s2 = " << s2 << endl; 60 }
##运行结果
##问题
- func函数将字符进行加密,加密方法为所有字符(除了z)后移一个字符的凯撒变换;z变成a,这是特殊情况。
- tolower的功能是将字母字符变为小写字母,toupper的功能是将字母字符变为大写字母。
- 第一个:从哪里开始;第二个:到哪里结束;第三个:开始执行的位置;第四个:传递时附加的规则;改变后,会在原始容器内部执行操。
##实验任务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 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 using namespace std; 23 string t=s; 24 reverse(t.begin(),t.end()) ; 25 if(t.compare(s)==0){ 26 return true; 27 } 28 else{ 29 return false; 30 } 31 } 32 33 bool is_palindrome_ignore_case(const std::string &s) { 34 using namespace std; 35 string t=s,sl; 36 for(auto i : s){ 37 sl+=tolower(i); 38 } 39 reverse(t.begin(),t.end()) ; 40 string tl; 41 for(auto i : t){ 42 tl+=tolower(i); 43 } 44 if(tl.compare(sl)==0){ 45 return true; 46 } 47 else{ 48 return false; 49 } 50 }
##运行结果
##问题
使用getline(cin,s)让他读取一整行的字符内容
##实验任务5
##代码
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 using namespace std; 5 string dec2n(int x, int n = 2); 6 7 int main() { 8 int x; 9 while(cin >> x) { 10 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 // 函数dec2n定义 20 string dec2n(int x, int n) 21 { 22 if (x == 0) { 23 return "0"; 24 } 25 26 string result; 27 28 while (x > 0) { 29 int t = x % n; 30 result += (t>=10) ? ('A' + (t - 10)) : ('0' + t); 31 x /= n; 32 } 33 34 reverse(result.begin(), result.end()); 35 return result; 36 }
##运行结果
##实验任务6
##代码
1 #include <iostream> 2 #include <string> 3 #include <algorithm> // 包含 std::rotate 4 #include <iomanip> // 用于 setw 格式化输出 5 6 using namespace std; 7 8 int main() { 9 string original = "abcdefghijklmnopqrstuvwxyz"; 10 for (char c : original) { 11 cout << c << " "; 12 } 13 cout << endl; 14 for (int n = 1; n <= 26; ++n) { 15 string cipher = original; 16 rotate(cipher.begin(), cipher.begin() + n, cipher.end()); 17 cout << setw(2) << n << " "; 18 for (char c : cipher) { 19 cout << (char)toupper(c) << " "; 20 } 21 cout << endl; 22 } 23 24 return 0; 25 }
##运行结果
##实验任务7
##代码
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <numeric> 5 #include <iomanip> 6 #include <cstdlib> 7 #include <ctime> 8 9 int generate_number(); 10 char generate_operator(std::string &s); 11 int given(); 12 13 int main(){ 14 using namespace std; 15 srand(time(0)); 16 int count = 0, result, r; 17 for(auto i = 1; i < 11; i++) 18 { 19 result = given(); 20 cin >> r; 21 if(r == result) 22 count++; 23 } 24 cout << "正确率:" << fixed << setprecision(2) << static_cast<double>(count*10) << "%"; 25 } 26 27 int generate_number(){ 28 return std::rand() % 10 + 1; 29 } 30 31 char generate_operator(std::string &s){ 32 return s[std::rand() % 4]; 33 } 34 35 int given(){ 36 using namespace std; 37 char c; 38 int a, b; 39 std::string op{"*/+-"}; 40 c = generate_operator(op); 41 a = generate_number(), b = generate_number(); 42 if(c == '/') 43 { 44 45 while(a%b != 0) 46 a = generate_number(), b = generate_number(); 47 cout << a << " " << c << " " << b << " = "; 48 return a/b; 49 } 50 else if(c == '-'){ 51 while(a < b) 52 a = generate_number(), b = generate_number(); 53 cout << a << " " << c << " " << b << " = "; 54 return a-b; 55 } 56 else if(c == '+'){ 57 cout << a << " " << c << " " << b << " = "; 58 return a+b; 59 } 60 else{ 61 cout << a << " " << c << " " << b << " = "; 62 return a*b; 63 } 64 }
##运行结果