离散实验指导书

合集下载

离散数学实验指导书

离散数学实验指导书

实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。

二、实验内容从键盘输入两个命题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)

离散数学实验指导书(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("**************************************************\n\n");
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版

《离散数学》课程实验指导书《离散数学》实验指导书合肥工业大学计算机与信息学院王晓华,杨娟,李书杰,汪荣贵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、实验目的熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。

离散数学实践指导书

离散数学实践指导书

《离散数学实践》实验指导书课程类型:必修课适应专业:计算机科学与技术总学时:20学时实验学时:20(上机)实验次数:7先修课程:C(++)语言一、前言《离散数学》课程实验的目的是培养学生使用所学过的计算机程序设计语言求解一些简单的离散数学问题,通过实验帮助实验者理解有关的重要概念,加深了解和更好地掌握《离散数学》课程教学大纲要求的内容。

在《离散数学实践》的课程实验过程中,要求学生做到:1. 预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前做出思考和分析;2. 认真书写实验报告。

实验报告包括实验目的和要求,实验情况及其分析;写出程序设计说明,给出源程序框图和清单;3. 实验完成之后,应对算法与源程序进行评价,对运行结果进行分析,提交源程序及两组调试数据及其实验结果;4. 遵守机房纪律,爱护实验设备。

二、实验目的1. 培养学生动手编程解决实际问题的能力;2. 训练学生分析问题和调试程序的能力;3. 锻炼学生分析科技实验结果的能力;4. 为后续的课程学习和工作奠定良好的基础。

三、实验要求1. 问题分析:充分地分析和理解问题本身,弄清要求做什么,用什么算法。

2. 程序设计1) 根据所采用的算法,设计数据结构,画出流程图并编程;2) 最后准备调试程序的数据及测试方案。

3. 上机调试1) 对程序进行编译,纠正程序中可能出现的语法错误;2) 调试前,先运行一遍程序看看究竟将会发生什么;3) 如果情况不好,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试. 设置观察窗输出中间变量值等手段。

4. 整理实验报告1) 实验内容:采用的算法名称;2) 问题描述:包括目标. 任务. 条件约束描述等;3) 设计:数据结构设计和核心算法设计. 主要功能模块的输入. 处理(算法框架)和输出;4) 测试范例:测试结果的分析讨论. 测试过程中遇到的主要问题及所采用的解决措施;5) 心得:包括程序的改进设想,经验和体会;6) 程序清单:源程序,其中包括变量说明及详细的注释。

离散数学实验指导书_工程认证(实验5:分油问题)

离散数学实验指导书_工程认证(实验5:分油问题)

实验五分油问题●实验所属系列:离散数学课程实验●实验对象:本科●相关课程及专业:离散数学,计算机科学与技术●实验类型:综合型实验●实验时数(学分):4学时实验目的通过编写程序来解决有趣的逻辑问题,锻炼逻辑分析能力,熟悉离散数学知识的综合运用,提高程序设计水平。

实验内容与要求两个小孩去打油,一人带了一个一斤的空瓶,另一个带了一个七两和一个三两的空瓶。

原计划各打一斤油,可是由于所带的钱不够,只好合打了一斤油,在回家的路上,二人想平分这一斤油,可是又没有其它工具。

现只用这三个瓶子(一斤、七两、三两)精确地分出两个半斤油来。

实验的软硬件环境PC机一台,装有C/C++/JA V A语言集成开发环境。

实验过程和方法1)对分油问题进行逻辑分析。

分油问题的初始状态可表示为(10,0,0),然后经过一系列的循环倒油,直到所求的目标状态(5,5,0)由于没有其它工具,因此这里只有两种基本倒油操作:倒空源瓶或倒满目标瓶。

倒油过程中,若目标瓶已达到容量极限或倒油操作导致的状态之前曾经出现过,则此次倒油是没有必要的。

可见,这个问题的实质在于对所有倒油状态进行搜索。

搜索的方法可以是深入优先或者广度优先。

2)设计主要的搜索算法。

搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况。

对于问题的第一个状态,叫初始状态,要求的状态叫目标状态。

搜索就是把规则应用于实始状态,在其产生的状态中,直到得到一个目标状态为止。

产生新的状态的过程称为扩展(即由一个状态,通过应用规则,产生新状态的过程)。

搜索的要点是:A.初始状态;B.重复产生新状态;C.检查新状态是否为目标,是结束,否转B;如果搜索是以接近起始状态的程序依次扩展状态的,叫广度优先搜索。

