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个字母编入循环数组 的方法来实现。