离散实验指导书
离散数学实验指导书

实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
实验二关系闭包计算一、实验目的熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
二、实验内容从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
实验三计算两结点间长度为m的路的数目一、实验目的熟悉邻接矩阵和两结点间长度为m的路的数目的关系并编程计算。
二、实验内容从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。
考虑有向图和无向图。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
实验四最优树的构造一、实验目的熟悉最优树的构造算法,掌握最优树的构造过程。
二、实验内容从键盘输入一组权值,构造出对应的最优树,列出构造过程。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
部分参考答案:实验二C++源程序#include<iostream.h>int num;class guanxi{public:int jz[100][100];void set(){cout<<"shu ru yuan su shu"<<endl;cin>>num;cout<<"put in the guanxi"<<endl;int i,j;for(i=0;i<num;i++)for(j=0;j<num;j++)cin>>jz[i][j];cout<<"关系剧阵是:"<<endl;for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<jz[i][j]<<" ";if (j==num-1)cout<<endl;}cout<<endl;}friend void zifan();friend void duichen();friend void chuandi();};void zifan(guanxi ox){int i,j;for(i=0;i<num;i++)ox.jz[i][i]=1;for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<ox.jz[i][j]<<" ";if (j==num-1)cout<<endl;}}void duichen(guanxi ox){int i,j;for(i=0;i<num;i++)for(j=0;j<num;j++){if(ox.jz[i][j]==1)ox.jz[j][i]=1;}for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<ox.jz[i][j]<<" ";if (j==num-1)cout<<endl;}}void chuandi(guanxi ox){int i,j,k;for(i=0;i<num;i++)for(k=0;k<num;k++)if(ox.jz[k][i]==1){for(j=0;j<num;j++)if(ox.jz[i][j]==1)ox.jz[k][j]=1;}for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<ox.jz[i][j]<<" ";if (j==num-1)cout<<endl;}}main(){guanxi o1;o1.set();cout<<"它的自反闭包是:"<<endl;zifan(o1);cout<<"它的对称闭包是:"<<endl;duichen(o1);cout<<"它的传递闭包是:"<<endl;chuandi(o1);return 0;}C源程序#include<stdio.h>int main(){int i,j,k,n;static int str[122],zifan[122],chuandi[122],duich[122];printf("Please input the jie:\n");scanf("%d",&n);printf("A=%d\n",n);for(i=0;i<n*n;i++){scanf("%d",&str[i]);}printf("The shu zu is:\n");for(j=0;j<n*n;j++){printf("%4d",str[j]);if((j+1)%n==0)printf("\n");}for(j=0;j<n*n;j++){zifan[j]=str[j];chuandi[j]=str[j];duich[j]=str[j];}printf("The zifan bibao is:\n");for(i=0;i<n*n;i++){if(i%(n+1)==0)zifan[i]=zifan[i]||1;printf("%4d",zifan[i]);if((i+1)%n==0)printf("\n");}printf("The duich bibao is:\n");for(i=0,j=0;i<n*n&&j<n;i++){if(i>j*(n+1)&&i<(j+1)*n){ duich[i]=duich[(i-j*(n+1))*(n-1)+i]||duich[i];duich[(i-j*(n+1))*(n-1)+i]=duich[(i-j*(n+1))*(n-1)+i]||duich[i];}else if(i>=(j+1)*n)j++;}for(i=0;i<n*n;i++){printf("%4d",duich[i]);if((i+1)%n==0)printf("\n");}printf("The chuandi bibao is:\n");for(i=0;i<n;i++)for(j=0;j<n;j++)if(chuandi[j*n+i]){for(k=0;k<n;k++)chuandi[j*n+k]=chuandi[j*n+k]||chuandi[i*n+k];}for(i=0;i<n*n;i++){printf("%4d",chuandi[i]);if((i+1)%n==0)printf("\n");}return 0;}实验三#include <iostream.h>class luchang{private:int N;int **p;public:luchang(int n);~luchang();int input();luchang &operator =(luchang &A);luchang &mul(luchang &A,luchang &B);void disply();int disply(int M);};luchang::luchang(int n){N=n;int i;p=new int*[N];for (i=0;i<N;i++)p[i]=new int[N];}luchang::~luchang(){int i;for (i=0;i<N;i++)delete p[i];delete p;}int luchang::input(){int i,j;for (i=0;i<N;i++){for (j=0;j<N;j++)cin>>p[i][j];}return 0;}luchang& luchang::operator =(luchang &A){int i,j;for (i=0;i<N;i++){for(j=0;j<N;j++)p[i][j]=A.p[i][j];}return *this;}luchang& luchang::mul(luchang &A,luchang &B) {int i,j,k,sum=0;for (i=0;i<N;i++){for (j=0;j<N;j++){for (k=0;k<N;k++){sum+=B.p[i][k]*A.p[k][j];p[i][j]=sum;}sum=0;}}return *this;}void luchang::disply(){for (int i=0;i<N;i++){for (int j=0;j<N;j++)cout<<p[i][j]<<" ";cout<<endl;}}int luchang::disply(int M){int i,j;int count=0;for (i=0;i<N;i++){for (j=0;j<N;j++){if (p[i][j]==M)count++;else continue;}}cout<<count<<endl;return 0;}void main(){cout<<"请输入图中的点数V"<<endl;int n=0;cin>>n;luchang ob1(n),ob2(n),ob3(n);cout<<"请输入邻接矩阵"<<endl;ob1.input();ob2=ob1;ob3=ob1;cout<<"请输入要查找的路长M"<<endl;int M=0;cin>>M;for (int i=0;i<M-1;i++){ob3.mul(ob1,ob2);ob2=ob3;}ob3.disply();ob3.disply(M);cout<<endl;}。
离散数学实验指导书(2010)

