集合的基本运算: 依据集合运算规则,实现任意给定两个集合的交、并、差、笛卡儿积运算,和第一个集合的幂集,并显示运算结果。
来源:互联网 发布:数据营销有哪些 编辑:程序博客网 时间:2024/04/29 01:06
#include<iostream>
#include <cstring>
using namespace std;
struct s{ //定义用来表示集合的数据类型
int length; //集合的元素数
char *elem; //集合的元素
};
char p[100];
class Operators //集合运算类
{
public:
s Input();
void Show(s A);
s Intersect(s A, s B);
s Union(s A, s B);
s Except(s A, s B);
void GetPowerSet(int i,s A);
void Descartes(s A, s B);
private:
void Sort(s A);
};
s Operators::Input()//集合的输入
{ s A;
cout << "请输入数组元素的个数:" << endl;
cin >> A.length;
A.elem = new char[A.length];
cout << "请输入" << A.length << "个元素:" << endl;
for(int i=0; i<A.length; i++){
cin >> A.elem[i];
}
return A;
}
s Operators::Intersect(s A, s B)//交集
{
s C;
int k,i,j;
C.length = A.length>B.length?B.length:A.length;
C.elem = new char[C.length];
k=0;
for( i=0; i<A.length; i++){
for( j=0; j<B.length; j++){
if(A.elem[i]==B.elem[j]){
C.elem[k]=B.elem[j];
k++;
break;
}
}
}
C.length=k;
return C;
}
s Operators::Union(s A, s B)//并集
{
s C;
int i, j, k; //k用来标记C中所赋值元素的个数
bool flag; //标志位
k=0;
C.length = A.length+B.length;
C.elem = new char[C.length];
for( i=0; i<A.length; i++){
C.elem[i] = A.elem[i];
k++;
}
for(j=0; j<B.length; j++){
flag=1;
for(i=0; i<A.length; i++){
if(B.elem[j]==A.elem[i]){
flag=0;
break;
}
}
if(flag){
C.elem[k]=B.elem[j];
k++;
}
}
C.length = k;
return C;
}
s Operators::Except(s A, s B)//差集
{
s C;
int i, j, k; //k用来标记C中所赋值元素的个数
bool flag;
C.length = A.length;
C.elem = new char[C.length];
k=0;
for(i=0; i<A.length; i++){
flag=1;
for(j=0; j<B.length; j++){
if(B.elem[j]==A.elem[i]){
flag=0;
break;
}
}
if(flag){
C.elem[k]=A.elem[i];
k++;
}
}
C.length = k;
return C;
}
void Operators::Descartes(s A, s B)//笛卡尔积
{
cout << "{";
for(int i=0; i<A.length; i++){
for(int j=0; j<B.length; j++){
cout << "<" << A.elem[i] << "," << B.elem[j] << ">" << " ";
}
}
cout << "}" << endl;
}
void Operators::Show(s A)
{
cout << "{ ";
for(int i=0;i<A.length;i++){
cout << A.elem[i] << " ";
}
cout << "}" << endl;
}
void Operators::GetPowerSet(int i,s A)//幂集
{
int x;
int k=0;
int len = A.length;
if(i >= len)
{
if(p[0]!=0)
cout <<"{" <<p<<"}"<<" ";
else
cout << "{}" << endl; // 表示空集
}
else
{
x = A.elem[i];
k = strlen(p);
p[k] = x;
GetPowerSet(i+1, A);
p[k] = 0;
GetPowerSet(i+1, A);
}
}
int main()
{
Operators o;
s X,Y,R;
cout<<"请输入集合X"<<endl;
X = o.Input();
cout<<"请输入集合Y"<<endl;
Y = o.Input();
cout << "集合X∩Y=";
R = o.Intersect(X,Y);
o.Show(R);
cout << "集合X∪Y=";
R = o.Union(X,Y);
o.Show(R);
cout << "集合X-Y=";
R = o.Except(X,Y);
o.Show(R);
cout << "集合Y-X=";
R = o.Except(Y,X);
o.Show(R);
cout << "集合X*Y=";
o.Descartes(X,Y);
cout<<"集合X的幂集= ";
cout<<"{";
o.GetPowerSet(0,X);
cout<<"}";
#include <cstring>
using namespace std;
struct s{ //定义用来表示集合的数据类型
int length; //集合的元素数
char *elem; //集合的元素
};
char p[100];
class Operators //集合运算类
{
public:
s Input();
void Show(s A);
s Intersect(s A, s B);
s Union(s A, s B);
s Except(s A, s B);
void GetPowerSet(int i,s A);
void Descartes(s A, s B);
private:
void Sort(s A);
};
s Operators::Input()//集合的输入
{ s A;
cout << "请输入数组元素的个数:" << endl;
cin >> A.length;
A.elem = new char[A.length];
cout << "请输入" << A.length << "个元素:" << endl;
for(int i=0; i<A.length; i++){
cin >> A.elem[i];
}
return A;
}
s Operators::Intersect(s A, s B)//交集
{
s C;
int k,i,j;
C.length = A.length>B.length?B.length:A.length;
C.elem = new char[C.length];
k=0;
for( i=0; i<A.length; i++){
for( j=0; j<B.length; j++){
if(A.elem[i]==B.elem[j]){
C.elem[k]=B.elem[j];
k++;
break;
}
}
}
C.length=k;
return C;
}
s Operators::Union(s A, s B)//并集
{
s C;
int i, j, k; //k用来标记C中所赋值元素的个数
bool flag; //标志位
k=0;
C.length = A.length+B.length;
C.elem = new char[C.length];
for( i=0; i<A.length; i++){
C.elem[i] = A.elem[i];
k++;
}
for(j=0; j<B.length; j++){
flag=1;
for(i=0; i<A.length; i++){
if(B.elem[j]==A.elem[i]){
flag=0;
break;
}
}
if(flag){
C.elem[k]=B.elem[j];
k++;
}
}
C.length = k;
return C;
}
s Operators::Except(s A, s B)//差集
{
s C;
int i, j, k; //k用来标记C中所赋值元素的个数
bool flag;
C.length = A.length;
C.elem = new char[C.length];
k=0;
for(i=0; i<A.length; i++){
flag=1;
for(j=0; j<B.length; j++){
if(B.elem[j]==A.elem[i]){
flag=0;
break;
}
}
if(flag){
C.elem[k]=A.elem[i];
k++;
}
}
C.length = k;
return C;
}
void Operators::Descartes(s A, s B)//笛卡尔积
{
cout << "{";
for(int i=0; i<A.length; i++){
for(int j=0; j<B.length; j++){
cout << "<" << A.elem[i] << "," << B.elem[j] << ">" << " ";
}
}
cout << "}" << endl;
}
void Operators::Show(s A)
{
cout << "{ ";
for(int i=0;i<A.length;i++){
cout << A.elem[i] << " ";
}
cout << "}" << endl;
}
void Operators::GetPowerSet(int i,s A)//幂集
{
int x;
int k=0;
int len = A.length;
if(i >= len)
{
if(p[0]!=0)
cout <<"{" <<p<<"}"<<" ";
else
cout << "{}" << endl; // 表示空集
}
else
{
x = A.elem[i];
k = strlen(p);
p[k] = x;
GetPowerSet(i+1, A);
p[k] = 0;
GetPowerSet(i+1, A);
}
}
int main()
{
Operators o;
s X,Y,R;
cout<<"请输入集合X"<<endl;
X = o.Input();
cout<<"请输入集合Y"<<endl;
Y = o.Input();
cout << "集合X∩Y=";
R = o.Intersect(X,Y);
o.Show(R);
cout << "集合X∪Y=";
R = o.Union(X,Y);
o.Show(R);
cout << "集合X-Y=";
R = o.Except(X,Y);
o.Show(R);
cout << "集合Y-X=";
R = o.Except(Y,X);
o.Show(R);
cout << "集合X*Y=";
o.Descartes(X,Y);
cout<<"集合X的幂集= ";
cout<<"{";
o.GetPowerSet(0,X);
cout<<"}";
}
补充:
回溯法与树的遍历
求含n个元素的集合的幂集: 集合A的幂集是由集合A的所有子集所组成的集合。如:A = {1,2,3},则A的幂集p(A) = {{1,2,3}, {1,2}, {1,3}, {1}, {2,3}, {2}, {2}, 空集} 求幂集p(A)的元素的过程可看成是依次对集合A中元素进行“取”或“舍”的过程,并且可用一棵二叉树来表示过程中幂集元素的状态变化状况。 树中根结点表示幂集元素的初始状态(为空集); 叶子结点表示它的终结状态; 而第i(i=2,3,...,n-1)层的分支结点,则表示已对集合A中前i-1个元素进行了取/舍处理的当前状态(左分支表示“取”,右分支表示“舍”)。
如下图所示:
求含n个元素的集合的幂集: 集合A的幂集是由集合A的所有子集所组成的集合。如:A = {1,2,3},则A的幂集p(A) = {{1,2,3}, {1,2}, {1,3}, {1}, {2,3}, {2}, {2}, 空集} 求幂集p(A)的元素的过程可看成是依次对集合A中元素进行“取”或“舍”的过程,并且可用一棵二叉树来表示过程中幂集元素的状态变化状况。 树中根结点表示幂集元素的初始状态(为空集); 叶子结点表示它的终结状态; 而第i(i=2,3,...,n-1)层的分支结点,则表示已对集合A中前i-1个元素进行了取/舍处理的当前状态(左分支表示“取”,右分支表示“舍”)。
如下图所示:
0 0
- 集合的基本运算: 依据集合运算规则,实现任意给定两个集合的交、并、差、笛卡儿积运算,和第一个集合的幂集,并显示运算结果。
- 集合的并、交和差运算
- 集合的交 并 差 补 运算
- 集合的交、并、差运算
- multiset集合容器的集合运算:并、交、差
- 集合的并、交和差运算的程序
- 集合交、并、差运算
- 实现两个集合的相等判定、并、交和差运算
- c++项目--集合的并差交综合运算
- 集合的交 并 补运算
- 集合的交运算
- 在以单链表表示的正整数的有序集合上,实现集合的并、交和差运算
- 集合的表示、并查集的数组存储方式和集合的差并运算
- 编制一个能演示执行集合的并、交和差运算的程序。(有序表)
- 编制一个能演示执行集合的并、交和差运算的程序。(有序表)
- C语言 集合运算 并、交,相对补,对称差,判断两个集合是否相等,求集合幂集
- 求集合(用有序单链表表示)的并、交和差运算
- 问题:编写一个程序,实现一个整数集合的基本运算: s1+s2 两整数集合的并运算 s1-s2 两整数集合的差运算 s1*s2 两整数集合的交运算 要求:输入整数集合{2 4 1 3 5}和{2 5 1
- Java 学习历程(一)程序执行过程
- 利用Detours进行API拦截
- Android开发黄金搭档:Android Studio + Genymotion模拟器
- sql 转换 自定义函数
- qt将http更改为https
- 集合的基本运算: 依据集合运算规则,实现任意给定两个集合的交、并、差、笛卡儿积运算,和第一个集合的幂集,并显示运算结果。
- Qt学习——qt界面的国际化显示
- 4.物联网和云计算及大数据
- 学习源码的网站
- 【thinkphp3.x】thinkphp3.x中使用show方法进行内容解析输出
- android 自定义checkbox怪异事件(未完)
- android SDK和ADT的区别
- 诗情画意,激昂我人生
- Android技术积累:开发规范