大作業題(二)
阿新 • • 發佈:2019-01-01
本人大一新生,這是根據老師佈置的作業自己寫的程式碼,有不足之處請指正。
題目描述:
定義並實現一個整數集合類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; }