WD—C++课前作业—30题

news2024/12/25 12:31:08

怎么会手和脚都在桌子上

目录

31,声明一个类 String,其数据成员为 char head[100],构造函数 String(char*Head)实现 head 的初始化,成员函数 void reverse()实现 head 内字符串的逆序存放,成员函数 void print()实现 head 内字符串的输出。

32.定义盒子 Box类,要求具有以下成员:可设置盒子形状;可计算盒子体积;可计算盒子的表面积。

33.声明一个 Tree(树)类,有成员 ages(树龄),成员函数grow(int years)用以对 ages 加上 years,showAge()用以显示 tree 对象的 ages 值。在主函数中定义 Tree 类对象,并调用成员函数(自行指定实参数据)

34.有一个学生类 Student,包括学生姓名、成绩,设计一个友元函数,输出成绩对应的等级:(1)大于等于 90:优;(2)80~90:良;(3)70~79:中;(4)60~69:及格;(5)小于 60:不及格。

35.定义一个复数类,用友元函数实现对双目运算符“+”的运算符重载,使其适用于复数运算。

36.有一个 Time 类,包含数据成员 minute(分)和 sec(秒),模拟秒表,每次走一秒,满 60 秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。(提示:重载单目运算符++)

37.设计一个三角形类 Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。

38.使用函数重载的方法定义两个重名函数,分别求出整型数的两数之和和浮点数的两数之和,并在主函数中调用。

39.定义一个抽象类 Shape 用以计算面积,从中派生出计算长方形、梯形、圆形面积的派生类。程序中通过基类指针来调用派生类中的虚函数,计算不同形状的面积。

40.定义计数器类 Counter。要求具有以下成员:计数器值;可进行增值和减值记数;可提供记数值。

41.声明一个哺乳动物 Mammal 类,再由此派生出狗 Dog类,二者都定义 speak(成员函数,基类中定义为虚函数。声明一个 Dog类的对象,调用 speak()函数,观察运行结果。

42.编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求  :a)抽象出一个基类 Base;  b)在其中说明一个虚函数用来求面积;   c)利用派生类定义“三角形、正方形、圆形”;  编写主函数并测试。

C++字符串(std::string)、STL(标准模板库)相关;(这一部分的作业,请参考 C++ Primer5 的练习)

43.编写一段程序,从标准输入中一次读入一整行,存入 std::string 中,然后修改该程序,使其一次读入一个词。(练习3.2)

44.请说明std::string类的输入运算符和 getline函数分别是如何处理空白字符的。(练习3.3)

45.编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。(练习 3.5)

46.编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。(练习 3. 10)

47.编写一段程序,创建一个含有 10 个整数的 vector 对象,然后使用迭代器将所有元素的值都变成原来的两倍。输出 vector 对象的内容,检验程序是否正确。(练习 3.23)

48.编写一段程序,比较两个 std::string 对象。再编写一段程序,比较两个C风格字符串的内容。(练习3.39)

49.对于下面的程序任务,vector、deque 和 list 哪种容器最为合适?解释你的选择的理由。如果没有哪一种容器优于其他容器,也请解释理由。(练习9.1)(1)读取固定数量的单词,将他们按字典序插入到容器中。(2)读取未知数量的单词,总是将新单词插入到末尾。删除操作在头部进行。(3)从一个文件读取未知数量的整数。将这些数排序,然后将他们打印到标准输出。

50.对6种创建和初始化 vector 对象的方法,每一种都给出一个实例。解释每个 vector 包含什么值。(练习9.11)

51.如何从一个 list初始化一个 vector?从一个 vector又该如何创建?编写代码验证你的答案。(练习9.13)

52.编程程序,将一个 1ist 中的 char*指针(指向C风格字符串)元素赋值给-个vector中的string。(练习9.14) 

53,编写程序,从标准输入读取 string 序列,存入一个 deque 中。编写一个循环,用迭代器打印 deque 中的元素。(练习 9.18)

54.编写程序,从一个 1ist拷贝元素到两个 deque 中,其中值为偶数的所有元素都拷贝到一个 deque 中,而奇数元素都拷贝到另一个 deque 中。(9.20)

​编辑55,假定你希望每次读取一个字符存入一个 std::string 中,而且知道最少需要读取 100个字符,应该如何提高程序的性能?(9.42)

​编辑56.编写一个函数,接受一个表示名字的 std::string 参数和两个分别表示前缀(如“Mr.”或“Ms.”)和后缀(如“Jr.”“III”)的字符串。使用迭代器及insert 和 append 函数将前缀和后缀加到给定的名字中,生成新的 string 并返回。(9.45)

57.定义一个 map,关键字是家庭的姓,值是一个 vector,保存家中孩子(们)的名。编写代码,实现添加新的家庭以及向已有家庭中添加新的孩子。(11.7)

0.1  bug,只有第一个添加人的函数能进入循环

​编辑​编辑0.2 正常的

58,编写一个程序,在一个 vector 而不是一个 set 中保存不重复的单词。使用set的优点是什么?(练习 11.8)

59.可以用什么类型来对一个 map 进行下标操作?下标运算符返回的类型时什么?请给出一个具体例子,即定义一个 map,然后写出一个可以用来对 map 进行下标操作的类型以及下标运算符将会返回的类型。(11.26)

60.用冒泡法对 10 个整数排序。(用 STL 的 vector 容器实现)​​​​​​​

