当前位置: 首页 > news >正文

oop实验一

oop实验一

实验一:

task1:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <algorithm>
 5 
 6 template<typename T>
 7 void output(const T &c);
 8 
 9 void test1();
10 void test2();
11 void test3();
12 
13 int main() {
14     std::cout << "测试1: \n";
15     test1();
16 
17     std::cout << "\n测试2: \n";
18     test2();
19 
20     std::cout << "\n测试3: \n";
21     test3();
22 }
23 
24 template <typename T>
25 void output(const T &c) {
26     for(auto &i : c)
27         std::cout << i << ' ';
28     std::cout << '\n';
29 }
30 
31 void test1() {
32     using namespace std;
33 
34     string s0{"0123456789"};
35     cout << "s0 = " << s0 << endl;
36 
37     string s1(s0);
38     reverse(s1.begin(), s1.end());  
39     cout << "s1 = " << s1 << endl;
40 
41     string s2(s0.size(), ' ');
42     reverse_copy(s0.begin(), s0.end(), s2.begin()); 
43     cout << "s2 = " << s2 << endl;
44 }
45 
46 void test2() {
47     using namespace std;
48 
49     vector<int> v0{2, 0, 4, 9};
50     cout << "v0: "; output(v0);
51 
52     vector<int> v1{v0};
53     reverse(v1.begin(), v1.end());
54     cout << "v1: "; output(v1);
55 
56     vector<int> v2{v0};
57     reverse_copy(v0.begin(), v0.end(), v2.begin());
58     cout << "v2: "; output(v2);
59 }
60 
61 void test3() {
62     using namespace std;
63 
64     vector<int> v0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
65     cout << "v0: "; output(v0);
66 
67     vector<int> v1{v0};
68     rotate(v1.begin(), v1.begin()+1, v1.end());  
69     cout << "v1: "; output(v1);
70 
71     vector<int> v2{v0}; 
72     rotate(v2.begin(), v2.begin()+2, v2.end());  
73     cout << "v2: "; output(v2);
74 
75     vector<int> v3{v0};
76     rotate(v3.begin(), v3.end()-1, v3.end()); 
77      cout << "v3: "; output(v3);
78 
79     vector<int> v4{v0};
80     rotate(v4.begin(), v4.end()-2, v4.end()); 
81     cout << "v4: "; output(v4);
82 }

 

运行截图:

test1

问题1:reverse修改操作的元素,并且无返回值;reverse_copy因为其后缀执行赋值操作,不修改元素,将反转后的元素复制到新的地址

问题2:rotate将前面容器的元素送到后面容器的最后面

             其中first 代表容器的起始迭代器;middle代表从first到此为止的元素需要被移至后面;last代表容器结束的迭代器

 

task2:

源代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <numeric>
 5 #include <iomanip>
 6 #include <cstdlib>
 7 #include <ctime>
 8 
 9 template<typename T>
10 void output(const T &c);
11 
12 int generate_random_number();
13 void test1();
14 void test2();
15 
16 int main() {
17     std::srand(std::time(0)); 
18     std::cout << "测试1: \n";
19     test1();
20 
21     std::cout << "\n测试2: \n";
22     test2();
23 }
24 
25 template <typename T>
26 void output(const T &c) {
27     for(auto &i: c)
28         std::cout << i << ' ';
29     std::cout << '\n';
30 }
31 
32 int generate_random_number() {
33     return std::rand() % 101;
34 }
35 
36 void test1() {
37     using namespace std;
38 
39     vector<int> v0(10);
40     generate(v0.begin(), v0.end(), generate_random_number);
41     cout << "v0: "; output(v0);
42 
43     vector<int> v1{v0};
44     sort(v1.begin(), v1.end()); 
45     cout << "v1: "; output(v1);
46 
47     vector<int> v2{v0};
48     sort(v2.begin()+1, v2.end()-1);
49     cout << "v2: "; output(v2);
50 }
51 
52 void test2() {
53     using namespace std;
54 
55     vector<int> v0(10);  
56     generate(v0.begin(), v0.end(), generate_random_number); 
57     cout << "v0: "; output(v0);
58 
59     auto min_iter = min_element(v0.begin(), v0.end());
60     auto max_iter = max_element(v0.begin(), v0.end());
61     cout << "最小值: " << *min_iter << endl;
62     cout << "最大值: " << *max_iter << endl;
63 
64     auto ans = minmax_element(v0.begin(), v0.end());
65     cout << "最小值: " << *(ans.first) << endl;
66     cout << "最大值: " << *(ans.second) << endl;
67 
68     double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / v0.size();
69     cout << "均值: " << fixed << setprecision(2) << avg1 << endl;
70 
71     sort(v0.begin(), v0.end());
72     double avg2 = accumulate(v0.begin()+1, v0.end()-1, 0.0) / (v0.size()-2);
73     cout << "去掉最大值、最小值之后,均值: " << avg2 << endl;
74 }

运行截图:

test2

问题1:generate用来调用函数完成批量赋值的操作

