0
点赞
收藏
分享

微信扫一扫

C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合

1.类模板

 类模板的作用

   使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。

   类模板的声明

   类模板 template <模板参数表> class 类名 {类成员声明};

   如果需要在类模板以外定义其成员函数,则要采用以下的形式: template <模板参数表> 类型名 类名<模板参数标识符列表>::函数名(参数表)

	      #include <iostream>
				#include <cstdlib>
				using namespace std;
				struct Student {
				    int id;       //学号
				    float gpa;    //平均分
				};
				template <class T>
				class Store {//类模板:实现对任意类型数据进行存取
				private:
				    T item; // item用于存放任意类型的数据
				    bool haveValue;  // haveValue标记item是否已被存入内容
				public:
				    Store();
				    T &getElem();   //提取数据函数
				    void putElem(const T &x);  //存入数据函数
				};

				template <class T>
				Store<T>::Store(): haveValue(false) { }
				template <class T>
				T &Store<T>::getElem() {
				    //如试图提取未初始化的数据,则终止程序
				    if (!haveValue) {
				        cout << "No item present!" << endl;
				        exit(1);    //使程序完全退出,返回到操作系统。
				    }
				    return item;        // 返回item中存放的数据
				}
				template <class T>
				void Store<T>::putElem(const T &x) {
				    // 将haveValue 置为true,表示item中已存入数值
				    haveValue = true;
				    item = x;           // 将x值存入item
				}

				int main() {
				    Store<int> s1, s2;
				    s1.putElem(3);
				    s2.putElem(-7);
				    cout << s1.getElem() << "  " << s2.getElem() << endl;

				    Student g = { 1000, 23 };
				    Store<Student> s3;
				    s3.putElem(g);
				    cout << "The student id is " << s3.getElem().id << endl;

				    Store<double> d;
				    cout << "Retrieving object D... ";
				    cout << d.getElem() << endl;
				    //d未初始化,执行函数D.getElement()时导致程序终止
				    return 0;
				}

运行结果:

C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合_类模板


2.整数集合类

实现整数集合类

   要求:1、类中含两个私有变量,集合中元素的个数和集合中元素组成的数组。

         2、用Set函数输入,Show函数输出结果(按从小到大的顺序输出各个元素)。

         3、实现运算符+的重载,表示两个集合的并集。

            实现运算符&的重载,表示两个集合的交集。

            实现运算符-的重载,表示两个集合的差。

   提示:1、集合中不可出现重复元素。

         2、空集时,输出empty。

   样例1

    输入

     3

     1 2 3

     4

     1 2 5 6

    输出

     1 2 3 5 6

     1 2

     3

   样例2

    输入

     3

     1 2 3

     3

     1 2 3

    输出

     1 2 3

     1 2 3

     empty

#include <iostream>

using namespace std;

class Cassemblage {
	private:
		int num[1000];
		int count;
	public:
		Cassemblage() : count(0) {};

		void Set(int *c_num, int c_count);

		Cassemblage operator+ (Cassemblage &c);

		Cassemblage operator& (Cassemblage &c);

		Cassemblage operator- (Cassemblage &c);

		void Show();

};

void Cassemblage::Set(int *c_num, int c_count) {
	// 初始对象
	for (int i = 0; i < c_count; i++) {
		if (count == 0) {
			num[count++] = c_num[i];
		} else {
			int flag = 1;
			for (int j = 0; j < count; j++) {
				if (c_num[i] == num[j]) {
					flag = 0;
					continue;
				}
			}
			if (flag) {
				num[count++] = c_num[i];
			}
		}
	}
	// 对象元素排序
	for (int i = 0; i < count; i++) {
		for (int j = 1; j < (count - i); j++) {
			if (num[j] < num[j-1]) {
				int temp = num[j];
				num[j] = num[j-1];
				num[j-1] = temp;
			}
		}
	}
}

