实验1

任务1

源代码

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
template<typename T>
void output(const T& c);
void test1();
void test2();
void test3();
int main() {
    std::cout << "测试1: \n";
    test1();
    std::cout << "测试2: \n";
    test2();
    std::cout << "测试3: \n";
    test3();
}

template<typename T>
void output(const T& c) {
    for (auto& i : c)
        std::cout << i << ' ';
    std::cout << '\n' ;
}
void test1() {
    using namespace std;

    string s0{ "0123456789" };
    cout << "s0 = " << s0 << endl;
    string s1(s0);
    reverse(s1.begin(), s1.end());
    cout << "s1 = " << s1 << endl;

    string s2(s0.size(), ' ');
    reverse_copy(s0.begin(), s0.end(), s2.begin());
    cout << "s2 = " << s2 << endl;    
}
void test2() {
    using namespace std;

    vector<int> v0{ 2,0,4,9 };
    cout << "v0: "; output(v0);
    vector<int> v1{ v0 };
    reverse(v1.begin(), v1.end());
    cout << "v1: "; output(v1);

    vector<int> v2{ v0 };
    reverse_copy(v0.begin( ), v0.end( ), v2.begin( ));
    cout << "v2: "; output(v2);

}
void test3() {
    using namespace std;

    vector<int> v0{ 0,1,2,3,4,5,6,7,8,9 };
    cout << "v0: "; output(v0);

    vector<int> v1{ v0 };
    rotate(v1.begin(), v1.begin() + 1, v1.end());
    cout << "v1: "; output(v1);

    vector<int> v2{ v0 };
    rotate(v2.begin(), v2.begin() + 2, v2.end());
    cout << "v2: "; output(v2);

    vector<int> v3{ v0 };
    rotate(v3.begin(), v3.end() - 1, v3.end());
    cout << "v3: "; output(v3);
    vector<int> v4{ v0 };
    rotate(v4.begin(), v4.end() - 2, v4.end());
    cout << "v4: "; output(v4);
}

效果

屏幕截图 2025-10-11 091950

1.reverse反转自身数组,而reverse_copy自身保持不变将数组反转后拷贝给另一个数组

2.将区间(first,middle)里的元素全都移到(middle,end)后面,而让middle位置原本元素变为新的起始位置,实现移动

旋转的起始位置,旋转的分界位置,旋转的结束位置

任务2

源代码

#include<vector>
#include<algorithm>
#include<numeric>
#include<iomanip>
#include<cstdlib>
#include<ctime>
#include <iostream>

template<typename T>
void output(const T& c);

int generate_random_number();
void test1();
void test2();

