实验目的
- 知道什么是类模板,会正确定义和使用简单的类模板
- 能够描述数组的特性,会使用C++语法正确定义和访问内置数组,知道其局限性
- 能够解释指针变量的特性,会使用C++语法正确定义指针变量间接访问对象
- 能熟练使用现代C++标准库中的数组模板类array、动态数组类模板vector、字符串类string
- 知道现代C++标准库中迭代器,会使用迭代器访问各种序列容器对象
- 针对具体问题场景,能够灵活、组合使用C++标准库与自定义类对问题进行抽象和编程求解
实验内容
5.实验任务5
实验代码
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
class Info
{
private:
string nickname;
string contact;
string city;
int number;
public:
Info(string, string, string, int);
void print();
};
Info::Info(string Name = {}, string Contact = {}, string City = {}, int n = 0) : nickname{Name}, contact{Contact}, city{City},number{n}{}
void Info::print()
{
cout << setfill(' ') << setw(16) << left << "昵称:" << nickname << endl
<< setfill(' ') << setw(16) << left << "联系方式:" << contact << endl
<< setfill(' ') << setw(16) << left << "所在城市:" << city << endl
<< setfill(' ') << setw(16) << left << "预定人数:" << number << endl
<< endl;
}
int Number=0;
int main(int argc, char const *argv[])
{
const int capacity = 100;
vector<Info> audience_info_list;
int n;
string s, s1, s2, s3;
cout << "录入信息:" << endl
<< endl
<< setfill(' ') << setw(16) << left << "昵称"
<< setfill(' ') << setw(28) << left << "联系方式(邮箱/手机号)"
<< setfill(' ') << setw(16) << left << "所在城市"
<< setfill(' ') << setw(16) << left << "预定参加人数" << endl;
while (cin >> s1)
{
cin >> s2 >> s3 >> n;
audience_info_list.push_back(Info(s1, s2, s3, n));
Number+=n;
if (Number > capacity)
{
Number-=n;
cout << "对不起,只剩" << capacity - Number << "个位置。" << endl
<< "1.输入u,更新(update)预定信息" << endl
<< "2.输入q,退出预定" << endl
<< "你的选择:";
cin >> s;
if (s == "q")
{
break;
}
if (s == "u")
{
audience_info_list.pop_back();
continue;
}
}
}
cout <<endl<< "截止目前,一共有" << Number << "位听众预定参加。预定听众信息如下:" << endl;
for (auto &item : audience_info_list)
{
item.print();
}
return 0;
}
测试结果
6.实验任务6
实验代码
textcoder.hpp
#pragma once
#include <iostream>
#include <string>
using namespace std;
class TextCoder
{
private:
string text;
public:
TextCoder(string);
string get_ciphertext();
string get_deciphertext();
private:
void encoder(string &s)
{
for (auto &i : s)
{
if (isalpha(i))
{
i += 5;
if (i > 'z'||i<'a'&&i>'Z')
i -= 26;
}
}
}
void decoder(string &s)
{
for (auto &i : s)
{
if (isalpha(i))
{
i -= 5;
if (i < 'A'||i>'Z'&&i<'a')
i += 26;
}
}
}
};
TextCoder::TextCoder(string Text) : text{Text}
{
}
string TextCoder::get_ciphertext()
{
encoder(text);
return text;
}
string TextCoder::get_deciphertext()
{
decoder(text);
return text;
}
task6.cpp
#pragma once
#include <iostream>
#include <string>
using namespace std;
class TextCoder
{
private:
string text;
public:
TextCoder(string);
string get_ciphertext();
string get_deciphertext();
private:
void encoder(string &s)
{
for (auto &i : s)
{
if (isalpha(i))
{
i += 5;
if (i > 'z'&&i>'Z')
i -= 26;
}
}
}
void decoder(string &s)
{
for (auto &i : s)
{
if (isalpha(i))
{
i -= 5;
if (i > 'z'&&i>'Z')
i += 26;
}
}
}
};
TextCoder::TextCoder(string Text) : text{Text}
{
}
string TextCoder::get_ciphertext()
{
encoder(text);
return text;
}
string TextCoder::get_deciphertext()
{
decoder(text);
return text;
}
测试结果
1.实验任务1
实验代码
task1_1.cpp
#include <iostream>
using std::cout;
using std::endl;
// 类A的定义
class A{
public:
A(int x0, int y0): x{ x0 }, y{ y0 } {}
void show() const { cout << x << ", " << y << endl; }
private:
int x, y;
};
// 类B的定义
class B{
public:
B(double x0, double y0): x{ x0 }, y{ y0 } {}
void show() const { cout << x << ", " << y << endl;}
private:
double x, y;
};
int main() {
A a(3, 4);
a.show();
B b(3.2, 5.6);
b.show();
}
task1_2.cpp
#include <iostream>
#include <string>
using std::cout;
using std::endl;
// 定义类模板X
template<typename T>
class X{
public:
X(T x0, T y0): x{x0}, y{y0} {}
void show() const { cout << x << ", " << y << endl;}
private:
T x, y;
};
int main() {
X<int> x1(3, 4);
x1.show();
X<double> x2(3.2, 5.6);
x2.show();
X<std::string> x3("hello", "c plus plus");
x3.show();
}
测试结果
2.实验任务2
实验代码
task2_1.cpp
#include <iostream>
#include <string>
int main() {
using namespace std;
string s1, s2;
s1 = "nuist"; // 赋值
s1[0] = 'N'; // 支持通过[]和索引方式访问
s1.at(1) = 'U'; // 支持通过xx.at()方法访问
cout << boolalpha << (s1 == "nuist") << endl; // 字符串比较
cout << s1.length() << endl; // 字符串长度
cout << s1.size() << endl; // 字符串长度
s2 = s1 + ", 2050"; // 字符串连接
cout << s2 << endl;
string email{"[email protected]"};
auto pos = email.find("@"); // 查找子串"@"第一次出现的索引位置,如果失败,返回string::npos
if (pos == string::npos)
cout << "illegal email address";
else {
auto s1 = email.substr(0, pos); // 取子串, 从索引0 ~ pos-1
auto s2 = email.substr(pos + 1); // 取子串,从pos+1到末尾
cout << s1 << endl;
cout << s2 << endl;
}
string phone{"15216982937"};
cout << phone.replace(3, 5, string(5, '*')) << endl; // 把从索引位置为3开始的连续5个字符替换成*
string s3{"cosmos"}, s4{"galaxy"};
cout << "s3: " + s3 + " s4: " + s4 << endl;
s3.swap(s4); // 交换
cout << "s3: " + s3 + " s4: " + s4 << endl;
string s5{"abc"};
const char *pstr = s5.c_str(); // 方法c_str()把string类字符串组转换成C风格的字符串
cout << pstr << endl;
string s6{"12306"};
int x1 = stoi(s6); // 把string转换成int
cout << x1 << endl;
int x2 = 12306;
string s7 = to_string(x2); // 把int转换成string
cout << s7 << endl;
double x3 = 123.06;
string s8 = to_string(x3); // 把double转换成string
cout << s8 << endl;
}
task2_2.cpp
#include <iostream>
#include <string>
#include <limits>
int main() {
using namespace std;
const int n = 10;
string prompt = string(n, '*') + "Enter a string: " + string(n, '*') + '\n';
cout << prompt;
string s1;
cin >> s1; // 从输入流中提取字符串给s1,碰到空格、回车、Tab键即结束
cout << "s1: " << s1 << endl;
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空输入缓冲区
cout << prompt;
getline(cin, s1); // 从输入流中提取一行字符串给s1,直到换行
cout << "s1: " << s1 << endl;
string s2, s3;
cout << prompt;
getline(cin, s2, ' '); // 从输入流中提取字符串给s2,直到指定分隔符空格
getline(cin, s3);
cout << "s2: " << s2 << endl;
cout << "s3: " << s3 << endl;
}
task2_3.cpp
#include <iostream>
#include <string>
int main() {
using namespace std;
string s;
cout << "Enter words: \n";
// 重复录入字符串,将小写字符转换成大写,直到按下Ctrl+Z
while( getline(cin, s) ) {
for(auto &ch: s)
ch = toupper(ch);
cout << s << "\n";
}
}
task2_4.cpp
#include <iostream>
#include <string>
#include <algorithm>
int main() {
using namespace std;
string s1;
cout << "Enter words: \n";
getline(cin, s1);
cout << "original words: \n";
cout << s1 <<endl;
cout << "to uppercase: \n";
transform(s1.begin(), s1.end(), s1.begin(), ::toupper);
cout << s1 << endl;
}
测试结果
3.实验任务3
实验代码
task3_1.cpp
#include <iostream>
#include <vector>
template<typename T>
void output(const T &obj) {
for(auto &item: obj)
std::cout << item << ", ";
std::cout << "\b\b \n";
}
int main() {
using namespace std;
vector<int> v1; // 创建一个vector对象v1, 未指定大小, 元素是int型, 未初始化
vector<int> v2(5); // 创建一个vector对象v2, 包含5个元素,元素是int型,初始值是默认值0
vector<int> v3(5, 42); // 创建一个vector对象v3, 包含5个元素,元素是int型,指定初始值是42
vector<int> v4{1, 9, 8, 4}; // 创建一个vector对象v4, 元素是int型,使用初始化列表方式
vector<int> v5{v4}; // 创建一个vector对象v5, 使用已经存在的对象v4创建
output(v2);
output(v3);
output(v4);
output(v5);
return 0;
}
task3_2.cpp
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
void output(const vector<int> &v) {
cout << "v.size() = " << v.size() << endl;
cout << "v.capacity() = " << v.capacity() << endl;
cout << endl;
}
int main() {
vector<int> v{42};
output(v);
v.push_back(55);
v.push_back(90);
output(v);
for(auto i = 0; i < 8; ++i)
v.push_back(i);
output(v);
v.pop_back();
output(v);
return 0;
}
测试结果
4.实验任务4
实验代码
#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <algorithm>
using namespace std;
// 函数模板
// 通过索引方式输出对象值
template<typename T>
void output1(const T &obj) {
for(auto i = 0; i < obj.size(); ++i)
cout << obj.at(i) << ", ";
cout << "\b\b \n";
}
// 函数模板
// 通过迭代器方式输出对象值
template<typename T>
void output2(const T &obj) {
for(auto p = obj.cbegin(); p != obj.cend(); ++p)
cout << *p << ", ";
cout << "\b\b \n";
}
// 函数模板
// 通过auto for方式输出对象值
template<typename T>
void output3(const T &obj) {
for(auto &item: obj)
cout << item << ", ";
cout << "\b\b \n";
}
// 测试string类对象
void test1() {
string s1{"cplus"};
output1(s1);
reverse(s1.begin(), s1.end()); // 对对象s1中的数据项进行翻转
output2(s1);
sort(s1.begin(), s1.end()); // 对对象s1中的数据项排序(默认升序)
output3(s1);
}
// 测试array<int>类对象
void test2() {
array< array<int, 4>, 3> x{1, 9, 8, 4, 2, 0, 2, 2, 2, 0, 4, 9 };
output1( x.at(0) );
output2( x.at(1) );
output3( x.at(2) );
}
// 测试vector<string>类对象
void test3() {
vector<string> v1 {"Sheldon", "Leonard", "Howard", "Raj"};
v1.push_back("Penny");
v1.push_back("Amy");
output1(v1);
sort(v1.begin(), v1.end(), std::greater<string>()); // 对v1对象中的字符串按降序排序
output2(v1);
reverse(v1.begin(), v1.end()); // 对v1对象中的字符串翻转
output3(v1);
}
int main() {
cout << "test1: " << endl;
test1();
cout << "test2: " << endl;
test2();
cout << "test3: " << endl;
test3();
return 0;
}