实验二 数组、指针与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输入英文文本: ";
	}
}

使用更改的数据的测试结果:

实验总结

  1. 当想要在类外访问(跨文件)类的静态成员函数时,发现无法直接访问,于是采用了友元函数的形式。
  2. 在范围 for 中未使用引用符的形式,保存了原始的text信息,但导致了空间占用和可能的信息不一致(实验中未出现)。
  3. 对于面向对象的思维方式与C++标准库的熟悉使用需要一定且足量的练习与实践!
posted @ 2021-10-28 17:25  髪之殇  阅读(70)  评论(3)    收藏  举报