实验1 现代C++编程初体验
任务一:
1 // 现代C++标准库、算法库体验 2 // 本例用到以下内容: 3 // 1. 字符串string, 动态数组容器类vector、迭代器 4 // 2. 算法库:反转元素次序、旋转元素 5 // 3. 函数模板、const引用作为形参 6 #include <iostream> 7 #include <string> 8 #include <vector> 9 #include <algorithm> 10 using namespace std; 11 // 声明 12 // 模板函数声明 13 template<typename T> 14 void output(const T &c); 15 // 普通函数声明 16 void test1(); 17 void test2(); 18 void test3(); 19 int main() { 20 cout << "测试1: \n"; 21 test1(); 22 cout << "\n测试2: \n"; 23 test2(); 24 cout << "\n测试3: \n"; 25 test3(); 26 } 27 // 函数实现 28 // 输出容器对象c中的元素 29 template <typename T> 30 void output(const T &c) { 31 for(auto &i: c) 32 cout << i << " "; 33 cout << endl; 34 } 35 // 测试1 36 // 组合使用算法库、迭代器、string反转字符串 37 void test1() { 38 string s0{"0123456789"}; 39 cout << "s0 = " << s0 << endl; 40 string s1{s0}; 41 reverse(s1.begin(), s1.end()); // 反转指定迭代器区间的元素 42 cout << "s1 = " << s1 << endl; 43 44 string s2{s0}; 45 reverse_copy(s0.begin(), s0.end(), s2.begin()); // 将指定迭代区间的元素拷贝到指定迭代器开始的目标区间,并且在复制过程中反转次序 46 cout << "s2 = " << s2 << endl; 47 } 48 // 测试2 49 // 组合使用算法库、迭代器、vector反转动态数组对象vector内数据 50 void test2() { 51 vector<int> v0{2, 0, 4, 9}; 52 cout << "v0: "; 53 output(v0); 54 vector<int> v1{v0}; 55 reverse(v1.begin(), v1.end()); 56 cout << "v1: "; 57 output(v1); 58 vector<int> v2{v0}; 59 reverse_copy(v0.begin(), v0.end(), v2.begin()); 60 cout << "v2: "; 61 output(v2); 62 } 63 // 测试3 64 // 组合使用算法库、迭代器、vector实现元素旋转移位 65 void test3() { 66 vector<int> v0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 67 cout << "v0: "; 68 output(v0); 69 vector<int> v1{v0}; 70 rotate(v1.begin(), v1.begin()+1, v1.end()); // 旋转指定迭代器区间[v1.begin(), v1.end())之间的数据项,旋转后从迭代器v1.begin()+1位置的数据项开始 71 cout << "v1: "; 72 output(v1); 73 vector<int> v2{v0}; 74 rotate(v2.begin(), v2.begin()+2, v2.end()); 75 cout << "v2: "; 76 output(v2); 77 vector<int> v3{v0}; 78 rotate(v3.begin(), v3.end()-1, v3.end()); 79 cout << "v3: "; 80 output(v3); 81 vector<int> v4{v0}; 82 rotate(v4.begin(), v4.end()-2, v4.end()); 83 cout << "v4: "; 84 output(v4); 85 }
任务二:
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <algorithm> 5 #include <numeric> 6 #include <iomanip> 7 using namespace std; 8 // 函数声明 9 // 模板函数声明 10 template<typename T> 11 void output(const T &c); 12 // 普通函数声明 13 int rand_int_100(); 14 void test1(); 15 void test2(); 16 int main() { 17 cout << "测试1: \n"; 18 test1(); 19 cout << "\n测试2: \n"; 20 test2(); 21 } 22 // 函数实现 23 // 输出容器对象c中的元素 24 template <typename T> 25 void output(const T &c) { 26 for(auto &i: c) 27 cout << i << " "; 28 cout << endl; 29 } 30 // 返回[0, 100]区间内的一个随机整数 31 int rand_int_100() { 32 return rand() % 101; 33 } 34 // 测试1 35 // 对容器类对象指定迭代器区间进行赋值、排序 36 void test1() { 37 vector<int> v0(10); // 创建一个动态数组对象v0, 对象大小为10 38 generate(v0.begin(), v0.end(), rand_int_100); // 产生[0, 100]之间的随机整数赋值给指定迭代器区间[v0.begin(), v0.end())内的每个数据项 39 cout << "v0: "; 40 output(v0); 41 vector<int> v1{v0}; 42 sort(v1.begin(), v1.end()); // 对指定迭代器区间[v1.begin(), v1.end())内数据项进行升序排序 43 cout << "v1: "; 44 output(v1); 45 vector<int> v2{v0}; 46 sort(v2.begin()+1, v2.end()-1); // 对指定迭代器区间[v1.begin()+1,v1.end()-1)内数据项进行升序排序 47 cout << "v2: "; 48 output(v2); 49 } 50 // 测试2 51 // 对容器类对象指定迭代器区间进行赋值、计算最大值/最小值/均值 52 void test2() { 53 vector<int> v0(10); 54 generate(v0.begin(), v0.end(), rand_int_100); 55 cout << "v0: "; 56 output(v0); 57 auto iter1 = min_element(v0.begin(), v0.end()); 58 cout << "最小值: " << *iter1 << endl; 59 auto iter2 = max_element(v0.begin(), v0.end()); 60 cout << "最大值: " << *iter2 << endl; 61 auto ans = minmax_element(v0.begin(), v0.end()); 62 cout << "最小值: " << *(ans.first) << endl; 63 cout << "最大值: " << *(ans.second) << endl; 64 double avg1 = accumulate(v0.begin(), v0.end(), 0)/v0.size(); 65 cout << "均值: " << fixed << setprecision(2) << avg1 << endl; 66 cout << endl;vector<int> v1{v0}; 67 cout << "v0: "; 68 output(v0); 69 sort(v1.begin(), v1.end()); 70 double avg2 = accumulate(v1.begin()+1, v1.end()-1, 0)/(v1.size()-2); 71 cout << "去掉最大值、最小值之后,均值: " << avg2 << endl; 72 }
任务三:
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 bool is_palindrome(std::string s); 5 int main() { 6 using namespace std; 7 string s; 8 while(cin >> s) // 多组输入,直到按下Ctrl+Z后结束测试 9 cout << boolalpha << is_palindrome(s) << endl; 10 } 11 12 bool is_palindrome(std::string s) 13 { 14 std::string s1=s; 15 reverse(s1.begin(),s1.end()); 16 if(s1==s) 17 return true; 18 else 19 return false; 20 }
任务四:
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 5 std::string int_to_string(int num) { 6 std::string result; 7 bool isNegative = num < 0; 8 if (isNegative) num = -num; // 取绝对值 9 do { 10 result += (num % 10) + '0'; // 提取数字并转换为字符 11 num /= 10; 12 } while (num > 0); 13 if (isNegative) result += '-'; // 处理负数 14 std::reverse(result.begin(), result.end()); // 反转字符串 15 return result; 16 } 17 18 std::string dec2n(int x, int n = 2) { 19 if (x == 0) return "0"; // 处理0的情况 20 std::string result; 21 bool isNegative = x < 0; // 检查是否为负数 22 x = std::abs(x); // 取绝对值 23 24 while (x > 0) { 25 int remainder = x % n; // 计算余数 26 if (remainder < 10) 27 result += int_to_string(remainder); // 使用自定义函数 28 else 29 result += ('A' + remainder - 10); // 处理大于9的余数(十六进制) 30 x /= n; // 继续除以n 31 } 32 33 if (isNegative && n == 10) // 仅在十进制中包含负号 34 result += '-'; 35 36 std::reverse(result.begin(), result.end()); // 反转结果字符串 37 return result; 38 } 39 40 int main() { 41 using namespace std; 42 int x; 43 while (cin >> x) { 44 cout << "十进制: " << x << endl; 45 cout << "二进制: " << dec2n(x) << endl; 46 cout << "八进制: " << dec2n(x, 8) << endl; 47 cout << "十六进制: " << dec2n(x, 16) << endl << endl; 48 } 49 }
任务5:
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 5 int main() { 6 int count =1 ; 7 cout << " "<< " "; 8 for(char begin = 'a';begin <= 'z'; begin++) 9 cout << setw(2)<< begin; 10 cout << endl; 11 for (char original = 'A'; original <= 'Z'; ++original) { 12 cout << setw(2) << count; // 打印原始数字 13 14 // 打印加密字母 15 for (char encrypted = original + 1; encrypted <= 'Z'; ++encrypted) { 16 cout << " " << encrypted ; 17 } 18 for (char encrypted = 'A'; encrypted <= original; ++encrypted) { 19 cout << " " <<encrypted ; 20 } 21 count++; 22 cout << endl; // 换行 23 } 24 25 return 0; 26 }
任务6:
1 #include <iostream> 2 #include <iomanip> 3 #include <cstdlib> 4 #include <ctime> 5 6 using namespace std; 7 8 int main() { 9 srand(static_cast<unsigned int>(time(0))); // 初始化随机数种子 10 int correctAnswers = 0; // 记录正确答案的数量 11 const int totalQuestions = 10; // 总题目数量 12 13 for (int i = 0; i < totalQuestions; ++i) { 14 int num1 = rand() % 10 + 1; // 生成 1 到 10 的随机数 15 int num2 = rand() % 10 + 1; // 生成 1 到 10 的随机数 16 char operation; 17 18 // 随机选择运算符 19 int op = rand() % 4; // 生成 0 到 3 的随机数 20 if (op == 0) { 21 operation = '+'; // 加法 22 } else if (op == 1) { 23 operation = '-'; // 减法 24 if (num1 < num2) { 25 swap(num1, num2); // 确保第一个数大于第二个数 26 } 27 } else if (op == 2) { 28 operation = '*'; // 乘法 29 } else { 30 operation = '/'; // 除法 31 num1 = num1 * num2; // 确保能整除 32 } 33 34 // 输出题目 35 cout << num1 << " " << operation << " " << num2 << " = " ; 36 int userAnswer; 37 cin >> userAnswer; // 获取用户输入的答案 38 39 // 检查答案 40 int correctAnswer = 0; 41 switch (operation) { 42 case '+': 43 correctAnswer = num1 + num2; 44 break; 45 case '-': 46 correctAnswer = num1 - num2; 47 break; 48 case '*': 49 correctAnswer = num1 * num2; 50 break; 51 case '/': 52 correctAnswer = num1 / num2; 53 break; 54 } 55 56 if (userAnswer == correctAnswer) { 57 correctAnswers++; 58 } 59 } 60 61 // 输出正确率 62 double accuracy = static_cast<double>(correctAnswers) / totalQuestions * 100; 63 cout << "正确率: " << fixed << setprecision(2) << accuracy << "%" << endl; 64 65 return 0; 66 }
实验总结:
任务1和任务2更加了解了C++中vector的一些语法组件,如:reverse等基于标准库<algorithm>下的一些函数的应用。
任务3,4,5相对基础,主要考查的是一些基本语法的运用。
本次实验很好的起到了C语言与C++语言学习的过渡作用,其中任务6中设置随机数种子在学校课程中第一次接触,很有学习意义