问题2:效率比较高,时间复杂度更低,遍历的操作只需要一次

问题3:lambda更适合复杂度更低的场景,更加便利,逻辑性稍微差一些

 

task3:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cctype>
 5 
 6 unsigned char func(unsigned char c);
 7 void test1();
 8 void test2();
 9 
10 int main() {
11     std::cout << "测试1: 字符串大小写转换\n";
12     test1();
13 
14     std::cout << "\n测试2: 字符变换\n";
15     test2();
16 }
17 
18 unsigned char func(unsigned char c) {
19     if(c == 'z')
20         return 'a';
21     
22     if(c == 'Z')
23         return 'A';
24     
25     if(std::isalpha(c))
26         return static_cast<unsigned char>(c+1);
27     
28     return c;
29 }
30 
31 void test1() {
32     std::string s1{"Hello World 2049!"};
33     std::cout << "s1 = " << s1 << '\n';
34 
35     std::string s2;
36     for(auto c: s1)
37         s2 += std::tolower(c);
38     std::cout << "s2 = " << s2 << '\n'; 
39 
40     std::string s3;
41     for(auto c: s1)
42         s3 += std::toupper(c);
43     std::cout << "s3 = " << s3 << '\n'; 
44 }
45 
46 void test2() {
47     std::string s1{"I love cosmos!"};
48     std::cout << "s1 = " << s1 << '\n';
49     
50     std::string s2(s1.size(), ' ');
51     std::transform(s1.begin(), s1.end(),
52                    s2.begin(),
53                    func);
54     std::cout << "s2 = " << s2 << '\n';
55 }

运行截图:

test3

问题1:将输入的字符进行变换,返回下一个字母;不是字母就返回元字符

问题2:tolower将大写的字母变成小写的字母;toupper相反,将小写的字母变成大写的字母

问题3:它有四个参数,分别为输入的开始迭代器,输入的结束迭代器,输出的开始迭代器和转换过程需要的函数

s2_begin会导致转存,不修改原来的字符串;s1_begin会直接修改原来的字符串、

 

task4:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 
 5 bool is_palindrome(const std::string &s);
 6 bool is_palindrome_ignore_case(const std::string&s);
 7 
 8 int main(){
 9     using namespace std;
10     string s;
11     while (cin>>s){
12         cout << boolalpha
13              << "区分大小写:" <<is_palindrome(s)<< "\n"
14              << "不区分大小写:"<< is_palindrome_ignore_case(s)<< "\n\n";
15     }
16 }
17 
18 bool is_palindrome(const std::string&s){
19     std::string rev_s=s;
20     std::reverse(rev_s.begin(),rev_s.end());
21     return s==rev_s;
22 }
23 
24 bool is_palindrome_ignore_case(const std::string&s){
25     std::string lower_s=s;
26     for (char &c:lower_s){
27         c=std::tolower(static_cast<unsigned char>(c));
28     }
29     std::string rev_lower_s=lower_s;
30     std::reverse(rev_lower_s.begin(),rev_lower_s.end());
31     return lower_s==rev_lower_s;
32 }

运行截图:

task4

问题:将原来的cin>>s改成getline(cin,s)让他读取一整行的字符内容

 

task5:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 
 5 std::string dec2n(int x,int n=2);
 6 
 7 int main(){
 8     int x;
 9     while(std::cin>>x) {
10         std::cout << "十进制: " <<x<< '\n'
11                   << "二进制: " <<dec2n(x)<< '\n'
12                   << "八进制: " <<dec2n(x,8)<< '\n'
13                   << "十二进制: " <<dec2n(x,12)<< '\n'
14                   << "十六进制: " <<dec2n(x,16)<< '\n'
15                   << "三十二进制: " <<dec2n(x,32)<< "\n\n"; 
16     }
17 }
18 
19 std::string dec2n(int x, int n){
20     if (x==0){
21         return "0";
22     }
23     std::string result;
24     const std::string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
25     while(x>0){
26         result+=digits[x%n];
27         x=x/n;
28     }
29     std::reverse(result.begin(),result.end());
30     return result;
31 }

运行截图:

task5

 

 

task6:

源代码:

 1 #include <iostream>
 2 #include <string>
 3 
 4 int main() {
 5     std::cout<<"   ";
 6     for (char c = 'a'; c <= 'z'; ++c) {
 7         std::cout << c << " ";
 8     }
 9     std::cout << std::endl;
10 
11     std::string plain = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
12     for (int i = 1; i <= 26; ++i) {
13         if (i < 10) {
14             std::cout<<" ";
15             std::cout << i << " ";
16         } else {
17             std::cout << i << " ";
18         }
19         for (int j = 0; j < 26; ++j) {
20             int pos = (j + i) % 26;
21             std::cout << plain[pos] << " ";
22         }
23         std::cout << std::endl;
24     }
25 
26     return 0;
27 }

运行截图:

task6

 

 

task7:

