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(opType1){
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_QUESTIONS100.0;
cout<<"正确率:"<<fixed<<setprecision(2)<<accuracy<<"%"<<endl;
return 0;
}
- 运行截图测试
![task7]()
实验总结:
cout<<a<<" "<<这种链式输出比c语言方便很多
stew(2)能够轻松实现对齐
rand()%10+1随机生成数非常舒服
但整体感觉该实验过程比较依赖具体头文件和命名空间
总之用C++库很方便快捷











浙公网安备 33010602011771号