离散实验报告
- 格式:doc
- 大小:186.50 KB
- 文档页数:21
离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。
本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。
一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。
图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。
以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。
通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。
二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。
通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。
例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。
三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。
排列组合是密码学中常用的数学工具之一。
通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。
例如,RSA加密算法中的大素数的选择,就涉及了排列组合的知识。
四、概率论在数据分析中的应用概率论是离散数学中的一门重要学科,它在数据分析中具有广泛的应用。
通过概率论的方法,我们可以对数据进行统计和分析,从而得出一些有意义的结论。
例如,在市场调研中,我们可以通过抽样调查的方法,利用概率论的知识,对整个市场的情况进行推断。
五、图论在物流规划中的应用物流规划是现代物流管理中的一个重要环节。
图论作为离散数学的重要分支,可以帮助我们解决物流规划中的一些问题。
例如,我们可以通过构建物流网络图,分析货物的流动路径,优化物流的运输效率,降低物流成本。
结论:离散数学作为一门重要的数学学科,在现实生活中具有广泛的应用。
通过对离散数学的学习和应用,我们可以解决实际问题,提高工作效率,推动社会的发展。
希望通过本实验报告的介绍,能够增加对离散数学的兴趣,进一步挖掘离散数学在实际生活中的潜力。
一、实验目的1. 理解幂集的概念,掌握幂集的运算规则;2. 掌握幂集在实际问题中的应用;3. 培养逻辑思维能力和编程能力。
二、实验原理幂集是指一个集合中所有子集的集合,记作P(A)。
对于任意集合A,其幂集P(A)的元素个数等于2的A的元素个数次方。
设集合A={a1, a2, ..., an},则其幂集P(A)包含以下元素:1. 空集∅;2. 单元素集合{a1},{a2},...,{an};3. 两个元素组成的集合,如{a1, a2},{a1, a3},...,{an-1, an};4. ...;5. n个元素组成的集合,即A本身。
幂集的运算规则如下:1. 交换律:P(A) = P(B);2. 结合律:(P(A) ∩ P(B)) ∩ P(C) = P(A ∩ B) ∩ P(C);3. 分配律:P(A) ∪ (P(B) ∩ P(C)) = (P(A) ∪ P(B)) ∩ (P(A) ∪ P(C))。
三、实验内容1. 定义一个集合A;2. 求集合A的幂集P(A);3. 分析幂集在实际问题中的应用。
四、实验步骤1. 定义集合A,例如:A = {1, 2, 3};2. 编写程序计算幂集P(A);3. 分析幂集P(A)的元素;4. 应用幂集解决问题。
五、实验结果以集合A = {1, 2, 3}为例,其幂集P(A)为:P(A) = {∅, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}六、实验分析1. 幂集P(A)包含8个元素,即2^3 = 8,符合幂集的定义;2. 幂集P(A)的元素包括空集、单元素集合、两个元素组成的集合以及A本身;3. 幂集在实际问题中具有广泛的应用,例如:在计算机科学中,集合的幂集可以用于描述数据结构、算法设计等;在数学中,幂集可以用于研究集合论、拓扑学等。
七、实验总结通过本次实验,我们掌握了幂集的概念和运算规则,并了解了幂集在实际问题中的应用。
一、实验目的1. 理解离散信号与系统的基本概念和特性;2. 掌握离散信号与系统的时域分析方法;3. 通过MATLAB仿真,加深对离散信号与系统时域分析的理解。
二、实验原理离散信号与系统是数字信号处理的基础,其分析方法主要包括时域分析、频域分析、Z变换分析等。
本实验主要研究离散信号与系统的时域分析方法。
时域分析主要包括信号的波形分析、时移、翻转、微分、积分等运算,以及系统的零状态响应和零输入响应等。
三、实验内容1. 离散信号的时域分析(1)利用MATLAB生成一个简单的离散信号,如方波信号、三角波信号等;(2)对生成的离散信号进行时移、翻转、微分、积分等运算,观察运算结果;(3)绘制信号波形图,分析信号特性。
2. 离散系统的时域分析(1)利用MATLAB建立离散系统模型,如一阶差分方程、二阶差分方程等;(2)对离散系统进行零状态响应和零输入响应分析;(3)绘制系统响应曲线,分析系统特性。
四、实验步骤1. 利用MATLAB生成方波信号、三角波信号等,并进行时域分析;2. 对生成的离散信号进行时移、翻转、微分、积分等运算,观察运算结果;3. 绘制信号波形图,分析信号特性;4. 建立离散系统模型,进行零状态响应和零输入响应分析;5. 绘制系统响应曲线,分析系统特性。
五、实验结果与分析1. 离散信号的时域分析(1)方波信号时域分析:通过MATLAB生成方波信号,进行时移、翻转、微分、积分等运算,观察运算结果。
结果显示,时移、翻转等运算改变了信号的相位,微分运算改变了信号的频率,积分运算改变了信号的幅度。
(2)三角波信号时域分析:通过MATLAB生成三角波信号,进行时域分析。
结果显示,三角波信号具有连续变化的特性,在时域上表现出较好的平滑性。
2. 离散系统的时域分析(1)一阶差分方程系统:建立一阶差分方程系统模型,进行零状态响应和零输入响应分析。
结果显示,系统响应曲线呈现出指数衰减特性,符合一阶系统的特性。
离散信号分析实验报告引言离散信号分析是数字信号处理中的一个重要概念,它涉及到对一系列离散的数据进行分析和处理。
通过对信号进行采样和量化,我们可以将连续信号转换为离散信号,并利用离散信号分析方法来研究信号的性质和特征。
本实验报告将介绍离散信号分析的基本概念以及常用的分析方法。
实验目的通过本次实验,我们将掌握以下内容: 1. 理解离散信号和连续信号的区别和联系; 2. 学习离散信号的采样和量化方法; 3. 掌握离散信号的时域分析方法,如序列的求和、平均、差分等; 4. 学习离散信号的频域分析方法,如傅里叶变换、频谱分析等。
实验步骤1. 信号的采样和量化在离散信号分析中,我们首先需要对连续信号进行采样和量化。
采样是指将连续信号在一定时间间隔内进行取样,得到一系列离散的采样点。
量化是指对采样点进行量化,将其离散化为有限个取值。
我们可以使用MATLAB等工具来进行信号的采样和量化。
2. 时域分析在离散信号分析中,时域分析是研究信号在时间域上的特性和性质的方法之一。
常用的时域分析方法包括序列的求和、平均、差分等。
•序列的求和:我们可以对离散信号的序列进行求和,求得序列的总和。
这可以帮助我们了解信号的能量和幅值等特性。
•序列的平均:通过对离散信号的序列进行求平均,我们可以得到信号的平均值,进一步了解信号的均值和稳定性。
•序列的差分:差分是指计算离散信号序列中相邻两个采样点的差值。
通过计算差分,我们可以了解信号的变化率和趋势。
3. 频域分析频域分析是研究信号在频率域上的特性和性质的方法之一。
常用的频域分析方法包括傅里叶变换和频谱分析。
•傅里叶变换:傅里叶变换是一种将信号从时域转换到频域的方法,通过傅里叶变换,我们可以将信号表示为一系列频率和幅度的组合。
傅里叶变换可以帮助我们了解信号的频率成分和频谱特性。
•频谱分析:频谱分析是对信号的频率成分进行分析和研究的方法。
通过对信号进行频谱分析,我们可以了解信号的频率分布和频域特性。
“离散数学”实验报告目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)1、实验原理........................................................................................................2、实验过程.......................................................................................................五、实验数据及结果分析 (13)六、源程序清单 (24)源代码 (24)七、其他收获及体会 (45)一、实验目的实验一:熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
实验二:掌握关系的概念与性质,基本的关系运算,关系的各种闭包的求法。
理解等价类的概念,掌握等价类的求解方法。
实验三:理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。
二、实验内容实验一:1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))实验二:1.求有限集上给定关系的自反、对称和传递闭包。
(有两种求解方法,只做一种为A,两种都做为B)2. 求有限集上等价关系的数目。
(有两种求解方法,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。
(C)实验三:以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A)。
并计算任意两个结点间的距离(B)。
对不连通的图输出其各个连通支(C)。
三、实验环境C或C++语言编程环境实现。
四、实验原理和实现过程(算法描述)实验一:1.实验原理(1)合取:二元命题联结词。
引言:离散数学是一门基础性的数学学科,广泛应用于计算机科学、电子信息等领域。
本文是《离散数学实验报告(二)》,通过对离散数学实验的深入研究和实践,总结了相关的理论知识和应用技巧,希望能够对读者对离散数学有更加深入的理解。
概述:本实验主要涉及离散数学中的集合、关系、图论等基本概念及其应用。
通过对离散数学的实验学习,深入掌握了这些概念和应用,对于在实际问题中的应用和拓展具有重要的意义。
正文内容:一、集合相关概念及应用1.定义:集合是由元素组成的无序的整体。
介绍了集合的基本概念、集合的表示法以及集合的运算。
2.集合的应用:介绍了集合在数学、计算机科学中的应用,如数据库的查询、关系代数等。
二、关系相关概念及应用1.定义:关系是一个元素与另一个元素之间的对应关系。
介绍了关系的基本概念、关系的表示方法及其运算。
2.关系的应用:介绍了关系在图像处理、社交网络分析等领域的应用,如图像中的像素点之间的关系、社交网络中用户之间的关系等。
三、图论基础知识及应用1.定义:图是由顶点和边组成的抽象的数学模型。
介绍了图的基本概念、图的表示方法和图的运算。
2.图论的应用:介绍了图论在路由算法、电子商务等领域的应用,如路由器的路由选择、电子商务中的商品推荐等。
四、布尔代数的概念及应用1.定义:布尔代数是一种基于集合论和逻辑学的代数系统。
介绍了布尔代数的基本概念、布尔表达式及其化简方法。
2.布尔代数的应用:介绍了布尔代数在电路设计、开关控制等方面的应用,如逻辑门电路的设计、开关控制系统的建模等。
五、递归的概念及应用1.定义:递归是一种通过调用自身来解决问题的方法。
介绍了递归的基本原理、递归的应用技巧。
2.递归的应用:介绍了递归在算法设计、树的遍历等方面的应用,如快速排序算法、树结构的遍历等。
总结:通过本次离散数学的实验学习,我深入掌握了集合、关系、图论等基本概念与应用。
集合的应用在数据库查询、关系代数等方面起到了重要的作用。
关系的应用在图像处理、社交网络分析等领域有广泛的应用。
第1篇一、实验目的1. 理解时域离散信号的基本概念和特性。
2. 掌握时域离散信号的表示方法。
3. 熟悉常用时域离散信号的产生方法。
4. 掌握时域离散信号的基本运算方法。
5. 通过MATLAB软件进行时域离散信号的仿真分析。
二、实验原理时域离散信号是指在时间轴上取离散值的一类信号。
这类信号在时间上不连续,但在数值上可以取到任意值。
时域离散信号在数字信号处理领域有着广泛的应用,如通信、图像处理、语音处理等。
时域离散信号的基本表示方法有:1. 序列表示法:用数学符号表示离散信号,如 \( x[n] \) 表示离散时间信号。
2. 图形表示法:用图形表示离散信号,如用折线图表示序列。
3. 时域波形图表示法:用波形图表示离散信号,如用MATLAB软件生成的波形图。
常用时域离散信号的产生方法包括:1. 单位阶跃信号:表示信号在某个时刻发生突变。
2. 单位冲激信号:表示信号在某个时刻发生瞬时脉冲。
3. 正弦信号:表示信号在时间上呈现正弦波形。
4. 矩形脉冲信号:表示信号在时间上呈现矩形波形。
时域离散信号的基本运算方法包括:1. 加法:将两个离散信号相加。
2. 乘法:将两个离散信号相乘。
3. 卷积:将一个离散信号与另一个离散信号的移位序列进行乘法运算。
4. 反褶:将离散信号沿时间轴翻转。
三、实验内容1. 实验一:时域离散信号的表示方法(1)使用序列表示法表示以下信号:- 单位阶跃信号:\( u[n] \)- 单位冲激信号:\( \delta[n] \)- 正弦信号:\( \sin(2\pi f_0 n) \)- 矩形脉冲信号:\( \text{rect}(n) \)(2)使用图形表示法绘制以上信号。
2. 实验二:时域离散信号的产生方法(1)使用MATLAB软件生成以下信号:- 单位阶跃信号- 单位冲激信号- 正弦信号(频率为1Hz)- 矩形脉冲信号(宽度为2)(2)观察并分析信号的波形。
3. 实验三:时域离散信号的基本运算(1)使用MATLAB软件对以下信号进行加法运算:- \( u[n] \)- \( \sin(2\pi f_0 n) \)(2)使用MATLAB软件对以下信号进行乘法运算:- \( u[n] \)- \( \sin(2\pi f_0 n) \)(3)使用MATLAB软件对以下信号进行卷积运算:- \( u[n] \)- \( \sin(2\pi f_0 n) \)(4)使用MATLAB软件对以下信号进行反褶运算:- \( u[n] \)4. 实验四:时域离散信号的仿真分析(1)使用MATLAB软件对以下系统进行时域分析:- 系统函数:\( H(z) = \frac{1}{1 - 0.5z^{-1}} \)(2)观察并分析系统的单位冲激响应。
离散数学实验报告一、实验目的离散数学是现代数学的一个重要分支,它在计算机科学、信息科学、人工智能等领域有着广泛的应用。
本次离散数学实验的目的在于通过实际操作和编程实现,深入理解离散数学中的基本概念、原理和算法,提高解决实际问题的能力,培养逻辑思维和创新能力。
二、实验环境本次实验使用的编程语言为 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、图的遍历图是离散数学中的重要结构。
离散信号分析实验报告离散信号分析实验报告引言离散信号分析是一门重要的信号处理技术,广泛应用于通信、图像处理、音频处理等领域。
本实验旨在通过实际操作,探索离散信号分析的基本原理和方法,并通过实验结果验证理论知识的正确性。
实验一:离散信号采样与重构在离散信号分析中,采样是将连续时间信号转换为离散时间信号的过程。
首先,我们使用示波器对连续时间信号进行采样,得到一组离散时间信号。
然后,通过重构技术,将离散时间信号恢复为连续时间信号。
实验中,我们选择了一个正弦信号作为输入信号,通过改变采样频率和重构方法,观察信号的失真情况。
实验结果表明,当采样频率低于信号频率的两倍时,会发生混叠现象,导致信号失真。
而当采样频率高于信号频率的两倍时,信号可以被完全恢复。
此外,使用不同的重构方法也会对信号的失真程度产生影响。
通过实验,我们深入理解了采样和重构的原理,并了解到了如何选择合适的采样频率和重构方法。
实验二:离散信号频谱分析频谱分析是离散信号分析的重要内容之一。
在实验中,我们使用FFT算法对离散信号进行频谱分析,并观察信号在频域上的特征。
通过改变输入信号的频率、幅度和相位,我们可以观察到频谱分析结果的变化。
实验结果表明,在频域上,信号的频谱图呈现出明显的峰值,对应着信号的频率成分。
当输入信号为单频信号时,频谱图上只有一个峰值;而当输入信号为复合信号时,频谱图上会有多个峰值。
此外,改变信号的幅度和相位也会对频谱图产生影响。
通过实验,我们进一步理解了离散信号在频域上的特性,为后续的信号处理工作奠定了基础。
实验三:离散信号滤波滤波是离散信号处理中常用的技术之一。
在实验中,我们使用FIR和IIR两种滤波器对输入信号进行滤波,并比较它们的性能差异。
通过观察输出信号的波形和频谱,我们可以评估滤波器的效果。
实验结果表明,FIR滤波器具有线性相位特性,能够实现较好的频率响应;而IIR滤波器则具有较窄的带宽和较快的响应速度。
根据不同的应用需求,我们可以选择合适的滤波器类型。
一、实验目的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}。
离散实验报告专业:数学与应用数学班级:091121学号:2009112125姓名:张鼎珩日期:2011.06.23实验内容:实验一真值计算实验二两个集合运算实验三关系闭包计算实验四关系与函数进行试验:实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容(1)求任意一个命题公式的真值表:从键盘输入两个命题P 和Q的真值,求它们的合取、析取、蕴含和等价的真值(2)利用真值表求任意一个命题公式的主范式(3)利用真值表进行逻辑推理三实验程序:#include<stdio.h>/*标准输入输出头文件*/#include<stdlib.h>/*该文件包含了的C语言标准库函数的定义*/#include<string.h>/*字符串数组的函数定义的头文件*/#include<conio.h>/*通用输入输出库*/#include<math.h>#define N 50void jisuan();void zhenzhibiao();void panduan(int b[N],int f);int tkh (char sz[N], char ccu[N], int icu[N], int h0);int fkh (char sz[N], char ccu[N], int icu[N], int h0);main(){int a1;start:do{printf(" 1.求P、Q的合取、析取、条件和双条件的真值\n 2.求任意一个命题公式的真值表,并根据真值表求主范式\n 3.退出\n");printf("\n选择功能选项:");fflush(stdin);/*清空输入缓冲区,通常是为了确保不影响后面的数据读取*/scanf("%d",&a1);switch(a1)/*switch语句实现选择功能*/{case 1:system("cls");jisuan();break;/*功能A*/case 2:system("cls");fflush(stdin);zhenzhibiao();break;/*功能BC*/case 3:system("exit");exit(0);/*结束整个程序的运行*/default:system("cls");goto start;/*控制流转移到start处*/}}while(1);}void jisuan()/*功能A*/{char p,q,t,ch;int p1,q1;do{start:fflush(stdin);printf("请输入P和Q的真值(T或F):");scanf("%c,%c",&p,&q);if((p=='F'||p=='f'||p=='T'||p=='t')&&(q=='F'||q=='f'||q=='T'||q=='t')){if(p=='F'||p=='f')/*赋值*/p1=0;elsep1=1;if(q=='F'||q=='f')q1=0;elseq1=1;if(p1|q1)/*计算*/t='T';elset='F';printf("P析取Q为:%c\n",t);if(p1&q1)t='T';elset='F';printf("P和取Q为:%c\n",t);if((!p1)|q1)t='T';elset='F';printf("P条件Q为:%c\n",t);if(p1==q1)t='T';elset='F';printf("P双条件Q为:%c\n",t);}else{printf("请按正确格式输入!\n");goto start;};printf("是否继续输入?Y/N");fflush(stdin);ch=getch();system("cls");}while(ch!='n'&&ch!='N');}void zhenzhibiao()/*功能BC*/{int i1,i2,d=1,icu[N],kh=0,jg,j=0,h0;int bj=0,hq[N],h=0,x=0,xq[N];char sz[N],ccu[N],sz0[N];hq[0]=-1;xq[0]=-1;printf("请输入一个合法的命题公式(可含与或非及括号):\n");gets(sz);strcpy(sz0,sz);for(i1=0;i1<strlen(sz);i1++){if(sz[i1]==')' || sz[i1]=='(')kh++;if(sz[i1]>='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z'){for(i2=0;i2<j;i2++) /*判断并储存变量*/if(ccu[i2]==sz[i1])d=0;if(d==1){ccu[j]=sz[i1];j++;}d=1;}}printf("\n该式子中的变量个数为:%d\n",j);h0=j;printf("\n输出真值表如下:\n \n");for(i1=0;i1<h0;i1++)printf(" %c ",ccu[i1]);printf(" ");puts(sz);printf("\n");for(i1=0;i1<j;i1++) /*先将所有的变量赋值为零*/icu[i1]=0;for(i2=0;i2<j;i2++)printf(" %d ",icu[i2]);jg=tkh(sz,ccu,icu,h0);if(jg==0)hq[h++]=bj;elsexq[x++]=bj;printf(" ------> %d\n",jg);strcpy(sz,sz0);for(i1=0;i1<(int)pow(2,j)-1;i1++){++bj;panduan(icu,0); /*赋值变量*/jg=tkh(sz,ccu,icu,h0);if(jg==0)hq[h++]=bj;elsexq[x++]=bj;strcpy(sz,sz0); /*恢复被修改的数组*/for(i2=0;i2<j;i2++)printf(" %d ",icu[i2]);printf(" ------> %d\n",jg);}if(hq[0]==-1)printf("\n该命题公式不存在主合取范式。
\n");else{printf("\n该命题公式的主合取范式:\n\t");for(i1=0;i1<h;i1++)printf("M(%d) ",hq[i1]);}if(xq[0]==-1)printf("\n该命题公式不存在主析取范式。
\n");else{printf("\n\n该命题公式的主析取范式:\n\t");for(i1=0;i1<x;i1++)printf("m(%d) ",xq[i1]);}printf("\n");getch();system("cls");fflush(stdin);}void panduan(int b[N],int f) /* 二进制赋值*/{int i;i=f;if(b[f]==0)b[f]=1;else{b[f]=0;panduan(b,++i);}}int tkh (char sz[N],char ccu[N],int icu[N],int h0){int i,j,h,s,kh=0,wz[N],a;char xs1[N],ckh[N]; /*xs1用来保存括号内的字符 ckh用来保存括号*/ s=strlen(sz);for(i=0;i<s;i++)if(sz[i]=='(' || sz[i]==')'){wz[kh]=i;ckh[kh]=sz[i];kh++;}if(kh==0)return fkh(sz,ccu,icu,h0);else{for(i=0;i<kh;i++)if(ckh[i]==')')break;for(j=wz[i-1]+1,h=0;j<wz[i];j++,h++)xs1[h]=sz[j];xs1[h]='\0';a=fkh(xs1,ccu,icu,h0);if(a==1)sz[wz[i-1]]=1;elsesz[wz[i-1]]=-2;for(j=wz[i-1]+1;j<s+wz[i-1]-wz[i];j++)sz[j]=sz[j+wz[i]-wz[i-1]];sz[j]='\0';return tkh(sz,ccu,icu,h0);}}int fkh(char sz[N],char ccu[N],int icu[N],int h0) {int i,h=0,j=0,j1=0,j2=0,j3=0,i1,i2,p1=-1,p2=-1,s;char dt[N];s=strlen(sz);if(s==1)if(sz[0]==-2)return 0;elsereturn 1; /*1 就是sz[0]的值*/else{for(i=0;i<s-j;i++) /*先处理非*/if(sz[i]=='!'){for(i1=0;i1<h0;i1++)if(sz[i+1]==ccu[i1])p1=icu[i1];if(sz[i+1]==-2)p1=0;if(p1==-1)p1=sz[i+1];dt[j+2]=!p1;sz[i]=j+2;j++;p1=0;for(i1=i+1;i1<s-j;i1++)sz[i1]=sz[i1+1];}p1=-1;j1=j;for(i=0;i<s-j1-2*j2;i++) /*处理与*/if(sz[i]=='&')for(i1=0;i1<h0;i1++){if(sz[i-1]==ccu[i1])p1=icu[i1];if(sz[i+1]==ccu[i1])p2=icu[i1];}for(i2=2;i2<j+2;i2++){if(sz[i-1]==i2)p1=dt[i2];if(sz[i+1]==i2)p2=dt[i2];}if(sz[i-1]==-2)p1=0;if(sz[i+1]==-2)p2=0;if(p1==-1)p1=(int)(sz[i-1]);if(p2==-1)p2=(int)(sz[i+1]);dt[j+2]=p1 && p2;sz[i-1]=j+2;j++;j2++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2;i1++)sz[i1]=sz[i1+2];i=i-1;}for(i=0;i<s-j1-2*j2-2*j3;i++) /* 处理或*/ if(sz[i]=='|'){for(i1=0;i1<h0;i1++){if(sz[i-1]==ccu[i1])p1=icu[i1];if(sz[i+1]==ccu[i1])p2=icu[i1];for(i2=2;i2<j+2;i2++){if(sz[i-1]==i2)p1=dt[i2];if(sz[i+1]==i2)p2=dt[i2];}if(sz[i-1]==-2)p1=0;if(sz[i+1]==-2)p2=0;if(p1==-1)p1=sz[i-1];if(p2==-1)p2=sz[i+1];dt[j+2]=p1 || p2;sz[i-1]=j+2;j++;j3++;p1=-1;p2=-1;for(i1=i;i1<s-j1-2*j2-2*j3;i1++) sz[i1]=sz[i1+2];i--;}return dt[j+1];}}运行结果:实验二两个集合运算一、实验目的集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构,数据库理论,开关理论,自动机理论和可计算理论等领域都有广泛的应用。