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

实验任务一

#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 << "\n测试2: \n";
    test2();
    std::cout << "\n测试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);
}

image

问题1:reverse修改原数据,reverse_copy创建反转副本且不改变原数据

问题2:rotate算法通过循环移位来改变元素顺序,first:区间起始位置,middle:新的起始位置(旋转中心点),last:区间结束位置

 

实验任务二

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

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 max_it = max_element(v0.begin(), v0.end());
    auto min_it = min_element(v0.begin(), v0.end());
    cout << "最小值: " << *min_it << endl;
    cout << "最大值: " << *max_it << 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();
    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;
}

image

 问题1:用指定生成器函数的结果填充容器的某个区间

问题2:代码更简洁,访问更高效

问题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 << "测试2:字符替换\n";
    test2();
}

unsigned char func(unsigned char c) {
    if (c == '1')
        return 'a';
    if (c == '2')
        return 'A';
    if (std::isalpha(c))
        return static_cast<unsigned char>(c + 1);
    return c;
}

void test1() {
    std::string s = "Hello World 2048!";
    std::cout << "s = " << s << "\n";
    std::string s1;
    for (char c : s)
        s1 += std::tolower(c);
    std::cout << "s1 = " << s1 << "\n";
    std::string s2;
    for (char c : s)
        s2 += std::toupper(c);
    std::cout << "s2 = " << s2 << "\n";
}

void test2() {
    std::string s1 = "I love C++!";
    std::cout << "s1 = " << s1 << "\n";
    std::string s2(s1.size(), '*');
    std::transform(s1.begin(), s1.end(), s2.begin(), func);
    std::cout << "s2 = " << s2 << "\n";
}

image

 问题1:主要功能是将字符串中的大写字母转换为小写字母,同时删除字符串中的所有数字字符

问题2:tolower:将大写字母转换为对应的小写字母;toupper:将小写字母转换为对应的大写字母

问题3:1:指定区域的起始位置,2:指定区域的结束位置,3:生成的数据开始存储的位置,4:数据转化/处理规则

 

实验任务四

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;

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

int main() {
    using namespace std;
    string s;
    //多组输入,直到按下Ctrl+z结束测试
    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.length() - 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.length() - 1;
    
    while (left < right) {
        // 将字符转换为小写后比较
        if (tolower(s[left]) != tolower(s[right])) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

c92013159eb663b8e63d2808120e7612

 问题1:使用getline()函数

int main() {
    string s;
    
    cout << "请输入字符串(可包含空格,空行退出): " << endl;
    
    while (getline(cin, s)) {
        if (s.empty()) { // 输入空行时退出
            break;
        }

 

实验任务五

#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){
    std::string result ;
    char str ;
    if(x == 0){
        return "0" ;
    }
    
    while(x>0){
        int remainder = x % n ;
        if( remainder < 10 ){
            str = '0' + remainder ;
        }
        else{
            str = 'A' + remainder - 10 ;
        }
        
        result.insert(0 , 1, str) ;
        
        x = x/n ;
    }
    return result ;
}

image

 

实验任务六

#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
  
  int main() {
      std::string start;
      for (int i = 0; i < 26; i++) {
          start += static_cast<char>(97 + i);
     }
 
     std::cout << "   ";
     for (int i = 0; i < 26; i++) {
         std::cout << start[i] << " ";
     }
     std::cout << std::endl;
 
     for (int i = 1; i <= 26; i++) {
         std::cout << std::setw(2) << i << " ";
         std::rotate(start.begin(), start.begin() + 1, start.end());
         for (int j = 0; j < 26; j++) {
             std::cout << static_cast<char>(toupper(start[j])) << " ";
         }
         std::cout << std::endl;
     }
}

a843d5ab81519db8826c779ca4f1ca9b

 

实验任务七

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;

int main() {
// 设置随机种子,确保每次运行题目不同
srand(time(0));

int correctCount = 0; // 正确答案计数
const int totalQuestions = 10; // 总题目数

cout << "=== 小学生算术运算测试 ===" << endl;
cout << "请回答以下10道算术题:" << endl << endl;

for (int i = 1; i <= totalQuestions; i++) {
// 生成两个1-10的随机操作数
int num1 = rand() % 10 + 1;
int num2 = rand() % 10 + 1;

// 随机选择运算符:0-加, 1-减, 2-乘, 3-除
int operation = rand() % 4;
char opChar;
int correctAnswer;
int userAnswer;

// 根据运算符类型处理题目
switch (operation) {
case 0: // 加法
opChar = '+';
correctAnswer = num1 + num2;
break;

case 1: // 减法(确保num1 >= num2)
if (num1 < num2) {
swap(num1, num2); // 交换确保第一个数大于等于第二个数
}
opChar = '-';
correctAnswer = num1 - num2;
break;

case 2: // 乘法
opChar = '*';
correctAnswer = num1 * num2;
break;

case 3: // 除法(确保能整除)
// 重新调整num2,确保num1能被num2整除
if (num1 % num2 != 0) {
// 找到num1的约数作为num2
for (int divisor = num1; divisor >= 1; divisor--) {
if (num1 % divisor == 0 && divisor <= 10) {
num2 = divisor;
break;
}
}
}
opChar = '/';
correctAnswer = num1 / num2;
break;
}

// 显示题目并获取用户答案
cout << "第" << setw(2) << i << "题: " << num1 << " " << opChar << " " << num2 << " = ";
cin >> userAnswer;

// 检查答案是否正确
if (userAnswer == correctAnswer) {
cout << "✓ 正确!" << endl;
correctCount++;
} else {
cout << "✗ 错误!正确答案是: " << correctAnswer << endl;
}
cout << endl;
}

// 计算并显示正确率
double accuracy = (static_cast<double>(correctCount) / totalQuestions) * 100;
cout << "=== 测试结果 ===" << endl;
cout << "答对题数: " << correctCount << "/" << totalQuestions << endl;
cout << fixed << setprecision(2);
cout << "正确率: " << accuracy << "%" << endl;

return 0;
}

image

 

posted @ 2025-10-17 23:41  晚夕惋惜婉西  阅读(5)  评论(1)    收藏  举报