离散实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

用C语言实现。

三、程序源代码
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
bool p,q,h,x,d,s;
cout<<"请输入p的真值";
cin >> p ;
cout<<"请输入q的真值";
cin>>q;
h=p && q;
x=p || q;
if (p=0)
d=1;
else
d=p && q;
s=h;
cout <<"p合取q的值为"<<h<<" ; "<<"p析取q的值为"<<x<<"\n";
cout <<"p到q的条件值为"<<d<<" ; "<<"p到q的双条件值为"<<s<<"\n";
}
四、程序运行结果
实验二关系闭包计算
一、实验目的
熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。

二、实验内容
从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,传递闭包要求使用两种算法,即R+和Warshall算法。

用C语言实现。

三、程序源代码
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
bool M[10][10],N[10][10],be[10][10],M2[10][10];
int x,y,i,j,z,u;
bool zhi;
void xianshi();
void qingling();
void zifan();
void duichen();
void cdr_1();
void cd();
void ss();
void ssfan();
void ss2();
void cdw();
void main()
{
cout<<"请输入元素个数(元素个数不得大于10)";
cin>>x;
cout<<"请输入关系矩阵中的0项或是1项,按0输入0项,按1输入1项:";
cin>>y;
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
M[i-1][j-1]=!(bool)y;
}
cout<<"请输入关系矩阵中的"<<(bool)y<<"项"<<"第一个数为行数,第二个数为列数,输入00结束";
while (i!=0 && j!=0)
{
cin>>i>>j;
if (i==0 && j==0)
break;
M[i-1][j-1]=(bool)y;
cout<<"M["<<i<<"]["<<j<<"]="<<M[i-1][j-1]<<"\n";
}
ssfan();
xianshi();
zifan();
duichen();
cdr_1();
cdw();
}
void ss()
{
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
M[i-1][j-1]=N[i-1][j-1];
}
}
void ssfan()
{
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
N[i-1][j-1]=M[i-1][j-1];
}
}
void xianshi()
{
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
cout<<M[i-1][j-1]<<" ";
cout<<"\n";
}
cout<<"\n";
}
void qingling()
{
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
M[i-1][j-1]=0;
}
}
void zifan()
{
ss();
cout<<"自反闭包的矩阵为:"<<"\n";
for (i=1;i<=x;i++)
{
M[i-1][i-1]=1;
}
cout<<"\n";
xianshi();
}
void duichen()
{
ss();
cout<<"对称闭包的矩阵为:"<<"\n";
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
if (M[i-1][j-1]==true)
M[j-1][i-1]=true;
}
cout<<"\n";
xianshi();
}
void cd()
{
zhi=false;
for (i=1;i<=x;i++)
{
for (z=1;z<=x;z++)
{
for (j=1;j<=x;j++)
{
zhi=zhi || ( M[i-1][j-1] && N[j-1][z-1] );
}
M2[i-1][z-1]=zhi;
zhi=false;
}
}
}
void ss2()
{
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
M[i-1][j-1]=M2[i-1][j-1];
}
}
void cdr_1()
{
ss();
cout<<"用R++的方法求传递闭包的矩阵为:"<<"\n";
for (u=1;u<=x;u++)
{
for (i=1;i<=x;i++)
{
zhi=false;
for (j=1;j<=x;j++)
{
zhi=be[i-1][j-1] || M[i-1][j-1];
be[i-1][j-1]=zhi;
zhi=false;
}
}
cd();
ss2();
}
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
cout<<be[i-1][j-1]<<" ";
cout<<"\n";
}
cout<<"\n";
}
void cdw()
{
cout<<"用Warshall方法计算传递闭包的结果为;"<<"\n";
ss();
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
{
if ( M[j-1][i-1] == 1)
{
for (z=1;z<=x;z++)
{
M[j-1][z-1]=M[j-1][z-1] || M[i-1][z-1];
}
}
}
}
xianshi();
}
四、运行结果
1.输入
2.输出
实验三计算两结点间长度为m的路的数目
一、实验目的
熟悉邻接矩阵和两结点间长度为m的路的数目的关系并编程计算。

二、实验内容
从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。

考虑有向图和无向图。

用C语言实现。

实现可达性矩阵。

