当前位置:文档之家› 离散数学计算机实验报告

离散数学计算机实验报告

离散实验报告实验一真值计算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连接成P ↔ Q,称P ↔ Q为命题P和Q的双条件式复合命题,简称双条件命题,P ↔Q读做“P当且仅当Q”,或“P等价Q”。

称↔为双条件联结词。

当P和Q的真值相同时,P ↔ Q的真值为真;否则,P ↔ Q 的真值为假。

本实验要求从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。

用C语言或MATLAB实现。

3、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。

源代码:#include <iostream.h>void main(){int p,q;cout<<"请分别输入P,Q的真值:";cin>>p>>q;if(p>1||p<0){cout<<"P的真值有误,请重新输入!"<<endl;}if(q>1||q<0){cout<<"Q的真值有误,请重新输入!"<<endl;}if(p==0&&q==0){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=0"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=1"<<endl;}if(p==0&&q==1){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=0"<<endl;}if(p==1&&q==0){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=0"<<endl;cout<<"P<->Q=0"<<endl;}if(p==1&&q==1){cout<<"P∧Q=1"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=1"<<endl;}}运行结果:请分别输入P,Q的真值:0 1P∧Q=0P∨Q=1P→Q=1P<->Q=0Press any key to continue实验二关系闭包计算1、实验目的熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。

2、实验内容与要求定义6 设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则①R1是自反的(对称的、传递的)②R⊆R1③对任何自反的(对称的、传递的)关系R2,若R⊆R2,则R1⊆R2。

R的自反、对称和传递闭包分别记为r(R)、s(R)和t(R)。

定理1 令R⊆A⨯A,则①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)for j=1 to n doif A[j,i]=1 then dofor k=1 to n doA[j,k]:=A[j,k]+A[i,k](4)i=i+1;(5)if i<=n then to (3)else stop本实验要求从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。

用C语言或MA TLAB实现。

3、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。

源代码:#include <iostream.h>class Matrix{int row,col;double *p;public:Matrix(int r,int c);void print();double &operator()(int i,int j);int getrow(){return row;}int getcol(){return col;}friend Matrix operator+(Matrix x,Matrix y); //定义运算符号};Matrix::Matrix(int r,int c){row=r;col=c;p=new double[r*c];for(int i=0;i<r*c;i++){p[i]=0;}}void Matrix::print() //矩阵输出函数{for(int i=1;i<=row;i++){for(int j=1;j<=col;j++){cout<<p[(i-1)*col+j-1]<<" ";}cout<<endl;}}double &Matrix::operator()(int i,int j) //定义()运算return p[(i-1)*col+j-1];}Matrix operator+(Matrix x,Matrix y) //定义矩阵加法{Matrix sum1(x.getrow(),x.getcol());for(int m=1;m<=x.getrow();m++){for(int n=1;n<=x.getcol();n++){sum1(m,n)=x(m,n)+y(m,n);}}return sum1;}//主函数int main(){int r1,c1;cout<<"请输入关系矩阵的行和列:";cin>>r1>>c1;Matrix A(r1,c1);int m,n;cout<<"请输入关系矩阵的数据:"<<endl;for(m=1;m<=r1;m++){for(n=1;n<=c1;n++){cin>>A(m,n);}}cout<<"你所输入的关系矩阵是:"<<endl;A.print();Matrix I(r1,c1);cout<<"元素A的恒等矩阵是:"<<endl;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;}}}Matrix rA(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的自反闭包关系矩阵是:"<<endl;rA.print();Matrix AA(r1,c1);for(m=1;m<=r1;m++){for(n=1;n<=c1;n++){AA(m,n)=A(n,m);}}cout<<"A的逆矩阵是:"<<endl;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的对称闭包是:"<<endl;sA.print();int i,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的传递闭包是:"<<endl;tA.print();return 0;}运行结果:请输入关系矩阵的行和列:3 3请输入关系矩阵的数据:1 0 01 0 10 1 0你所输入的关系矩阵是:1 0 01 0 10 1 0元素A的恒等矩阵是:0 0 00 0 00 0 0A的自反闭包关系矩阵是:1 0 01 1 10 1 1A的逆矩阵是:1 1 00 0 10 1 0A的对称闭包是:1 1 01 0 10 1 0A的传递闭包是:1 0 01 1 11 1 1Press any key to continue实验三 计算两结点间长度为m 的路的数目1、实验目的熟悉邻接矩阵和两结点间长度为m 的路的数目的关系并编程计算。

相关主题