实 验 报 告
(2017 / 2018 学年 第 一 学期)
课程名称
离散数学
实验名称
求取整除关系这一偏序关系上所有盖住关系,并判定对应偏序集是否为有补格。
实验时间
2017
年
12
月
6
日
指导单位
计算机科学与技术系
指导教师
柯昌博
学生姓名
胡君
班级学号
B16041309
学院(系)
计算机学院、软件学院
专 业
软件工程
实 验 报 告
实验名称
求取整除关系这一偏序关系上所有盖住关系,并判定对应偏序集是否为有补格。
指导教师
柯昌博
实验类型
上机
实验学时
4
实验时间
12月6日
一、 实验目的和要求
目的:学以致用,将书本上学习的求取盖住关系和有补格的判定用代码实现出来,将几门学科融会贯通,让学生学会动手实践,而不是只停留在书本上,做一个只会读书的“书呆子”。
要求:用代码实现:用户按从小到大的顺序输入集合A上的元素,以“-1”作为结束标志,程序输出集合A上整除关系这一偏序关系上所有的盖住关系,并判定对应偏序集是否为有补格。
二、 实验环境(实验设备)
设备:MacBook Pro (Retina, 13-inch, Early 2015)
环境(IDE):macOS Sierra 10.12.1(16B2555)
Xcode Version 7.1 beta (7B60)
三、实验原理及内容
1.盖住关系的定义、格的定义、有界格的定义、有补格的定义
实 验 报 告
1、 程序实现代码如下:}
#include
#include
using namespace std;
vector a; //保存集合A上的元素
class note //表示序偶的结构体
{
public:
int x,y;
note(int aa,int bb)
{
x=aa;
y=bb;
}
};
vector COV; //保存所有盖住关系的序偶
void SolveCov() //计算出所有盖住关系,并保存在COV数组,原理根据书上定义
{
for(int i=0;i=0;k--){
if(gcd(a[i],a[j])%a[k]==0){
inflag2=1;//inflag2负责保存该对元素的下确界是否存在的真假值
break;
}
}
if(inflag1==0||inflag2==0){
outflag=0;//outflag负责保存整个偏序关系是否是格的真假值
return false;
}
}
}
return true;
}
bool JudgeYouJieGe() //判断是不是有界格,根据书上定义
{
int flag=1,i;
for(i=1;i=0;i--){
if(a[max]%a[i]!=0){
flag=0;
return false;
}
}
return true;
}
bool JudgeYouBuGe() //判断是不是有补格,根据书上定义
{
int outflag=1;
for(int i=0;ia[j]){
max=a[i];
min=a[j];}
else
{
min=a[i];
max=a[j];}
int k;
for(k=max;k=0;k--){
if(gcd(a[i],a[j])%a[k]==0&&k!=0){
ininflag=0;//ininflag负责保存目前该对元素是否满足上确界为1且下确界为0的真假值
break;
}
}
}
if(ininflag==1){
inflag=1;//inflag负责保存对于当前元素a[i]是否能在集合A中找到一个元素是其补元素的真假值
break;
}
}
if(inflag==0){
outflag=0;//outflag负责保存整个偏序关系是否是格的真假值
return false;
}
}
return true;
}
int main()
{
int i,tmp;
cout<<"请按从小到大顺序输入集合A上的元素\n";
cin>>tmp;
while(tmp!=-1){
a.push_back(tmp);//选择vector结构是因为vector可以动态生成空间,避免了要用户输入集合A上元素个数的麻烦
cin>>tmp;
}
SolveCov();
cout<<"所有的盖住关系为:\nCOV A={";
for(i=0;i";
else cout<<",<"<";
}
cout<<"}"<流程图
实 验 报 告
四、实验小结(包括问题和解决方法、#
体会#、意见与建议等)
1.本程序保持这个原则:初始化为满足条件更苛刻的情况(真1或假0),相比满足条不苛刻的情况作为跳出情况。这个很好用,可以简化判断流程以及节省判断时间
2.数组a选择vector结构是因为vector可以动态生成空间,避免了要用户输入集合A上元素个数的麻烦
3.int gcd(int x,int y) //辗转相除法计算最大公约数,至于最小公倍数则是x*y/gcd(x,y)
{
int r=1;
while(r)
{
r=y%x;
y=x;
x=r;
}
return y;
}
五、指导教师评语
成 绩
批阅人
日 期