合肥工业大学离散数学实验报告2.docx
《合肥工业大学离散数学实验报告2.docx》由会员分享,可在线阅读,更多相关《合肥工业大学离散数学实验报告2.docx(10页珍藏版)》请在冰豆网上搜索。
合肥工业大学离散数学实验报告2
实验二:
逻辑运算与闭包运算求解
姓名:
李亚鸣
学号:
2014211590
班级:
计算机科学与技术14-1班
实验地点:
三号实验楼4号机房
实验时间:
2015年10月24日
1实验目的和要求
实验目的:
(1)通过补充代码,完成基本逻辑运算的程序,加深对逻辑运算的理解。
(2)通过补充待完善的MFC程序,添加核心warshall算法部分,加强对闭包运算的求解的理解,同时对warshall算法加深理解。
实验要求:
(1)在luojiyuns.cpp文件中补充And(),Or(),Not(),Xor(),Single_condition(),Doublbe_condition()以实现基本逻辑运算。
(2)warshallDlg.cpp文件中的CWarshallDlg:
:
OnCalculate()函数中补充warshall算法
(3)在待完善的MFC代码上补充warshall算法的核心部分,并在图形上实现。
2实验环境和工具
VisualC++6.0
3实验结果
3.1算法流程图
3.2程序核心代码
(1)
/****************************************************
//该函数用于进行逻辑与运算
//val_one和val_two分别为参与运算的逻辑值
//调用twovalue_Judge函数检测是否符合输入要求,然后进行
//逻辑运算并返回运算结果
*****************************************************/
intluoji:
:
And(intval_one,intval_two)
{
//intjud;
if(twovalue_Judge(val_one,val_two))
{
returnval_one==1&&val_two==1;
}
else
{
Output();
return2;
}
cout<<"\n\n";
}
/****************************************************
//该函数用于进行逻辑或运算
//val_one和val_two分别为要进行计算逻辑值
//调用twovalue_Judge函数检测是否符合输入要求,然后进行
//逻辑运算并返回运算结果
*****************************************************/
intluoji:
:
Or(intval_one,intval_two)
{
//intjud;
if(twovalue_Judge(val_one,val_two))
{
returnval_one==1||val_two==1;
}
else
{
Output();
return2;
}
cout<<"\n\n";
}
/****************************************************
//该函数用于进行逻辑非运算
//val_one为要进行计算的逻辑值
//调用onevalue_Judge函数检测是否符合输入要求,然后进行
//逻辑运算并返回运算结果
*****************************************************/
intluoji:
:
Not(intval_one)
{
//intjud;
if(onevalue_Judge(val_one))
{
returnval_one==0;
}
else
{
Output();
return2;
}
cout<<"\n\n";
}
/****************************************************
//该函数用于进行逻辑异或运算
//val_one和val_two分别为要进行计算逻辑值
//调用twovalue_Judge函数检测是否符合输入要求,然后进行
//逻辑运算并返回运算结果
*****************************************************/
intluoji:
:
Xor(intval_one,intval_two)
{
//intjud;
if(twovalue_Judge(val_one,val_two))
{
returnval_one^val_two;
}
else
{
Output();
return2;
}
cout<<"\n\n";
}
/****************************************************
//该函数用于进行逻辑单条件运算
//val_one和val_two分别为要进行计算逻辑值
*****************************************************/
intluoji:
:
Single_condition(intval_one,intval_two)
{
//intjud;
if(twovalue_Judge(val_one,val_two))
{
returnval_one==1&&val_two==0;
}
else
{
Output();
return2;
}
cout<<"\n\n";
}
/****************************************************
//该函数用于进行逻辑双条件运算
//val_one和val_two分别为要进行计算逻辑值
*****************************************************/
intluoji:
:
Double_condition(intval_one,intval_two)
{
//intjud;
if(twovalue_Judge(val_one,val_two))
{
returnval_one==0&&val_two==0;
}
else
{
Output();
return2;
}
cout<<"\n\n";
}
(4)
//以下语句段使用warshall方法改变矩阵中的值以帮助求解传递闭包
//需要用到的矩阵的行、列值存储在变量dim中,矩阵中各个位置上的对应
//值存储在two_mat[][]数组中
//请在此添加warshall算法代码
intj,k;
int**temp=newint*[dim];//定义二维动态数组
for(i=0;itemp[i]=newint[dim];
for(k=0;k{
for(i=0;i{
for(j=0;j{
//if(two_mat[k][i]&&(two_mat[k][j]||two_mat[j][i]))two_mat[k][i]=1;
temp[i][j]=(two_mat[i][j])||(two_mat[i][k]&two_mat[k][j]);
}
}
for(i=0;ifor(j=0;jtwo_mat[i][j]=temp[i][j];
}
3.3运行结果
3.4运行结果分析
对基本逻辑运算,用了几个简单的例子进行检测,运行结果都正确
对warshall算法也用了一个4X4的矩阵作为例子进行检测,运算结果正确。
实验心得
基本逻辑运算的难度不是很大,就是运用C++进行运算即可。
Warshall算法给我们提供了一个求二元关系传递闭包的高效方法。
综合现代计算机技术,利用Warshall算法我们可轻松的求出一个二元关系的可传递闭包。
Warshall算法类似于求图中每对顶点间最短路径的Floyd算法。
其实,用Floyd算法也能求关系的传递闭包,方法为令关系R的关系图G中的每条弧的权值都为1,这样得一有向网G1,设G1的邻接矩阵为D(-1)(若vi无自回路,则D(-1)(i,i)=∞),对G1用Floyd算法求其每对顶点间最短路径,得结果矩阵D(n-1)。
因若G中vi与vj连通,当且仅当D(n-1)[i,j]≠∞,故将矩阵D中的∞都改为0,其它值都改为1,得矩阵A,则矩阵A即为t(R)的关系矩阵。
Floyd算法和Warshall算法的时间复杂度都为O(n3),但明显用Floyd算法求关系的传递闭包绕了弯子。