实验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输入英文文本: ";
    }
}

 

posted @ 2021-11-02 15:49  睡不醒的浅泽  阅读(56)  评论(4编辑  收藏  举报