《离散数学》实验指导一实验课的任务、性质与目的本实验课程是信息专业学生的一门专业基础课程,通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
二实验目标1. 掌握离散数学中涉及的相关概念。
2. 培养学生的逻辑思维能力和算法设计的思想。
3. 熟练掌握C/C++语言程序设计的基本方法和各种调试手段。
4. 熟练掌握包括数组、链表以及邻接表或邻接矩阵等数据结构的建立和运用。
5. 通过实验掌握递归程序设计的基本方法。
6. 掌握图的存储和遍历方法。
三实验要求1.实验前,复习《离散数学》课程中的有关内容。
2.上机前编好程序,上机时调试。
3.编程要独立完成,程序应加适当的注释。
4.完成实验报告。
四实验报告要求文字用小4号或4号;程序和注释用5号以班为单位交.实验报告文件名:080x姓名学号(实验xA/B/C)实验报告上交时间:做完实验后一到两周内,在课间拷贝到教室机器的指定目录中。
实验一一实验内容(二选一)1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))注意:题目类型分为A,B,C三类,其中A为基本题,完成A类题目可达到设计的基本要求,其他均为加分题,并按字母顺序分数增加越高。
二实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
三实验环境C或C++语言编程环境实现。
四实验说明1.逻辑联接词的运算本实验要求大家利用C/C++语言,实现二元合取、析取、条件和双条件表达式的计算。
充分利用联接词和逻辑运算符之间的相似性实现程序功能。
2. 求任意一个命题公式的真值表本实验要求大家利用C/C++语言,实现任意输入公式的真值表计算。
一般我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。
《离散数学》实验课程指导书

