尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

实验1 现代c++初体验

实验1 现代c++初体验
📅 发布时间:2026/6/18 21:06:12

task 1.cpp

 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 << "测试2:\n";
18     test2();
19 
20     std::cout << "测试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 }
task 1

 

image

 Q1:reverse直接反转原容器的元素;reverse_copy将原容器的元素反转后再复制到新容器,原容器保持不变

Q2:给定一串字符的开头和末尾,再给定一个新的开头(从给定字符区间里选一个),新开头之前的字符就会移动到末尾;第一个参数表示序列的起始元素,第二个参数表示循环移动后新的起始元素的位置,第三个元素表示序列的末尾

 

task 2.cpp

 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 << "测试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 }
task 2

 

image

 Q1:generate将generate_random_number这个函数随机生成的1-100的数复制给v0的元素

Q2:使用min_element和max_element要历经两遍v0,分别找出最大值和最小值;minmax_element只要历经一遍v0,同时找出最小值和最大值

Q3:lambda表达式适用于逻辑简单且使用次数少的情景,比如generate_random_number在这段代码里只出现了两次,都是作为函数生成器的作用

 

task 3.cpp

 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(), s2.begin(), func);
52     std::cout << "s2=" << s2 << '\n';
53 }
task 3

image

 Q1:func函数的功能是将大小写字母转化为他们ASCII值+1的字母,如果遇到z和Z则转化为a和A

Q2:tolower将大写字母转化为小写形式,toupper将小写字母转化为大写形式

Q3:第一个参数是要转换的字符串的开头,第二个参数是要转换的字符串的末尾,第三个参数是要存放位置的开始,第四个参数是要对每个字符做怎样的处理;如果将s2.begin()换成s1.begin()变换后的字符串会直接覆盖s1原本的内容

 

task 4.cpp

 

 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 
12     while (cin >> s) {
13         cout << boolalpha << "区分大小写:" << is_palindrome(s) << "\n" << "不区分大小写:" << is_palindrome_ignore_case(s) << "\n\n";
14     }
15 }
16 
17 bool is_palindrome(const std::string& s) {
18     std::string s1(s.size(), ' ');
19     reverse_copy(s.begin(), s.end(), s1.begin());
20 
21     int i;
22     for (i = 0;i < s.size();i++) {
23         if (s[i] != s1[i]) {
24             return 0;
25             break;
26         }
27     }
28 
29     if (i == s.size() - 1)
30         return 0;
31 }
32 
33 bool is_palindrome_ignore_case(const std::string& s) {
34     std::string s1;
35     for (auto c : s)
36         s1 += std::tolower(c);
37 
38     std::string s2(s1.size(), ' ');
39     reverse_copy(s1.begin(), s1.end(), s2.begin());
40 
41     int i;
42     for (i = 0;i < s1.size();i++) {
43         if (s1[i] != s2[i]) {
44             return 0;
45             break;
46         }
47     }
48 
49     if (i == s1.size() - 1)
50         return 0;
51 }

 

image

 Q:可以将cin<<s改成getline(cin,s)

 

task 5.cpp

 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 s;
24 
25     while (x != 0) {
26         int r;
27         r = x % n;
28         if (r >= 10) 
29             s += static_cast<char>('A'+ r -10);
30         else
31             s += static_cast<char>(r + '0');
32         x = x / n;
33     }
34 
35     std::reverse(s.begin(), s.end());
36 
37     return s;
38 }

image

 

 

task 6.cpp

 1 #include<iostream>
 2 #include<iomanip>
 3 #include<algorithm>
 4 
 5 void putout(const std::string& s);
 6 
 7 int main() {
 8     std::string s1,s2;
 9     int i;
10 
11     for (i = 0;i < 26;i++) 
12         s1 += static_cast<char>('a' + i);
13 
14     std::cout << "  ";
15     putout(s1);
16 
17     for (auto c : s1)
18         s2 += std::toupper(c);
19 
20     for (i = 1;i <= 26;i++) {
21         std::cout << std::setfill(' ') << std::setw(2) << i;
22         std::rotate(s2.begin(), s2.begin() + 1 , s2.end());
23         putout(s2);
24     }
25 }
26 
27 void putout(const std::string& s) {
28     for (auto c : s)
29         std::cout << ' ' << c;
30     std::cout << '\n';
31 }

 

image

 

task 7.cpp

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<ctime>
 4 #include<vector>
 5 #include<iomanip>
 6 
 7 using namespace std;
 8 
 9 int main() {
10     srand(time(0));
11 
12     int correct = 0;
13     for (int i = 0;i < 10;i++) {
14         int x = rand() % 10 + 1;
15         int y = rand() % 10 + 1;
16         int z = rand() % 4;
17         int ans;
18         string s{ '+','-','*','/' };
19 
20         if (z == 0) 
21             ans = x + y;
22 
23         if (z == 1) {
24             if (x < y)
25                 swap(x, y);
26             ans = x - y;
27         }
28 
29         if (z == 2) 
30             ans = x * y;
31 
32         if (z == 3) {
33             if (x % y != 0) {
34                 vector<int> v;
35                 for (int k = 1;;k++) {
36                     x = k * y;
37                     if (x > 10) break;
38                     v.push_back(x);
39                 }
40                 x = v[rand() % v.size()];
41             }
42             ans = x / y;
43         }
44 
45         int answer;
46         std::cout << x << " " << s[z] << " " << y << " " << "= ";
47         std::cin >> answer;
48 
49         if (ans == answer)
50             correct++;
51     }
52 
53     double rate = correct / 10.00 * 100;
54     std::cout << "正确率:" <<fixed<<setprecision(2)<< rate << '%' << '\n';
55 }

image

 

相关新闻

  • presto配置
  • Hadoop--MapReduce
  • 20232308 2025-2026-1 《网络与系统攻防技术》实验一实验报告

最新新闻

  • MC68060软件包深度解析:浮点库实现与操作系统集成实战
  • C语言数学函数库深度解析:fabs、fmod、hypot的原理、陷阱与工程实践
  • 高中/高三/高考 回忆录
  • 从晶体管到可编程单元:深入解析FPGA芯片的架构层次与设计哲学
  • 02 代码整洁之道阅读笔记
  • 2026年卫生间漏水维修服务适配指南:昆山鼎壹万防水补漏公司及苏州本地服务商综合适配解析 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号