实验2 数组、指针与C++标准库
实验任务5
问题场景描述如下:
某独立音乐人要举办一场免费小型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的听众信息
info.hpp
#include <iostream> #include <string> #include <iomanip> using namespace std; //预约类 class Info{ private: string nickname;//昵称 string contact;//联系方式 string city;//所在城市 int n;//预定参加人数 public: Info(string nickname1, string contact1, string city1, int n1); ~Info();//析构函数 void print()const ; }; Info::Info(string nickname1, string contact1, string city1, int n1) : nickname(nickname1), contact(contact1), city(city1), n(n1) { }; Info::~Info() { } void Info::print() const { cout << left << endl << setw(15) << "\n称呼:" << setw(15) << nickname << setw(15) << "\n联系方式:" << setw(15) << contact << setw(15) << "\n所在城市:" << setw(15) << city << setw(15) << "\n预定人数:" << setw(15) << n << endl; }
task5.cpp
#include <iostream> #include <vector> #include <string> #include "Info.hpp" using namespace std; static int s = 0;//已预订人数 const int capacity = 100;//上限人数 int main(){ vector<Info> audience_info_list;//存放线上预约的听众信息 string nickname1, contact1, city1; int n1; cout << "录入信息:\n\n称呼/昵称,联系方式(邮箱/手机号),所在城市,预定参加人数\n"; while (cin >> nickname1) { cin >> contact1 >> city1 >> n1; if (s + n1 <= capacity) { Info tmp(nickname1, contact1, city1, n1); audience_info_list.push_back(tmp);//将新的听众信息存入list s += n1; if (s == capacity) break; } else { char option; cout << "亲爱的 " << nickname1 << " 对不起,只剩" << capacity - s << "个位置." << "\n1. 输入u,更新(update)预定信息" << "\n2. 输入q,退出预定" << "您的选择:"; cin >> option; if (option == 'u') { cout << "请重新输入:" << endl; } if (option == 'q') { cout << endl; break; } } } cout << "截至目前,一共有" << s << "位听众预定参加。预定观众信息如下:" << endl; for (auto list : audience_info_list) list.print(); return 0; }
实验任务6
设计并实现一个类TextCoder,用于对英文文本字符串进行简单的加密和解密操作。要求如下
数据成员
text 私有,用于存放要加密或解密的字符串(字符串内只限英文字符)
函数成员 encoder() 公有,用于对数据成员text进行加密操作,以返回值形式返回加密后的英文文本 加密规则如下:
每个英文字母用其后的第5个英文字母替换,即: 字符a用f替换,字符b用g替换,字符u用字符z替换,字符v用字符a替换,字符z用字符e替 换,以此类推。 大写字符A用大写字符F替换, 大写字符B用大写字符G替换,大写字符Z用大写字符E替换。 字母之外的其它字符保持不变。
abcdefghijklmnopqrstuvwxyz
decoder() 公有,用于对数据成员text进行解密操作,以返回值形式返回解密后的英文文本 解密规则如下:
每个英文字母字符用其前面的第5个字符替换,即: 字符f用a替换,字符g用b替换,字符a用v替换,字符b用字符w替换,以此类推。(大写类 同) 字母之外的其它字符保持不变。
在主程序中,循环输入英文文本,使用类TextCoder构造对象完成加密操作,以及,对传输后收到的加 密文本进行解密操作。
直到按下 Ctrl+Z 终止程序。
textcoder.hpp
#include <iostream> #include <string> using namespace std; class TextCoder { private: string text; public: TextCoder(string text1); ~TextCoder(); string encoder(); string decoder(); }; TextCoder::TextCoder(string text) : text(text) { } TextCoder::~TextCoder() { } string TextCoder::decoder() { for (int i = 0; i < text.length(); i++) { if((text[i]>='f'&&text[i]<='z')||(text[i]>='F'&&text[i]<='Z')) { text[i]-=5;//每个英文字母用其前的第5个英文字母替换 } else if((text[i]>='a'&&text[i]<'f')||(text[i]>='A'&&text[i]<'F')) { text[i]+=21; } } return text; } string TextCoder::encoder() { for (int i = 0; i < text.length(); i++) { if((text[i]>='a'&&text[i]<='u')||(text[i]>='A'&&text[i]<='U')) { text[i]+=5;//每个英文字母用其后的第5个英文字母替换 } else if((text[i]>'u'&&text[i]<='z')||(text[i]>'U'&&text[i]<='Z')) { text[i]-=21; } } return text; }
task6.cpp
#include "textcoder.hpp" #include <iostream> #include <string> int main() { using namespace std; string text, encoded_text, decoded_text; cout << "输入英文文本: "; while (getline(cin, text)) { encoded_text = TextCoder(text).encoder(); // 这里使用的是临时无名对象 cout << "加密后英文文本:\t" << encoded_text << endl; decoded_text = TextCoder(encoded_text).decoder(); // 这里使用的是临时无名对象 cout << "解密后英文文本:\t" << decoded_text << endl; cout << "\n输入英文文本: "; } }