1. 程式人生 > >c++專案--集合的並差交綜合運算

c++專案--集合的並差交綜合運算

題目:編寫一個程式,用於進行集合的並、差和交的運算,例如輸入整數集合{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;
}

執行結果: