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;
}



运行结果:




  • 10
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值