iT邦幫忙

0

C++取交集取聯集

#include <iostream>
using namespace std;

class IntegerSet{
	public:
		IntegerSet(int);
		~IntegerSet(){};
		IntegerSet Union_of_Set(IntegerSet);
		IntegerSet Intersection_of_Set(IntegerSet);
		void InsertElement(int);
		void DeleteElement(int);
		bool isEqualTo(IntegerSet);
		void printSet();
	private:
		bool set[100];
		int size;
};

IntegerSet::IntegerSet(int count){
	this->size =count;
	for (int i=0;i<count;i++)
	{
		IntegerSet::set[i]=false;
	}
}
//為什麼要用this,不能用size=count嗎? 
//為什麼可以知道size=6
//為什麼 IntegerSet::set[i]=false; 這行要打integerSet::
//這個for迴圈是做什麼? 

IntegerSet IntegerSet::Union_of_Set(IntegerSet set2){ 
	IntegerSet union_of_set(100);
	for (int i=0; i<size; i=i+1){
		if (this->set[i]==true or set2.set[i] == true){
			union_of_set.InsertElement(i);
		}
	}
	return union_of_set;
}
//這裡的for迴圈表示什麼阿

IntegerSet IntegerSet::Intersection_of_Set(IntegerSet set2){ 
	IntegerSet intersection_of_set(100);
	for (int i=0; i<size; i=i+1){
		if (this->set[i]==true and set2.set[i] == true){
			intersection_of_set.InsertElement(i);
		}
	}
	return intersection_of_set;
}

void IntegerSet::InsertElement(int index){
	set[index] = true;
}

void IntegerSet::DeleteElement(int index){
	set[index] = false;
}

bool IntegerSet::isEqualTo(IntegerSet set2){
	for (int index=0; index<size; index++){
		if (this->set[index] != set2.set[index] ){
			return false;
		}
	}
	return true;
}

void IntegerSet::printSet(){
	for (int index=0; index<size; index++){
		if (set[index] == true){
			cout << index << '_';
		}
	}
}






int main()
{ 
	int insert_1,insert_2,insert_3,insert_4,insert_5,insert_6;
	IntegerSet testset1(100),testset2(100),testset3(100),testset4(100);
	
	cin >> insert_1 >> insert_2 >>insert_3 >>insert_4 >> insert_5 >>insert_6;
	
    testset1.InsertElement(insert_1);
    testset1.InsertElement(insert_2);
    testset1.InsertElement(insert_3);
    testset1.InsertElement(insert_4);
    testset1.InsertElement(insert_5);
    testset1.InsertElement(insert_6);
    testset1.printSet();
    cout<< endl;
    
    testset2.InsertElement(3);
    testset2.InsertElement(5);
    testset2.InsertElement(6);
    testset2.InsertElement(8);
    testset2.InsertElement(9);
    testset2.InsertElement(44);
    testset2.printSet();
    cout<< endl;
    
    testset3 = testset1.Union_of_Set(testset2);
    testset3.printSet();
    cout<< endl;
    
    testset4 = testset1.Intersection_of_Set(testset2);
    testset4.printSet();
    cout<< endl;
    
    if (testset1.isEqualTo(testset2)){
    	cout << 1 << endl;
	}
	else{
		cout << 0 << endl;
	}
    return 0;
}

非常感謝!

淺水員 iT邦新手 3 級 ‧ 2019-04-01 17:45:24 檢舉
main 裡面都是把 size 設為 100 個,至於只會印出 6 個是因為 printSet 掃描過這 100 個元素時,只印出 set 被設為 true 的那幾個。

1 個回答

1
海綿寶寶
iT邦超人 1 級 ‧ 2019-04-02 09:31:59
最佳解答

題目是:取交集聯集
如果用人工智慧來解題,大概會寫這樣,再用肉眼判斷
https://ithelp.ithome.com.tw/upload/images/20190402/20001787uvKOhdTMC2.png
而這裡的程式的做法是
先準備大小為100的陣列(型態為bool)
並且將全部設值為 false,如下M1
https://ithelp.ithome.com.tw/upload/images/20190402/20001787M6oGyx9R9U.png
然後用 TRUE 來表示有該數字,以 1,2,3,4,5,6 為例如下M2
https://ithelp.ithome.com.tw/upload/images/20190402/20001787Tinck0Ty6L.png
所以可以得到題目以下(為了好看,用 V 代表 True,空白代表 False)
https://ithelp.ithome.com.tw/upload/images/20190402/20001787JkRYLvPEfu.png
最後是計算聯集和交集
聯集就是「從元素0到元素99,上下兩者只要有一個是V就設成 True」M3
交集就是「從元素0到元素99,上下兩者兩個都要是V才設成 True」M4
處理後得到結果如下
https://ithelp.ithome.com.tw/upload/images/20190402/20001787Y56j8VyQRW.png

做完收工放飯

M1:IntegerSet::IntegerSet(int count),
M2:void IntegerSet::InsertElement(int index)
M3:IntegerSet IntegerSet::Union_of_Set(IntegerSet set2)
M4:IntegerSet IntegerSet::Intersection_of_Set(IntegerSet set2)
另外有幾個函式
void IntegerSet::DeleteElement(int index):刪掉一個數字(eg.設為 False)
bool IntegerSet::isEqualTo(IntegerSet set2):比對兩個陣列是否相同
void IntegerSet::printSet():印出數字(eg.只印 True 的部份)

sunnyyeh iT邦新手 5 級 ‧ 2019-04-13 22:59:21 檢舉

謝謝你超詳細的解說!!!
真的很感謝您~~~~

問題解決就好
週末愉快
/images/emoticon/emoticon01.gif

sunnyyeh iT邦新手 5 級 ‧ 2019-04-15 22:16:15 檢舉

每次都麻煩您 真的很感謝也很不好意思QQ
萬分謝謝您!!

我要發表回答

立即登入回答