C++ 实验二 任务报告

📝实验二 任务报告

✨实验总结

😟遇到的问题:

这几个标准库的用法都很有多,一时半会还学不完

输入缓冲区也和c语言一样需要注意

🧐解决方法:

通过c++官网查询和阅读c++ prime plus加上搜索引擎学习

🤔反思:

英语水平有待提高,不然文档的阅读会很难受

✨实验内容

🕐任务一 ~ 四

string库

https://www.cnblogs.com/easygod/p/15501722.html

vector库

https://www.cnblogs.com/easygod/p/15501723.html

array库

https://www.cnblogs.com/easygod/p/15501724.html

关于c++的缓冲区

https://zhuanlan.zhihu.com/p/24882947

http://c.biancheng.net/view/3766.html

https://liam.page/2017/12/31/buffer-of-stream-in-Cpp/

🕔任务五

问题场景描述如下:

某独立音乐人要举办一场免费小型liveshowlivehouse场地容量有限,最多容纳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的听众信息

📃代码:

task5.hpp

#ifndef TEST_CPP_TASK5_HPP
#define TEST_CPP_TASK5_HPP

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

class Info
{
private:
    string nickname;
    string contact;
    string city;
    int num;
public:
    static int all;

    //使用默认参数构造函数,每次构造增加总共人数
    Info(string s1 = "", string s2 = "", string s3 = "", int n = 0) :
            nickname(s1), contact(s2), city(s3), num(n) { all += n; }

    //输出一个队伍的信息
    void print() const
    {
        cout.setf(ios::left);//设置左对齐
        cout << setw(16) << nickname << setw(16) << contact << setw(16) << city << setw(16) << num << endl;
    }

    //用于删除一个队伍的人数
    void pop_back() { all -= num; }
};

int Info::all = 0;
#endif //TEST_CPP_TASK5_HPP


task5.cpp

#include "task5.hpp"
#include <vector>

using namespace std;
const int capability = 100;

void input(string &nickname, string &contact, string &city, int &num)
{
    cout << "请输入姓名:";
    cin >> nickname;
    cout << "请输入联系方式:";
    cin >> contact;
    cout << "请输入城市:";
    cin >> city;
    cout << "请输入人数:";
    cin >> num;
}

int main()
{
    string nickname, contact, city;
    int num, flag = 1;
    vector<Info> reserve{0};
    while (flag)
    {
        cout << "* 目前人数 * : " << Info::all << endl;
        input(nickname, contact, city, num);
        Info temp(nickname, contact, city, num);
        reserve.push_back(temp);
        if (Info::all > capability)
        {
            reserve.pop_back();
            temp.pop_back();
            cout << "人数过多! 剩余容量为: " << capability - Info::all << endl;
            cout << "请输入1修改人数或者输入0退出程序:";
            cin >> flag;
        }
        else if (Info::all == capability)
        {
            flag = 0;
            cout << "停止录入!" << endl;
        }
        else
        {
            cout << "是否继续录入?请输入1继续,否则请输入0: ";
            cin >> flag;
        }
        cout << endl;
    }
    cout.setf(ios::left);
    cout << setw(16) << "nickname:" << setw(16) << "contact:" << setw(16) << "city: " << setw(16) << "num: " << endl;
    //使用迭代器
    for (const auto &i: reserve)
        i.print();
    return 0;
}

🎨截图:

图有点长,直接输出:

* 目前人数 * : 0
请输入姓名:leo
请输入联系方式:10086
请输入城市:nj
请输入人数:90
是否继续录入?请输入1继续,否则请输入0:1

* 目前人数 * : 90
请输入姓名:sim
请输入联系方式:10000
请输入城市:cd
请输入人数:9
是否继续录入?请输入1继续,否则请输入0:1

* 目前人数 * : 99
请输入姓名:sue
请输入联系方式:10010
请输入城市:cs
请输入人数:2
人数过多! 剩余容量为: 1
请输入1修改人数或者输入0退出程序:1