Cassemblage Cassemblage::operator+ (Cassemblage &c) {
	Cassemblage t;
	int t_num[1000], t_count = 0;
	for (int i = 0; i < count; i++) {
		t_num[t_count++] = num[i];
	}
	for (int i = 0; i < c.count; i++) {
		t_num[t_count++] = c.num[i];
	}
	t.Set(t_num, t_count);
	return t;
}

Cassemblage Cassemblage::operator& (Cassemblage &c) {
	Cassemblage t;
	int t_num[1000], t_count = 0;
	for (int i = 0; i < count; i++) {
		for (int j = 0; j < c.count; j++) {
			if(num[i] == c.num[j]) {
				t_num[t_count++] = num[i];
			}
		}
	}
	t.Set(t_num, t_count);
	return t;
}

Cassemblage Cassemblage::operator- (Cassemblage &c) {
	Cassemblage t;
	int t_num[1000], t_count = 0;
	for (int i = 0; i < count; i++) {
		int flag = 1;
		for (int j = 0; j < c.count; j++) {
			if(num[i] == c.num[j]) {
				flag = 0;
			}
		}
		if (flag) {
			t_num[t_count++] = num[i];
		}
	}
	t.Set(t_num, t_count);
	return t;
}

void Cassemblage::Show() {
	if (count != 0) {
		for (int i = 0; i < count; i++) {
			cout << num[i] << " ";
		}
	} else {
		cout << "empty";
	}
}

int main(int argc, char* argv[]) {
	Cassemblage z1, z2, x1, x2, x3;
	int i, n1, n2, a1[1000], a2[1000];

	cin >> n1;
	for(i=0; i<n1; i++) {
		cin >> a1[i];
	}
	z1.Set(a1, n1);

	cin >> n2;
	for(i=0; i<n2; i++) {
		cin >> a2[i];
	}
	z2.Set(a2, n2);


	x1=z1+z2;
	x1.Show();
	cout << endl;

	x2=z1&z2;
	x2.Show();
	cout << endl;

	x3=z1-z2;
	x3.Show();


	return 0;
}

运行结果:

C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合_数据_02

C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合_数据_03


3.复数集合类,模板结合

实现复数集合类

   要求:1、实现两个类:集合类(Cassemblage )和复数类(Cmycomplex)。

         2、输入:分别输入集合中元素个数和元素(实部和虚部)。

         3、输出:按照复数模的大小从小到大输出,不考虑两个复数模相等的情况。

            当为空集时,输出empty。

            对于复数虚部为负时,输出形如(1-1i)。

         4、集合中不能出现相同元素。

         5、实现集合的并(+)、交(&)、差(-)。

   样例1:

    输入

     3

     1 2

     2 4

     1 -1

     4

     1 3

     2 4

     2 2

     1 2

    输出

     (1-1i) (1+2i) (2+2i) (1+3i) (2+4i)

     (1+2i) (2+4i)

     (1-1i)

   样例2:

    输入

     3

     1 2

     2 4

     3 2

     3

     1 2

     2 4

     3 2

    输出

     (1+2i) (3+2i) (2+4i)

     (1+2i) (3+2i) (2+4i)

     empty

#include <iostream>
#include <cmath>

using namespace std;

class Cmycomplex {
	private:
		double a;
		double b;
	public:
		Cmycomplex(int c_a = 0, int c_b = 0) : a(c_a), b(c_b) {};

		void Set(int c_a, int c_b);
		
		double getA();
		
		double getB();

		friend istream& operator>> (istream& in, Cmycomplex& cc);

		friend ostream& operator<< (ostream& out, const Cmycomplex& cc);
		
		int operator== (Cmycomplex &cc);

};

void Cmycomplex::Set(int c_a, int c_b) {
	a = c_a;
	b = c_b;
}

double Cmycomplex::getA() {
	return a;
}

double Cmycomplex::getB() {
	return b;
}

istream& operator>> (istream& in, Cmycomplex& cc) {
	in >> cc.a >> cc.b;
	return in;
}

ostream& operator<< (ostream& out, const Cmycomplex& cc) {
	if (cc.b < 0) {
		out << "(" << cc.a << cc.b << "i)";
	} else {
		out << "(" << cc.a << "+" << cc.b << "i)";
	}
	return out;
}