31,声明一个类 String,其数据成员为 char head[100],构造函数 String(char*Head)实现 head 的初始化,成员函数 void reverse()实现 head 内字符串的逆序存放,成员函数 void print()实现 head 内字符串的输出。
#include <iostream>
#include <cstring>
using namespace std;
/*
声明一个类 String,其数据成员为 char head[100]
构造函数 String(char*Head)实现 head 的初始化
成员函数 void reverse()实现 head 内字符串的逆序存放
成员函数 void print()实现 head 内字符串的输出。
*/
class String {
public:
	String(char* Head) {
		strcpy_s(head, sizeof(head), Head);
	}
	void reverse() {
		int len = strlen(head);
		for (int i = 0; i < len / 2; i++) {
			char temp = head[i];
			head[i] = head[len - i - 1];
			head[len - i - 1] = temp;
		}
	}
	void print() {
		cout << head << endl;
	}
	char head[100];
};
void test01() {
	String s(const_cast<char*>("hallo,world"));
	s.print();
	s.reverse();
	s.print();
}
int main() {
	test01();
	system("pause");
	return 0;
}

BUG:在你的代码中,test01 函数中创建 String 对象时,实参类型是 const char* 类型,但是构造函数参数类型是 char*,导致类型不匹配的错误。为了解决这个问题,你可以将构造函数的参数类型改为 const char*,或者在调用构造函数时将实参的类型转换为 char* 