* 目前人数 * : 99
请输入姓名:sue
请输入联系方式:10010
请输入城市:sue
请输入人数:1
停止录入!

nickname:       contact:        city:           num:
leo             10086           nj              90
sim             10000           cd              9
sue             10010           sue             1

进程已结束,退出代码为 0

🤓反思:

vector的用法需要多练直到熟练掌握

🕕任务六

设计并实现一个类TextCoder,用于对英文文本字符串进行简单的加密和解密操作。

要求如下

  • 数据成员

    • text私有,用于存放要加密或解密的字符串(字符串内只限英文字符)
  • 函数成员

    • encoder() 公有,用于对数据成员text进行加密操作,以返回值形式返回加密后的英文文本
    • decoder() 公有,用于对数据成员text进行解密操作,以返回值形式返回解密后的英文文本

加密规则如下: 每个英文字母用其后的第5个英文字母替换,即: 字符af替换,字符bg替换,字符u用字符z替 换,字符v用字符a替换,字符z用字符e替 换,以此类推。 大写字符A用大写字符F替换, 大写字符B用大写字符G替换,大写字符Z用大写字符E替换。 字母之外的其它字符保持不变。

解密规则如下: 每个英文字母字符用其前面的第5个字符替换,即: 字符f用a替换,字符g用b替换,字符a用v替换,字符b用字符w替换,以此类推。(大写类 同) 字母之外的其它字符保持不变。

在主程序中,循环输入英文文本,使用类TextCoder构造对象完成加密操作,以及,对传输后收到的加 密文本进行解密操作。

📃代码:

task6.hpp

#ifndef TEST_CPP_TASK6_HPP
#define TEST_CPP_TASK6_HPP

#include <iostream>
#include <string>

using namespace std;

bool islower(char text)
{
    if ('a' <= text && text <= 'z')
        return true;
    else
        return false;
}

bool isupper(char text)
{
    if ('A' <= text && text <= 'Z')
        return true;
    else
        return false;
}

string encode(char text)
{
    string s;
    if (islower(text))
        return s = text + 5 - (text + 4) / ('z') * 26;//人为创建字母循环
    else if (isupper(text))
        return s = text + 5 - (text + 4) / ('Z') * 26;
    else
        return s = text;
}

string decode(char text)
{
    string s;
    if (islower(text))
        return s = text - 5 + ('a') / (text - 4) * 26;//人为创建字母循环
    else if (isupper(text))
        return s = text - 5 + ('A') / (text - 4) * 26;
    else
        return s = text;
}

class TextCoder
{
private:
    string text;
public:
    TextCoder(string code) : text(code) {}
    string encoder()
    {
//        string code;
//        for (int i = 0; text[i]; ++i)
//            code.append(encode(text[i]));
//        return text = code;

        for (int i = 0; text[i]; ++i)
            text.replace(i, 1, encode(text[i]));
        return text;
    }

    string decoder()
    {
//        string origin;
//        for (int i = 0; text[i]; ++i)
//            origin.append(decode(text[i]));

        for (int i = 0; text[i]; ++i)
            text.replace(i, 1, decode(text[i]));
        return text;
    }
};

#endif //TEST_CPP_TASK6_HPP

task6.cpp

#include "task6.hpp"
#include <iostream>
#include <string>

int main()
{
    using namespace std;
    string text, encoded_text, decoded_text;
    cout << "输入英文文本:";
    getline(cin, text);
    while (text!="exit")
    {
        encoded_text = TextCoder(text).encoder(); // 这里使用的是临时无名对象
        cout << "加密后英文文本:" << encoded_text << endl;
        decoded_text = TextCoder(encoded_text).decoder(); // 这里使用的是临时无名对象
        cout << "解密后英文文本:" << decoded_text << endl;
        cout << "\n输入英文文本:";
        getline(cin, text);
    }
}

🎨截图:

加密文字

🤓反思:

这个解密主要运用了string的操作,新建字符串还是替换字符我觉得都可以.

posted @ 2021-11-03 00:07  李柳星  阅读(56)  评论(4编辑  收藏  举报