int main() {
    std::srand(std::time(0));
    std::cout << "测试1 : \n";
    test1();
    std::cout << "测试2 : \n";
    test2();
}
template <typename T>
void output(const T& c) {
    for (auto& i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}
int generate_random_number() {
    return std::rand() % 101;
}

void test1() {
    using namespace std;

    vector<int> v0(10);
    generate(v0.begin(), v0.end(), generate_random_number);
    cout << "v0: ", output(v0);

    vector<int> v1{ v0 };
    sort(v1.begin(), v1.end());
    cout << "v1: ", output(v1);

    vector<int> v2{ v0 };
    sort(v2.begin()+1, v2.end()-1);
    cout << "v2: "; output(v2);
}
void test2() {
    using namespace std;

    vector<int> v0(10);
    generate(v0.begin(), v0.end(), generate_random_number);
    cout << "v0: "; output(v0);

    auto min_iter = min_element(v0.begin(), v0.end());
    auto max_iter = max_element(v0.begin(), v0.end());
    cout << "最大值: " << *max_iter << endl;
    cout << "最小值: " << *min_iter << endl;

    auto ans = minmax_element(v0.begin(), v0.end());
    cout << "最大值: " << *(ans.first) << endl;
    cout << "最小值: " << *(ans.second) << endl;

    double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / (v0.size() - 2);
    cout << "均值: " << fixed << setprecision(2) << avg1 << endl;

    sort(v0.begin(), v0.end());
    double avg2 = accumulate(v0.begin() + 1, v0.end() - 1, 0.0) / (v0.size() - 2);
    cout << "去掉最大值,最小值后的均值: " << avg2 << endl;
}

效果

屏幕截图 2025-10-14 200205

1.遍历数组,将返回值依次赋值给每个元素

2.效率更高,只需遍历一次容器

3.等同

 任务3

源代码

#include<iostream>
#include<string>
#include<algorithm>
#include<cctype>

unsigned char func(unsigned char c);
void test1();
void test2();

int main() {
    std::cout << "测试1: 字符串大小写转换\n";
    test1();

    std::cout << "\n测试2: 字符变换\n";
    test2();
}

unsigned char func(unsigned char c) {
    if (c == 'z')
        return 'a';

    if (c == 'Z')
        return 'A';

    if (std::isalpha(c))
        return static_cast<unsigned char>(c + 1);

    return c;
}

void test1() {
    std::string s1{ "Hello world 2049!" };
    std::cout << "s1 = " << s1 << '\n';

    std::string s2;
    for (auto c : s1)
        s2 += std::tolower(c);
    std::cout << "s2 = " << s2 << '\n';

    std::string s3;
    for (auto c : s1)
        s3 += std::toupper(c);
    std::cout << "s3 = " << s3 << '\n';
}

void test2() {
    std::string s1{ "I love cosmos!" };
    std::cout << "s1 = " << s1 << '\n';

    std::string s2(s1.size(), ' ');
    std::transform(s1.begin(), s1.end(), s2.begin(), func);
    std::cout << "s2 = " << s2 << '\n';
}

效果

屏幕截图 2025-10-14 223727

1.确认大小写字母

2.tolower将字符串全都小写 toupper将字符串全都大写

3.输入序列的起始位置 输入序列的结束位置 输出序列的起始位置 对输入序列中每个字符的变化函数

s1直接修改为变换后的结果,原来s1数据丢失

 任务4 

源代码

#include<iostream>
#include<string>
#include<algorithm>

bool is_palindrome(const std::string& s);
bool is_palindrome_ignore_case(const std::string& s);

int main() {
    using namespace std;
    string s;

    while (cin >> s) {
        cout << boolalpha
            << "区分大小写: " << is_palindrome(s) << "\n"
            << "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n";
    }
}
bool is_palindrome(const std::string& s) {
    int left = 0;
    int right = s.size() - 1;
    while (left < right) {
        if (s[left] != s[right])
            return false;
        left++;
        right--;
    }
    return true;
}

bool is_palindrome_ignore_case(const std::string& s) {
    int left = 0;
    int right = s.size() - 1;
    while (left < right) {
        if (towlower(s[left]) != towlower(s[right]))
            return false;
        left++;
        right--;
    }
    return true;
}

效果

屏幕截图 2025-10-15 104159

1.while (cin >> s)改为while(getline(cin,s))

任务5

源代码

#include<iostream>
#include<string>
#include<algorithm>
std::string dec2n(int x, int n = 2);
int main() {
    int x;
    while (std::cin >> x) {
        std::cout << "十进制: " << x << '\n'
            << "二进制: " << dec2n(x) << '\n'
            << "八进制: " << dec2n(x, 8) << '\n'
            << "十二进制: " << dec2n(x, 12) << '\n'
            << "十六进制: " << dec2n(x, 16) << '\n'
            << "三十二进制: " << dec2n(x, 32) << "\n\n";
    }
}
std::string dec2n(int x, int n) {
    if (x == 0) return "0";
    std::string s;
    const char* digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    while (x > 0) {
        int r = x % n;
        s += digits[r];
        x /= n;
    }
    std::reverse(s.begin(), s.end());
    return s;

}

效果

屏幕截图 2025-10-15 110118

任务6

源代码

#include <iostream>
#include <iomanip>

int main() {
    std::cout << "  ";
    for (char c = 'a'; c <= 'z'; ++c) {
        std::cout << std::setw(3) << c;
    }
    std::cout << std::endl;

    for (int i = 1; i <= 26; ++i) {
        std::cout << std::setw(2) << i;
        for (char c = 'a'; c <= 'z'; ++c) {
            char encrypted = 'A' + (c - 'a' + i) % 26;
            std::cout << std::setw(3) << encrypted;
        }
        std::cout << std::endl;
    }
    return 0;
}

效果

屏幕截图 2025-10-15 111540

任务7

源代码

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>

int getRandomNumber(int min, int max) {
    return rand() % (max - min + 1) + min;
}

void generateQuestion(int& num1, int& num2, char& op) {
    num1 = getRandomNumber(1, 10);
    num2 = getRandomNumber(1, 10);
    int opType = getRandomNumber(1, 4);

    switch (opType) {
    case 1:
        op = '+';
        break;
    case 2:
        op = '-';
        if (num1 < num2) {
            std::swap(num1, num2);
        }
        break;
    case 3:
        op = '*';
        break;
    case 4:
        op = '/';
        while (num1 % num2 != 0) {
            num1 = getRandomNumber(1, 10);
            num2 = getRandomNumber(1, 10);
        }
        break;
    }
}

int main() {
    srand(time(0));
    int correctCount = 0;

    for (int i = 0; i < 10; ++i) {
        int num1, num2, userAnswer, correctAnswer;
        char op;

        generateQuestion(num1, num2, op);

        switch (op) {
        case '+':
            correctAnswer = num1 + num2;
            break;
        case '-':
            correctAnswer = num1 - num2;
            break;
        case '*':
            correctAnswer = num1 * num2;
            break;
        case '/':
            correctAnswer = num1 / num2;
            break;
        }

        std::cout << num1 << " " << op << " " << num2 << " = ";
        std::cin >> userAnswer;

        if (userAnswer == correctAnswer) {
            correctCount++;
        }
    }

    double accuracy = static_cast<double>(correctCount) / 10 * 100;
    std::cout << std::fixed << std::setprecision(2) << "正确率: " << accuracy << "%" << std::endl;

    return 0;
}

效果

屏幕截图 2025-10-15 112942

 

posted @ 2025-10-15 11:32  毛天佑202483290413  阅读(24)  评论(2)    收藏  举报