离散数学实验之集合的运算源代码
集合的运算实验报告
一、实验目的1. 理解集合的概念和性质。
2. 掌握集合的基本运算,包括并集、交集、差集和补集。
3. 通过实际操作,加深对集合运算的理解和应用。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 集合运算库:Python内置的set模块三、实验内容1. 集合的定义与创建2. 集合的基本运算:并集、交集、差集和补集3. 集合运算的实际应用四、实验步骤1. 集合的定义与创建(1)定义集合:集合是由若干个元素组成的无序、互不相同的集合。
(2)创建集合:使用花括号{}或set()函数创建集合。
```python# 使用花括号创建集合set1 = {1, 2, 3, 4, 5}# 使用set()函数创建集合set2 = set([1, 2, 3, 4, 5])```2. 集合的基本运算(1)并集(union):两个集合中所有元素的集合。
```python# 计算set1和set2的并集union_set = set1.union(set2)print(union_set) # 输出:{1, 2, 3, 4, 5}```(2)交集(intersection):两个集合中共有的元素组成的集合。
```python# 计算set1和set2的交集intersection_set = set1.intersection(set2)print(intersection_set) # 输出:{1, 2, 3, 4, 5}```(3)差集(difference):一个集合中存在,另一个集合中不存在的元素组成的集合。
```python# 计算set1和set2的差集difference_set = set1.difference(set2)print(difference_set) # 输出:{5}```(4)补集(symmetric_difference):两个集合中不同时存在的元素组成的集合。
集合的运算代码
/**********差集函数**********/ void chaji(linklist &A,linklist &B,linklist &C) { linklist p,q,s,t; p=A->next; printf("\n\tA 与 B 的差集是:"); while(p!=NULL) { q= B->next; while((q!=NULL)&&(p->data!=q->data)) q=q->next; if(q==NULL) { s=(linklist)malloc(sizeof(Lnode)); s->data=p->data; s->next=C->next; C->next=s; } p=p->next; } InsertSort(C); ListTraverse(C); C->next=NULL; q=B->next; printf("\n"); printf("\n\tB 与 A 的差集是:"); while(q!=NULL) { p=A->next; while((p!=NULL)&&(p->data!=q->data)) p=p->next; if(p==NULL) { t=(linklist)malloc(sizeof(Lnode)); t->data=q->data; t->next=C->next; C->next=t; } q=q->next; } InsertSort(C); ListTraverse(C); C->next=NULL; }
void main() { while(1) { system("cls"); linklist A,B,C; InitList(A); InitList(B); InitList(C); int sel=0,a=1,b=1; printf("\n\n\n\n\t 求 AB 集合的交集和并集(请输入数字或者字母! ! !)\n"); printf("\n\t 请输入 A 集合的元素:"); a=input(A); if(A->next!=NULL) { printf("\n\t 请输入 B 集合的元素:"); b=input(B); } printf("\n\n\n\n\n"); if(a==1&&b==1) { if(A->next!=NULL&&B->next!=NULL) { printf("\n\t\t 输入成功\n"); printf("\n\t 按任意键进入主菜单:"); getch(); system("cls"); do { char menu[]= {"\n\n\n\t\t\t--------- ☆1.交集运算☆---------\n\n" "\t\t\t--------- ☆2.并集运算☆---------\n\n" "\t\t\t--------- ☆3.差集运算☆---------\n\n" "\t\t\t--------- ☆0. 退出☆---------\n\n" }; printf("\n\n\n\n\n\n\tA 集合中的元素是:"); ListTraverse(A); printf("\n"); printf("\n\tB 集合中的元素是:"); ListTraverse(B); printf("\n\n\n"); printf("%s",menu); printf("\n\n");
离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]
离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]实验成绩:202212202201016学号:【实验题目】1.命题逻辑实验四【实验目的】2.掌握用计算机求集合的交、并、差和补运算的方法。
【实验内容】3.编程实现集合的交、并、差和补运算。
【实验要求】4、++语言编程实现C或C【算法描述】5.10},,,9,6,7,,C,E表示集合。
假定A={1,34,5,(1)用数组AB10},9,,8,7,4,5,6,34B={2,,3,,7,8,10},E={1,2,,输入数据时要求检查数据是否重复(集合中的E(全集),B,输入数组A 的子集。
B是集合E,要求集合数据要求不重复)A,置成空集。
以下每一个运算都要求先将集合CB}且某)二个集合的交运算:AB={某|某A(2C中的元素进行比较,将相同的元素放在数组中元素逐一与数组B把数组AB的交。
便是集合中,数组CA和集合C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]==b[j])c[k++]=a[i];B}或某3)二个集合的并运算:AB={某|某A(中中的元素逐一与数组AC中。
将数组B中各个元素先保存在数组把数组AB和集合C便是集合A 的元素进行比较,把不相同的元素添加到数组C中,数组的并。
C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]==c[j])break;if(j==m){c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={某|某A且某B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
C语言算法:for(j=0;j<m;j++){for(i=0;i<n;i++){if(A[j]==B[i]){C[k]=A[j];k++;break;}if(j==n){C[k]=A[i];k++;}}A}且~A=B-A={某|某B某)集合的补运算:(5把不相同的元素保存到中的元素进行比较,E中的元素逐一与数组A将数组关于集合中,数组数组CC便是集合AE的补集。
离散数学实验报告求集合的运算——并运算
【实验目的】通过编程实现求给定集合A和B的并集C(C=A∪B)的运算。
【实验内容】已知所给集合A和B,求A与B 的并集C(C=A∪B)。
【实验原理】因为并集的定义为:C={x|x∈A∨x∈B},所以,只要将集合A与B合在一起就得到了并集C。
但是,在一个集合中,同样的元素没必要出现两次或两次以上,所以,在将集合A送入并集C后,应将集合B中与A中相同的元素删除,再将集合B送入并集C之中。
【程序代码】#include<stdio.h>int main(){int a[101],b[101],c[201]={0};int m,n;scanf("%d%d",&m,&n);for(int i=1;i<=m;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);for(int i=1;i<=m;i++)c[i]=a[i];int i=m+1;int k;for(int j=1;j<=n;j++){int t=1;for(k=1;k<=m;k++){if(a[k]==b[j])t=0;}if(t==1){c[i]=b[j];i++;}}for(int i=1;i<=m+n;i++){if(c[i]!=0)printf("%d ",c[i]);}}【实验结果】【实验心得】首先想到的是数组,先将数组a[],赋值给c[],然后通过两层for循环来判断b[],是否与a[]重复,如若不重复,将b[]赋值给c[]。
在开始的时候由于for循环套错位置出错,后设置一flag来判断b[]和a[]是否有重复的元素。
离散数学 实验四 编程实现集合的交、并、差和补运算。
离散数学实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】集合运算2.【实验目的】编程实现集合的交、并、差和补运算。
3.【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
4. 【实验要求】通过以下界面提示实现相应的集合运算**************************************************************** 请分别输入集合A与集合B的元素:请选择(1—5)要进行的集合运算:1.集合的交运算(A⋂B)2.集合的并运算(A⋃B)3.集合的差运算(A-B)4.集合的补运算(~A=E-A)5.继续/退出(y/n)****************************************************************5. 【算法描述】(1)用数组A,B,C,E表示集合。
假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。
以下每一个运算都要求先将集合C置成空集。
(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。
C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。
将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。
C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
离散数学实验报告
离散数学实验报告一、实验目的离散数学是现代数学的一个重要分支,它在计算机科学、信息科学、人工智能等领域有着广泛的应用。
本次离散数学实验的目的在于通过实际操作和编程实现,深入理解离散数学中的基本概念、原理和算法,提高解决实际问题的能力,培养逻辑思维和创新能力。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,还使用了一些相关的数学库和工具,如 sympy 库用于符号计算。
三、实验内容1、集合运算集合是离散数学中的基本概念之一。
在实验中,我们首先定义了两个集合 A 和 B,然后进行了并集、交集、差集等运算。
通过编程实现这些运算,加深了对集合运算定义和性质的理解。
```pythonA ={1, 2, 3, 4, 5}B ={4, 5, 6, 7, 8}并集union_set = Aunion(B)print("并集:", union_set)交集intersection_set = Aintersection(B)print("交集:", intersection_set)差集difference_set = Adifference(B)print("A 与 B 的差集:", difference_set)```2、关系的表示与性质判断关系是离散数学中的另一个重要概念。
我们使用矩阵来表示关系,并通过编程判断关系的自反性、对称性和传递性。
```pythonimport numpy as np定义关系矩阵relation_matrix = nparray(1, 0, 1, 0, 1, 0, 1, 0, 1)判断自反性is_reflexive = all(relation_matrixii == 1 for i inrange(len(relation_matrix)))print("自反性:", is_reflexive)判断对称性is_symmetric = all(relation_matrixij == relation_matrixji for i in range(len(relation_matrix)) for j in range(len(relation_matrix)))print("对称性:", is_symmetric)判断传递性is_transitive = Truefor i in range(len(relation_matrix)):for j in range(len(relation_matrix)):for k in range(len(relation_matrix)):if relation_matrixij == 1 and relation_matrixjk == 1 and relation_matrixik == 0:is_transitive = Falsebreakprint("传递性:", is_transitive)```3、图的遍历图是离散数学中的重要结构。
离散实验报告集合运算
一、实验目的1. 理解集合的基本概念和运算;2. 掌握集合的交、并、差、补等运算方法;3. 通过编程实现集合运算,提高编程能力。
二、实验原理集合是数学中的一种基本概念,用于描述一组具有某种共同属性的元素。
集合的运算主要包括交、并、差、补等。
以下是对这些运算的简要介绍:1. 交集(∩):两个集合A和B的交集是指同时属于A和B的元素组成的集合。
2. 并集(∪):两个集合A和B的并集是指属于A或B或同时属于A和B的元素组成的集合。
3. 差集(-):两个集合A和B的差集是指属于A但不属于B的元素组成的集合。
4. 补集(∁A):集合A的补集是指全集U中不属于A的元素组成的集合。
三、实验内容1. 编写程序,实现以下集合运算:(1)输入两个集合A和B,输出它们的交集C。
(2)输入两个集合A和B,输出它们的并集C。
(3)输入两个集合A和B,输出它们的差集C。
(4)输入一个集合A和全集U,输出A的补集C。
2. 编写程序,验证以下性质:(1)交换律:A∩B = B∩A,A∪B = B∪A。
(2)结合律:A∩(B∩C) = (A∩B)∩C,A∪(B∪C) = (A∪B)∪C。
(3)分配律:A∩(B∪C) = (A∩B)∪(A∩C),A∪(B∩C) = (A∪B)∩(A∪C)。
四、实验步骤1. 定义一个函数用于输入集合,使用数组存储集合元素。
2. 定义一个函数用于计算两个集合的交集,使用嵌套循环遍历两个集合,将相同的元素添加到新集合中。
3. 定义一个函数用于计算两个集合的并集,使用嵌套循环遍历两个集合,将所有元素添加到新集合中。
4. 定义一个函数用于计算两个集合的差集,使用嵌套循环遍历两个集合,将属于A但不属于B的元素添加到新集合中。
5. 定义一个函数用于计算集合的补集,使用嵌套循环遍历全集和集合A,将不属于A的元素添加到新集合中。
6. 编写主函数,调用上述函数,输入集合,输出运算结果。
五、实验结果与分析1. 实验结果(1)输入集合A:{1, 2, 3, 4, 5},集合B:{3, 4, 5, 6, 7},输出交集C:{3, 4, 5}。
最新离散数学集合运算C++或C语言实验报告
离散数学实验报告专业班级:12级计算机本部一班姓名:鲍佳珍学号:201212201401016 实验成绩:1.【实验题目】命题逻辑实验四2.【实验目的】掌握用计算机求集合的交、并、差和补运算的方法。
3.【实验内容】编程实现集合的交、并、差和补运算。
4、【实验要求】C或C++语言编程实现5.【算法描述】(1)用数组A,B,C,E表示集合。
假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。
以下每一个运算都要求先将集合C置成空集。
(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。
C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。
将数组B中的元素逐一与数组A中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。
C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
C语言算法:for (j=0;j<m;j++){ for (i=0;i<n;i++){ if (A[j]= =B[i]){ C[k]=A[j];k++;break; }if (j= =n){ C[k]=A[i];k++; } }(5)集合的补运算:~A=B-A={x|x∈B且x∉A}将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。
离散数学计算机实验报告
《离散数学》实验一、实验目的《离散数学》是现代数学的一个重要分支,是计算机科学与技术专业的基础理论课,也是该专业的核心课程和主干课程。
“离散数学”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。
该课程一方面为后继课程如数据结构、编绎原理、操作系统、数据库原理、人工智能和形式语言与自动机等提供必要的理论基础;同时,更为重要的是培养学生的抽象思维能力和逻辑推理能力,为今后的学习和工作打好基础。
无论从计算机学科发展的过去、现在和未来看,《离散数学》都是计算机科学与技术专业不可缺少的重要组成部分。
这门课程有着其它课程不可替代的地位和作用,是一门承前启后的课程。
根据《离散数学》课程本身的理论性较强的特性,为了帮助学生更好地学习本课程,理解和掌握所学基本概念和方法,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,设置实践环节十分重要。
通过实验实践内容的训练,突出逻辑性思维训练的特征, 目的是学习离散数学中的基本算法和方法,掌握数理逻辑、关系和图论中的基本算法,提高学生学习的兴趣及实际动手的能力。
通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所学知识,培养分析、解决实际问题的能力。
二、实验要求掌握真值表技术,熟悉联结词合取、析取、条件和双条件的概念。
熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
熟悉邻接矩阵和两结点间长度为m 的路的数目的关系。
熟悉最优树的构造算法,掌握最优树的构造过程。
实验前作好准备,分析问题并确定算法,设计代码。
做实验过程中认真分析和调试程序,记录并分析实验结果。
实验后完成实验报告,实验报告包括实验目的、实验内容、源程序、运行结果及分析。
可以使用C、VC或MATLAB完成实验。
实验题目包括真值计算、关系闭包计算、计算两结点间长度为m的路的数目、最优树的构造四个实验,每个实验要求2个学时完成。
三、实验设备及环境PC机一台,软件C、VC或MATLAB四、实验内容实验一真值计算1、实验目的熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。
离散数学第二次实验 代码
for(i=0;i<CountNum;i++){
Multiply(Matrix,Matrix_2,CountNum);
for(i=0;i<CountNum;i++){
Matrix_3[i]+=Matrix_2[i];}
}
int Matrix[பைடு நூலகம்000]={0};
cout<<"\n请输入元素集合,用{num1,num2,num3...}表示:"<<endl;
cin>>strInput;
if(!(CountNum=DetectAndConvert(strInput,strElements))){cout<<"输入格式错误!"<<endl;continue;}
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
int CountNum=0;
string strElements[100];
void Multiply(int *A,int *B,int &n)
if(isTransmissible(Matrix))cout<<"是传递的!"<<endl;else cout<<"是非传递的!"<<endl;
离散数学---集合的基本运算
从而, A-(B∪C)=(A-B)∩(A-C)
利用谓词公式证明求证:A(B∪C)=(A-B)∩(A-C)
证明:(A-B)∩(A-C)={x|x(A-B)∩(A-C)} ={x|x(A-B)∧ x(A-C)} ={x|xA∧(xB)∧(xA)∧(xC)}
={x|(xA)∧(xB)∧(xC)}
集合运算性质(运算律)
1、 交换律A∪B=B∪A,A∩B=B∩A
2、 结合律(A∪B)∪C=A∪(B∪C) (A∩B)∩C=A∩(B∩ C)
3、 分配律
A∪(B∩C)=(A∪B)∩(A∪C) A∩(B∪C)=(A∩B)∪(A∩C)
4、幂等律 A∪A=A,A∩A=A
5、同一律 A∪=A,A∩E=A 6、零一律 A∩=,A∪E=E 9、 德摩根律(A∪B)=A∩B (A∩B)=A∪B
求证:A-(B∪C)=(A-B)∩(A-C) 证明: x(A-B)∩(A-C), 则x(A-B)∧ x(A-C)
(xA)∧(xB)∧(xA)∧(xC) (xA)∧(xB)∧(xC)
(xA)∧(xB)∧(xC)
(xA)∧ (xB∨xC) (xA)∧(xB∪C ) x A-(B∪C)
集合的交并例题3
设A1={1,{2,3}},A2={2,{1,3}},
A3={3,{1,2}},
求A1∩A2,A1∩A3,A2 ∩ A3。
解:三个集合均有两个元素,其中一个元素是
数。另一元素是两个数组成的集合,三个集合没
有相同元素,∴A1∩A2=A2∩A3=A3∩A1=
不相交
如A∩B=称A,B不相交。
集合的差
设A,B是两集合,属于A而不属于B的元 素全体称为A与B的差集,记作A-B, 即A-B={xxA∧xB}。
python集合的代码
python集合的代码在Python中,集合(Set)是一种无序、可变且不重复的数据结构。
集合使用`{}`或`set()`来表示。
下面是一些关于集合操作和用法的示例代码:1. 创建集合:```pythonmy_set = {1, 2, 3} # 使用大括号创建集合print(my_set) # 输出: {1, 2, 3}my_set = set([4, 5, 6]) # 使用set()函数创建集合print(my_set) # 输出: {4, 5, 6}```2. 添加元素到集合:```pythonmy_set = {1, 2, 3}my_set.add(4) # 使用add()方法添加单个元素print(my_set) # 输出: {1, 2, 3, 4}my_set.update([5, 6, 7]) # 使用update()方法添加多个元素print(my_set) # 输出: {1, 2, 3, 4, 5, 6, 7}```3. 移除集合中的元素:```pythonmy_set = {1, 2, 3, 4, 5}my_set.remove(3) # 使用remove()方法删除指定元素print(my_set) # 输出: {1, 2, 4, 5}my_set.discard(2) # 使用discard()方法删除指定元素print(my_set) # 输出: {1, 4, 5}my_set.pop() # 使用pop()方法移除并返回一个随机元素print(my_set) # 输出: {4, 5}```4. 集合操作:```pythonset1 = {1, 2, 3, 4}set2 = {3, 4, 5, 6}intersection = set1.intersection(set2) # 交集print(intersection) # 输出: {3, 4}union = set1.union(set2) # 并集print(union) # 输出: {1, 2, 3, 4, 5, 6}difference = set1.difference(set2) # 差集:set1中有而set2中没有的元素print(difference) # 输出: {1, 2}symmetric_difference = set1.symmetric_difference(set2) # 对称差:set1和set2中都没有的元素print(symmetric_difference) # 输出: {1, 2, 5, 6}```除了上述操作,集合还支持其他方法和运算符,如`issubset()`、`issuperset()`、`clear()`、`copy()`等。
离散数学集合运算代码
k++;
}
for(int j=0;j<B;j++){
for(int m=0;m<A;){
if(u.a[m]!=u.b[j])m++;
elsebreak;
if(m==A){
u.c[k]=u.b[j];
k++;
}
}
}show(u,k);
}
void jiao(jihe u,int A,int B){
int k=0;
cout<<"两集合的交集为:";
for(int i=0;i<A;i++){
for(int j=0;j<B;j++){
if(u.a[i]==u.b[j]) {
u.c[k]=u.a[i];
k++;
}
}
}show(u,k);
}
void cha(jihe u,int A,int B){
int k=0;
cout<<" 2.交运算"<<endl;
cout<<" 3.差运算"<<endl;
cout<<" 4.笛卡尔积"<<endl;
for(;;){
cout<<"请输入您要的选择:";
cin>>e;
switch(e){
case 1:bing(u,u.p,u.q);break;
case 2:jiao(u,u.p,u.q);break;
集合运算C语言代码及报告
一,问题重述集合中的元素为小字母a-小写字母z,实现以下运算:实现集合表示和集合的运算(并、交、差、补)判断集合之间、元素和集合之间的关系二,源程序及注释#include <iostream.h>#include <iomanip.h>#include <conio.h>#include <stdio.h>#include <process.h>#include <string.h>#include <math.h>#include <stdlib.h>char a[100],b[100],c[100];int p,q,i,j,n;char d[26],t;void init(char *a);void display(char *a);void jiao(char *a,char *b,char *c);void bing(char *a,char *b,char *c);void cha(char *a,char *b,char *c);void bu(char *a);void jihejihe(char *a,char *b);void yuansujihe(char *a);void main(){char choice;while (1){system("cls");cout <<"\n\n\n\n";cout <<"\t\t 静态线性表操作 \n";cout <<"\t\t========================================";cout <<"\n\n";cout <<"\t\t 1:初始化 \n";cout <<"\t\t 2:显示 \n";cout <<"\t\t 3:交 \n";cout <<"\t\t 4:并 \n";cout <<"\t\t 5:差 \n";cout <<"\t\t 6:补 \n";cout <<"\t\t 7:集合与集合之间的关系 \n";cout <<"\t\t 8:集合与元素之间的关系 \n";cout <<"\n";cout <<"\t\t 0:退出 \n";cout <<"\n";cout <<"\t\t请选择:"<< flush;choice = getch();system("cls");switch(choice){case '1':init(a);break;case '2':display(a);break;case '3':jiao(a,b,c);break;case '4':bing(a,b,c);break;case '5':cha(a,b,c);break;case '6':bu(a);break;case '7':jihejihe(a,b);break;case '8':yuansujihe(a);break;case '0':exit(0);}}}void init(char *a)//创建一个集合cout<<"请输入集合中元素个数";cin>>n;cout<<"请输入集合之中的元素";for (i=1;i<=n;i++)cin>>a[i];}void display(char *a)//输出一个集合{cout<<"{ ";for(i=1;i<=n;i++)cout<<a[i]<<"";cout<<"}";}void jiao(char *a,char *b,char *c)//求集合的交{int k;k=1;cout<<"请输入第一个集合中元素个数";cin>>p;cout<<"请输入集合之中的元素";for (i=1;i<=p;i++)cin>>a[i];cout<<"请输入第二个集合中元素个数";cin>>q;cout<<"请输入集合之中的元素";for (j=1;j<=q;j++)cin>>b[j];cout<<"{ ";//求集合的交for(i=1;i<=p;i++){for (j=1;j<=q;j++)if(a[i]==b[j]){cout<<a[i]<<"";}}cout<<"}";}void bing(char *a,char *b,char *c)//求集合的并cout<<"请输入第一个集合中元素个数";cin>>p;cout<<"请输入集合之中的元素";for (i=1;i<=p;i++)cin>>a[i];cout<<"请输入第二个集合中元素个数";cin>>q;cout<<"请输入集合之中的元素";for (j=1;j<=q;j++)cin>>b[j];for(i=1;i<=p;i++){for (j=1;j<=q;j++)if(a[i]==b[j])a[i]='0';}cout<<"{ ";for(i=1;i<=p;i++)if(a[i]!='0')cout<<a[i]<<"";for(j=1;j<=q;j++)cout<<b[j]<<"";cout<<"}";}void cha(char *a,char *b,char *c)//求集合的差{cout<<"请输入第一个集合中元素个数";cin>>p;cout<<"请输入集合之中的元素";for (i=1;i<=p;i++)cin>>a[i];cout<<"请输入第二个集合中元素个数";cin>>q;cout<<"请输入集合之中的元素";for (j=1;j<=q;j++)cin>>b[j];for(i=1;i<=p;i++){for (j=1;j<=q;j++)if(a[i]==b[j])a[i]='0';}cout<<"{ ";for(i=1;i<=p;i++)if(a[i]!='0')cout<<a[i]<<"";cout<<"}";}void bu(char *a)//集合的补{cout<<"请输入集合中元素个数";cin>>n;cout<<"请输入集合之中的元素";for (i=1;i<=n;i++)cin>>a[i];for(i=0;i<26;i++)d[i]=i+97;for(i=1;i<=n;i++)for (j=0;j<26;j++){if (a[i]==d[j])d[j]='0';}cout<<"{ ";for(j=0;j<26;j++)if(d[j]!='0')cout<<d[j]<<"";cout<<"}";}void jihejihe(char *a,char *b)//两个集合之间的关系{int k;k=0;cout<<"请输入元素较少的集合A中元素个数";cin>>p;cout<<"请输入集合之中的元素";for (i=1;i<=p;i++)cin>>a[i];cout<<"请输入元素较多的集合B中元素个数";cin>>q;cout<<"请输入集合之中的元素";for (j=1;j<=q;j++)cin>>b[j];for(i=1;i<=p;i++){for (j=1;j<=q;j++)if (a[i]==b[j])k++;}if ((k==p)&&(p!=q)) cout<<"A包含于B "; else if ((k==p)&&(p==q)) cout<<"A=B";else cout<<"A与B不存在集合之间的关系";}void yuansujihe(char *a){int k;char t;k=0;cout<<"请输入集合A中元素个数";cin>>n;cout<<"请输入集合之中的元素";for (i=1;i<=n;i++)cin>>a[i];cout<<"请输入元素t";cin>>t;for(i=1;i<=n;i++)if(a[i]==t) k++;if(k==1) cout<<"t属于A";else cout<<"t不属于A";}三,运行结果显示,设第一个集合为B={a,b,c}设第二个集合为A={a,b}则运行结果依次显示为,交,并差补:设集合为{a,b,c,d,e}则补为集合关系判断元素与集合关系四,调试和运行程序过程中产生的问题及采取的措施:四,调试和运行程序过程中产生的问题及采取的措施:1,字符数组初始化。
离散数学实验集合
#include<iostream>using namespace std;#define len 10#define max 10000int a[len];//集合Aint b[len];//集合Bint jiao[len];//交集结果存放int bing[2*len];//并集结果存放int cha[len];//差集中存放相同元素int bl[len];//标记数组int zij[len];//子集数组存放int n1,n2;//集合A,集合B的元素个数int n3,n4;//关系R,S的元素个数int sum=0;//统计子集的个数,验证定理char r[len][5];//关系Rchar s[len][5]; //关系Schar fh[len*len][2];//复合函数的关系存储int num=0;//计数器void init(int a[]){for(int i=0;i<len;i++)a[i]=0;}//∪运算函数void opb(int a[],int b[]){for(int i=0;i<n1;i++)bing[i]=a[i];for(int i=n1;i<n1+n2;i++)bing[i]=b[i-n1];for(int i=0;i<n1+n2;i++){for(int j=i+1;j<n1+n2;j++){if(bing[i]==bing[j]) bing[j]=max;}}for(int i=0;i<n1+n2;i++){if(bing[i]!=max)cout<<bing[i]<<" ";}cout<<endl;}//∩运算函数void opj(int a[],int b[]){int count=0;for(int i=0;i<n1;i++){for(int j=0;j<n2;j++){if(a[i]==b[j]){jiao[j]=a[i];count++;}}}for(int i=0;i<count;i++) {if(jiao[i]!=max)cout<<jiao[i]<<" ";}cout<<endl;}//差运算函数void opc(int a[],int b[]){for(int i=0;i<n1;i++){for(int j=0;j<n2;j++){if(a[i]==b[j]) cha[i]=-1;}}for(int i=0;i<n1;i++){if(cha[i]!=-1)cout<<a[i]<<" ";}cout<<endl;}//笛卡尔积函数void opdj(int a[],int b[]){for(int i=0;i<n1;i++){for(int j=0;j<n2;j++){cout<<"<"<<a[i]<<","<<b[j]<<">," ;}}cout<<"}"<<endl;}//求子集的函数void ziji(int a[],int bl[],int n,int l){if(l==n){sum++;cout<<"{";for(int m=0;m<n;m++)cout<<zij[m]<<",";cout<<"}";return ;}else{for(int k=0;k<n1;k++){if(!bl[k]){zij[l]=a[k];for(int j=k;j>=0;j--)bl[j]=1;ziji(a,bl,n,l+1);for(int j=k;j>=0;j--)bl[j]=0;}}}}//求复合关系的函数void fuhe(char r[][5],char s[][5]){num=0;for(int i=0;i<n3;i++){for(int j=0;j<n4;j++){if(r[i][3]==s[j][1]){fh[num][0]=r[i][1];fh[num][1]=s[j][3];num++;}}}}int main(){cout<<"请输入a,b集合的元素个数n1,n2\n"; cout<<"n1:";cin>>n1;cout<<"n2:";cin>>n2;cout<<"请输入a集合的元素\n";for(int i=0;i<n1;i++)cin>>a[i];cout<<"请输入b集合的元素\n";for(int i=0;i<n2;i++)cin>>b[i];cout<<"a∩b=";opj(a,b);cout<<"a∪b=";opb(a,b);cout<<"a-b=";opc(a,b);cout<<"a*b={";opdj(a,b);cout<<"p(a)={$(空集),";for(int i=1;i<=n1;i++){init(bl);ziji(a,bl,i,0);cout<<"}";}cout<<endl<<"总计子集数:"<<sum+1<<endl; cout<<"请输入关系R的个数n3:";cin>>n3;cout<<"请输入关系R:";for(int i=0;i<n3;i++)for(int j=0;j<5;j++)cin>>r[i][j];cout<<"请输入关系S的个数n4:";cin>>n4;cout<<"请输入关系S:";for(int i=0;i<n4;i++)for(int j=0;j<5;j++)cin>>s[i][j];fuhe(r,s);cout<<"关系RoS={";for(int i=0;i<num;i++){cout<<"<"<<fh[i][0]<<","<<fh[i][1]<<">"<<","; }cout<<"}"<<endl;system("pause");return 0;}。
离散数学实验 C ++关系的运算
实验2 关系的运算(1)关系的幂运算输入:集合A,二元关系集合R,幂次n输出:R的n次幂要求:尽量使运算的计算量最小(2)关系闭包的计算输入:集合A,二元关系集合R输出:R的传递闭包t(R)要求:(a)采用Warshall 算法(89页)(b)编写代码判断输出t(R)为传递闭包程序代码:#include<iostream>#include<sstream>#include<vector>using namespace std;typedef vector< vector <int> > Mat;class Relation{vector<int>s;//集合Mat A;//关系矩阵Mat B;Mat C;Mat E;Mat D[100]; //用来存储矩阵int n;public:void inputs();//将集合存入向量中void inputa();//将读入的关系转化为关系矩阵void print();//输出关系矩阵void mi();int Warshall();};//定义类int n,m;//全局变量,下文中使用void Relation::inputs(){cout<<"输入集合";for(int a;cin>>a;){s、push_back(a);if(getchar()=='\n')break;}}//将集合存入向量中void Relation::inputa(){//将读入的关系转化为关系矩阵cout<<"输入关系";int i,j,e,r;for(i=0;i<s、size();i++){vector<int> u;for(j=0;j<s、size();j++){int ia=0;u、push_back(ia);}A、push_back(u);B、push_back(u);C、push_back(u);E、push_back(u);}//创建二维向量,初始化,就是每个元素为0for(int h,z;cin>>h>>z;){if(h==0&&z==0)break;for(i=0;i<s、size();i++){if(s[i]==h) e=i;if(s[i]==z) r=i;}A[e][r]=1;B[e][r]=1;E[e][r]=1;//C[e][r]=1;//读入关系,将关系对应的矩阵中的位置元素变为1if(getchar()=='\n')break;}}void Relation::print(){for(int i=0;i<s、size();i++){for(int j=0;j<s、size();j++)cout<<A[i][j]<<" ";cout<<endl;}}//输出关系矩阵void Relation::mi(){int a,b,i,c;cin>>n; //读入幂次if(n==0){ //0次幂for(int k=0;k<s、size();++k){for(int j=0;j<s、size();++j){if(k==j)cout<<"1 "; //对角线上元素为1 elsecout<<"0 ";}cout<<endl;}}else{for(i=1;i<n;++i){for(int h=0;h<s、size();++h){for(int d=0;d<s、size();++d){int m=0;for(int x=0;x<s、size();++x){m=m+B[h][x]*A[x][d]; //第h 行第d列的元素对应相乘的与}C[h][d]=m;}}if(i>1){for(a=0;a<s、size();++a){for(b=0;b<s、size();++b){if(C[a][b]!=D[0][a][b])break;}if(b!=s、size())break;}}//检验就是否重复if(a==s、size()&&b==s、size()){break;//重复则跳出不再幂乘}for(int k=0;k<s、size();k++){for(int j=0;j<s、size();j++){B[k][j]=C[k][j];}D[i-1]=B;c=i;}}if(a==s、size()&&b==s、size()){int q;q=(n-i)%c; //找出结果位置if(q==0) q=c;for(int e=0;e<s、size();e++){for(int f=0;f<s、size();f++){cout<<D[q-1][e][f]<<" "; //输出}cout<<endl;}return;}else{//1次幂for(int h=0;h<s、size();h++){for(int n=0;n<s、size();n++){cout<<B[h][n]<<" ";}cout<<endl;}}}}int Relation::Warshall(){for(int i=0;i<s、size();++i){for(int j=0;j<s、size();++j){if(A[j][i]==1){for(int k=0;k<s、size();++k){A[j][k]=A[j][k]+A[i][k];if(A[j][k]!=0&&A[j][k]!=1)A[j][k]=1;}}}}print();int a=1;int b=1;//for(int p=0;p<s、size();++p){for(int l=0;l<s、size();++l){if (A[p][l]==0){for (int x=0;x<s、size();++x){if(A[p][x]*A[x][l]==1)a=0;}}}}if(a==0){cout<<"wrong!"<<endl;}else{for(int p=0;p<s、size();++p){for(int l=0;l<s、size();++l){if(A[p][l]==1&&E[p][l]==0){A[p][l]=0;//再判断传递性for(int p=0;p<s、size();++p){for(int l=0;l<s、size();++l){if (A[p][l]==0){for (int x=0;x<s、size();++x){if(A[p][x]*A[x][l]==1)b=0;}}}}if(b==1){cout<<"wrong!"<<endl;return 0;}A[p][l]=1;}}}cout<<"right!"<<endl;}//return 1;}void main(){Relation w;w、inputs();w、inputa();w、print();cout<<"输入n"<<endl; w、mi();cout<<endl;cout<<"闭包为"<<endl; w、Warshall();}实验截图:。
离散数学实验二集合运算设计
实验2 集合运算设计一、实验目的熟悉并、交、差、对称差等运算,并编程设计。
二、实验内容在C语言中,有数组、结构体、共用体、枚举类型等用户自定义的复合型数据类型,但是并没有提供集合类型数据的定义以及集合的一些基本运算的实现。
为简单起见,这里,我们并不要求编写出专门的集合类型的数据类型及其基本运算,只要求用数组来存放集合中的元素,并设计其并、交、差、对称差等运算。
1. 对任意集合A,B,求它们的并集C=A∪B。
可以先将集合A中的元素全部送入集合C,然后将集合B中的元素送入集合C中,此时要注意与集合A相同的元素要跳过。
2. 对任意集合A,B,求它们的交集C=A∩B。
将集合A中与集合B中的相同的元素送入集合C中。
3. 对任意集合A,B,求它们的差集C=A-B。
将集合A的各个元素与集合B的元素进行比较,如果集合B的所有元素与之均不相等,则将该元素送入集合C中。
4. 对任意集合A,B,求它们的对称差C=A⊙B。
先将集合A的各个元素与集合B的元素进行比较,如果集合B的所有元素与之均不相等,则将该元素送入集合C中;然后将集合B的各个元素与集合A的元素进行比较,如果集合A的所有元素与之均不相等,则将该元素送入集合C中。
源代码:#include<stdio.h>int main(){int A[10],B[10],i,j=0,k; //假设集合A、B中分别有10个元素printf("请输入集合A的元素:\n");for(i=0;i<10;i++)scanf("%d",&A[i]);printf("请输入集合B的元素:\n");for(i=0;i<10;i++)scanf("%d",&B[i]);printf("集合A和集合B的并集为:");for(i=0;i<10;i++)printf("%d\t",A[i]); //先打印集合A中的元素〔集合A中所有元素都存在该并集中〕//开始查找B集合中A集合不存在的元素while(j<10){k=0;for(i=0;i<10;i++){if(B[j]!=A[i]) //B集合中每个元素都与集合A中所有元素进行比较k=k+1;}if(k==10) //只有k累加到10,才能证明B[j]存在于A集合中printf("%d\t",B[j]);j++; //检查下一个元素}printf("\n");printf("集合A和集合B的交集C为:");for(i=0;i<10;i++){for(j=0;j<10;j++)if(B[j]==A[i]){printf("%d\t",A[j]);break; //中断,无须查找了,缩短程序时间复杂度}}printf("\n");printf("集合A和集合B的差集C为:");j=0;while(j<10){k=0;for(i=0;i<10;i++){if(B[j]!=A[i])k=k+1;}if(k==10)printf("%d\t",B[j]); / /打印集合B中不存在集合A中的元素j++;}printf("\n");printf("集合A和集合B的对称差C为:");j=0;while(j<10){k=0;for(i=0;i<10;i++){if(B[j]!=A[i])k=k+1;}if(k==10)printf("%d\t",B[j]); / /打印集合B中不存在集合A中的元素j++;}j=0;while(j<10){k=0;for(i=0;i<10;i++){if(A[j]!=B[i])k=k+1;}if(k==10)printf("%d\t",A[j]); / /打印集合A中不存在集合B中的元素j++;}printf("\n");return 0;}运算结果截图:三、实验小结〔本次实验的心得体会,字数不限〕。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=0;i<k-1;i++) //对并集从小到大排序
for(j=i+1;j<k;j++)
if(g[i]>g[j]=g[j];
g[j]=x;
}
u=k;//传出 并集 元素个数
k=0;//--------------求差集
}
for(i=0;i<n;i++)
{
flog=0;
for(j=0;j<k;j++)
if(b[i]==g[j])//并删除B中相同元素
{
flog=1;
break;
}
if(flog==0)
g[k++]=b[i];//将集合B中元素弹入集合g[]
{
int i;
if(r!=0)
{
cout<<"A对B的差集A-B是:"<<endl;
for(i=0;i<r;i++)
cout<<d[i]<<' ';
cout<<endl;
}
else
cout<<"A对B的差集为空!"<<endl;
if(s!=0)
for(i=0;i<m;i++)
cin>>a[i];
cout<<"请输入B集合的元素个数:"<<endl;
cin>>n;
cout<<"请输入集合B:"<<endl;
for(i=0;i<n;i++)
cin>>b[i];
}
void Gather::Menu()
{
cout<<endl<<"--------------------------"<<endl;
k=0; //-------求并集g[]
for(i=0;i<m;i++)
{
flog=0;
for(j=0;j<k;j++)
if(a[i]==g[j])//删除A中相同元素
flog=1;
if(flog==0)
g[k++]=a[i];//将集合A中元素弹入集合g[]
cout<<"** K:笛卡尔乘积 **"<<endl;
cout<<"** A:输出所有结果 **"<<endl;
cout<<"** P:打印A和B **"<<endl;
cout<<"** E:退出 **"<<endl;
{
flog=0;
for(k=0;k<s1;k++)//删除交集中相同元素
if(a[i]==c[k])
flog=1;
if(flog==0)
c[s1++]=a[i];
break;
}
t=s1;//传出 交集 元素个数 ok
{
if(u==0)
{
cout<<"并集为空!"<<endl;
return ;
}
int i;
cout<<"两个集合的并集是:"<<endl;
for(i=0;i<u;i++)
cout<<g[i]<<' ';
cout<<endl;
}
void Gather::Chaji()//打印差集
int m,n,r,s,t,u,v;//集合A与B的元素个数
public:
Gather(); //构造函数,建立集合A、B
void Menu();//选择菜单
void Do();//完成各项操作
void Mix(); //打印交集
void Sum();//打印并集
{
if(t==0)
{
cout<<"交集为空!"<<endl;
return;
}
int i;
cout<<"两个集合的交集是:"<<endl;
for(i=0;i<t;i++)
cout<<c[i]<<" ";
cout<<endl;
}
void Gather::Sum()//打印并集
cout<<"** I:交集 **"<<endl;
cout<<"** U:并集 **"<<endl;
cout<<"** C:差集 **"<<endl;
cout<<"** D:对称差 **"<<endl;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<"<"<<a[i]<<','<<b[j]<<'>'<<' ';
cout<<endl;
}
cout<<endl<<"B*A:"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
q=0;
for(p=0;p<k;p++)
if(d[p]==a[i])//删除相同元素
q=1;
if(q!=1)
d[k++]=a[i];
}
}
r=k;////传出 A对B的差集 元素个数r
k=0;
for(i=0;i<n;i++)
cout<<"--------------------------"<<endl;
}
void Gather::Do()//求解操作
{
int i,j,k,s1=0,flog;
char x;
for(i=0;i<m;i++)//A
for(j=0;j<n;j++)//B
if(a[i]==b[j])//求交集元素
for(i=0;i<n;i++)
cout<<b[i]<<' ';
cout<<endl;
}
Gather::Gather()//构造函数,对象初始化
{
int i;
r=s=t=u=v=0;
cout<<"请输入A集合的元素个数:"<<endl;
cin>>m;
cout<<"请输入集合A:"<<endl;
int p,q;//控制差集相同元素删除
for(i=0;i<m;i++)
{
flog=0;
for(j=0;j<n;j++)
if(a[i]==b[j])////A对B的差集d[]
{
flog=1;
break;
}
if(flog==0)
cout<<"<"<<b[i]<<','<<a[j]<<'>'<<' ';
cout<<endl;
}
}
int main() //主函数
{
Gather g;//Gather集合对象
char c;
g.Do(); //具体操作
while(c!='E') //输入E退出系统
break;
case 'C': //求差集
g.Chaji();
break;
case 'D': //求对称差
g.Duichen();
break;
case 'K': //求笛卡尔乘积
g.Dika();
break;
case 'A': //输出所有运算结果
{
g.Menu(); //显示菜单
cout<<"请输入您的选项:";
cin>>c; //输入选项
switch(c)
{
case 'I': //求交集