源代码:

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <ctime>
 4 #include <iomanip>
 5 
 6 using namespace std;
 7 
 8 int main(){
 9     srand(time(0));
10     int correct=0;
11     for (int i=0;i<10;++i){
12         int a=rand()%10+1; 
13         int b=rand()%10+1;
14         int op=rand()%4; 
15         int result,user_ans;
16         
17         if(op==1){
18             if(a<b)swap(a,b);
19         }
20         else if(op==3){
21             while(a%b!=0){
22                 b=rand()%10+1;
23             }
24         }
25 
26         switch(op){
27             case 0:result=a+b;cout<<a<< " + " <<b<<" = ";break;
28             case 1:result=a-b;cout<<a<< " - " <<b<<" = ";break;
29             case 2:result=a*b;cout<<a<< " * " <<b<<" = ";break;
30             case 3:result=a/b;cout<<a<< " / " <<b<<" = ";break;
31         }
32 
33         cin>>user_ans;
34         if(user_ans==result){
35             correct++;
36         }
37     }
38 
39     double accuracy=(double)correct/10*100;
40     cout<<"正确率:"<<fixed<<setprecision(2)<<accuracy<<"%"<<endl;
41 
42     return 0;
43 }

运行截图:

task7

实验一总结:

task5中对于进制转换式偷了懒,直接创建了序列去存储所有可能的进制转化是可能用到的字符,直接在字符处理时挑取并且组成结果,很爽。

task6中打印字母表同样使用这样的方法,创建序列后直接打印,需要用到的空格,以及数字靠右对齐都是用直接打印空格占据行数去实现,也很好用。

task7回忆了switch的用法去打印算术符号,在使用时遇到很多麻烦,比如输出不对应的问题,豆包给出的结果不如人意,kimi的方法又过于繁琐。

同时三个实验也用到了没有接触过的头函数,都是在ai 的辅助下使用。

http://www.hskmm.com/?act=detail&tid=31594

相关文章:

  • 池化
  • 在AI技术唾手可得的时代,挖掘直播工具新需求成为关键突破点
  • 多模态识别技术革新物品追踪流程
  • 2025 年震动盘厂家最新推荐排行榜:精密 / 电子 / 笔筒 / 塑料震动盘及定做服务优选企业榜单发布
  • java学习2小时教程-【小细节】
  • 2025年太阳能板购买全攻略:推荐、选择与性价比分析
  • UEFI安装Windows 7 64位
  • 2025 年展会搭建公司最新推荐排行榜:服务商创意定制与全流程服务能力深度解析
  • 本地虚拟机windows 安装mysql数据库版本可选,外部如何连接
  • 2025年常州服装培训学校培训学校推荐榜
  • MLGO微算法科技创新AI技术:基于DRL的设备边缘协同推理优化系统,助力无线智能感知进入“极致高效”时代
  • 2025 最新隔音棉生产厂家口碑推荐榜:甄选家装公装专用材质,涵盖西南及全国实力品牌昆明/下水管/阻尼片/专用隔音棉厂家推荐
  • C 语言 - 操作文件函数全解析
  • C 语言 - fopen、fprintf、fread、fwrite、fputc 操作文件函数解析
  • 找靠谱图像处理软件?Adobe PS2025 全球设计师都在用
  • 2025 碳晶板厂家最新推荐榜:含木纹 / 白色 / 全屋整装等品类,西南及全国优质厂家权威甄选指南
  • 2025年麻辣王子全面评测:口味、价格与购买全攻略
  • 把列表中所有姓周的人的信息删掉(此题有坑, 请慎重): lst = [周⽼⼆, 周星星, 麻花藤, 周扒⽪] # 结果: lst = [麻花藤]
  • 2022 ICPC 香港 L
  • 2025 年乡村波形护栏厂家最新推荐排行榜:聚焦优质企业,助力乡村道路安全建设选型参考道路/高速/乡村道路/乡村公路波形护栏板厂家推荐
  • 员工签到微信小程序系统:企业考勤管理的高效解决方案
  • AI 姓氏头像生成小程序管理系统:专属头像定制与流量变现解决方案
  • AI元人文:元规则、元道德与哪吒模型
  • 知音 CMS:全场景音频与小说分销一体化解决方案
  • 2025年锅炉厂家最新权威推荐榜:工业锅炉、燃气锅炉、电热锅炉、蒸汽锅炉专业制造商实力解析与选购指南
  • CCSP2025 游记
  • powershell上移文件夹下的所有文件
  • 2025 年国内算力云公司最新推荐排行榜:聚焦 AI 训推与 MaaS 服务,助力企业精准选优质合作伙伴算力云大模型/算力云深度学习/微调算力云/蓝耘算力云公司推荐
  • 2025 年国内云计算公司最新推荐排行榜:聚焦 AI 训推与大模型需求的优质厂商精选指南模型训推云计算/大模型云计算/AI开发云计算公司推荐
  • 2025年防水连接器厂家最新推荐排行榜,连接器,航空插头,工业网线,专业防水与耐用性能深度解析