实验一现代C++编程初体验
实验任务1
问1:reverse 和 reverse_copy 有什么区别?
答:reverse 是就地反转,迭代器区间 [first, last) 内的元素被直接调换,算法结束后原容器内容已改变;reverse_copy 则不修改原区间,而是把反转后的结果拷贝到另一个输出区间,源区间保持不变。
问2:rotate 算法是如何改变元素顺序的?它的三个参数分别代表什么?
答:rotate 把区间 [first, last) 内的元素以 middle 为“轴”做循环左移:[first, middle) 整体移到尾部,[middle, last) 整体移到头部。
实验任务2
-
问1:generate 算法的作用是什么?
答:按顺序对区间 [first, last) 内的每个元素执行传入的可调用对象,并用返回值填充该位置,常用于快速生成测试数据。
问2:minmax_element 和分别调用 min_element、max_element 相比,有什么优势?
答:一次扫描即可完成最大/最小值查找,时间复杂度仍为 O(n) 但常数减半;同时返回 pair<min, max>,代码更短且避免重复遍历。
答:一次扫描即可完成最大/最小值查找,时间复杂度仍为 O(n) 但常数减半;同时返回 pair<min, max>,代码更短且避免重复遍历。
问3:lambda 表达式 { return std::rand()%101; } 与手写函数 generate_random_number 相比,适用场景是什么?
答:lambda 适合“一次性、局部使用、代码短小”的可调用需求,省掉函数声明/定义,捕获局部变量也更灵活;当算法需要多次复用或逻辑较复杂时,再考虑提取为具名函数。
答:lambda 适合“一次性、局部使用、代码短小”的可调用需求,省掉函数声明/定义,捕获局部变量也更灵活;当算法需要多次复用或逻辑较复杂时,再考虑提取为具名函数。
实验任务3
-
问1:自定义函数 func 功能是什么?
答:对字母字符循环后移一位(z→a, Z→A),非字母字符保持不变。
问2:tolower 和 toupper 功能分别是什么?
答:tolower 把字符转成小写,toupper 把字符转成大写
答:tolower 把字符转成小写,toupper 把字符转成大写
实验任务4
问:使用 cin >> s 输入时不能含空格,若希望测试含空格的字符串,代码应如何调整?
答:把读取语句换成
std::getline(std::cin, s);
即可保留行内空格;为兼容循环多组测试,可在每次读取前用 cin >> std::ws 丢弃残留换行。
实验任务5
源码如下:
#include <iostream> #include <string> #include <algorithm> using namespace std; string dec2n(int x, int n = 2) { if (x == 0) return "0"; const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string ans; bool neg = false; if (x < 0) { neg = true; x = -x; } while (x) { ans += digits[x % n]; x /= n; } if (neg) ans += '-'; reverse(ans.begin(), ans.end()); return ans; } int main() { int x; while (cin >> x) { cout << "十进制: " << x << '\n' << "二进制: " << dec2n(x) << '\n' << "八进制: " << dec2n(x, 8) << '\n' << "十二进制: " << dec2n(x, 12) << '\n' << "十六进制: " << dec2n(x, 16) << '\n' << "三十二进制: " << dec2n(x, 32) << "\n\n"; } return 0; }
实验任务6
代码如下
#include <iostream> #include <iomanip> using namespace std; int main() { const char plain[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char cipher[] = "DEFGHIJKLMNOPQRSTUVWXYZABC"; cout << "字母密文对照表:\n"; for (int i = 0; i < 26; ++i) { cout << plain[i] << "->" << cipher[i] << (i % 6 == 5 ? '\n' : ' '); } cout << '\n'; return 0; }
实验任务7
代码如下
#include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(static_cast<unsigned>(time(nullptr))); const int kTotal = 10; int correct = 0; for (int i = 1; i <= kTotal; ++i) { int a = rand() % 10 + 1; int b = rand() % 10 + 1; int op = rand() % 4; int ans = 0; char opch = 0; switch (op) { case 0: opch = '+'; ans = a + b; break; case 1: opch = '-'; if (a < b) swap(a, b); ans = a - b; break; case 2: opch = '*'; ans = a * b; break; case 3: opch = '/'; a = (a * b); ans = a / b; break; } cout << "(" << i << ") " << a << ' ' << opch << ' ' << b << " = "; int user; cin >> user; if (user == ans) { ++correct; cout << "✔\n"; } else { cout << "✘ 正确答案: " << ans << '\n'; } } double rate = static_cast<double>(correct) / kTotal * 100.0; cout << fixed << setprecision(2) << "正确率: " << rate << "%\n"; return 0; }