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

oop.shiyan1

实验1

源代码:

  1 #include<iostream>
  2 #include<string>
  3 #include<vector>
  4 #include<algorithm>
  5 
  6 //模版函数声明
  7 template<typename T>
  8 void output(const T& c);
  9 
 10 void test1();
 11 void test2();
 12 void test3();
 13 
 14 int main()
 15 {
 16     std::cout << "测试1:\n";
 17     test1();
 18 
 19     std::cout << "\n测试2:\n";
 20     test2();
 21 
 22     std::cout << "\n测试3:\n";
 23     test3();
 24 }
 25 
 26 
 27 //输出容器对象c中的元素
 28 template <typename T>
 29 void output(const T& c)
 30 {
 31     for (auto& i : c)
 32         std::cout << i << ' ';
 33     std::cout << '\n';
 34 
 35 }
 36 //测试1:组合使用算法库、迭代器、string反转字符串
 37 void test1()
 38 {
 39     using namespace std;
 40     string s0{ "0123456789" };
 41     cout << "s0 = " << s0 << endl;
 42 
 43     string s1(s0);
 44     //反转s1自身
 45     reverse(s1.begin(), s1.end());//修改源容器
 46     cout << "s1 = " << s1 << endl;
 47 
 48     string s2(s0.size(), ' ');
 49     //将s0反转后结果拷贝到s2,s0自身不变
 50     reverse_copy(s0.begin(),s0.end(), s2.begin());//源容器保持不变,括号内前两个为源容器范围,最后一个为新容器起始位置
 51     cout << "s2 = " << s2 << endl;
 52 
 53 }
 54 
 55 //测试2:组合使用算法库、迭代器、vector反转动态数组对象vector内数据库
 56 
 57 void test2()
 58 {
 59     using namespace std;
 60 
 61     vector<int> v0{ 2,0,4,9 };
 62     cout << "v0: ";output(v0);
 63     vector<int> v1{ v0 };
 64     reverse(v1.begin(), v1.end());
 65     cout << "v1: ";output(v1);
 66     
 67     vector<int> v2{ v0 };
 68     reverse_copy(v0.begin(), v0.end(), v2.begin());
 69     cout << "v2: ";output(v2);
 70 }
 71 
 72 //测试3:组合使用算法库、迭代器、vector实现元素旋转移位
 73 void test3()
 74 {
 75     using namespace std;
 76 
 77     vector<int> v0{ 0,1,2,3,4,5,6,7,8,9 };
 78     cout << "v0: ";output(v0);
 79 
 80     vector<int> v1{ v0 };
 81     //将[v1.begin(), v1.end())区间内元素循环左移1位
 82     rotate(v1.begin(), v1.begin() + 1, v1.end());
 83     cout << "v1: ";output(v1);
 84 
 85     vector<int> v2{ v0 };
 86     // 将[v1.begin(), v1.end())区间内元素循环左移2位
 87     rotate(v2.begin(), v2.begin() + 2, v2.end());
 88     cout << "v2: ";output(v2);
 89 
 90 
 91     vector<int> v3{ v0 };
 92     // 将[v1.begin(), v1.end())区间内元素循环右移1位
 93     rotate(v3.begin(), v3.end() - 1, v3.end());
 94     cout << "v3: ";output(v3);
 95 
 96     vector<int> v4{ v0 };
 97     // 将[v1.begin(), v1.end())区间内元素循环右移2位
 98     rotate(v4.begin(), v4.end() - 2, v4.end());
 99     cout << "v4: "; output(v4);
100 }

 

运行结果截图:

屏幕截图 2025-10-12 174332

 

问题:

1:reverse只反转原容器,而reverse_copy改变目标容器,不对原容器进行操作

2:rotate函数通过第一个参数和第三个参数确定选用数据的范围,以第二个参数作为中间量,随后将第一个参数到第二各参数之间的数据和第二个参数到第三个参数之间的数据调换位置实现元素移动

第一个参数代表起始位置,第二个参数代表移动后的第一个位置,第三个参数表示移动范围内的末尾位置

 

 

实验2

源代码:

 

#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 << "\n测试2: \n";test2();}//输出容器对象c中的元素
template<typename T>
void output(const T& c)
{for (auto& i : c)std::cout << i << ' ';std::cout << '\n';
}// 返回[0, 100]区间内的一个随机整数
int generate_random_number()
{return std::rand() % 101;
}// 测试1:对容器类对象指定迭代器区间赋值、排序
void test1()
{using namespace std;vector<int>v0(10);//创建一个动态数组对象v0,对象大小为10generate(v0.begin(), v0.end(), generate_random_number);//生成随机数填充v0cout << "v0: ";output(v0);vector<int> v1{ v0 };sort(v1.begin(), v1.end());//对整个vector排序cout << "v1: ";output(v1);vector<int> v2{ v0 };sort(v2.begin() + 1, v2.end() - 1);//只对中间部分排序,不包含首尾元素cout << "v2: ";output(v2);
}// 测试2:对容器类对象指定迭代器区间赋值、计算最大值/最小值/均值
void test2() {using namespace std;vector<int> v0(10);generate(v0.begin(), v0.end(), generate_random_number);cout << "v0: "; output(v0);// 求最大值和最小值auto min_iter = min_element(v0.begin(), v0.end());auto max_iter = max_element(v0.begin(), v0.end());cout << "最小值: " << *min_iter << endl;cout << "最大值: " << *max_iter << 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;
}

 

