1. 程式人生 > >大作業題(二)

大作業題(二)

本人大一新生,這是根據老師佈置的作業自己寫的程式碼,有不足之處請指正。
題目描述:
定義並實現一個整數集合類int_set,集合類中cur_size表明當前集合中有幾個整數,集合中最多含max_size個整數,存放集合元素的陣列是動態的。要求提供的方法有:
(1)增加一個整數到集合中;
(2)從集合中去掉一個元素;
(3)判斷一個元素是否在集合中;
(4)過載<<運算子,輸入集合;過載>>運算子輸出集合;
(5)分別實現集合的交、並、差運算。
 

標頭檔案:int_set.h

 

#ifndef _INT_SET_H_
#define _INT_SET_H_
#include <iostream>
using std::ostream;
using std::istream;
class int_set {
private:
	int max_size;
	int cur_size;
	int* set;
public:
	int_set();//集合類的預設建構函式
	int_set(int _max_size);//帶一個引數的集合類的建構函式
	int_set(const int_set&);//集合類的複製建構函式
	~int_set();//集合類的解構函式
	bool insert(int);//增加一個整數到集合中
	bool erase(int);//從集合中去掉一個元素
	int contain(int) const;//判斷一個元素是否在集合中,返回-1,證明不存在,否則返回該元素的下標
	void operator =(const int_set &);//賦值號的過載
	friend ostream & operator << (ostream&, const int_set&);//過載提取(<<)運算子
	friend istream & operator >> (istream&, int_set&);//過載插入(>>)運算子
	int_set operator *(const int_set &);//交集運算子號,求一個集合與另一個集合的交集
	int_set operator +(const int_set &);//並集運算子號,求一個集合與另一個集合的並集
	int_set operator -(const int_set &);//差集運算子號,求一個集合與另一個集合的差集
};
#endif

 

類的實現:int_set.cpp

 

#include "int_set.h"
#include <string>
#include <sstream>
using std::string;
using std::stringstream;
using std::getline;
using std::cout;
using std::cin;
using std::endl;
int_set::int_set():max_size(100) , cur_size(0) {//集合類的預設建構函式
	set = new int[max_size]();
}
int_set::int_set(int _max_size):max_size(_max_size), cur_size(0) {//帶一個引數的集合類的建構函式
	set = new int[max_size]();
}
int_set::int_set(const int_set &s):max_size(s.max_size), cur_size(s.cur_size) {//集合類的複製建構函式
	set = new int[max_size]();
	int i;
	for (i = 0; i < cur_size; i++) set[i] = s.set[i];
}
int_set::~int_set() {//集合類的解構函式
	delete[] set;
}
bool int_set::insert(int v) {//增加一個整數到集合中
	if (cur_size + 1 > max_size) {
		cout << "集合已經達到最大儲存限度,插入" << v << "失敗。" << endl;
		return false;
	}
	if (contain(v) != -1) return true;
	if (cur_size == 0) {
		set[0] = v;
		cur_size++;
		return true;
	}
	int i, j = cur_size;
	for (i = 0; set[i] < v&&i < cur_size; i++);
	for (; j > i; j--) set[j] = set[j - 1];
	set[i] = v;
	cur_size++;
	return true;
}
bool int_set::erase(int v) {//從集合中去掉一個元素
	if (contain(v) == -1) {
		cout << "集合中不存在" << v << "元素" << endl;
		return false;
	}
	int i = contain(v);
	for (; i < cur_size; i++) set[i] = set[i + 1];
	set[cur_size] = 0;
	cur_size--;
	return true;
}
int int_set::contain(int v) const {//判斷一個元素是否在集合中,返回-1,證明不存在,否則返回該元素的下標
	int i;
	for (i = 0; i < cur_size; i++)
		if (set[i] == v) break;
	if (i == cur_size) return -1;
	return i;
}
void int_set::operator=(const int_set &s) {//賦值號的過載
	delete[] set;
	max_size = s.max_size;
	cur_size = s.cur_size;
	set = new int[max_size]();
	int i;
	for (i = 0; i < cur_size; i++) set[i] = s.set[i];
}
ostream & operator<<(ostream & out, const int_set & s) {//過載提取(<<)運算子
	int i;
	for (i = 0; i < s.cur_size; i++) out << s.set[i] << ' ';
	out << endl;
	return out;
}
istream & operator>>(istream & in, int_set & s) {//過載插入(>>)運算子
	string str;
	getline(in, str);
	stringstream sstream(str);
	int v;
	while (sstream >> v) s.insert(v);
	return in;
}
int_set int_set::operator*(const int_set &s) {//int_set類的交集運算
	int max = (max_size > s.max_size) ? max_size : s.max_size;
	int_set b(max);//建立一個空集合b
	int i;
	for (i = 0; i < cur_size; i++)//遍歷原集合中的元素,如果原集合中的某個元素在s集合中存在,那麼向b中插入這元素
		if (s.contain(set[i]) != -1)
			b.insert(set[i]);
	return b;
}
int_set int_set::operator+(const int_set &s) {//int_set類的並集運算
	int max = max_size + s.max_size;
	int_set b(max);//建立一個空的集合b
	int i;
	for (i = 0; i < s.cur_size; i++) //遍歷兩個集合,向b中插入兩個集合中的元素
		b.insert(s.set[i]);
	for (i = 0; i < cur_size; i++)
		b.insert(set[i]);
	return b;
}
int_set int_set::operator-(const int_set &s) {//int_set類的差集運算
	//差集的求法,將原集合中包含的s集合的元素刪去
	int_set b = *this;
	int i;
	for (i = cur_size - 1; i != -1; i--)
		if (s.contain(set[i]) != -1) b.erase(set[i]);
	return b;
}

 

測試程式:main.cpp

 

#include "int_set.h"
using std::cout;
using std::cin;
int main() {
	int_set set1, set2, set3;
	cout << "給定一個集合set1,它的預設元素為1,2,7,9\n";
	cout << "給定一個集合set2,它的預設元素為8,9,10\n";
	set1.insert(1);
	set1.insert(2);
	set1.insert(7);
	set1.insert(9);
	set2.insert(8);
	set2.insert(9);
	set2.insert(10);
	cout << "下面除錯運算子>>\n";
	cout << "輸入一個集合set3\n";
	cin >> set3;
	cout << "下面除錯運算子<<\n";
	cout << "set1的元素為" << set1;
	cout << "set2的元素為" << set2;
	cout << "set3的元素為" << set3;
	cout << "除錯並集(+)運算子:求set1和set3的並集,結果儲存在set4中\n";
	int_set set4 = set3 + set1;
	cout << "set4的元素為" << set4;
	cout << "除錯交集(*)運算子:求set2和set1的交集,結果儲存在set4中\n";
	set4 = set1 * set2;
	cout << "set4的元素為" << set4;
	cout << "除錯差集(-)運算子:求set3和set2的差集,結果儲存在set4中\n";
	set4 = set3 - set2;
	cout << "set4的元素為" << set4;
	return 0;
}