32.定义盒子 Box类,要求具有以下成员:可设置盒子形状;可计算盒子体积;可计算盒子的表面积。
#include <iostream>
#include <string>
using namespace std;
class BOX {
public:
	BOX(int l,int w,int h) {
		m_l = l; m_w = w; m_h = h;
	}
	int gets() {
		return  m_l *m_w *m_h;
	}
	int getv() {
		return 2 * (m_l * m_w + m_l * m_h + m_w * m_h);
	}
	void shape() {
		cout << "BOX的长,宽,高分别为:" << m_l << " " << m_w << " " << m_h << endl;
	}
	int m_l;
	int m_w;
	int m_h;
};
void test01() {
	BOX b1(3, 4, 5);
	b1.shape();
	cout << "体积是:" << b1.getv() << endl;
	cout << "面积是:" << b1.gets() << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

33.声明一个 Tree(树)类,有成员 ages(树龄),成员函数grow(int years)用以对 ages 加上 years,showAge()用以显示 tree 对象的 ages 值。在主函数中定义 Tree 类对象,并调用成员函数(自行指定实参数据)
#include <iostream>
#include <string>
using namespace std;
/*
* 声明一个 Tree(树)类,有成员 ages(树龄)
成员函数grow(int years)用以对 ages 加上 years
showAge()用以显示 tree 对象的 ages 值
在主函数中定义 Tree 类对象,并调用成员函数(自行指定实参数据)
*/
class Tree {
public:
	Tree() {
		ages = 0;
	}
	Tree(int age) {
		this->ages = age;
	}
	void grow(int years) {
		this->ages += years;
	}
	void showAge() {
		cout << "树的年龄为:" << ages << endl;
	}
	int ages;
};
void test01() {
	Tree t1(78);
	t1.showAge();
	t1.grow(200);
	t1.showAge();
}
int main() {
	test01();
	system("pause");
	return 0;
}

34.有一个学生类 Student,包括学生姓名、成绩,设计一个友元函数,输出成绩对应的等级:
(1)大于等于 90:优;(2)80~90:良;(3)70~79:中;(4)60~69:及格;(5)小于 60:不及格。
#include <iostream>
#include <ctime>
using namespace std;
/*
有一个学生类 Student,包括学生姓名、成绩,设计一个友元函数,输出成绩对应的等级:
(1)大于等于 90:优;(2)80~90:良;(3)70~79:中;(4)60~69:及格;(5)小于 60:不及格。
*/
class Student {
	friend void classgrade(Student& s);
public:
	Student(string name, int sc) {
		n_name = name;
		n_score = sc;
	}
	void show() {
		cout << "姓名:" << n_name << "\t成绩:" << n_score << "\t等级:";
	}
private:
	string n_name;
	int n_score;
};
void classgrade(Student& s) {
	int sco = s.n_score / 10;
	switch (sco) {
	case 10:cout << "优" << endl; break;
	case 9:cout << "优" << endl; break;
	case 8:cout << "良" << endl; break;
	case 7:cout << "中" << endl; break;
	case 6:cout << "及格" << endl; break;
	default:cout << "不及格" << endl; break;
	}
}
void test01() {
	srand((unsigned int)time(NULL));
	Student s1("栋栋",rand()%51+50);
	s1.show();
	classgrade(s1);
}
int main() {
	test01();
	system("pause");
	return 0;
}

35.定义一个复数类,用友元函数实现对双目运算符“+”的运算符重载,使其适用于复数运算。
#include <iostream>
#include <ctime>
using namespace std;
/*
.定义一个复数类,用友元函数实现对双目运算符“+”的运算符重载,使其适用于复数运算。
*/
class Complex {
	friend Complex& operator+(Complex& c1, Complex& c2);
public:
	Complex(int a1, int b1) {
		_a = a1;
		_b = b1;
	}
	void show() {
		cout << _a << "+" << _b << "i" << endl;
	}
private:
	int _a;
	int _b;
};
Complex& operator+(Complex& c1, Complex& c2) {
	Complex c(c1._a + c2._a, c1._b + c2._b);
	return c;
}
void test01() {
	Complex c1(3, 5);
	Complex c2(7, 4);
	Complex c3 = c1 + c2;
	c2.show();
	c1.show();
	c3.show();
}
int main() {
	test01();
	system("pause");
	return 0;
}

36.有一个 Time 类,包含数据成员 minute(分)和 sec(秒),模拟秒表,每次走一秒,满 60 秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。(提示:重载单目运算符++)
#include <iostream>
#include <ctime>
using namespace std;
/*
有一个 Time 类,包含数据成员 minute(分)和 sec(秒)
模拟秒表,每次走一秒,满 60 秒进一分钟,此时秒又从0开始算。
要求输出分和秒的值。(提示:重载单目运算符++)
*/
class Time {
public:
	Time(int min,int sce) {
		_min = min;
		_sec = sce;
	}
	void showt() {
		cout << _min << " minute\t" << _sec <<" second" << endl;
	}
	Time& operator++() {//前置
		_sec++;
		if (_sec == 60) {
			_min++;
			_sec = 0;
		}
		return *this;
	}
	Time operator++(int) {//后置
		Time t(this->_min, this->_sec);
		_sec++;
		if (_sec == 60) {
			_min++;
			_sec = 0;
		}
		return t;
	}
private:
	int _min;
	int _sec;
};

void test01() {
	Time t1(3, 59);
	t1.showt();
	(t1++).showt();
	t1.showt();
	(++t1).showt();
	t1.showt();
}
int main() {
	test01();
	system("pause");
	return 0;
}

37.设计一个三角形类 Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。
#include <iostream>
using namespace std;
/*
设计一个三角形类 Triangle,包含三角形三条边长的私有数据成员
另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。
*/
class Triangle {
public:
	Triangle() {
		_a = _b = _c = 0;
	}
	bool ist(int a, int b, int c) {
		return a < (b + c) && b < (a + c) && c < (a + b);
	}
	Triangle(int a, int b, int c) {
		if (ist(a,b,c)) {
			_a = a;_b = b; _c = c;
		}
		else {
			cout << "no no no" << endl;
		}
	}
	void showt() {
		cout << this->_a << " " << this->_b << " " << this->_c << endl;
	}
	double ss() {
		double d = (_a + _b + _c) / 2;
		double s = sqrt(d*(d - _a)*(d - _b)*(d - _c));
		return s;
	}
	double operator+(Triangle &b) {
		return this->ss() + b.ss();
	}
private:
	int _a;
	int _c;
	int _b;
};

void test01() {
	Triangle t1(60,57,60);
	Triangle t2(3, 4, 5);
	t1.showt();
	t2.showt();
	cout << "t1:s:" << t1.ss() << endl;
	cout << "t2:s:" << t2.ss() << endl;
	cout << "t1+t2:s:" << t1+t2 << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

38.使用函数重载的方法定义两个重名函数,分别求出整型数的两数之和和浮点数的两数之和,并在主函数中调用。
#include<iostream>
#include<string>
using namespace std;
/*
使用函数重载的方法定义两个重名函数,分别求出整型数的两数之和和浮点数的两数之和,并在主函数中调用。
*/
void plus01(int a,int b=10) {
	cout << a + b << endl;
}
void plus01(double a, int b=10) {
	cout << a + b << endl;
}
int main() {
	int a = 8; 
	plus01(a);
	double i = 90.998;
	plus01(i);
	return 0;
}

39.定义一个抽象类 Shape 用以计算面积,从中派生出计算长方形、梯形、圆形面积的派生类。程序中通过基类指针来调用派生类中的虚函数,计算不同形状的面积。
#include<iostream>
#include<string>
using namespace std;
#define PAI 3.14159
/*
39.定义一个抽象类 Shape 用以计算面积,从中派生出计算长方形、梯形、圆形面积的派生类。
程序中通过基类指针来调用派生类中的虚函数,计算不同形状的面积。
*/
class shape {
public:
	virtual void getshape() {};
};
class rectangle :public shape {
public:
	rectangle(int l,int h) {
		this->_l = l; this->_h = h;
	}
	void getshape() {
		cout << "rectangle shape :" << endl;
		int shape = this->_l * this->_h;
		cout <<shape<< endl;
	}
public:
	int _l;
	int _h;
};
class trapezoid :public shape {
public:
	trapezoid(int ul,int dl,int uh) {
		this->_upl = ul; this->_downl = dl; this->_uph = uh;
	}
	void getshape() {
		cout << "trapezoid shape :" << endl;
		double shape = (this->_upl / 2.0 + this->_downl / 2.0) * this->_uph;
		cout << shape << endl;
	}
public:
	int _upl;
	int _downl;
	int _uph;
};
class circle :public shape {
public:
	circle(int r) {
		this->_r = r;
	}
	void getshape() {
		cout << "circle shape :" << endl;
		double shape = this->_r * this->_r * PAI;
		cout << shape << endl;
	}
public:
	int _r;
};
void test01() {
	rectangle t(5, 6);
	t.getshape();
	trapezoid tr(3, 5, 6);
	tr.getshape();
	circle c(5);
	c.getshape();
}
int main() {
	test01();
	return 0;
}

​​​​​​​

40.定义计数器类 Counter。要求具有以下成员:计数器值;可进行增值和减值记数;可提供记数值。
#include<iostream>
#include<string>
using namespace std;
#define PAI 3.14159
/*
40.定义计数器类 Counter。要求具有以下
成员:计数器值;
可进行增值和减值记数;可提供记数值。
*/
class Counter {
public:
	Counter(int a) {
		this->_count = a;
	}
	Counter& operator++() {//前置
		this->_count++;
		return *this;
	}
	Counter operator++(int) {//hou_zhi
		Counter p = *this;
		this->_count++;
		return p;
	}
	void getcount(int a) {
		cout << "begin count = " << this->_count << endl;
		system("pause");
		for (int i =0; i <= a; i++) {
			_count++;
			cout << this->_count << " ";
			system("cls");
		}
		cout << endl << "after count = " <<this->_count<< endl;
	}
public:
	int _count;
};
void test01() {
	Counter c(0);
	c.getcount(67);
	cout << (++c)._count << endl;
	cout << (c++)._count << endl;
	cout << (c)._count << endl;
}
int main() {
	test01();
	return 0;
}

41.声明一个哺乳动物 Mammal 类,再由此派生出狗 Dog类,二者都定义 speak(成员函数,基类中定义为虚函数。声明一个 Dog类的对象,调用 speak()函数,观察运行结果。
#include<iostream>
#include<string>
using namespace std;
#define PAI 3.14159
/*
41.声明一个哺乳动物 Mammal 类,再由此派生出狗 Dog类,二者都定义 speak(成员函数,
基类中定义为虚函数。声明一个 Dog类的对象,调用 speak()函数,观察运行结果。
*/
class Mammal {
public:
	virtual void speak() {};
};
class dog :public Mammal {
public:
	void speak() {
		cout << " wang wang wang " << endl;
	}
};
void test01() {
	dog facai;
	facai.speak();
}
int main() {
	test01();
	return 0;
}
42.编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求  :a)抽象出一个基类 Base;  b)在其中说明一个虚函数用来求面积;   c)利用派生类定义“三角形、正方形、圆形”;  编写主函数并测试。
#include<iostream>
#include<string>
using namespace std;
#define PAI 3.14159
/*
42.编写一个程序计算“三角形、正方形、圆形”三种图形的面积,要求  :
a)抽象出一个基类 Base;  
b)在其中说明一个虚函数用来求面积;  
c)利用派生类定义“三角形、正方形、圆形”;  编写主函数并测试。
*/
class shape {
public:
	virtual void getshape() {};
};
class square :public shape {
public:
	square(int l) {
		this->_l = l; 
	}
	void getshape() {
		cout << "square shape :" << endl;
		int shape = this->_l * this->_l;
		cout << shape << endl;
	}
public:
	int _l;
};
class triangle :public shape {
public:
	triangle(int ul, int dl, int uh) {
		this->_a = ul; this->_b = dl; this->_c = uh;
	}
	void getshape() {
		cout << "triangle shape :" << endl;
		double s = (_a + _b + _c) / 2.0;
		double shape = sqrt(s*(s-_a)*(s-_b)*(s-_c));
		cout << shape << endl;
	}
public:
	int _a;
	int _b;
	int _c;
};
class circle :public shape {
public:
	circle(int r) {
		this->_r = r;
	}
	void getshape() {
		cout << "circle shape :" << endl;
		double shape = this->_r * this->_r * PAI;
		cout << shape << endl;
	}
public:
	int _r;
};
void test01() {
	square t(5);
	t.getshape();
	triangle tr(4, 5, 3);
	tr.getshape();
	circle c(5);
	c.getshape();
}
int main() {
	test01();
	return 0;
}