运行结果截图:

屏幕截图 2025-10-12 181219

问题:

:1:generate的作用是根据generate_random_number填充容器

 2:使用minmax_element的代码更加简洁,同时只需遍历的次数更少,并且找最大最小值时是在同一时刻的容器内,避免了容器变化对结果影响

 3:lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法。对于不需要复用,且短小的函数,直接传递函数体可以增加代码的可读性。

在本任务中,两者效果完全相同

 

实验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 << "\n测试2:字符变换\n";test2();}unsigned char func(unsigned char c)
{if (c == 'z')return 'a';if (c == 'Z')return 'A';if (std::isalpha(c))return static_cast<unsigned char>(c + 1);return c;
}void test1()
{std::string s1{ "Hello World 2049!" };std::cout << "s1 =" << s1 << '\n';std::string s2;for (auto c : s1)s2 += std::tolower(c);std::cout << "s2 = " << s2 << '\n';std::string s3;for (auto c : s1)s3 += std::toupper(c);std::cout << "s3 = " << s3 << '\n';}void test2()
{std::string s1{ "I love cosmos!" };std::cout << "s1 = " << s1 << '\n';std::string s2(s1.size(), ' ');std::transform(s1.begin(), s1.end(), s2.begin(), func);std::cout << "s2 = " << s2 << '\n';
}

 

运行结果截图:

屏幕截图 2025-10-12 223115

 

问题:

 1:func的功能是实现字符的循环移位(a->b)

2:tolower是将大写字母变成小写,toupper是将小写字母变成大写

3:第一个参数s1.begin()和第二个参数s1.end()决定了原容器的起始位置,第三个参数s2.begin()决定了目标序列的起始位置,第四个参数func决定了功能循环移位

如果改成s1.begin将在原容器进行操作,s2将不再有结果

 

 

实验4

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 
 5 
 6 bool is_palindrome(const std::string& s);
 7 bool is_palindrome_ignore_case(const std::string& s);
 8 
 9 int main() {
10     using namespace std;
11     string s;
12     // 多组输入,直到按下Ctrl+Z结束测试
13     while (cin >> s) {
14         cout << boolalpha
15             << "区分大小写: " << is_palindrome(s) << "\n"
16             << "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n";
17     }
18 }
19 
20 
21 bool is_palindrome(const std::string& s)
22 {
23     int i;
24     for(i=0;i<s.length();i++)
25         {
26         if (s[i] != s[s.length() - i - 1])
27           {
28             return false;
29           }
30         }
31     return true;
32 }
33 
34 bool is_palindrome_ignore_case(const std::string& s)
35 {
36     std::string s1;
37     for (auto c : s)
38         s1 += std::tolower(c);
39     int i;
40     for (i = 0;i < s1.length();i++)
41     {
42         if (s1[i] != s1[s1.length() - i - 1])
43         {
44             return false;
45         }
46     }
47     return true;
48 
49 }

 

运行结果截图:

屏幕截图 2025-10-12 230415

 

问题:

 可以在判断中跳过空格

 

实验5

源代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 
 5 
 6 std::string dec2n(int x, int n = 2);
 7 
 8 
 9 int main() {
10     int x;
11     while (std::cin >> x) {
12         std::cout << "十进制: " << x << '\n'
13             << "二进制: " << dec2n(x) << '\n'
14             << "八进制: " << dec2n(x, 8) << '\n'
15             << "十二进制: " << dec2n(x, 12) << '\n'
16             << "十六进制: " << dec2n(x, 16) << '\n'
17             << "三十二进制: " << dec2n(x, 32) << "\n\n";
18     }
19 }
20 
21 std::string dec2n(int x, int n )
22 {
23     std::string s ;
24     int i = 0;
25     char c;
26     if (x == 0)
27     {
28         return"0";
29     }
30     while (x>0)
31     {
32         if(x%n<10)
33         {
34             c = '0'+x % n;
35         }
36         else
37         {
38             c = 'A' + x % n-10;
39         }
40         x /= n;
41         s += c;
42         i++;
43     }
44     std::reverse(s.begin(), s.end());
45     return s;
46 }

 

运行结果截图:

屏幕截图 2025-10-13 173830

 

 

实验6

源代码:

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<iomanip>
 6 
 7 using namespace std;
 8 
 9 
