题目:编写一个程序,用于进行集合的并、差和交的运算,例如输入整数集合{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;
}
运行结果: