C++ 实验二 任务报告
📝实验二 任务报告
✨实验总结
😟遇到的问题:
这几个标准库的用法都很有多,一时半会还学不完
输入缓冲区也和c语言一样需要注意
🧐解决方法:
通过c++官网查询和阅读c++ prime plus加上搜索引擎学习
🤔反思:
英语水平有待提高,不然文档的阅读会很难受
✨实验内容
🕐任务一 ~ 四
string库
https://www.cnblogs.com/easygod/p/15501722.html
vector库
https://www.cnblogs.com/easygod/p/15501723.html
array库
https://www.cnblogs.com/easygod/p/15501724.html
关于c++的缓冲区
https://zhuanlan.zhihu.com/p/24882947
http://c.biancheng.net/view/3766.html
https://liam.page/2017/12/31/buffer-of-stream-in-Cpp/
🕔任务五
问题场景描述如下:
某独立音乐人要举办一场免费小型liveshow
。livehouse
场地容量有限,最多容纳100位乐迷听众。现通 过某平台开通线上预约登记。
线上预约登记信息类Info如下:
-
数据成员
- 昵称(nickname)
- 联系方式(contact)
- 所在城市(city)
- 预定参加人数(n)
-
函数成员
- 构造函数 带有参数,用于对预约信息(昵称、联系方式、所在城市、预定参加人数)进行初始化
print()
打印信息(昵称、联系方式、所在城市、预定参加人数)
编写代码实现以下要求: 设计并实现信息类Info
用于记录报名登记听众信息。
类的定义保存在文件info.hpp
中 编写主函数文件task5.cpp
:
定义一个vector
类对象audience_info_list
,用于存放线上预约登记的听众信息;
定义一个const
常量capacity
用于存放livehouse
最多能容纳的听众人数 从键盘录入每一个预约登记信息,直到停止录入(按下Ctrl+Z, 也可以通过程序自行设计其它 停止录入方式)或者预定参加人数达到上限,输出audience_info_list
对象中所有预约听众信 息。
用户预约时,当预定参加人数超过livehouse
场地剩余容量时,则提示用户输入q退出预定, 或,输入u更新预定信息。 打印预约参加livehouse
的听众信息
📃代码:
task5.hpp
#ifndef TEST_CPP_TASK5_HPP
#define TEST_CPP_TASK5_HPP
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
class Info
{
private:
string nickname;
string contact;
string city;
int num;
public:
static int all;
//使用默认参数构造函数,每次构造增加总共人数
Info(string s1 = "", string s2 = "", string s3 = "", int n = 0) :
nickname(s1), contact(s2), city(s3), num(n) { all += n; }
//输出一个队伍的信息
void print() const
{
cout.setf(ios::left);//设置左对齐
cout << setw(16) << nickname << setw(16) << contact << setw(16) << city << setw(16) << num << endl;
}
//用于删除一个队伍的人数
void pop_back() { all -= num; }
};
int Info::all = 0;
#endif //TEST_CPP_TASK5_HPP
task5.cpp
#include "task5.hpp"
#include <vector>
using namespace std;
const int capability = 100;
void input(string &nickname, string &contact, string &city, int &num)
{
cout << "请输入姓名:";
cin >> nickname;
cout << "请输入联系方式:";
cin >> contact;
cout << "请输入城市:";
cin >> city;
cout << "请输入人数:";
cin >> num;
}
int main()
{
string nickname, contact, city;
int num, flag = 1;
vector<Info> reserve{0};
while (flag)
{
cout << "* 目前人数 * : " << Info::all << endl;
input(nickname, contact, city, num);
Info temp(nickname, contact, city, num);
reserve.push_back(temp);
if (Info::all > capability)
{
reserve.pop_back();
temp.pop_back();
cout << "人数过多! 剩余容量为: " << capability - Info::all << endl;
cout << "请输入1修改人数或者输入0退出程序:";
cin >> flag;
}
else if (Info::all == capability)
{
flag = 0;
cout << "停止录入!" << endl;
}
else
{
cout << "是否继续录入?请输入1继续,否则请输入0: ";
cin >> flag;
}
cout << endl;
}
cout.setf(ios::left);
cout << setw(16) << "nickname:" << setw(16) << "contact:" << setw(16) << "city: " << setw(16) << "num: " << endl;
//使用迭代器
for (const auto &i: reserve)
i.print();
return 0;
}
🎨截图:
图有点长,直接输出:
* 目前人数 * : 0
请输入姓名:leo
请输入联系方式:10086
请输入城市:nj
请输入人数:90
是否继续录入?请输入1继续,否则请输入0:1
* 目前人数 * : 90
请输入姓名:sim
请输入联系方式:10000
请输入城市:cd
请输入人数:9
是否继续录入?请输入1继续,否则请输入0:1
* 目前人数 * : 99
请输入姓名:sue
请输入联系方式:10010
请输入城市:cs
请输入人数:2
人数过多! 剩余容量为: 1
请输入1修改人数或者输入0退出程序:1
* 目前人数 * : 99
请输入姓名:sue
请输入联系方式:10010
请输入城市:sue
请输入人数:1
停止录入!
nickname: contact: city: num:
leo 10086 nj 90
sim 10000 cd 9
sue 10010 sue 1
进程已结束,退出代码为 0
🤓反思:
vector
的用法需要多练直到熟练掌握
🕕任务六
设计并实现一个类TextCoder
,用于对英文文本字符串进行简单的加密和解密操作。
要求如下
-
数据成员
text
私有,用于存放要加密或解密的字符串(字符串内只限英文字符)
-
函数成员
encoder()
公有,用于对数据成员text
进行加密操作,以返回值形式返回加密后的英文文本decoder()
公有,用于对数据成员text
进行解密操作,以返回值形式返回解密后的英文文本
加密规则如下: 每个英文字母用其后的第5个英文字母替换,即: 字符
a
用f
替换,字符b
用g
替换,字符u
用字符z
替 换,字符v
用字符a
替换,字符z
用字符e
替 换,以此类推。 大写字符A
用大写字符F
替换, 大写字符B
用大写字符G
替换,大写字符Z
用大写字符E
替换。 字母之外的其它字符保持不变。
解密规则如下: 每个英文字母字符用其前面的第5个字符替换,即: 字符f用a替换,字符g用b替换,字符a用v替换,字符b用字符w替换,以此类推。(大写类 同) 字母之外的其它字符保持不变。
在主程序中,循环输入英文文本,使用类TextCoder
构造对象完成加密操作,以及,对传输后收到的加 密文本进行解密操作。
📃代码:
task6.hpp
#ifndef TEST_CPP_TASK6_HPP
#define TEST_CPP_TASK6_HPP
#include <iostream>
#include <string>
using namespace std;
bool islower(char text)
{
if ('a' <= text && text <= 'z')
return true;
else
return false;
}
bool isupper(char text)
{
if ('A' <= text && text <= 'Z')
return true;
else
return false;
}
string encode(char text)
{
string s;
if (islower(text))
return s = text + 5 - (text + 4) / ('z') * 26;//人为创建字母循环
else if (isupper(text))
return s = text + 5 - (text + 4) / ('Z') * 26;
else
return s = text;
}
string decode(char text)
{
string s;
if (islower(text))
return s = text - 5 + ('a') / (text - 4) * 26;//人为创建字母循环
else if (isupper(text))
return s = text - 5 + ('A') / (text - 4) * 26;
else
return s = text;
}
class TextCoder
{
private:
string text;
public:
TextCoder(string code) : text(code) {}
string encoder()
{
// string code;
// for (int i = 0; text[i]; ++i)
// code.append(encode(text[i]));
// return text = code;
for (int i = 0; text[i]; ++i)
text.replace(i, 1, encode(text[i]));
return text;
}
string decoder()
{
// string origin;
// for (int i = 0; text[i]; ++i)
// origin.append(decode(text[i]));
for (int i = 0; text[i]; ++i)
text.replace(i, 1, decode(text[i]));
return text;
}
};
#endif //TEST_CPP_TASK6_HPP
task6.cpp
#include "task6.hpp"
#include <iostream>
#include <string>
int main()
{
using namespace std;
string text, encoded_text, decoded_text;
cout << "输入英文文本:";
getline(cin, text);
while (text!="exit")
{
encoded_text = TextCoder(text).encoder(); // 这里使用的是临时无名对象
cout << "加密后英文文本:" << encoded_text << endl;
decoded_text = TextCoder(encoded_text).decoder(); // 这里使用的是临时无名对象
cout << "解密后英文文本:" << decoded_text << endl;
cout << "\n输入英文文本:";
getline(cin, text);
}
}
🎨截图:
🤓反思:
这个解密主要运用了string的操作,新建字符串还是替换字符我觉得都可以.