C++字符串(std::string)、STL(标准模板库)相关;(这一部分的作业,请参考 C++ Primer5 的练习)

43.编写一段程序,从标准输入中一次读入一整行,存入 std::string 中,然后修改该程序,使其一次读入一个词。(练习3.2)
#include<iostream>
#include<string>
using namespace std;
#define PAI 3.14159
/*
43.编写一段程序,从标准输入中一次读入一整行,存入 std::string 中,
然后修改该程序,使其一次读入一个词。(练习3.2)
*/

void test01() {
	cout << " one word once :___" << endl;
	string c;
	cin >> c;
	cout << c << endl;//string读到空格停止读入
}
void test02() {
	cout << " one line once:___" << endl;
	string line;
	while (getline(cin, line)) {//getline(is,s)从is中读取一行赋给S[包括空格],返回is
		cout << line << endl;
	}
}
int main() {
	test01();
	test02();
	return 0;
}
44.请说明std::string类的输入运算符和 getline函数分别是如何处理空白字符的。(练习3.3)

输入运算符 :逐字读取,行编辑,只保留第一串不含空白字符的连续字符;
getline :逐字读取,行编辑,全保留/换行符不存贮到字符串中

#include<iostream>
#include<string>
using namespace std;
#define PAI 3.14159
/*
44.请说明std::string类的输入运算符和 
getline函数分别是如何处理空白字符的。(练习3.3)
*/

void test01() {
	cout << " one word once :___" << endl;
	string c;
	cin >> c;
	cout << c << endl;
}
void test02() {
	cout << " one line once:___" << endl;
	string line;
	while (getline(cin, line)) {
		cout << line << endl;
	}
}
int main() {
	test01();
	test02();
	return 0;
}

45.编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。(练习 3.5)
#include<iostream>
#include<string>
using namespace std;
#define PAI 3.14159
/*
45.编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。
然后修改上述程序,用空格把输入的多个字符串分隔开来。(练习 3.5)
*/

void test01() {
	string word;
	while (cin>>word) {
		cout << word;
	}
}
void test02() {
	string word;
	while (cin >> word) {
		cout << word<<" ";
	}
}
int main() {
	//test01();
	test02();
	return 0;
}

