c++專案--集合的並差交綜合運算
阿新 • • 發佈:2019-02-07
題目:編寫一個程式,用於進行集合的並、差和交的運算,例如輸入整數集合{9,5 ,4,3, 6, 7 }和{ 2, 4 ,6 ,9 },計算出它們進行集合的並、差和交運算後的結果。
使用軟體:vs2013
注意:vs2013會將Enter 和 ctrl+Z作為標準輸入流結束,而vs2015不能將Enter作為標準輸入流結束,可以將ctrl + Z作為結束,但是不能再進行輸入,就算是重新啟用cin也不行。所以推薦使用vs2013來編寫這個程式。
----當用戶使用ctrl + z來結束輸入,則表示標準輸入檔案以及讀入完,所以以後的cin失效了(不進行輸入,直接跳過)。所以必須執行
cin.clear();
cin.sync();
來重新啟動cin
存在的不足:使用者輸入的集合也許不滿足集合的規則。比如:有相同的元素。另外本程式沒有考慮空集的情況。過段時間再來改進。
用到的檔案:
源.cpp:
#include <iostream> using namespace std; #define M 50 #include "class.h" int main() { cout << "輸入集合s1\n"; Set s1; cout << "輸入集合s2\n"; cin.clear(); //重新啟用標準輸入 cin.sync(); Set s2; Set s3(0); cout << "\n----------------"; cout << "\n集合1\n"; s1.show(); cout << "\n集合2\n"; s2.show(); cout << "\n----------------\n"; cout << "\n--集合1∪集合2\n"; s3 = s1 + s2; s3.show(); cout << "\n--集合1-集合2\n"; s3 = s1 - s2; s3.show(); cout << "\n--集合1∩集合2\n"; s3 = s1*s2; s3.show(); cout << "\n"; system("pause"); return 0; }
class.h:
#pragma once class Set { public: Set();//初始化集合 17行 Set(int i);//不進行初始化,int i只用於區別set() 62 void show();//輸出集合 29 Set operator+(Set &);//集合的並運算 36 Set operator-(Set &);//集合的差運算 66 Set operator*(Set &);//集合的交運算 100 private: int set[M]; int num;//用於計數集合的數字個數 }; Set::Set() { FILE* fp = stdin;//定義一個檔案指標指向標準輸入 num = 0; cout << "使用Ctrl + Z結束輸入\n"; for (int i = 0; i < M; i++) { if (fp->_cnt == 1)break;//如果當前位置為1,則說明使用者輸入的內容已經讀入完成 cin >> set[i]; num++; } } void Set::show() { for (int i = 0; i < num; i++) { cout << set[i] << ' '; } } Set Set::operator+(Set &s2) { Set temp(0);//將計算結果新增到這個物件 temp = s2;//將s2集合所有元素賦值給temp集合 int sign;//作為標誌 int number = 0; for (int i = 0; i<num; i++) { sign = 1;//表示可以將set[i]新增到s2.set[]中 for (int j = 0; j < s2.num; j++) { if (set[i] == s2.set[j]) { sign = 0;//表示元素有重複,不能新增 break; } } if (sign) { number++; temp.set[number + s2.num -1] = set[i]; } } temp.num = number + s2.num; return temp; } inline Set::Set(int i) { } Set Set::operator-(Set &S2) { Set T(0);//將計算結果新增到這個物件 int *p = new int[num];//用記錄兩個集合公有元素的下標 int *ptemp = p;//用於移動,不改變原來p的指向,用於ptemp指標歸位 int number = 0; for (int i = 0; i < S2.num; i++) { for (int j = 0; j < num; j++) { if (S2.set[i] == set[j]) { *(ptemp++) = j;//將下標記錄 break; } } *ptemp = -1;//將-1作為下標結束的標誌,因為下標沒有-1 } for (int i = 0; i < num; i++) { ptemp = p;//將指標ptemp恢復原來的指向 while (*(ptemp) != -1) { if (i == *(ptemp)) goto NEXT;//下標相同,則退出迴圈,跳過儲存 ptemp++; } T.set[number++] = set[i]; NEXT: ; } T.num = number; //T集合的元素個數 delete []p; return T; } Set Set::operator*(Set &S2) { Set T(0);//將計算結果新增到這個物件 int *p = new int[num];//用記錄兩個集合公有元素的下標 int *ptemp = p;//用於移動,不改變原來p的指向,使用者ptemp歸位 int number = 0; for (int i = 0; i < S2.num; i++) { for (int j = 0; j < num; j++) { if (S2.set[i] == set[j]) { *(ptemp++) = j;//將下標記錄 break; } } *ptemp = -1;//將-1作為下標結束的標誌,因為下標沒有-1 } for (int i = 0; i < num; i++) { ptemp = p;//將指標ptemp恢復原來的指向 while (*(ptemp) != -1) { if (i == *(ptemp)) { T.set[number++] = set[i]; break; }//下標相同,則儲存並退出迴圈 ptemp++; } } T.num = number; //T集合的元素個數 delete[]p; return T; }
執行結果: