Task 5

info.hpp

#ifndef _info.hpp
#include <iostream>
using namespace std;
class info
{
public:
    info(string new_nickname="name", string new_contact="contact", string new_city="city", int new_n=0)
        :nickname{ new_nickname }, contact{ new_contact }, city{ new_city }, n{ new_n }{};
    void print();
    string nickname;
    string contact;
    string city;
    int n;
};

void info:: print()
{
    cout << "称呼:            " << nickname << endl;
    cout << "联系方式:        " << contact << endl;
    cout << "所在城市:        " << city << endl;
    cout << "预定人数:        " << n << endl;
}

#endif // !_info.hpp

source.cpp

#include <iostream>
#include "info.hpp"
#include <vector>
#include <string>

int main()
{
    //using namespace std;
    vector<info> audience_info_list;
    info temp_info;
    static int capacity=0;
    cout << "录入信息:\n\n昵称,联系方式(邮箱/手机号),所在城市,预定参加人数" << endl;
    while (cin >> temp_info.nickname && cin >> temp_info.contact && cin >> temp_info.city && cin >> temp_info.n)
    {
        capacity += temp_info.n;
        if (capacity > 100)
        {
            capacity -= temp_info.n;
            char FLAG;
            cout << "人数已达限制,请选择:\n输入q退出预定,输入u更新预定信息" << endl;
            cin >> FLAG;
            if (FLAG == 'q')
                goto print;
            else if (FLAG == 'u')
            {
                cout << "请更新预定人数" << endl;
                cin >> temp_info.n;
            }
        }
        audience_info_list.push_back(temp_info);
        if (capacity == 100)
            goto print;
    }
print:
    cout << "截至目前,一共有" << capacity << "位观众预定参加,预定听众信息如下" << endl;
    for (auto it = audience_info_list.begin(); it != audience_info_list.end(); it++)
        it->print();
}

 未达上限人数时:

 

已达到上线人数时:

 

 Task 6

TextCoder.hpp:

#ifndef _TEXTCODER.hpp
#include <iostream>
#include <string> 
using std::string;

class TextCoder
{
public:
    TextCoder(string tem_string) :text(tem_string) {};
    string encoder();
    string decoder();
private:
    string text;
};

#endif // !_TEXTCODER.hpp

string TextCoder::encoder()
{
    for (auto it = text.begin(); it != text.end(); it++)
    {    
        if (*it >= 65 && *it <= 85)
            *it += 5;
        else if (*it > 85 && *it <= 90)
            *it -= 21;
        else if (*it >= 97 && *it <= 117)
            *it += 5;
        else if (*it > 117 && *it <= 122)
            *it -= 21;
    }
    return text;
}

string TextCoder::decoder()
{
    for (auto it = text.begin(); it != text.end(); it++)
    {
        if (*it >= 70 && *it <= 90)
            *it -= 5;
        else if (*it >= 65 && *it < 70)
            *it += 21;
        else if (*it >= 102 && *it <= 122)
            *it -= 5;
        else if (*it >= 97 && *it < 102)
            *it += 21;
    }
    return text;
}

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

修改后的输出结果:

实验总结

心得体会:

Task2_3中,for(auto &ch:s)语句若把引用类型改成普通类型,会发现输出的依然是小写字母,证明在这种情况下,用普通类型无法对值进行修改。

网上资料:

复制代码
int my_array[5] = { 1, 2, 3, 4, 5 };

 

// 不会改变 my_array 数组中元素的值

// x 将使用 my_array 数组的副本

for (int x : my_array)

{

    x *= 2;

    cout << x << endl;

}

 

// 会改变 my_array 数组中元素的值

// 符号 & 表示 x 是一个引用变量,将使用 my_array 数组的原始数据

// 引用是已定义的变量的别名

for (int& x : my_array)

{

    x *= 2;

    cout << x << endl;

}

 

// 还可直接使用初始化列表

for (int x : { 1, 2, 3, 4, 5 })

{

    x *= 2;

    cout << x << endl;

}
复制代码

迭代器的使用

 

复制代码
#include <iostream>
#include <vector>
int main()
{
using namespace std;
vector<int> v{ 1,9,2,5,6 };
// 遍历方式1: 范围for
for (auto const& i : v)
cout << i << ", ";
cout << "\b\b \n";//意为退格两次,即将最后一个元素后的逗号删去,起控制输出的作用
// 遍历方式2:使用迭代器
for (auto it = v.begin(); it != v.end(); ++it)
cout << *it << ", ";
cout << "\b\b \n";
// 遍历方式3: 使用反向迭代器
for (auto it = v.rbegin(); it != v.rend(); ++it)
cout << *it << ", ";
cout << "\b\b \n";
}
复制代码

迭代器的类型类似于指针,如要指代元素,须在前面加上*。

迭代器也可用++,区别是:正向迭代器++指向下一个元素,反向迭代器指向前一个元素。

注意:在正向迭代器中,end()为指向最后一个元素后面;同理,在反向迭代器中,rbegin指向第一个元素前面。(类似于头指针的运用,方便使用)

 

vector容器size()与capacity()的区别

  size() 返回目前元素个数;

  capacity() 返回"不进行空间重新分配"条件下最多能容那的元素个数;

为什么size()与capacity()不同?

  因为当向一个vector添加元素时,编译器一般不会只申请一个空间,它会多申请几个,防止由于多次申请空间导致的时间浪费。

 思考:

  这次的encoder(),decoder()函数,我都是用改变ASCII码来实现的,我认为还可以通过 将26个字母编入循环数组 的方法来实现。