一.实验任务五:
1.问题场景描述如下:
某独立音乐人要举办一场免费小型liveshow。livehouse场地容量有限,最多容纳100位乐迷听众。现通
过某平台开通线上预约登记。线上预约登记信息类Info如下:
数据成员
昵称(nickname)
联系方式(contact)
所在城市(city)
预定参加人数(n)
函数成员
构造函数
带有参数,用于对预约信息(昵称、联系方式、所在城市、预定参加人数)进行初始化
print()
打印信息(昵称、联系方式、所在城市、预定参加人数)
编写代码实现以下要求:
设计并实现信息类Info用于记录报名登记听众信息。类的定义保存在文件info.hpp中
编写主函数文件task5.cpp:
定义一个vector<Info>类对象audience_info_list,用于存放线上预约登记的听众信息;
定义一个const常量capacity用于存放livehouse最多能容纳的听众人数
从键盘录入每一个预约登记信息,直到停止录入(按下Ctrl+Z, 也可以通过程序自行设计其它
停止录入方式)或者预定参加人数达到上限,输出audience_info_list对象中所有预约听众信
息。
用户预约时,当预定参加人数超过livehouse场地剩余容量时,则提示用户输入q退出预定,
或,输入u更新预定信息。
打印预约参加livehouse的听众信息
2.分析过后的代码如下:
Info.hpp:
1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 class Info 7 { 8 private: 9 string nickname;//昵称 10 string contact;//联系方式 11 string city;//所在城市 12 int n;//预定参加人数 13 public: 14 Info(string nickname0,string contact0,string city0,int n0):nickname(nickname0),contact(contact0),city(city0),n(n0){} 15 void print() const; 16 ~Info()=default;//析构函数 17 18 }; 19 void Info::print() const 20 { 21 std:: cout<<"称呼:\t\t\t"<<nickname<<endl; 22 std:: cout<<"联系方式:\t\t"<<contact<<endl; 23 std:: cout<<"所在城市:\t\t"<<city<<endl; 24 std:: cout<<"预定人数:\t\t"<<n<<endl; 25 } 26
main.cpp如下:
1 #include"Info.hpp" 2 #include<iostream> 3 #include<vector> 4 #include<string> 5 using namespace std; 6 static int t=0;//t用来保存当前已预定的人数 7 const int capacity=100;//最多可以容纳的听众数目 8 int main() 9 { 10 vector<Info> audience_info_list;//存放线上预约的听众信息 11 string nickname0,contact0,city0; 12 int n; 13 cout<<"录入信息:\n\n"<<"称呼/昵称,联系方式(邮箱/手机号),所在城市,预定参加人数"<<endl; 14 while(cin>>nickname0) 15 { 16 cin>>contact0>>city0>>n; 17 if(t+n<=capacity) 18 { 19 Info tmp(nickname0,contact0,city0,n); 20 audience_info_list.push_back(tmp);//将新的听众信息存入list 21 t+=n; 22 if(t==capacity) 23 break; 24 } 25 else//所剩容量已不足 26 { 27 cout<<"对不起,只剩"<<capacity-t<<"个位置."<<endl 28 <<"1.输入u,更新(update)预定信息"<<endl 29 <<"2.输入q,退出预定"<<endl 30 <<"你的选择:"; 31 char ch; 32 cin>>ch; 33 if(ch=='u') 34 cout<<"请重新输入:"<<endl; 35 else 36 { 37 cout<<endl; 38 break; 39 } 40 } 41 } 42 cout<<"截至目前,一共有"<<t<<"位听众预定参加。预定观众信息如下:"<<endl; 43 for(auto list:audience_info_list) 44 list.print(); 45 return 0; 46 }
运行结果如下:


二、实验任务六
1.题目描述如下:
设计并实现一个类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 终止程序。
2.分析后的代码如下:
Textcoder.hpp如下:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 class TextCoder { 6 private: 7 string text; 8 public: 9 TextCoder(string text0):text(text0){};//构造函数 10 string encoder();//用于对数据成员text进行加密操作 11 string decoder();//用于对数据成员text进行解密操作 12 ~TextCoder()=default;//析构函数 13 }; 14 15 string TextCoder::encoder() { 16 for (int i = 0; i < text.length(); i++) 17 { 18 if((text[i]>='a'&&text[i]<='u')||(text[i]>='A'&&text[i]<='U')) 19 { 20 text[i]+=5;//每个英文字母用其后的第5个英文字母替换 21 } 22 else if((text[i]>'u'&&text[i]<='z')||(text[i]>'U'&&text[i]<='Z')) 23 { 24 text[i]-=21; 25 } 26 27 28 } 29 30 return text; 31 } 32 33 string TextCoder::decoder() { 34 for (int i = 0; i < text.length(); i++) 35 { 36 if((text[i]>='f'&&text[i]<='z')||(text[i]>='F'&&text[i]<='Z')) 37 { 38 text[i]-=5;//每个英文字母用其前的第5个英文字母替换 39 } 40 else if((text[i]>='a'&&text[i]<'f')||(text[i]>='A'&&text[i]<'F')) 41 { 42 text[i]+=21; 43 } 44 45 46 } 47 return text; 48 }
main.cpp如下:
1 #include "Textcoder.hpp" 2 #include <iostream> 3 #include <string> 4 5 int main() 6 { 7 using namespace std; 8 9 string text, encoded_text, decoded_text; 10 11 cout << "输入英文文本: "; 12 while (getline(cin, text)) 13 { 14 encoded_text = TextCoder(text).encoder(); // 这里使用的是临时无名对象 15 cout <<endl<<"加密后英文文本:\t" << encoded_text << endl<< endl; 16 17 decoded_text = TextCoder(encoded_text).decoder(); // 这里使用的是临时无名对象 18 cout << "解密后英文文本:\t" << decoded_text << endl<< endl; 19 cout << "\n输入英文文本: "; 20 } 21 }
运行结果如下:

三、实验结论
1.使用 getline(cin, s1) 能够读入包含空格的字符串。还可以通过参数指定读取时的分隔符。
2.vector <类型> 名称,例如实验任务5中的vector<Info> list,其中,vector的成员函数有:
begin():返回指向第一个元素的迭代器
end():返回指向最后一个元素后面的位置的迭代器
rbegin():返回指向最后一个元素
rend():返回指向第一个元素前面的位置的迭代器
size():返回目前元素个数
capacity():返回"不进行空间重新分配"条件下最多能容那的元素个数
push_back():在尾部追加元素
pop_back():从尾部删除元素
insert(x):向容器中指定的迭代器x位置之前插入元素
erase(x):移除指定迭代器x位置的元素
其中,使用begin()和end()可以实现vector对象的遍历,但同时,也可以直接调用本实验任务五中的print函数,for(auto list : audience_list) list.print().
实验任务5中用到了push_back(对象名),这个类似于将新的元素加入栈,但与栈不同的是栈是先进后出。
3.任务六中的加密解密要把字母分成两批,这个容易忽视。
浙公网安备 33010602011771号