10 template<typename T>
11 void output(const T& c);
12 
13 
14 // 输出容器对象c中的元素
15 template <typename T>
16 void output(const T& c)
17 {
18     for (auto& i : c)
19         std::cout << i << ' ';
20     std::cout << '\n';
21 }
22 
23 
24 
25 
26     
27 
28     int main()
29     {
30         vector<char> v0 = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
31                            'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
32                            'u', 'v', 'w', 'x', 'y', 'z' };
33         cout << ' ' << ' ' << ' ';
34         
35         for (char c : v0)
36         {
37             cout<< c << " ";
38         }
39         cout << endl;
40         vector<char> v1{ v0 };
41     
42         for (char& c : v1)
43         {
44             c = toupper(c);
45         }
46         
47         
48     int i;
49     for (i = 1;i <=26;i++)
50     {   
51         cout << setw(2) << i<<' ';
52         vector<char> vi{ v1 };
53         // 将[v1.begin(), v1.end())区间内元素循环左移i位
54         rotate(vi.begin(), vi.begin() + i, vi.end());
55         output(vi);
56 
57     }
58 }

 

运行结果截图:

屏幕截图 2025-10-13 200732

 

 

 

实验7

源代码:

  1 #include<iostream>
  2 #include<cstdlib>
  3 #include<ctime>
  4 #include<iomanip>
  5 #include<string>
  6 
  7 using namespace std;
  8 
  9 
 10 void generate_random_number(int& num1,int& num2);
 11 int generate_operate();
 12 char get_operate(int k);
 13 int calculate_answer(int num1, int num2, int k);
 14 
 15 
 16 void generate_random_number(int& num1, int& num2)
 17 {
 18     num1 = rand() % 10+1;
 19     num2 = rand() % 10+1;
 20     
 21 }
 22 
 23 int generate_operate()
 24 
 25 {
 26     int k = rand() % 4;
 27     return k;
 28 }
 29 
 30 char get_operate(int k)
 31 {
 32     switch (k)
 33     {
 34     case(0):return'+';
 35     case(1):return'-';
 36     case(2):return'*';
 37     case(3):return'/';
 38     default:return 0;
 39     }
 40 }
 41 
 42 int calculate_answer(int num1, int num2, int k)
 43 {
 44     switch (k)
 45     {
 46     case 0: return num1 + num2;
 47     case 1: return num1 - num2;
 48     case 2: return num1 * num2;
 49     case 3: return num1 / num2;
 50     default: return 0;
 51     }
 52 }
 53 int main()
 54 {
 55     srand(time(0));
 56     int total = 10;
 57     int num1, num2;
 58     int k;
 59     double correct_rate;
 60     int correct = 0;
 61     for (int i = 0; i < total; i++)
 62     {
 63 
 64         bool valid = false;
 65         int answer;
 66         char c;
 67         
 68         
 69 
 70         do {
 71             generate_random_number(num1, num2);
 72             k = generate_operate();
 73             c = get_operate(k);
 74 
 75             if (k == 1 && num1 < num2)
 76             {
 77                 swap(num1, num2);
 78                 valid = true;
 79             }
 80             else if (k == 3 && num1 % num2 != 0)
 81             {
 82                 valid = false; // 除法不能整除,无效
 83             }
 84             else
 85             {
 86                 valid = true;
 87             }
 88         } while (!valid); // 无效则重新生成
 89         
 90         std::cout << num1 << c << num2 << '=';
 91         std::cin >> answer;
 92         
 93         
 94         if (answer == calculate_answer(num1, num2, k))
 95         {
 96             correct++;
 97         }
 98         
 99     }
100     correct_rate = double(correct)/10*100;
101     std::cout << "正确率:" << correct_rate << "%";
102 }

 

运行结果截图:

 

屏幕截图 2025-10-13 220234

屏幕截图 2025-10-13 220213

 

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

相关文章:

  • 玄机——第一章 应急响应-Linux日志分析 wp
  • 第四周第五天4.5
  • 深入解析:flutter AudioPlayer的使用问题及处理
  • 11 10.10
  • 12 10.11
  • P3330 [ZJOI2011] 看电影
  • 20232315 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • 地址
  • CSP-S 2025 提高级模拟赛 Day6 复盘 B.连通子图
  • 新手村程序
  • Android Camera openCamera - 教程
  • 信号与系统
  • 大作业第一阶段验收小组集体加5分 -
  • 业务定义与指标体系搭建
  • Linux使用笔记
  • [Vulhub靶机]W1R3S靶机渗透
  • 基于zynq实现一个边缘识别视频流(预学习HLS篇)
  • 咬鼠
  • 10月13日日记
  • 分享一个知乎高赞回答生成AI指令:让技术人也能写出有深度的回答
  • 实用指南:C语言速成秘籍——循环结构(while、do while、for)和跳转语句(break,continue)
  • 描述https的加密过程
  • CSP-S 2025 提高级模拟赛 Day6 复盘 A.选择方案
  • SSL证书批量申请终极指南:一次搞定所有域名
  • npm install creat-vue命令使用报错解决方法
  • PDF转图片工具:基于PyQt5的完整实现与深度解析 - 详解
  • MongoDB安装及使用
  • 从Gemini Robotics看通用机器人的科技路径
  • 张量的基本操作
  • Windows7 隐藏用户