实验一现代C++编程初体验

实验任务1

 image

问1:reverse 和 reverse_copy 有什么区别?
答:reverse 是就地反转,迭代器区间 [first, last) 内的元素被直接调换,算法结束后原容器内容已改变;reverse_copy 则不修改原区间,而是把反转后的结果拷贝到另一个输出区间,源区间保持不变。

问2:rotate 算法是如何改变元素顺序的?它的三个参数分别代表什么?

答:rotate 把区间 [first, last) 内的元素以 middle 为“轴”做循环左移:[first, middle) 整体移到尾部,[middle, last) 整体移到头部。

实验任务2

image

 

  1. 问1:generate 算法的作用是什么?
    答:按顺序对区间 [first, last) 内的每个元素执行传入的可调用对象,并用返回值填充该位置,常用于快速生成测试数据。
问2:minmax_element 和分别调用 min_element、max_element 相比,有什么优势?
答:一次扫描即可完成最大/最小值查找,时间复杂度仍为 O(n) 但常数减半;同时返回 pair<min, max>,代码更短且避免重复遍历。
问3:lambda 表达式 { return std::rand()%101; } 与手写函数 generate_random_number 相比,适用场景是什么?
答:lambda 适合“一次性、局部使用、代码短小”的可调用需求,省掉函数声明/定义,捕获局部变量也更灵活;当算法需要多次复用或逻辑较复杂时,再考虑提取为具名函数。

 实验任务3

image

 

  1. 问1:自定义函数 func 功能是什么?
    答:对字母字符循环后移一位(z→a, Z→A),非字母字符保持不变。
问2:tolower 和 toupper 功能分别是什么?
答:tolower 把字符转成小写,toupper 把字符转成大写

实验任务4

image

问:使用 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;
}

 

image

实验任务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;
}

 

image

 实验任务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;
}

image

 

posted @ 2025-10-17 17:14  张毅炜  阅读(11)  评论(1)    收藏  举报