int Cmycomplex::operator==(Cmycomplex &cc) {
	if (a == cc.a && b == cc.b) {
		return 1;
	} else {
		return 0;
	}
}


template <class T>
class Cassemblage {
	private:
		T elem[1000];
		int count;

	public:
		Cassemblage() : count(0) {};
		
		void Set(T *c_elem, int c_count);

		Cassemblage operator+ (Cassemblage &c);

		Cassemblage operator& (Cassemblage &c);

		Cassemblage operator- (Cassemblage &c);

		void Show();
		
};

template <class T>
void Cassemblage<T>::Set(T *c_elem, int c_count) {
	// 初始对象
	for (int i = 0; i < c_count; i++) {
		if (count == 0) {
			elem[count++] = c_elem[i];
		} else {
			int flag = 1;
			for (int j = 0; j < count; j++) {
				if (c_elem[i] == elem[j]) {
					flag = 0;
					continue;
				}
			}
			if (flag) {
				elem[count++] = c_elem[i];
			}
		}
	}
	// 对象元素排序
	for (int i = 0; i < count; i++) {
		for (int j = 1; j < (count - i); j++) {
			if ((elem[j].getA() * elem[j].getA() + elem[j].getB() * elem[j].getB()) < ((elem[j-1].getA() * elem[j-1].getA() + elem[j-1].getB() * elem[j-1].getB()))) {
				T temp = elem[j];
				elem[j] = elem[j-1];
				elem[j-1] = temp;
			}
		}
	}
}

template <class T>
Cassemblage<T> Cassemblage<T>::operator+ (Cassemblage &c) {
	Cassemblage<T> t;
	T t_elem[1000];
	int t_count = 0;
	for (int i = 0; i < count; i++) {
		t_elem[t_count++] = elem[i];
	}
	for (int i = 0; i < c.count; i++) {
		t_elem[t_count++] = c.elem[i];
	}
	t.Set(t_elem, t_count);
	return t;
}

template <class T>
Cassemblage<T> Cassemblage<T>::operator& (Cassemblage &c) {
	Cassemblage<T> t;
	T t_elem[1000];
	int t_count = 0;
	for (int i = 0; i < count; i++) {
		for (int j = 0; j < c.count; j++) {
			if(elem[i] == c.elem[j]) {
				t_elem[t_count++] = elem[i];
			}
		}
	}
	t.Set(t_elem, t_count);
	return t;
}

template <class T>
Cassemblage<T> Cassemblage<T>::operator- (Cassemblage &c) {
	Cassemblage<T> t;
	T t_elem[1000];
	int t_count = 0;
	for (int i = 0; i < count; i++) {
		int flag = 1;
		for (int j = 0; j < c.count; j++) {
			if(elem[i] == c.elem[j]) {
				flag = 0;
			}
		}
		if (flag) {
			t_elem[t_count++] = elem[i];
		}
	}
	t.Set(t_elem, t_count);
	return t;
}

template <class T>
void Cassemblage<T>::Show() {
	if (count != 0) {
		for (int i = 0; i < count; i++) {
			cout << elem[i] << " ";
		}
	} else {
		cout << "empty";
	}
}

int main() {

	Cassemblage <Cmycomplex> z1, z2, x1, x2, x3;
	int i, n1, n2;
	Cmycomplex a1[1000], a2[1000];

	cin >> n1;
	for(i=0; i<n1; i++) {
		cin >> a1[i];
	}
	z1.Set(a1, n1);

	cin >> n2;
	for(i=0; i<n2; i++) {
		cin >> a2[i];
	}
	z2.Set(a2, n2);


	x1=z1+z2;
	x1.Show();
	cout << endl;

	x2=z1&z2;
	x2.Show();
	cout << endl;

	x3=z1-z2;
	x3.Show();

	return 0;
}

运行结果:

C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合_c++_04

C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合_整数类_05


举报

相关推荐

C++提高编程---模板---类模板

0 条评论