46.编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。(练习 3. 10)
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
/*
46.编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串剩余的部分。(练习 3. 10)
*/

void test02() {
	string line;
	while (getline(cin, line)) {
		for (auto c:line) {
			if (!ispunct(c)) {
				cout << c;
			}
		}
	}
}
int main() {
	test02();
	return 0;
}
47.编写一段程序,创建一个含有 10 个整数的 vector 对象,然后使用迭代器将所有元素的值都变成原来的两倍。输出 vector 对象的内容,检验程序是否正确。(练习 3.23)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
/*
47.编写一段程序,创建一个含有 10 个整数的 vector 对象,
然后使用迭代器将所有元素的值都变成原来的两倍。
输出 vector 对象的内容,检验程序是否正确。(练习 3.23)
*/
void print01(vector<int> &v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		//*it *= 2;
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	vector<int> v;
	for (int i = 0; i < 10; i++)
		v.push_back(i);
	print01(v);
	for (int i = 0; i < 10; i++)
		v[i]*=2;
	print01(v);
}
int main() {
	test02();
	return 0;
}
48.编写一段程序,比较两个 std::string 对象。再编写一段程序,比较两个C风格字符串的内容。(练习3.39)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
/*
48.编写一段程序,比较两个 std::string 对象。再编写一段程序,比较两个C风格字符串的内容。(练习3.39)
*/
void bigorsmall(string s1,string s2) {
	if (s1.compare(s2) == 0) {
		cout << s1<<" == "<<s2 << endl;
	}
	else if (s1.compare(s2) < 0) {
		cout << s1 << " > " << s2 << endl;
	}
	else if (s1.compare(s2) > 0) {
		cout << s1 << " < " << s2 << endl;
	}
}
void test02() {
	string s1 = "dsewfaewg";
	string s2 = "dsewfaewg";
	bigorsmall(s1, s2);
	const char* v1 = "nihao";
	const char* v2 = "aihao";
	bigorsmall(v1, v2);
}
int main() {
	test02();
	return 0;
}

49.对于下面的程序任务,vector、deque 和 list 哪种容器最为合适?解释你的选择的理由。如果没有哪一种容器优于其他容器,也请解释理由。(练习9.1)
(1)读取固定数量的单词,将他们按字典序插入到容器中。
(2)读取未知数量的单词,总是将新单词插入到末尾。删除操作在头部进行。
(3)从一个文件读取未知数量的整数。将这些数排序,然后将他们打印到标准输出。
/*
(1)LIST可以对任意位置进行快速插入或删除元素,操作方便,修改指针即可,不需要移动大量元素,LIST合适,
也可以每次尾部插入之后用排序算法重新排序,VECTOR合适
(2)固定头部删除,尾部插入,DEQUE更合适
(3)排序需要遍历元素,VECTOR访问元素的速度快于DEQUE,LIST,VECTOR合适
*/
50.对6种创建和初始化 vector 对象的方法,每一种都给出一个实例。解释每个 vector 包含什么值。(练习9.11)
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<list>
using namespace std;
/*
50.对6种创建和初始化 vector 对象的方法,每一种都给出一个实例。解释每个 vector 包含什么值。(练习9.11)
*/
void myprint(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	vector<int> v1;     //vector<T> v; 
	for (int i = 0; i < 5; i++) {
		v1.push_back(i);
	}
	vector<int> v2(v1.begin(), v1.end());   //vector(v.begin(),v.end());
	vector<int> v3(15,1);   //vector(n,elem); 
	vector<int> v4(v3);   //vector(const vector &vec); 
	vector<int> v5;   //operator= 
	v5 = v1;
	vector<int> v6;   //assign(n,elem)
	v6.assign(20, 0);   
	vector<int> v7;  //assign(beg,end)
	v7.assign(v3.begin(), v3.end());
	myprint(v1);
	myprint(v2);
	myprint(v3);
	myprint(v4);
	myprint(v5);
	myprint(v6);
	myprint(v7);
}
int main() {
	test02();
	return 0;
}

