# 实验3 数组、指针与现代c++标准库

1.实验任务1

#include <iostream>

using std::cout;
using std::endl;

class A{
public:
A(int x0, int y0): x{ x0 }, y{ y0 } {}
void show() const { cout << x << ", " << y << endl; }
private:
int x, y;
};

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();
}

#include <iostream>
#include <string>

using std::cout;
using std::endl;

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

#include <iostream>
#include <string>

int main() {
using namespace std;

string s1, s2;
s1 = "nuist";
s1[0] = 'N';
s1.at(1) = 'U';
cout << boolalpha << (s1 == "nuist") << endl;
cout << s1.length() << endl;
cout << s1.size() << endl;
s2 = s1 + ", 2050";
cout << s2 << endl;

string email{"xyz@gmail.com"};
auto pos = email.find("@");
if (pos == string::npos)
else {
auto s1 = email.substr(0, pos);
auto s2 = email.substr(pos + 1);
cout << s1 << endl;
cout << s2 << endl;
}

string phone{"15216982937"};
cout << phone.replace(3, 5, string(5, '*')) << endl;

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();
cout << pstr << endl;

string s6{"12306"};
int x1 = stoi(s6);
cout << x1 << endl;

int x2 = 12306;
string s7 = to_string(x2);
cout << s7 << endl;

double x3 = 123.06;
string s8 = to_string(x3);
cout << s8 << endl;
}

#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;
}

#include <iostream>
#include <string>

int main() {
using namespace std;

string s;

cout << "Enter words: \n";

while( getline(cin, s) ) {
for(auto &ch: s)
ch = toupper(ch);
cout << s << "\n";
}
}

#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

#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);
}

#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);
}

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();
}

5.实验任务5

info.hpp

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

using namespace std;

class info{
public:
info(string name,string contact,string city,int n);
~info()=default;

void print();
int get_total();

private:
string nickname;
string contact;
string city;
int n;
static int total;
};

int info::total=0;
info::info(string name,string contact,string city,int n):nickname{name},contact{contact},city{city},n{n}{
total+=n;
}

int info::get_total(){
}

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

#include"info.hpp"
#include<vector>
#include<iomanip>

using namespace std;

static int i=0;
const int capacity=100;

int main(){
vector<info>audience_info_list;
string name,contact,city;
int n;
char ch;

cout<<"录入信息:"<<endl;
cout<<std::left<<"昵称\t"
<<"联系方式（邮箱/手机号）\t\t"
<<"所在城市\t"
<<"预定参加人数\t"<<endl;
while(cin>>name)
{
cin>>contact
>>city
>>n;
if(i+n<=capacity)
{
info t(name,contact,city,n);
audience_info_list.push_back(t);
i+=n;
if(i==capacity)
break;
}
else
{
cout<<"对不起，只剩"<<capacity-i<<"个位置."<<endl;
cout<<"1.输入u，更新（update）预定信息"<<endl
<<"2.输入q，退出预定"<<endl;
cout<<"你的选择：";
cin>>ch;
if(ch=='u')
cout<<"请重新录入信息："<<endl;
else
{
cout<<endl;
break;
}
}
}
cout<<endl;
cout<<"截至目前，一共有"<<i<<"位听众预定参加。预定听众信息如下："<<endl;
for(auto list:audience_info_list)
list.print();
}

6.实验任务6

textcoder.hpp

#include<iostream>
#include<string>

using namespace std;

class TextCoder{
public:
TextCoder(string text);
~TextCoder()=default;

string get_ciphertext();
string get_deciphertext();

private:
string text;
void encoder();
void decoder();
};

TextCoder::TextCoder(string text):text{text}{}

void TextCoder::encoder(){
for(int i=0;i<text.length();i++)
{
if((text[i]>='f'&&text[i]<='z')||(text[i]>='F'&&text[i]<='Z'))
{
text[i]-=5;
}
else if((text[i]>='a'&&text[i]<='e')||(text[i]>='A'&&text[i]<='E'))
{
text[i]+=21;
}
}
}

void TextCoder::decoder()
{
for(int i=0;i<text.length();i++)
{
if((text[i]>='a'&&text[i]<='u')||(text[i]>='A'&&text[i]<='U'))
{
text[i]+=5;
}
else if((text[i]>='V'&&text[i]<='Z')||(text[i]>='v'&&text[i]<='z'))
{
text[i]-=21;
}
}
}

string TextCoder::get_ciphertext(){
encoder();
return text;
}

string TextCoder::get_deciphertext(){
decoder();
return text;
}

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

void test() {
using namespace std;

string text, encoded_text, decoded_text;

cout << "输入英文文本: ";
while (getline(cin, text)) {
encoded_text = TextCoder(text).get_ciphertext();  // 这里使用的是临时无名对象
cout << "加密后英文文本:\t" << encoded_text << endl;

decoded_text = TextCoder(encoded_text).get_deciphertext(); // 这里使用的是临时无名对象
cout << "解密后英文文本:\t" << decoded_text << endl;
cout << "\n输入英文文本: ";
}
}

int main() {
test();
}

posted @ 2022-10-21 14:47  阑夜风华  阅读(21)  评论(0编辑  收藏  举报