实验二 数组、指针与C++标准库
实验任务五 简单预约登记的设计与实现
简单说明:某独立音乐人要举办一场免费小型的现场演出。现由于场地容量有限,最多容纳100位乐迷听众。现通过某平台开通线上预约登记,设计并实现一个简 单的预约登记程序。
类定义与实现Info.hpp代码如下:
#ifndef INFO_HPP
#define INFO_HPP
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
class Info {
public:
Info() = default;
Info(string name, string con, string c, int m) : nickname(name), contact(con), city(c), n(m) {};
void print();
friend int getCnt(); //类外友元函数,用于获得当前预定数
friend void setCnt(int n); //类外友元函数,用于修改当前预定数
int getn() { return n; }
private:
string nickname;
string contact;
string city;
int n;
static int bcnt;
};
int Info::bcnt = 0;
void Info::print() {
cout << "称呼:\t\t" << nickname << endl;
cout << "联系方式:\t" << contact << endl;
cout << "所在城市:\t" << city << endl;
cout << "预订人数:\t" << n << endl;
}
int getCnt() { return Info::bcnt; }
void setCnt(int n) { Info::bcnt = n; }
#endif // !INFO_HPP
主程序task5.cpp代码如下:
#include "Info.hpp"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<Info> audience_info_list(20);
const int maxNum = 100;
string nickname, contact, city, s;
int n, cnt = 0;
cout << "录入信息:\n" << endl;
cout << "称呼/昵称,联系方式(邮箱/手机号),所在城市,预定参加人数" << endl;
while (cin >> nickname) {
cin >> contact;
cin >> city;
cin >> n;
//对预约容量的判断
if (n + getCnt() <= maxNum) {
audience_info_list.at(cnt++) = Info(nickname, contact, city, n);
setCnt(n + getCnt());
}
else {
//二级选择,继续或退出
char c;
cout << "对不起,只剩" << 100 - getCnt() << "个位置" << endl;
cout << "1. 输入u,更新(update)预订信息" << endl;
cout << "2. 输入q,退出预定" << endl;
cout << "你的选择是:";
cin >> c;
if (c == 'u') {
//继续输入,重新开始循环
cout << "称呼/昵称,联系方式(邮箱/手机号),所在城市,预定参加人数" << endl;
continue;
}
else if (c == 'q')
//退出循环
break;
}
}
//输出已预订信息
cout << endl;
cout << "截至目前,一共有" << getCnt() << "位听众预定参加。预定听众信息如下:" << endl;
for (auto i : audience_info_list) {
if (i.getn() > 0)
i.print();
else
break;
}
}
使用更改的数据的测试结果:



实验任务六 简单信息加密的设计与实现
简单说明:设计一个程序用于对英文文本串进行简单的加密和解密操作。加密规则为:对每一个字母,用其后的第五个字母代替(例如a用f代替,b用g代替)。
类定义与实现TextCoder.hpp代码如下:
#ifndef TEXTCODER_HPP
#define TEXTCODER_HPP
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
class TextCoder {
public:
TextCoder() = default;
TextCoder(string t) : text(t) {};
string encoder();
string decoder();
private:
string text;
};
//编码程序
string TextCoder::encoder() {
string ret;
for (auto c : text) {
if (c >= 'a' && c <= 'u' || c >= 'A' && c <= 'U') {
char t = c + 5;
ret.push_back(t);
}
else if (c >= 'v' && c <= 'z' || c >= 'V' && c <= 'Z') {
char t = c - 21;
ret.push_back(t);
}
else
ret.push_back(c);
}
return ret;
}
//解码程序
string TextCoder::decoder() {
string ret;
for (auto c : text) {
if (c >= 'f' && c <= 'z' || c >= 'F' && c <= 'Z') {
char t = c - 5;
ret.push_back(t);
}
else if (c >= 'a' && c <= 'e' || c >= 'A' && c <= 'E') {
char t = c + 21;
ret.push_back(t);
}
else
ret.push_back(c);
}
return ret;
}
#endif // !TEXTCODER_HPP
主程序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输入英文文本: ";
}
}
使用更改的数据的测试结果:

实验总结
- 当想要在类外访问(跨文件)类的静态成员函数时,发现无法直接访问,于是采用了友元函数的形式。
- 在范围 for 中未使用引用符的形式,保存了原始的text信息,但导致了空间占用和可能的信息不一致(实验中未出现)。
- 对于面向对象的思维方式与C++标准库的熟悉使用需要一定且足量的练习与实践!

浙公网安备 33010602011771号