printf("您要在多少个数中进行线性查找,请输入(1~100):");
scanf("%d",&n);
printf("\n");
while(n<1 || n>100) //如果输入的数据列表长度不在[1,100]之间
scanf("%d",&a[i]);
i=0;
do
{
exchanged=0;
for(j=0;j<l-1-i;j++)
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
exchanged=1;
}
if (i==0)
printf("\n");
printf("第%d趟冒泡排序法由小到大排序后:\n",i+1);
{ int r[50];
int length;
}list,*sqlist;
int CreateSqlist(sqlist s)
{
int i;
printf("请输入您要进行搜索的数据队列的长度:\n");
scanf("%d",&(s->length));
printf("\n请输入您要进行搜索的%d个数据:\n",s->length);
printf("冒泡排序算法\n");
离散信号实验报告

一、实验目的1. 理解离散信号的概念及其特点。
2. 掌握离散信号的表示方法。
3. 掌握离散信号的基本运算方法。
4. 熟悉离散系统响应的求解方法。
5. 利用MATLAB进行离散信号分析。
二、实验原理离散信号是指时间上不连续的信号,与连续信号相比,具有以下特点:1. 采样性:离散信号是在时间上等间隔取样的信号。
2. 有限性:离散信号在时间上有限,即在有限的时间内存在。
3. 线性时不变性:离散系统具有线性时不变性,即系统对信号的时延和幅度变换保持不变。
离散信号的表示方法主要有以下几种:1. 序列表示法:用括号括起来的序列表示,如x[n]。
2. 图形表示法:用坐标轴表示,横轴为时间,纵轴为信号幅度。
3. Z变换表示法:用Z变换表示,如X(z)。
离散信号的基本运算方法包括:1. 加法运算:两个离散信号相加,结果为它们的序列对应元素相加。
2. 乘法运算:两个离散信号相乘,结果为它们的序列对应元素相乘。
3. 移位运算:将离散信号沿时间轴左移或右移。
4. 展平运算:将离散信号沿时间轴展平,即将信号序列展开成矩阵形式。
离散系统响应的求解方法主要有以下几种:1. 离散卷积法:用离散卷积运算求解离散系统响应。
2. Z变换法:用Z变换求解离散系统响应。
3. 快速傅里叶变换(FFT)法:用FFT求解离散系统响应。
三、实验内容及步骤1. 实验一:离散信号的表示方法(1)在MATLAB中,创建一个离散信号序列x[n],并绘制其图形表示。
(2)利用Z变换,将离散信号序列转换为Z变换表示。
2. 实验二:离散信号的基本运算(1)在MATLAB中,创建两个离散信号序列x[n]和y[n],并进行加法运算、乘法运算、移位运算和展平运算。
(2)绘制运算结果,并分析运算结果的特点。
3. 实验三:离散系统响应的求解(1)在MATLAB中,创建一个离散信号序列x[n],并设计一个离散系统。
(2)利用离散卷积法、Z变换法和FFT法求解离散系统响应。
《离散数学》实验指导书-2019版

《离散数学》课程实验指导书《离散数学》实验指导书合肥工业大学计算机与信息学院王晓华,杨娟,李书杰,汪荣贵2019年09月目录目录 (1)概述 (3)第一篇数理逻辑 (4)实验1 逻辑运算表示与验证 (4)1.1 实验要求和目的 (4)1.2 实验课时 (4)1.3 实验环境 (4)1.4 实验平台简介 (4)实验2 交通信号灯模型设计 (6)2.1 实验要求和目的 (6)2.2 实验课时 (6)2.3 实验环境 (6)2.4 思考题 (6)第二篇集合与关系 (7)实验3 小型关系数据库系统实现 (7)3.1 实验要求和目的 (7)3.2 实验课时 (7)3.3 实验环境 (7)3.4 实验平台简介 (7)实验4 关系的闭包运算及Floyd-Warshall算法求解 (10)4.1 实验要求和目的 (10)4.2 实验课时 (10)4.3 实验环境 (10)4.4 实验平台简介 (10)第三篇整数论 (12)实验5 数论之模运算 (12)5.1 实验要求和目的 (12)5.2 实验课时 (12)5.3 实验环境 (12)5.4 实验平台简介 (12)第四篇图论 (16)实验6 最短路径的Dijstra与Floyd-Warshal算法实现 (16)6.1 实验要求和目的 (16)6.2 实验课时 (16)6.3 实验环境 (16)6.4 实验平台简介 (16)实验7 欧拉回路的DFS或Fleury算法求解 (20)7.1 实验要求和目的 (20)7.2 实验课时 (20)7.3 实验环境 (20)7.4 实验平台简介 (20)实验8 最优树的Huffman算法求解 (22)8.1 实验要求和目的 (22)8.2 实验课时 (22)8.3 实验环境 (22)8.4 实验平台简介 (22)实验9 多相位交通信号灯智能控制模型设计与算法实现 (24)9.1 实验要求和目的 (24)9.2 实验课时 (25)9.3 实验环境 (25)9.4 思考题 (25)附录A:实验报告 (26)概述(1)实验概述运用某种程序设计语言选择并设计实现离散数学的数理逻辑系统、集合与关系、整数论、图论四个篇章共8个实验的相关内容,以检验和巩固离散数学中的基本知识、加深对本课程定义、定理、算法的理解,锻炼和培养学生的计算思维能力,完成系统设计,实现问题求解,达到有效提升综合实践能力和创新能力的目的,并有效缓解离散数学课程概念多、理论性强、高度抽象等特点给学生带来的畏难情绪。
离散实验报告一

离散数学实验报告(一)一、实验目的求命题公式的真值表及其主析取范式和主合取范式二、问题分析本程序最终的目的应是求命题公式的主析取范式和主合取范式,而在有命题真值表的情况下,主析取范式和主合取范式的求解将变得十分简单。
所以,该程序的关键问题应该是求解命题公式的真值表,此后在真值表的基础上完成主析取范式和主合取范式的求解。
(一)前期分析与部分变量准备规定前提,真值表中的T/F在该程序中用布尔类型的1/0来表达。
如此,可以方便程序的编写与运算。
首先,我们要确定各个联结词的符号表达,为了方便讨论,不妨在此先令各联结词表达如下:合取(*)、析取(/)、否定(-)、单条件(%)、双条件(@)。
接着,我们就需要明确各联结词所对应符号在程序中的功能。
具体来看,合取与析取可以分别使用c++自带的&&(且)和||(或)进行布尔运算,取否定也可以直接使用!(取非)运算;而对于单条件、双条件这两个联结词来看,在c++中并无已有的运算定义,所以我们要利用函数定义的方式重新明确其含义。
而后,定义char类型数组a[]用于存储命题公式,为了方便程序的实现,我们将命题变元与联结词分开存储于char类型数组b[]和c[]中。
(二)真值表输出算法以下,我们便进入了程序的核心部分——完成真值表的计算与输出。
碍于本人c++编程知识的局限,暂时只能实现输入三个变元、无否定情况下的命题公式的真值表输出。
为了完成真值表的输出,要解决以下几个问题1. 真值表的格式与指派控制对此,我们使用三层for语句嵌套完成真值表的每一行输出。
在循环的同时,我们还需要提前定义一个布尔数组p[],以根据每一行的输出完成三个变元的指派,并将其存储于数组p[]中。
2.真值表每一行结尾的结果计算首先,我们需要定义一个布尔类型的过程存储数组x[],利用switch语句的嵌套分别判断两个联结词,使用相应的运算符(&&、||、!)和已定义的两个布尔类型函数(imp、equ),一次计算,并且将每一次的计算结果存储至x[]中,运算直至最后一步完成结果的输出。
离散信号的实验报告

离散信号的实验报告实验名称:离散信号的生成与观测实验实验目的:1. 理解离散信号的概念和性质;2. 掌握离散信号的生成和观测方法;3. 练习使用计算机进行信号的生成和观测。
实验原理:离散信号是定义在离散时间上的信号。
在离散时间上,信号的取样是有限的,所以可以用数字表示信号的取值。
离散信号可以看作是连续信号在时间维度上的抽样。
离散信号的生成可以通过以下步骤进行:1. 选择采样周期T和采样点数N;2. 定义连续信号的表达式;3. 选择合适的采样频率,定时采样连续信号的值,得到离散信号。
离散信号的观测可以通过以下步骤进行:1. 将离散信号输入计算机,利用编程语言读取数据;2. 对离散信号进行处理和分析,如时域分析、频域分析等;3. 输出观测结果,进行可视化展示。
实验步骤:1. 设置采样周期T为1 ms,采样点数N为1000;2. 选择正弦信号作为连续信号的表达式,频率f为10 Hz,振幅为1;3. 选择合适的采样频率,如采样频率为100 Hz;4. 在计算机中编写程序,采样并观测离散信号。
实验结果:通过实验,我们得到了离散信号的采样值。
利用计算机对采样值进行处理和分析,得到了时域和频域上的信号特性。
在时域上,我们观察到离散信号在时间轴上的抽样点,可以根据抽样点的密度和分布情况分析信号的周期性、稳定性等特性。
在频域上,我们观察到离散信号的频谱图,可以根据频谱上的峰值和分布情况分析信号的频率成分、能量分布等。
实验讨论:离散信号的生成和观测是数字信号处理的基础,也是许多实际应用中常用的方法。
生成离散信号时,采样频率的选择要满足奈奎斯特采样定理,以避免采样失真。
观测离散信号时,可以利用计算机进行各种信号处理和分析,如滤波、谱分析等。
离散信号的特性和应用都十分广泛。
在通信系统中,离散信号的传输和处理是实现音视频编码和数据传输的重要手段。
在信号处理领域,离散信号的分析和处理常用于故障诊断、数据压缩、图像处理等方面。
离散数学实验指导书(附带模板)

《离散数学》实验指导书一、实验目的《离散数学》是现代数学的一个重要分支,是计算机科学与技术专业的基础理论课,也是该专业的核心课程和主干课程。
“离散数学”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。
该课程一方面为后继课程如数据结构、编绎原理、操作系统、数据库原理、人工智能和形式语言与自动机等提供必要的理论基础;同时,更为重要的是培养学生的抽象思维能力和逻辑推理能力,为今后的学习和工作打好基础。
无论从计算机学科发展的过去、现在和未来看,《离散数学》都是计算机科学与技术专业不可缺少的重要组成部分。
这门课程有着其它课程不可替代的地位和作用,是一门承前启后的课程。
根据《离散数学》课程本身的理论性较强的特性,为了帮助学生更好地学习本课程,理解和掌握所学基本概念和方法,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,设置实践环节十分重要。
通过实验实践内容的训练,突出逻辑性思维训练的特征, 目的是学习离散数学中的基本算法和方法,掌握数理逻辑、关系和图论中的基本算法,提高学生学习的兴趣及实际动手的能力。
通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所学知识,培养分析、解决实际问题的能力。
二、实验要求掌握真值表技术,熟悉联结词合取、析取、条件和双条件的概念。
熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
熟悉邻接矩阵和两结点间长度为m 的路的数目的关系。
熟悉最优树的构造算法,掌握最优树的构造过程。
实验前作好准备,分析问题并确定算法,设计代码。
做实验过程中认真分析和调试程序,记录并分析实验结果。
实验后完成实验报告,实验报告包括实验目的、实验内容、源程序、运行结果及分析。
可以使用C、VC或MATLAB完成实验。
实验题目包括真值计算、关系闭包计算、计算两结点间长度为m的路的数目、最优树的构造四个实验,每个实验要求2个学时完成。
三、实验设备及环境PC机一台,软件C、VC或MATLAB四、实验内容实验一真值计算1、实验目的熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。
【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。
实验用例:用化简命题逻辑公式的方法设计一个5人表决开关电路,要求3人以上(含3人)同意则表决通过(表决开关亮)。
【实验原理和方法】(1)写出5人表决开关电路真值表,从真值表得出5人表决开关电路的主合取公式(或主析取公式),将公式化简成尽可能含五个基本联结词最少的等价公式。
(2)上面公式中的每一个联结词是一个开关元件,将它们定义成C语言中的函数。
(3)输入5人表决值(0或1),调用上面定义的函数,将5人表决开关电路真值表的等价公式写成一个函数表达式。
(4)输出函数表达式的结果,如果是1,则表明表决通过,否则表决不通过。
参考代码:#include<stdio.h>int vote(int a,int b,int c,int d,int e){//五人中任取三人的不同的取法有10种。
i f( a&&b&&c || a&&b&&d || a&&b&&e || a&&c&&d || a&&c&&e || a&&d&&e || b&&c&&d || b&&c&&e || b&&d&&e || c&&d&&e)return 1;e lsereturn 0;}void main(){i nt a,b,c,d,e;p rintf("请输入第五个人的表决值(0或1,空格分开):");s canf("%d%d%d%d%d",&a,&b,&c,&d,&e);i f(vote(a,b,c,d,e))printf("很好,表决通过!\n");e lseprintf("遗憾,表决没有通过!\n");}//注:联结词不定义成函数,否则太繁实验二命题逻辑推理【实验目的】加深对命题逻辑推理方法的理解。
【实验内容】用命题逻辑推理的方法解决逻辑推理问题。
实验用例:根据下面的命题,试用逻辑推理方法确定谁是作案者,写出推理过程。
(1)营业员A或B偷了手表;(2)若A作案,则作案不在营业时间;(3)若B提供的证据正确,则货柜末上锁;(4)若B提供的证据不正确,则作案发生在营业时间;(5)货柜上了锁。
【实验原理和方法】(1)符号化上面的命题,将它们作为条件,营业员A偷了手表作为结论,得一个复合命题。
(2)将复合命题中要用到的联结词定义成C语言中的函数,用变量表示相应的命题变元。
将复合命题写成一个函数表达式。
(3)函数表达式中的变量赋初值1。
如果函数表达式的值为1,则结论有效, A偷了手表,否则是B偷了手表。
用命题题变元表示:A:营业员A偷了手表B:营业员B偷了手表C:作案不在营业时间D:B提供的证据正确E:货柜末上锁则上面的命题符号化为 (A||B) && (!A||C) && (!D||E) && (D||!C) && !E要求找到满足上面式子的变元A,B的指派便是结果。
C语言算法:i nt A,B,C,D,E;f or(A=0;A<=1;A++)for(B=0;B<=1;B++)for(C=0;C<=1;C++)for(D=0;D<=1;D++)for(E=0;E<=1;E++)if((A||B) && (!A||C) && (!D||E) && (D||!C) && !E)printf("A=%d,B=%d\n",A,B);}/*实验结果是:A=0,B=1,即B偷了手表*/实验三集合运算【实验目的】掌握用计算机求集合的交、并、差和补运算的方法。
【实验内容】编程实现集合的交、并、差和补运算。
【实验原理和方法】(1)用数组A,B,C,E表示集合。
输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。
以下每一个运算都要求先将集合C置成空集。
(2)二个集合的交运算:把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C中,数组C便是集合A和集合B的交。
C语言算法:f or(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]==b[j]) c[k++]=a[i];(3)二个集合的并运算:把数组A中各个元素先保存在数组C中。
将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B的并。
C语言算法:for(i=0;i<m;i++)c[i]=a[i];f or(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中各个元素先保存在数组C中。
将数组B中的元素逐一与数组B中的元素进行比较,把相同的元素从数组C中删除,数组C便是集合A和集合B的差A-B。
C语言算法:f or(i=0;i<m;i++)c[i]=a[i];f or(i=0;i<n;i++)for(j=0;j<m;j++)if(b[i]==c[j]){for(k=j;k<m;k++)c[k]=c[k+1];/*移位*/m--;break;}(5)集合的补运算:将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。
求补集是一种种特殊的集合差运算。
实验四 二元关系及其性质【实验目的】掌握二元关系在计算机上的表示方法,并掌握如果判定关系的性质。
【实验内容】 编程判断一个二元关系是否为等价关系,如果是,求其商集。
等价关系:集合A 上的二元关系R 同时具有自反性、对称性和传递性,则称R 是A 上的等价关系。
【实验原理和方法】(1)A 上的二元关系用一个n ×n 关系矩阵R=n n ij r ⨯)(表示,定义一个n ×n 数组r[n][n]表示n ×n 矩阵关系。
(2)若R 对角线上的元素都是1,则R 具有自反性。
C 语言算法:int i,flag=1;for(i=0;i<N && flag ;i++)if(r[i][i]!=1) flag=0; 如果flag=1, 则R 是自反关系(3)若R 是对称矩阵,则R 具有对称性。
对称矩阵的判断方法是:R r R r ji ij ∈∀∈∀有,。
C 语言算法:int i,j,flag=1;for(i=0;i<N && flag ;i++)for(j=i+1;j<N && flag;j++)if(r[i][j] &&r[j][i]!=1) flag=0; 如果flag=1, 则R 是对称关系(4)关系的传递性判断方法:对任意i ,j ,k ,若111===ik jk ij r r r 有且。
C 语言算法:int i,j,k,flag=1;for(i=0;i<N && flag;i++)for(j=0;j<N && flag;j++)for(k=0;k<N && flag;k++)if(r[i][j] &&r[j][k] && r[i][k]!=1) flag=0; 如果flag=1, 则R 是传递关系(5)求商集的方法:商集是由等价类组成的集合。
已知R 是等价关系,下面的算法是把等价类分行打印出来。
C 语言算法:int i,j,flag=1;int a[N];for(i=0;i<N;i++)a[i]=i+1;/*i代表第i个元素*/for(i=0;i<N;i++){if(a[i]){printf("{ ");for(j=0;j<N;j++)if(r[i][j] && a[j]!=0){printf("%d ",a[j]);/*打印和第i个元素有关系的所有元素*/a[j]=0;}printf("}\n");}}实验五 关系闭包运算【实验目的】掌握求关系闭包的方法。
【实验内容】编程求一个关系的闭包,要求传递闭包用warshall 方法。
【实验原理和方法】设N 元关元系用r[N][N]表示,c[N][N]表示各个闭包,函数initc(r)表示将c[N][N]初始化为r[N][N]。
(1)自反闭包:A I R R r =)(。
C 语言算法: 将关系矩阵的对角线上所有元素设为1。
initc(r);/*将关系矩阵的对角线上所有元素设为1*/for(i=0;i<N;i++) c[i][i]=1;(2)对称闭包:R R R s '= )(C 语言算法: 在关系矩阵的基础上,若1,1==ji ij r r 令。
initc(r);for(i=0;i<N;i++)for(j=0;j<N;j++) if(c[i][j]) c[j][i]=1;/*将关系矩阵的对角线上所有元素设为1*/(3)传递闭包:n R R R R t 2)(=,或用warshall 方法。
方法1:n R R R R t 2)(=,下面求得的关系矩阵T=n n ij b ⨯)(就是)(R t 。
int b[N][N];initc(r);/*用c 装好r*/for(m=1;m<N;m++) /*得r 的m 次方,用c 装好*/{for(i=0;i<N;i++)for(j=0;j<N;j++){b[i][j]=0;for(k=0;k<N;k++)b[i][j]+=c[i][k]*r[k][j];if(b[i][j]) b[i][j]=1;} initc(b);/*把r 的m 次方b 赋给c 保存*/方法2:warshall方法initc(r);/*用c装好r*/for(i=0;i<N;i++)for(j=0;j<N;j++)if(c[j][i])for(k=0;k<N;k++){c[j][k]=c[j][k]+c[i][k];if(c[j][k]) c[j][k]=1;}实验六 欧拉图判定和应用【实验目的】掌握判断欧拉图的方法。