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

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

时间:2024-02-07 12:31:50浏览次数:27  
标签:count Cassemblage int elem C++ ++ num 集合 模板

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


标签:count,Cassemblage,int,elem,C++,++,num,集合,模板
From: https://blog.51cto.com/u_16532251/9636446

相关文章

  • 蒟蒻的模板
    蒟蒻Rainbow_Automaton的模板\(\text{2023-10}\)备战\(\text{csp-s}\)只是目前会的然而目前啥也不会...代码注意事项不要使用usingnamespacestd;min和max都可以直接std::minstd::max吧关同步#definefastreadstd::ios_sync_with_stdio(false);cin.ti......
  • C++类开发第二篇(浅析构造函数和析构函数)
    class_2构造函数构造函数是一种特殊的成员函数,用于创建和初始化类的对象。它的名称与类的名称相同,没有返回值,也不需要显式调用。在C++中,每个类都必须至少有一个构造函数。当我们创建一个类的对象时,编译器会自动调用构造函数来初始化该对象的成员变量。构造函数可以执行一些操作......
  • c++ function
    可调用对象函数函数指针函数类lamda表达式bind对象函数类重载了函数调用运算符()的类的对象,称为函数对象。classcallable{public:voidoperator()(intx)const{cout<<"callable::operator():"<<x<<endl;}};intmain(){calla......
  • C++编程练习||1.排序函数模板2.函数模板3.重载printArray函数模板
    1.排序函数模板已知主函数如程序后缀代码所示,请为其编写适当的模板函数,使主函数的bubbleSort函数可以对一个整型数组和一个浮点数数组进行输入、排序、输出操作。#include<iostream>#include<iomanip>usingnamespacestd;template<typenameT>voidbubbleSort(T*arr,......
  • c++命名空间
    1.命名空间定义注:命名空间只能在全局变量中定义namespacemystd{intx,y;intmax(inta,intb){returnstd::max(a,b);}}intmain(){inta=10,b=4;std::cout<<mystd::max(a,b);}2.命名空间可以嵌套namespacemystd{......
  • DevC++ 支持c++11
    DevC++支持c11报错解决点击工具,选择编译选项勾选编译时加入一下命令-std=c++11......
  • C++(learning)
     模板宏例子,用于创建get()、set()#defineWELD_ATTACH_INFO_SETGET(T,FUN,VAR)\inlineTget##FUN()const{returnVAR;}\inlinevoidset##FUN(Tt){VAR=t;}WELD_THRESHOLD_SETGET(int,InitId,init_id_) 方便引用#ifndefUSE_PLANDATA#defineUSE_PL......
  • [职场] 插画师简历模板
    一份简历,应该包含求职意向、联系方式、教育背景、实践经历等信息,这些信息能够让用人单位更还得了解到求职者是一个什么样的人,能否胜任这个岗位,那一份用人单位满意的简历应该怎么写,这里就分享一份插画师的简历模板。供大家参考阅读。基本信息院校:蓝山美术学院专业:......
  • Windows下如何使用 Sublime Text 4 配置 C/C++ 环境(使用LSP-clangd)
    1软件安装1.1SublimeText4安装及PackageControl安装略,请自行百度/必应/谷歌。1.2Clang环境安装1.2.1Clang下载在LLVMMinGW下载最新版Clang编译器,此处应根据个人电脑系统及版本选择,本文选择llvm-mingw-20231128-ucrt-x86_64.zip,后续文件名将以此为例。各版本......
  • 有关各种数据结构模板
    FHQ-Treap模板题-普通平衡树#include<bits/stdc++.h>#definelstr[u].l#definerstr[u].rusingnamespacestd;constintN=3e5+10;structNode{intl,r;intkey,v;intsize;}tr[N];introot,idx;intn,m;voidpushup(intu){tr[u].size......