如果扩展是首先扩展新产生的状态,则叫深度优先搜索。

利用程序实现深度优先搜索时,可用一个数组存放产生的所有状态。

离散数学实验指导书_工程认证(实验6:洒水车路线问题)

离散数学实验指导书_工程认证(实验6:洒水车路线问题)

实验六洒水车路线问题●实验所属系列:离散数学课程实验●实验对象:本科●相关课程及专业:离散数学,计算机科学与技术●实验类型:设计型实验●实验时数(学分):4学时实验目的解决与图论中欧拉回路有关的实际问题,扩展对于书本知识的理解,提高程序设计能力和逻辑思维能力。

实验内容与要求一辆洒水车从所在的市政办公点出发,需要在所有负责的街道上洒水,并最后回到原点。

问洒水车如何设计路线才能使得走的路程最短。

实验的软硬件环境PC机一台,装有C/C++/JA V A语言集成开发环境。

实验过程和方法1)对给定问题进行理论分析;将这个问题抽象成图论的语言,就是给定一个连通图,每条边的权值就是街道的长度,本问题转化为在图中求一条回路,使得回路的总权值最小。

如果街道的连通图为欧拉图,则只要求出图中的一条欧拉回路即可。

否则,洒水车要完成任务就必须在某些街道上重复走若干次。

如果重复走一次,就加一条平行边,于是原来对应的图形就变成了多重图。

只是要求加进的平行边的总权值最小就行了。

于是,问题就转化为,在一个有奇度数结点的赋权连通图中,增加一些平行边,使得新图不含奇度数结点,并且增加的边的总权值最小。

因此,问题的关键在于如何增加这些平行边。

设V1为图中所有奇度数节点的集合,下面给出了算法:1.使用弗洛伊德算法计算图中任一两结点间的最短路径长度。

2.构成一个|V1|×|V1|的矩阵,这个矩阵给出了图中每两个奇度数结点间的最短路径长度,3.将矩阵中的结点进行两两组合,找出一个最佳的组合情况,这种组合使得他们的最短路径长度之和最小。

4.根据前面得到的最佳组合,求出各对组合的最短路径。

并将最短路径上的每条边都加一条平行边。

5.利用Fleury算法求欧拉回路。

下面举例说明这个算法:上图的奇度数结点为1,3,6,11奇度数结点构成的矩阵为136111-153876315-247663824-5211767652-结点的最佳组合为:136111-153876315-247663824-5211767652-由于是对称的矩阵,我们只关心上三角部分:136111-153876315-247663824-5211767652-现在我们得到1和3,6和11之间的最短路径(1;3) (6;9), (9;11)将最短路径上的边各添加一条平行边。

实验指导书(带源程序)

实验指导书(带源程序)

实验一离散时间系统与MATLAB一. 实验目的1. 进一步加深对离散时间系统的理解。

2. 学习在MA TLAB中怎样表示离散时间信号。

3. 熟悉离散时间信号的作图。

二. 实验步骤1. 复习离散时间系统的有关内容。

2. 复习MA TLAB的基本语法。

3. 按实验内容熟悉stem。

4. 编写程序。

5. 输出结果,总结结论,按要求写出实验报告。

