离散数学计算机实验报告.docx
- 文档编号:14495581
- 上传时间:2023-04-23
- 格式:DOCX
- 页数:21
- 大小:24.40KB
离散数学计算机实验报告.docx
《离散数学计算机实验报告.docx》由会员分享,可在线阅读,更多相关《离散数学计算机实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
离散数学计算机实验报告
离散实验报告
实验一真值计算
1、实验目的
熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。
2、实验内容与要求
定义1设P表示一个命题,由命题联结词┐和命题P连接成┐P,称┐P为P的否定式复合命题,┐P读“非P”。
称┐为否定联结词。
┐P是真,当且仅当P为假;┐P是假,当且仅当P为真。
定义2设P和Q为两个命题,由命题联结词∧将P和Q连接成P∧Q,称P∧Q为命题P和Q的合取式复合命题,P∧Q读做“P与Q”,或“P且Q”。
称∧为合取联结词。
当且仅当P和Q的真值同为真,命题P∧Q的真值才为真;否则,P∧Q的真值为假。
定义3设P和Q为两个命题,由命题联结词∨把P和Q连接成P∨Q,称P∨Q为命题P和Q的析取式复合命题,P∨Q读做“P或Q”。
称∨为析取联结词。
当且仅当P和Q的真值同为假,P∨Q的真值为假;否则,P∨Q的真值为真。
定义4设P和Q为两个命题,由命题联结词→把P和Q连接成P→Q,称P→Q为命题P和Q的条件式复合命题,简称条件命题。
P→Q读做“P条件Q”或者“若P则Q”。
称→为条件联结词。
当P的真值为真而Q的真值为假时,命题P→Q的真值为假;否则,P→Q的真值为真。
定义5令P、Q是两个命题,由命题联结词把P和Q连接成PQ,称PQ为命题P和Q的双条件式复合命题,简称双条件命题,PQ读做“P当且仅当Q”,或“P等价Q”。
称为双条件联结词。
当P和Q的真值相同时,PQ的真值为真;否则,PQ的真值为假。
本实验要求从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。
用C语言或MATLAB实现。
3、实验报告要求
列出实验目的、实验内容、实验步骤、源程序和实验结果。
源代码:
#include
voidmain()
{
intp,q;
cout<<"请分别输入P,Q的真值:
";
cin>>p>>q;
if(p>1||p<0)
{
cout<<"P的真值有误,请重新输入!
"< } if(q>1||q<0) { cout<<"Q的真值有误,请重新输入! "< } if(p==0&&q==0) { cout<<"P∧Q=0"< cout<<"P∨Q=0"< cout<<"P→Q=1"< cout<<"P<->Q=1"< } if(p==0&&q==1) { cout<<"P∧Q=0"< cout<<"P∨Q=1"< cout<<"P→Q=1"< cout<<"P<->Q=0"< } if(p==1&&q==0) { cout<<"P∧Q=0"< cout<<"P∨Q=1"< cout<<"P→Q=0"< cout<<"P<->Q=0"< } if(p==1&&q==1) { cout<<"P∧Q=1"< cout<<"P∨Q=1"< cout<<"P→Q=1"< cout<<"P<->Q=1"< } } 运行结果: 请分别输入P,Q的真值: 01 P∧Q=0 P∨Q=1 P→Q=1 P<->Q=0 Pressanykeytocontinue 实验二关系闭包计算 1、实验目的 熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。 2、实验内容与要求 定义6设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则 ①R1是自反的(对称的、传递的) ②RR1 3对任何自反的(对称的、传递的)关系R2,若RR2,则R1R2。 R的自反、对称和传递闭包分别记为r(R)、s(R)和t(R)。 定理1令RAA,则 ①r(R)=R∪IA ②s(R)=R∪R-1 ③t(R)=R∪R2∪R3… Warshall算法: 设R是n个元素集合上的二元关系,M是R的关系矩阵; (1)置新矩阵A: =M (2)置i: =1; (3)forj=1tondo ifA[j,i]=1thendo fork=1tondo A[j,k]: =A[j,k]+A[i,k] (4)i=i+1; (5)ifi<=nthento(3) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) elsestop 本实验要求从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。 用C语言或MATLAB实现。 3、实验报告要求 列出实验目的、实验内容、实验步骤、源程序和实验结果。 源代码: #include classMatrix{ introw,col; double*p; public: Matrix(intr,intc); voidprint(); double&operator()(inti,intj); intgetrow() { returnrow; } intgetcol() { returncol; } friendMatrixoperator+(Matrixx,Matrixy);//定义运算符号 }; Matrix: : Matrix(intr,intc) { row=r; col=c; p=newdouble[r*c]; for(inti=0;i { p[i]=0; } } voidMatrix: : print()//矩阵输出函数 { for(inti=1;i<=row;i++) { for(intj=1;j<=col;j++) { cout< } cout< } } double&Matrix: : operator()(inti,intj)//定义()运算 { returnp[(i-1)*col+j-1]; } Matrixoperator+(Matrixx,Matrixy)//定义矩阵加法 { Matrixsum1(x.getrow(),x.getcol()); for(intm=1;m<=x.getrow();m++) { for(intn=1;n<=x.getcol();n++) { sum1(m,n)=x(m,n)+y(m,n); } } returnsum1; } //主函数 intmain() { intr1,c1; cout<<"请输入关系矩阵的行和列: "; cin>>r1>>c1; MatrixA(r1,c1); intm,n; cout<<"请输入关系矩阵的数据: "< for(m=1;m<=r1;m++) { for(n=1;n<=c1;n++) { cin>>A(m,n); } } cout<<"你所输入的关系矩阵是: "< A.print(); MatrixI(r1,c1); cout<<"元素A的恒等矩阵是: "< I.print(); for(m=1;m<=r1;m++) { for(n=1;n<=c1;n++) { if(m==n) {I(m,n)=1;} else {I(m,n)=0;} } } MatrixrA(r1,c1),sA(r1,c1),tA=A; for(m=1;m<=r1;m++)//自反闭包 { for(n=1;n<=c1;n++) { rA(m,n)=I(m,n)+A(m,n); if(rA(m,n)>1) { rA(m,n)=1; } } } cout<<"A的自反闭包关系矩阵是: "< rA.print(); MatrixAA(r1,c1); for(m=1;m<=r1;m++) { for(n=1;n<=c1;n++) { AA(m,n)=A(n,m); } } cout<<"A的逆矩阵是: "< AA.print(); for(m=1;m<=r1;m++)//对称闭包 { for(n=1;n<=c1;n++) { sA(m,n)=A(m,n)+AA(m,n); if(sA(m,n)>1) { sA(m,n)=1; } } } cout<<"A的对称闭包是: "< sA.print(); inti,j,k; for(i=1;i<=r1;i++)//传递 { for(j=1;j<=r1;j++) { if(tA(j,i)==1) { for(k=1;k<=r1;k++) { tA(j,k)=tA(j,k)+tA(i,k); } } } } for(m=1;m<=r1;m++) { for(n=1;n<=c1;n++) { if(tA(m,n)>1) { tA(m,n)=1; } } } cout<<"A的传递闭包是: "< tA.print(); return0; } 运行结果: 请输入关系矩阵的行和列: 33 请输入关系矩阵的数据: 100 101 010 你所输入的关系矩阵是: 100 101 010 元素A的恒等矩阵是: 000 000 000 A的自反闭包关系矩阵是: 100 111 011 A的逆矩阵是: 110 001 010 A的对称闭包是: 110 101 010 A的传递闭包是: 100 111 111 Pressanykeytocontinue 实验三计算两结点间长度为m的路的数目 1、实验目的 熟悉邻接矩阵和两结点间长度为m的路的数目的关系并编程计算。 2、实验内容与要求 定义7给定简单图G= 其中 i,j=1,2,…,n。 定理2设A为简单图G的邻接矩阵,则Am中的i行j列元素amij等于G中联结vi到vj的长度为m的链(或路)的数目。 本实验要求从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。 考虑有向图和无向图。 用C语言或MATLAB实现。 3、实验报告要求 列出实验目的、实验内容、实验步骤、源程序和实验结果。 源代码: #include classMatrix{ introw,col; double*p; public: Matrix(intr,intc); voidprint(); double&operator()(inti,intj); intgetrow() { returnrow; } intgetcol() { returncol; } friendMatrixoperator*(Matrixx,Matrixy);//定义运算符号 }; Matrix: : Matrix(intr,intc) { row=r; col=c; p=newdouble[r*c]; for(inti=0;i { p[i]=0; } } voidMatrix: : print()//矩阵输出函数 { for(inti=1;i<=row;i++) { for(intj=1;j<=col;j++) { cout< } cout< } } double&Matrix: : operator()(inti,intj)//定义()运算 { returnp[(i-1)*col+j-1]; } Matrixoperator*(Matrixx,Matrixy)//定义矩阵乘法 { Matrixsum2(x.getrow(),x.getcol()); for(intm=1;m<=x.getrow();m++) { for(intn=1;n<=x.getcol();n++) { sum2(m,n)=0; for(inte=1;e<=x.getrow();e++) { sum2(m,n)=x(m,e)*y(e,n)+sum2(m,n); } } } returnsum2; } //主函数 intmain() { intn;intm;intnum=0; cout<<"请输入简单图G中的结点个数: "; cin>>n; MatrixA(n,n); inti,j; cout<<"请输入结点之间的关系: "< for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>A(i,j); } } cout<<"简单图G的邻接矩阵是: "< A.print(); cout<<"请再输入一个正整数作为路的长度: "; cin>>m; MatrixAA=A; for(i=1;i { AA=AA*A; } AA.print(); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i! =j) { num=num+AA(i,j)*AA(i,j); } } } cout<<"长度为"< "< return0; } 运行结果: 请输入简单图G中的结点个数: 4 请输入结点之间的关系: 1011 1001 0100 0001 简单图G的邻接矩阵是: 1011 1001 0100 0001 请再输入一个正整数作为路的长度: 2 1112 1012 1001 0001 长度为2路的数目为: 14 Pressanykeytocontinue 实验四最优树的构造 1、实验目的 熟悉最优树的构造算法,掌握最优树的构造过程。 2、实验内容与要求 定义8在权分别为w1,w2,…,wt的加权二叉树T中,若权是wi的叶结点,其级为L(wi),则 称为加权二叉树T的权,并记为w(T)。 已知w1,w2,…,wt为权,T0为加权二叉树,其权为w(T0),如果对任意加权二叉树T,它的权是w(T),均有w(T0)≤w(T),则称T0是最优树或Huffman树。 定理3设T为加权w1,w2,…,wt且w1≤w2≤…≤wt的最优树,则 (1)加权w1和w2的叶结点vw1和vw2是兄弟。 (2)以叶结点vw1和vw2为儿子的分枝结点,它是所有分枝结点的级最高者。 定理4设T为加权w1,w2,…,wt且w1≤w2≤…≤wt的最优树,若将以加权w1和w2的叶结点为儿子的分枝结点改为加权w1+w2的叶结点而得到一棵新树T1,则T1是最优树。 根据上述两个定理,求一棵有t个权的最优树,可简化为求一棵有t-1个权的最优树,而这又可简化为求一棵有t-2个权的最优树,依此类推。 具体作法是: 首先找出两个最小的权值,设w1和w2。 然后对t-1个权w1+w2,w3,…,wt求作一棵最优树,并且将这棵树中的结w1+w2代之以w1w2,依此类推。 本实验要求从键盘输入一组权值,构造出对应的最优树,列出构造过程。 用C语言或MATLAB实现。 源代码: #include voidmain() { cout<<"请输入权值的数目: "; intn;inti,j,k,l; cin>>n; int*quan; quan=newint[n]; cout<<"请输入一组权值: "; for(i=0;i { cin>>quan[i]; } cout<<"需要构造的最优树的权值是: "; for(i=0;i { cout< } cout< intm; cout<<"构造最优树的过程: "< for(i=0;i { for(k=0;k for(j=k+1;j { if(quan[k]>quan[j]) { m=quan[k]; quan[k]=quan[j]; quan[j]=m; } } for(l=i;l { cout< } cout< quan[i+1]=quan[i]+quan[i+1]; } } 运行结果: 请输入权值的数目: 7 请输入一组权值: 62912472 需要构造的最优树的权值是: 62912472 构造最优树的过程: 22467912 4467912 678912 891213 121317 1725 42 Pressanykeytocontinue
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 离散数学 计算机 实验 报告