三、程序源代码
#include <iostream>
using namespace std;
int M[9][9],N[9][9],P[9][9],Q[9][9];
int x,y,z,i,j,k,zhi;
const d=1;
char ff;
void qingling();
void fuzhi();
void fuzhi2();
void chenji();
void xianshi();
void duichen();
void xianshi2();
void shuru1();
void shuru2();
void main()
{
int j;
qingling;
shuru2();
fuzhi();
for(j=2;j<=y;j++)
{
chenji();
fuzhi2();
}
xianshi();
xianshi2();
}
void qingling()
{
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
{
M[i][j]=0;
P[i][j]=0;
Q[i][j]=0;
}
}
}
void fuzhi()
{
for (i=1;i<=x;i++) {
for (j=1;j<=x;j++)
{
N[i][j]=M[i][j];
Q[i][j]=M[i][j];
}
}
}
void fuzhi2()
{
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
{
Q[i][j]=P[i][j]+Q[i][j];
}
}
for (i=1;i<=x;i++)
{
for (j=1;j<=x;j++)
{
N[i][j]=P[i][j];
}
}
}
void chenji()
{
for(i=1;i<=x;i++)
{
for(j=1;j<=x;j++)
{
zhi=0;
for(k=1;k<=x;k++)
{
zhi=zhi+N[i][k]*M[k][j];
}
P[i][j]=zhi;
}
}
}
void xianshi()
{
if(ff=='y')
cout<<"有向图的y次邻接矩阵为:"<<"\n";
else
cout<<"无向图的y次邻接矩阵为:"<<"\n";
for(i=1;i<=x;i++)
{
for(j=1;j<=x;j++)
{
cout<<N[i][j]<<" ";
}
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=x;i++)
{
for(j=1;j<=x;j++)
{
if (N[i][j]==y)
cout<<"路的长度为"<<y<<"的两个节点是从节点"<<j<<"到节点"<<i<<"路"<<"\n";
}
}
cout<<"\n";
}
void duichen()
{
for(i=1;i<=x;i++)
{
for(j=1;j<=x;j++)
{
if (M[i][j]>0)
M[j][i]=M[i][j];
}
}
}
void xianshi2()
{
cout<<"可达性矩阵为:"<<"\n";
for(i=1;i<=x;i++)
{
for(j=1;j<=x;j++)
{
cout<<Q[i][j]<<" ";
}
cout<<"\n";
}
cout<<"\n";
}
void shuru1()
{
x=4;
y=3;
M[1][2]=d;
M[2][3]=d;
M[2][4]=d;
M[3][1]=d;
M[3][2]=d;
M[3][4]=d;
M[4][1]=d;
cout<<"请输入路的长度";
cin>>y;
cout<<"请选者为有向图还是无向图[y/n]";
cin>>ff;
while(ff !='y' && ff !='n')
{
cout<<"请输入合法字符"<<"\n"<<"请选者为有向图还是无向图";
cin>>ff;
}
if (ff == 'n')
duichen();
}
void shuru2()
{
cout<<"请输入路的长度";
cin>>y;
cout<<"请输入方阵的边长";
cin>>x;
do
{
cout<<"请输入邻接矩阵非零项的行:"<<"\n";
cin>>i;
cout<<"请输入邻接矩阵非零项的列:"<<"\n";
cin>>j;
cout<<"请输入邻接矩阵非零项的值:"<<"\n";
cin>>M[i][j];
}
while (i!=0 && j!=0);
cout<<"请选者为有向图还是无向图[y/n]";
cin>>ff;
while(ff !='y' && ff !='n')
{
cout<<"请输入合法字符"<<"\n"<<"请选者为有向图还是无向图";
cin>>ff;
}
if (ff == 'n')
duichen(); }
四、运行程序
1.输入
2.结果
实验四最优树的构造
一、实验目的
熟悉最优树的构造算法,掌握最优树的构造过程。

二、实验内容
从键盘输入一组权值,构造出对应的最优树,列出构造过程。

用C语言实现。

三、程序源代码
#include <iostream>
using namespace std;
int M[100];
int N[100][100];
int P[100][100][100];
int x;
void shuru();
void paixu(int h);
void shuchu();
void main()
{
int i,j,k,l,linshi;
shuru();
shuchu();
paixu(x);
shuchu();
for (i=x;i>=2;i--)
{
paixu(i);
cout<<M[i]<<"和"<<M[i-1]<<"合并到"<<M[i]+M[i-1]<<"\n";
M[i-1]=M[i]+M[i-1];
}
}
void shuru()
{
x=13;
M[1]=29;
M[2]=31;
M[3]=3;
M[4]=2;
M[5]=5;
M[6]=41;
M[7]=11;
M[8]=13;
M[9]=7;
M[10]=19;
M[11]=17;
M[12]=23;
M[13]=37;
}
void paixu(int h)
{
int i,j,linshi;
for (i=1;i<=h-1;i++)
{
for (j=i+1;j<=h;j++)
{
if (M[i]<=M[j])
{
linshi=M[i];
M[i]=M[j];
M[j]=linshi;
}
}
}
}
void shuchu()
{
int i;
for(i=1;i<=x;i++)
{
cout<<M[i]<<" ";
}
cout<<"\n";
}
四、运行实验。

相关文档
最新文档