51.如何从一个 list<int>初始化一个 vector<double>?从一个 vector<int>又该如何创建?编写代码验证你的答案。(练习9.13)
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<list>
using namespace std;
/*
51.如何从一个 list<int>初始化一个 vector<double>?
从一个 vector<int>又该如何创建?编写代码验证你的答案。(练习9.13)
*/
void myprint(vector<double>& v) {
	for (vector<double>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	list<int>l(5, 6);
	vector<double>v0(l.begin(), l.end());
	vector<int> v1(10,1);
	vector<double>v2(v1.begin(),v1.end());
	myprint(v0);
	myprint(v2);
}
int main() {
	test02();
	return 0;
}

52.编程程序,将一个 1ist 中的 char*指针(指向C风格字符串)元素赋值给-个vector中的string。(练习9.14) 
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<list>
using namespace std;
/*
52.编程程序,将一个 1ist 中的 char*指针(指向C风格字符串)元素
赋值给-个vector中的string。(练习9.14) 
*/
void myprint(vector<string>& v) {
	for (vector<string>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	list<const char*>l = { "cc","ii","ee"};
	vector<string>v0(l.begin(), l.end());
	myprint(v0);
}
int main() {
	test02();
	return 0;
}
​​​​​​​
53,编写程序,从标准输入读取 string 序列,存入一个 deque 中。编写一个循环,用迭代器打印 deque 中的元素。(练习 9.18)
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<list>
using namespace std;
/*
53,编写程序,从标准输入读取 string 序列,存入一个 deque 中。
编写一个循环,用迭代器打印 deque 中的元素。(练习 9.18)
*/
void myprint(deque<string>& v) {
	for (deque<string>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	deque<string>v0;
	string word;
	while (cin >> word) {
		v0.push_back(word);
	}
	myprint(v0);
}
int main() {
	test02();
	return 0;
}
54.编写程序,从一个 1ist<int>拷贝元素到两个 deque 中,其中值为偶数的所有元素都拷贝到一个 deque 中,而奇数元素都拷贝到另一个 deque 中。(9.20)
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<list>
using namespace std;
/*
54.编写程序,从一个 1ist<int>拷贝元素到两个 deque 中,其中值为偶数的所有元素
都拷贝到一个 deque 中,而奇数元素都拷贝到另一个 deque 中。(9.20)
*/
void myprint(deque<int>& v) {
	for (deque<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	deque<int> odd_number;
	deque<int> even_number;
	list<int> l;
	for (int i = 0; i < 101; i++) {
		l.push_back(i);
	}
	for (auto it = l.begin(); it != l.end(); it++) {
		if (*it % 2 == 0) {
			even_number.push_back(*it);
		}
		else {
			odd_number.push_back(*it);
		}
	}
	cout << " odd_number" << endl;
	myprint(odd_number);
	cout << " even_number" << endl;
	myprint(even_number);
}
int main() {
	test02();
	return 0;
}
55,假定你希望每次读取一个字符存入一个 std::string 中,而且知道最少需要读取 100个字符,应该如何提高程序的性能?(9.42)
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<list>
using namespace std;
/*
55,假定你希望每次读取一个字符存入一个 std::string 中,而且知道最少需要
读取 100个字符,应该如何提高程序的性能?(9.42)
1.使用 reserve:在读取字符前,调用 reserve 函数来预留足够的内存空间,以减少动态内存分配的次数
2.使用移动语义:当将读取的字符添加到 std::string 中时,使用移动语义而不是复制语义,可以避免不必要的内存复制。
*/

void test02() {
	string str;
	str.reserve(100);//提前开辟空间
	cout << str.capacity() << endl;
	char c;
	/*while ((c = getchar()) != EOF) {
		str.push_back(c);
	}*/
	while (cin.get(c)) {
		str.push_back(move(c));//使用移位字符
	}
	cout << str << endl;
}
int main() {
	test02();
	return 0;
}
56.编写一个函数,接受一个表示名字的 std::string 参数和两个分别表示前缀(如“Mr.”或“Ms.”)和后缀(如“Jr.”“III”)的字符串。使用迭代器及insert 和 append 函数将前缀和后缀加到给定的名字中,生成新的 string 并返回。(9.45)
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<list>
using namespace std;
/*
56.编写一个函数,接受一个表示名字的 std::string 参数和两个分别表示前缀(如“Mr.”或“Ms.”)和后缀(如“Jr.”“III”)的字符串。
使用迭代器及insert 和 append 函数将前缀和后缀加到给定的名字中,生成新的 string 并返回。(9.45)
*/

void test02() {
	string str="魏国";
	string prefix = "Mr.";
	string prefix2 = "Ms.";
	string suffix = "Jr.III";
	cout << str << endl;
	str.append(suffix,0,3);
	cout << str << endl;
	str.append(suffix, 3, 3);
	cout << str << endl;
	str.insert(0, prefix);
	cout << str << endl;
	str.insert(0, prefix2);
	cout << str << endl;
}
int main() {
	test02();
	return 0;
}
57.定义一个 map,关键字是家庭的姓,值是一个 vector,保存家中孩子(们)的名。编写代码,实现添加新的家庭以及向已有家庭中添加新的孩子。(11.7)
0.1  bug,只有第一个添加人的函数能进入循环
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
/*
57.定义一个 map,关键字是家庭的姓,值是一个 vector,保存家中孩子(们)的名。
编写代码,实现添加新的家庭以及向已有家庭中添加新的孩子。(11.7)
*/
void addchild(map<string, vector<string>>&fam) {
	string ff, child;
	cout << " addchild : enter family,child" << endl;
	while(cin>>ff&&cin>>child){
		fam[ff].push_back(child);
	}
}
void addfamily(map<string, vector<string>> &fam) {
	cout << " addfamily:enter family" << endl;
	string ff;
	while (cin >> ff) {
		fam[ff];
	}
}
void show(map<string,vector<string>> &fam) {
	cout << "show family and children" << endl;
	for (auto a : fam) {
		cout << a.first << ":\t" << endl;
		for (auto b : a.second) {
			cout << b << " ";
		}
		cout << endl;
	}
}
void test02() {
	map<string, vector<string>> fam;
	addchild(fam);
	addfamily(fam);//bug,只有第一个添加人的函数能进入循环
	show(fam);
}
int main() {
	test02();
	return 0;
}
0.2 正常的
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
/*
57.定义一个 map,关键字是家庭的姓,值是一个 vector,保存家中孩子(们)的名。
编写代码,实现添加新的家庭以及向已有家庭中添加新的孩子。(11.7)
*/
void addchild(map<string, vector<string>>&fam, const string &ff, const string &child) {
		fam[ff].push_back(child);
}
void addfamily(map<string, vector<string>> &fam,const string &ff) {
	fam[ff];
}
void show(map<string,vector<string>> &fam) {
	cout << "show family and children" << endl;
	for (auto a : fam) {
		cout << a.first << ":\t" ;
		for (auto b : a.second) {
			cout << b << " ";
		}
		cout << endl;
	}
	cout << endl;
}
void test02() {
	map<string, vector<string>> fam;
	addchild(fam,"huang","dsd");
	addchild(fam, "huang", "34523");
	addchild(fam, "chen", "dddq");
	addfamily(fam,"xu");
	addfamily(fam, "zhuge");
	show(fam);
}
int main() {
	test02();
	return 0;
}

58,编写一个程序,在一个 vector 而不是一个 set 中保存不重复的单词。使用set的优点是什么?(练习 11.8)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
/*
58,编写一个程序,在一个 vector 而不是一个 set 中保存不重复的单词。使用set的优点是什么?(练习 11.8)
SET	会自动进行排序,且不允许重复元素出现
*/
void addVector(vector<string> &v,string a) {
	vector<string>::iterator isrepetition=find(v.begin(), v.end(), a);
	if (isrepetition == v.end()) {
		v.push_back(a);
	}
}
void show(vector<string>& v) {
	for (vector<string>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	vector<string> v;
	addVector(v, "hkhk");
	addVector(v, "23");
	addVector(v, "hkhk");
	show(v);
}
int main() {
	test02();
	return 0;
}
​​​​​​​
59.可以用什么类型来对一个 map 进行下标操作?下标运算符返回的类型时什么?请给出一个具体例子,即定义一个 map,然后写出一个可以用来对 map 进行下标操作的类型以及下标运算符将会返回的类型。(11.26)
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
/*
当对MAP进行下标操作时,会得到一个MAPPED_TYPE对象,解引用一个迭代器时,会得到一个VALUE_TYPE对象
STRING 和 VECTOR使用小标和解引用返回的数据类型相同
*/
void show(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	map<int, string> m;
	m.insert(make_pair(2, "dsfe"));
	cout <<" m[2]:\t" << m[2] << endl;
	map<int, string>::iterator it = m.begin();
	cout <<"*it:\t" << (*it).first << " " << (*it).second << endl;
}
int main() {
	test02();
	return 0;
}
60.用冒泡法对 10 个整数排序。(用 STL 的 vector 容器实现)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
/*
60.用冒泡法对 10 个整数排序。(用 STL 的 vector 容器实现)
*/
void bubble(vector<int> &v) {
	for (int t= 0; t < v.size()-1; t++) {
		for (int i = 0; i < v.size() - 1 - t; i++) {
			if (v[i] > v[i + 1]) {
				v[i] += v[i + 1];
				v[i + 1] = v[i] - v[i + 1];
				v[i]= v[i] - v[i + 1];
			}
		}
	}
}
void show(vector<int>& v) {
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	srand(unsigned int(time(NULL)));
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		int t = rand() % 100;
		v.push_back(t);
	}
	show(v);
	bubble(v);
	show(v);
}
int main() {
	test02();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LAMMPS学习】九、LAMMPS脚本 示例

9. 示例脚本 LAMMPS 发行版包含一个包含许多示例问题的示例子目录。许多是二维模型&#xff0c;运行速度快且易于可视化&#xff0c;在台式机上运行最多需要几分钟。每个问题都有一个输入脚本 (in.*)&#xff0c;并在运行时生成一个日志文件 (log.*)。有些使用初始坐标的数据文…

Scrapy爬虫:利用代理服务器爬取热门网站数据

在当今数字化时代&#xff0c;互联网上充斥着大量宝贵的数据资源&#xff0c;而爬虫技术作为一种高效获取网络数据的方式&#xff0c;受到了广泛的关注和应用。本文将介绍如何使用Scrapy爬虫框架&#xff0c;结合代理服务器&#xff0c;实现对热门网站数据的高效爬取&#xff0…

Spring Cloud系列—Spring Cloud Gateway服务网关的部署与使用指南

Gateway网关 文章目录 Gateway网关1. 网关基本简介1.1 什么是网关1.2 为什么需要网关&#xff1f; 2. 快速搭建gateway网关2.1 创建新模块2.2 引入依赖2.3 编写启动类2.4 配置路由规则2.5 测试 3. 路由过滤4. 过滤器4.1 简介4.2 网关过滤器4.2.2 种类 4.3 自定义过滤器4.3.1 自…

能播放SWF文件的FlashPlayer播放器

问题&#xff1a; 你是不是遇到了 flash 动画 放不了了&#xff1f; 以前的flash游戏玩不了了 在网上很难找到好用的&#xff0c;免费Flashplayer播放器&#xff0c; 找到的也没法保存.exe 以前买的课件放不了了 一打开就更新提示&#xff1a; 再不就是意外能打开了但【创建…

50. UE5 RPG FGameplayEffectContext

接下来&#xff0c;我想实现处理完伤害时&#xff0c;将伤害的触发格挡或者触发暴击时的逻辑传递到数据集的PostGameplayEffectExecute里面&#xff0c;这样&#xff0c;在处理IncomingDamage时&#xff0c;我们可以通过释放触发格挡或者触发暴击在UI上面进行对应的效果表现。 …

Ubuntu环境搭建与共享文件

vmtool 然后依次执行以下指令 sudo apt-get update 更新包列表。访问系统的软件仓库源,检查所有已知软件包的最新版本,并更新本地数据库,使得可以安装或升级到最新的软件版本。sudo apt-get upgrade 升级所有已安装的软件包到它们的最新版本。这不包括新安装的软件包,仅限…

24/05/14总结

签到2&#xff1a; 签到界面上有时间显示&#xff0c;签到码输入框&#xff0c;开始签到&#xff0c;当倒计时结束&#xff0c;老师端和学生端都会显示签到结果&#xff0c;所以签到结果需要建表&#xff1a;&#xff08;签到了的学生和未签到的学生&#xff0c; 这次签到的时间…

【iOS】工厂模式

文章目录 前言设计模式的三大原则简单工厂模式工厂方法模式抽象工厂模式关于三兄弟的升级与降级注意 前言 上文讲完了iOS的架构模式&#xff0c;接下来聊一聊设计模式&#xff0c;设计模式有许多&#xff0c;主要介绍一下工厂模式 设计模式的三大原则 S 单一职责原则 告诉我…

adobe安装“Error:SyntaxError:JSON Parse error:Unexpec

mac电脑安装Adobe时&#xff0c;会提示错误“Error:SyntaxError:JSON Parse error:Unexpected EOF”&#xff0c;这是怎么回事儿的&#xff0c;不管您是安装AI、PS、PR还是LR&#xff0c;如果也遇到相同的问题&#xff0c;可以参考一下方法解决&#xff1a; 「adobe安装提示错误…

LLM应用-prompt提示:让大模型总结生成思维导图

第一步&#xff1a;大模型生成markdown思维导图格式 例如&#xff1a;kimi 总结pdf文档案例&#xff1a; 生成的markdown格式&#xff1a; # 知识图谱的构建及应用 ## 一、知识图谱的构建 ### 1. 数据采集 - 来源&#xff1a;结构化数据库、半结构化网页、非结构化文本 - 预处…

三星将采用铁电材料实现1000层3D NAND

在2022年的技术日上&#xff0c;三星公布了一项宏伟目标&#xff0c;即到2030年推出层数超过1000层的先进NAND芯片。据Wccftech报道&#xff0c;这家韩国存储巨头似乎正逐步接近这一目标&#xff0c;计划在NAND芯片制造中应用新型“铁电”材料。 最近美国火奴鲁鲁举行的VLSI技术…

Mujoco仿真【将urdf文件转化为xml文件】

最近开始学习mujoco仿真方面的内容 先前写过一篇博客&#xff1a;强化学习&#xff1a;MuJoCo机器人强化学习仿真入门&#xff08;1&#xff09;_mujoco仿真-CSDN博客 简单介绍了mujoco仿真的一些内容&#xff0c;下面想在Mujoco中将urdf转为xml文件&#xff0c;了解到mujoco是…

pikachu靶场通关之csrf漏洞通关教程

目录 CSRF&#xff08;get型&#xff09; 1.打开网站&#xff0c;点击右上角提示 2.登录之后&#xff0c;点击修改个人信息 3.修改上述内容&#xff0c;打开抓包工具 4.抓到修改用户信息的数据包 5.构造虚假url&#xff0c;诱导用户点击 6.弹到修改后的界面 ​编辑 7.返…

windows11 Django环境安装

相关文档 1、验证python和pip3环境 C:\Users\Administrator>python Python 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for…

数据库学习之select语句练习

目录 素材 练习 1、显示所有职工的基本信息。 结果 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 结果 3、求出所有职工的人数。 结果 4、列出最高工和最低工资。 结果 5、列出职工的平均工资和总工资。 结果 6、创建一个只有职…

【LeetCode刷题】136.只出现一次的数字(Ⅰ)

【LeetCode刷题】136.只出现一次的数字&#xff08;Ⅰ&#xff09; 1. 题目&#xff1a;2.思路分析&#xff1a;思路1&#xff1a;一眼异或&#xff01; 1. 题目&#xff1a; 2.思路分析&#xff1a; 思路1&#xff1a;一眼异或&#xff01; 看到题目&#xff0c;如果有一定基…

助力数字农林业发展服务香榧智慧种植,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建香榧种植场景下香榧果实检测识别系统

作为一个生在北方但在南方居住多年的人&#xff0c;居然头一次听过香榧&#xff08;fei&#xff09;这种作物&#xff0c;而且这个字还不会念&#xff0c;查了以后才知道读音&#xff08;fei&#xff09;&#xff0c;三声&#xff0c;这着实引起了我的好奇心&#xff0c;我相信…

在macOS中开发的Django项目部署到局域网的Win10服务器上

由于windows10是日常办公电脑&#xff0c;没有服务器基本环境&#xff0c;部署工程耗费不少时间&#xff0c;记录一下。 1、安装Python 访问Python官方下载页面&#xff1a;Python Downloads&#xff0c;下载适用于Windows的安装程序并按照提示进行安装。开发环境python版本是…

主从Reactor服务器

目录&#xff1a; 目录&#xff1a; 目标&#xff1a; 本文讲解思路&#xff1a; 各模块的功能以及代码&#xff1a; 1.服务器相关模块&#xff1a;服务器模块的功能是对所有的连接以及线程进⾏管理 2.协议相关模块&#xff1a;协议模块是对当前的Reactor模型服务器提供应…

GPT-4o:全面深入了解 OpenAI 的 GPT-4o

GPT-4o&#xff1a;全面深入了解 OpenAI 的 GPT-4o 关于 GPT-4o 的所有信息ChatGPT 增强的用户体验改进的多语言和音频功能GPT-4o 优于 Whisper-v3M3Exam 基准测试中的表现 GPT-4o 的起源追踪语言模型的演变GPT 谱系&#xff1a;人工智能语言的开拓者多模式飞跃&#xff1a;超越…