三. 实验内容1.掌握stem函数STEM(Y) plots the data sequence Y as stems from the x axis terminated with circles for the data value.STEM(X,Y) plots the data sequence Y at the values specified in X.例:t=[0:0.1:2]; x=cos(pi*t+0.6); stem(t,x);xn=[4,2,2,3,6,7]; stem(xn);思考:STEM(Y)与STEM(X,Y)有什么不同?STEM与PLOT函数有什么不同?2.掌握subplot函数H = SUBPLOT(m,n,p), or SUBPLOT(mnp), breaks the Figure window into an m-by-n matrix of small axes, selects the p-th axes for the current plot, and returns the axis handle. The axes are counted along the top row of the Figure window, then the second row, etc.例:n1=0:3;x1=[1,1,1,1];subplot(221);stem(n1,x1);title('x1序列');n2=0:7;x2=[1,2,3,4,4,3,2,1];subplot(222);stem(n2,x2);title('x2序列');n3=0:7;x3=[4,3,2,1,1,2,3,4];subplot(223);stem(n3,x3);title('x3序列');n4=0:7;x41=cos((pi/4)*n4);subplot(224);stem(n4,x41);title('x4序列');思考:subplot是怎样分配各个作图分区的顺序号的?3.信号的运算]0,1.0,4.0,7.0,1[)(1=n x ,]9.0,7.0,5.0,3.0,1.0[)(2=n x ,请作出)()(21n x n x +,)()(21n x n x 的图形。

离散上机实验报告

离散上机实验报告

实验名称:离散信号与系统的时域分析实验课程:离散信号与系统实验时间:2023年10月25日实验地点:计算机实验室一、实验目的1. 理解离散时间信号及其特性。

2. 掌握离散时间系统的时域分析方法。

3. 熟悉MATLAB在离散信号与系统分析中的应用。

二、实验原理离散信号与系统是信号与系统理论的重要组成部分,它研究离散时间信号和离散时间系统之间的相互关系。

离散时间信号是指在时间上以离散点取值的信号,而离散时间系统则是指输入和输出都是离散时间信号的系统。

在离散时间系统中,时域分析是最基本的分析方法。

它通过分析系统的输入和输出信号随时间的变化规律,来研究系统的动态特性和稳态特性。

三、实验内容1. 离散时间信号的生成与处理- 使用MATLAB生成一系列离散时间信号,如方波、三角波、锯齿波等。

- 对生成的信号进行时域变换,如求取信号的绝对值、平方、求导等。

- 绘制信号的时域波形图。

2. 离散时间系统的时域分析- 使用MATLAB建立离散时间系统模型。

- 计算系统的零点、极点。

- 分析系统的稳定性。

- 求解系统的单位脉冲响应和单位阶跃响应。

- 绘制系统响应的时域波形图。

3. MATLAB在离散信号与系统分析中的应用- 使用MATLAB进行信号的傅里叶变换和逆变换。

- 使用MATLAB进行系统的频域分析。

- 使用MATLAB进行系统的仿真实验。

四、实验步骤1. 实验一:离散时间信号的生成与处理- 使用MATLAB生成方波信号:```matlabfs = 1000; % 采样频率t = 0:1/fs:1-1/fs; % 时间向量f = 5; % 频率y = square(2pift); % 方波信号```- 绘制方波信号的时域波形图:```matlabplot(t, y);title('方波信号');xlabel('时间 (s)');ylabel('幅度');```2. 实验二:离散时间系统的时域分析- 建立离散时间系统模型:num = [1 -2 1]; % 系统的分子系数den = [1 -1.6 1.28 0.5 -0.1]; % 系统的分母系数 sys = tf(num, den); % 建立系统模型```- 计算系统的零点、极点:```matlab[z, p, k] = tfdata(sys);disp('零点:');disp(z);disp('极点:');disp(p);```- 分析系统的稳定性:```matlabisStable = isstable(sys);disp(['系统是否稳定:', num2str(isStable)]); ```- 求解系统的单位脉冲响应:```matlabyout = lsim(sys, [1 0], t);```- 绘制系统响应的时域波形图:plot(t, yout);title('系统响应');xlabel('时间 (s)');ylabel('幅度');```3. 实验三:MATLAB在离散信号与系统分析中的应用- 进行信号的傅里叶变换和逆变换:```matlabY = fft(y);y_inv = ifft(Y);```- 进行系统的频域分析:```matlabY = freqz(sys, 512);```- 进行系统的仿真实验:```matlab[yout, t_out] = lsim(sys, [1 0], t);```五、实验结果与分析1. 实验一结果分析- 通过MATLAB生成了方波信号,并绘制了其时域波形图。

《数字信号处理》实验指导书(正文)

《数字信号处理》实验指导书(正文)

实验一 离散时间信号分析一、实验目的1.掌握各种常用的序列,理解其数学表达式和波形表示。

2.掌握在计算机中生成及绘制数字信号波形的方法。

3.掌握序列的相加、相乘、移位、反褶等基本运算及计算机实现与作用。

4.掌握线性卷积软件实现的方法。

5.掌握计算机的使用方法和常用系统软件及应用软件的使用。

6.通过编程,上机调试程序,进一步增强使用计算机解决问题的能力。

二、实验原理1.序列的基本概念离散时间信号在数学上可用时间序列来表示,其中代表序列的第n 个数字,n 代表时间的序列,n 的取值范围为∞<<∞-n 的整数,n 取其它值)(n x 没有意义。

离散时间信号可以是由模拟信号通过采样得到,例如对)(t x a 模拟信号进行等间隔采样,采样间隔为T ,得到一个{})(nT x a 有序的数字序列就是离散时间信号,简称序列。

2.常用序列常用序列有:单位脉冲序列(单位采样))(n δ、单位阶跃序列)(n u 、矩形序列)(n R N 、实指数序列、复指数序列、正弦型序列等。

3.序列的基本运算序列的运算包括移位、反褶、和、积、标乘、累加、差分运算等。

4.序列的卷积运算∑∞∞-*=-=)()()()()(n h n x m n h m x n y上式的运算关系称为卷积运算,式中代表两个序列卷积运算。

两个序列的卷积是一个序列与另一个序列反褶后逐次移位乘积之和,故称为离散卷积,也称两序列的线性卷积。

其计算的过程包括以下4个步骤。

(1)反褶:先将)(n x 和)(n h 的变量n 换成m ,变成)(m x 和)(m h ,再将)(m h 以纵轴为对称轴反褶成)(m h -。

(2)移位:将)(m h -移位n ,得)(m n h -。

当n 为正数时,右移n 位;当n 为负数时,左移n 位。

(3)相乘:将)(m n h -和)(m x 的对应点值相乘。

(4)求和:将以上所有对应点的乘积累加起来,即得)(n y 。

离散实验

离散实验

实验一 命题逻辑

char first(char op1, char op2)//根据输入的两个关联词,查找他们的优先级关系 { char tab[8][9]={ "><<<<<>>", ">><<<<>>", ">>><<<>>", ">>>><<>>", ">>>>><>>", "<<<<<<=E", ">>>>>E>>", "<<<<<<E=",}; char optr_list[]="+-|&!()@";//双条件、条件、析取、合取、非 int op1_loc, op2_loc; for(op1_loc=0;op1_loc<(int)strlen(optr_list);op1_loc++)if(optr_list[op1_loc]==op1)br eak; for(op2_loc=0;op2_loc<(int)strlen(optr_list);op2_loc++)if(optr_list[op2_loc]==op2)br eak; return tab[op1_loc][op2_loc];}
实验一 命题逻辑

离散数学实验指导书(2011516)

离散数学实验指导书(2011516)

离散数学实验指导书姜楠焉德军李笑牛(校内自编教材)大连民族学院计算机科学与工程学院2011年3月前言通常人们对离散数学教学的认识就是概念、定理、公式和解题。

但是,离散数学不仅仅是这些,还有实验。

在理论教学过程中,学生的活动只是“智力活动”,或更为直接地说是解题活动,教师在上面讲离散数学,而学生则每天在课堂上听课并在纸上做题目。

这样,对多数学生而言,离散数学的发现探索活动没有能够真正开展起来。

离散数学实验教学,通常由教师提出问题,让学生在计算机上做实验,利用小组合作学习或者组织全班讨论,开展研究性学习活动;实验过程中,依靠计算机,让学生主动参与发展、探究、解决问题,从中获得离散数学研究、解决实际问题的过程体验、情感体验,产生成就感,进而开发学生的创新潜能,因而对离散数学实验课程教学进行研究具有重要意义。

利用计算机进行离散数学实验教学,不仅是开展离散数学研究性学习的一种有效方式,而且也为数据结构及程序设计课程教学的开展提升了层次。

知识经济时代对创新人才的需求与离散数学教育中忽视学生创造性能力培养的矛盾日益凸显。

在教学中倡导研究性学习,开展离散数学实验课程教学的研究与探索,与当前社会对离散数学教学的需求是一致的。

目前国内外很少有人对离散数学实验课程教学进行研究,尤其是国内进行这方面研究的人员更少,人们更重视离散数学理论课程教学的研究,忽视了离散数学实验课程对理论课程教学的辅助与促进作用,也忽视了离散数学实验课程与数据结构等课程的有机联系。

因而我准备进行离散数学实验课程教学的研究与探索,以便更好的做好离散数学课程的教学改革工作。

本课程主要包括四个部分:集合与关系、图论、代数系统、数理逻辑。

要求学生了解算法,理解运用C或C++语言把书中的部分内容的算法编写出能在计算机上运行的程序的思想,掌握实现离散数学部分算法程序设计的基本编程技术。

目录前言 1 第一章集合 3 实验一集合的运算 3 实验二求集合的笛卡儿乘积 6 第二章关系7 实验三判断关系R的性质7 实验四判断关系R是否为等价关系10 实验五求等价类11 实验六由两个已知关系通过合成构造新的关系12 实验七关系的闭包运算13 实验八求关系个数的运算14 实验九求自反关系和对称关系的运算15 实验十求集合A上所有等价关系和偏序关系16 二、求集合A上的所有偏序关系17实验十一求满射函数18 第三章图论19 实验十二求可达矩阵的Warshall算法19 实验十三最小生成树的Kruskal算法20 实验十四判别图的连通性21 实验十五求无向图中顶点的度数23 实验十六求有向图中顶点的度数24 第四章代数系统25 实验十七判断是否为代数系统的算法25 实验十八判断是否为群的算法26 第五章数理逻辑28 实验十九构造合式公式的真值表28第一章集合实验一集合的运算一、求集合的并集1、实验类型:操作性2、实验目的通过编程实现求给定集合A和B的并集C(C=A∪B)的运算。

(完整版)离散数学实验指导书及其答案

(完整版)离散数学实验指导书及其答案

实验一命题逻辑公式化简【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。

【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。

实验用例:用化简命题逻辑公式的方法设计一个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

离散实验1

实验一连结词逻辑运算一.实验目的实现二元合取、析取、蕴涵和等价表达式的计算。

熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。

二.实验内容从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、蕴涵和等价四种运算的的真值。

要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。

三、实验主要仪器和设备硬件配置:PC,使用VC++6.0作为此次实验的实验环境。

开发语言:C语言。

四. 实验方法与步骤1. 算法分析:合取/\:p,q都为1的时候为1,其他为0析取\/:p,q都为0的时候为0,其他为1蕴含->:p为1,q为0时为0,其他为1等价<->:p,q同真同假算法设计思路:对各个输入量的处理,要确定输入的为0或1,否则出错,接下来就是运算处理,在C语言中本身支持的有与或非这三种,可以用!,&&,||来表示,而在这个实验中,不是与或非的可以通过转化而变为与或非的形式,具体流程图如下:2. 程序代码:#include <stdlib.h>#include <stdio.h>int main(){int a[3];int p=-1,q=-1;char s;aa:printf("\t\t ***************************************\n"); printf("\t\t ** **\n");printf("\t\t ** ☆欢迎使用逻辑运算软件☆ **\n");printf("\t\t ** **\n");printf("\t\t ***************************************\n\n");bb:printf("\n 请输入P的值(0或1),以回车结束:");scanf("%d",&p);if (p!=0&&p!=1)//检验输入的P值是否在允许范围内,出错则重新输入{printf("\n P的值输入有误,请重新输入");goto bb;}cc:printf("\n 请输入Q的值(0或1),以回车结束:");scanf("%d",&q);if (q!=0&&q!=1)//检验输入的Q值是否在允许范围内,出错则重新输入{printf("\n Q的值输入有误,请重新输入");goto cc;}a[0]=p&&q;//与运算a[1]=p||q;//或运算a[2]=(!p)||q;//蕴含运算,将其转化为与或非形式a[3]=((!p)||q)&&((!q)||p);//等值运算,将其转化为与或非形式printf("\n\n 合取:\n P/\\Q=%d\n",a[0]);//输出结果printf(" 析取:\n P\\/Q=%d\n",a[1]);printf(" 蕴含:\n P->Q=%d\n",a[2]);printf(" 等价:\n P<->Q=%d\n",a[3]);dd:printf("\n是否继续运算?(y/n)");scanf("%s",&s);if (s=='y'||s=='n'){if (s=='y'){system("cls"); //清屏goto aa;//返回顶层}else printf("欢迎下次再次使用!");//退出程序}else{printf("输入错误,请重新输入\n");//错误检验goto dd;}return 0;}3.实验数据及结果分析;初始界面:输入、选择和具体的操作过程:程序的退出:五.收获与感受题型很基础,但很久没有用C语言了有些东西用起来比较费劲,比如输入错误之后再重新输入一开始用While语句写了一大串还是没有成功,最后翻了翻原来做的题才写好的,但是写好之后又想起了goto语句,最后经过一波三折还是选择了简单的goto语句,写完之后自己又完善了一下输入提示方面的东西,又加了些注释,虽然有些瑕疵之类的,但总体感觉上还可以。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}实验六 欧拉图判定和应用【实验目的】掌握判断欧拉图的方法。

相关文档
最新文档