Task1

任务1

  • 运行截图测试
    tast1
  • 问题回答:reverse作用是原地反转区间元素,源区间被反转所以修改了源区间。而reverse_copy将区间反转后拷贝到另一处没有修改源区间。
    retate算法的本质是让middle成为区间反转后第一个元素的位置,让middle成为新区间的首个元素,也就是说区间的左移还是右移完全取决于middle是在区间的前半段还是后半段

任务2

  • 运行截图测试
    task2
    修改后的task2
  • 问题回答:generate作用就是用一个每次调用都能产生不同的值的函数来批量赋值,minmax_element比你min_element,max_element分开用比较次数更少,减少指针跳转成本的开销。程序改写后输出效果基本相同,看似换了个写法,但是改写后lambda的价值就在于就地定义,可获取局部变量,容易被内联优化,展示了lambda最基本的空捕获列表+空参数列表+函数的形式。

任务3

  • 运行截图测试
    task3
    改写的task3
  • 问题回答:func的功能是对字母做下一个字母的凯撒位移式变换,并处理首尾回环。tolower的功能是若字母是大写返回小写,否则返回原样;toupper的功能是若字母为小写返回大写,否则返回原样。transform第一个参数意义是输入区间的起点,第二个是输入区间的终点,第三个是输出起点,第四个是操作对每个元素施加一元函数。改写后区别和任务2中的reverse和revers_copy有点像,s2.begin变换后另存到s2s1不动(reverse_copy),s1.begin是就地变换s1被改写(reverse)。

任务4

  • 补足代码:
    bool is_palindrome(const std::string &s){
    std::string reversed_s=s;
    std::reverse(reversed_s.begin(),reversed_s.end());
    return s==reversed_s;
    }

bool is_palindrome_ignore_case(const std::string &s){std::string lower_s=s;
std::transform(lower_s.begin(),lower_s.end(),lower_s.begin(),[](unsigned char c){return std::tolower(c);});
std::string reversed_s=lower_s;
std::reverse(reversed_s.begin(),reversed_s.end());
return lower_s==reversed_s;
}

  • 运行截图测试
    task4
  • 改写后运行截图测试
    改写后task4
  • 问题回答:直接用getline,将whlie(cin>>s)改写成while(getline(cin, s))。

任务5

  • 补写代码:
    std::string dec2n(int x,int n){
    if(x==0){
    return "0";
    }
    std::string result="";
    const std::string charset="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    while(x>0){
    int remainder=x%n;
    result+=charset[remainder];
    x/=n;
    }
    std::reverse(result.begin(),result.end());
    return result;
  • 运行测试截图
    task5

任务6

  • 源代码:
    //#include
    //#include
    using namespace std;
    int main(){
    cout << " ";
    for (int j=0;j<26;j++){
    cout << (char)('a'+j)<< " ";
    }
    cout << endl;
    for(int i=1;i<=26;i++){
    cout << setw(2) <<i << " ";
    for (int j=1;j<=26;j++){
    char ch=(char)('A'+(i+j-1)%26);
    cout << ch << " ";
    }
    cout << endl;
    }
    return 0;
    }
  • 运行截图测试
    task6

任务7

  • 源代码:
    //#include
    //#include
    //#include
    //#include

using namespace std;
int main(){
srand(time(0));
int correctcount=0;
const int TOTAL_QUESTIONS=10;
for(int i=0;i<TOTAL_QUESTIONS;++i){
int a,b,answer;
char op;
int opType=rand()%4;
if(opType0){
op='+';
a=rand()%10+1;
b=rand()%10+1;
answer=a+b;
}
else if(opType
1){
op='-';
a=rand()%10+1;
b=rand()%10+1;
if(a<b){
int temp=a;
a=b;
b=temp;
}
answer=a-b;
}
else{
op='/';
b=rand()%10+1;
int quotient=rand()%10+1;
a=bquotient;
answer=a/b;
}
cout<<a<<" "<<op<<" "<<b<<" = ";
int useranswer;
cin>>useranswer;
if(useranswer==answer){
correctcount++;
}
}
double accuracy=(double)correctcount/TOTAL_QUESTIONS
100.0;
cout<<"正确率:"<<fixed<<setprecision(2)<<accuracy<<"%"<<endl;
return 0;

}

  • 运行截图测试
    task7

实验总结:

cout<<a<<" "<<这种链式输出比c语言方便很多
stew(2)能够轻松实现对齐
rand()%10+1随机生成数非常舒服
但整体感觉该实验过程比较依赖具体头文件和命名空间
总之用C++库很方便快捷

posted @ 2026-10-21 15:00  kk库拉索  阅读(4)  评论(0)    收藏  举报