偏序集中盖住关系的求取和格论中有补格的判定.docx
《偏序集中盖住关系的求取和格论中有补格的判定.docx》由会员分享,可在线阅读,更多相关《偏序集中盖住关系的求取和格论中有补格的判定.docx(19页珍藏版)》请在冰点文库上搜索。
![偏序集中盖住关系的求取和格论中有补格的判定.docx](https://file1.bingdoc.com/fileroot1/2023-7/5/1cfaa84c-4c05-4092-a1fa-032a44337664/1cfaa84c-4c05-4092-a1fa-032a443376641.gif)
偏序集中盖住关系的求取和格论中有补格的判定
实验报告
(/学年第一学期)
课程名称
离散数学
实验名称
偏序集中盖住关系的求取和格论中有补格的判定
实验时间
年
月
日
指导单位
指导教师
学生姓名
班级学号
学院(系)
专业
实验报告
实验名称
偏序集中盖住关系的求取和格论中有补格的判定
指导教师
实验类型
上机实验
实验学时
4
实验时间
一、实验目的和要求
能正确求出任意偏序集的盖住关系的集合,并且能正确判定任意偏序集是否为格,如果是格,判定其是否为有补格。
二、实验环境(实验设备)
硬件:
PC机。
软件:
Code:
:
Blocks(C++)
三、实验原理及内容
内容:
求盖住关系:
首先输入偏序集所对应的全集中的元素个数以及各个元素,屏幕输出该全集以便使用者观看,然后输入偏序集中的各个元素,程序调用求取偏序集的盖住关系的函数,在屏幕输出该盖住关系
判断是否为格,是否为有补格:
调用判断是否为格的函数和判断是否为有补格的函数分别判断并输出,结束之后询问是否继续使用,若继续使用怎清屏再循环一次。
原理:
建立一个元素类,用来保存元素,定义求盖住关系的函数和判断是否为格和是否为有补格的函数,在主函数中建立一个字符数组保存全集,建立一个对象数组保存偏序集调用函数并输出。
程序:
#include
#include
usingnamespacestd;
classelement
{
private:
intleft;
intright;
public:
element();
element(inta,intb);
~element(){};
intGetleft();
intGetright();
};
element:
:
element()
{
left=0;
right=0;
}
element:
:
element(inta,intb)
{
left=a;
right=b;
}
intelement:
:
Getleft()
{
returnleft;
}
intelement:
:
Getright()
{
returnright;
}
boolJudge_1(inta,intb,elementp[],intn)//判断元素是否在偏序集中
{
for(inti=0;i{
if(p[i].Getleft()==a&&p[i].Getright()==b)
{
returntrue;
}
else
{
continue;
}
}
returnfalse;
}
voidJudge_2(elementp[],intm,inta[],intn,elementq[],int&k)
//获得盖住关系
{
inti,j;
for(i=0;i{
if(p[i].Getleft()==p[i].Getright())
{
continue;
}
for(j=0;j{
if(Judge_1(p[i].Getleft(),a[j],p,m)&&
Judge_1(a[j],p[i].Getright(),p,m)&&
a[j]!
=p[i].Getleft()&&a[j]!
=p[i].Getright())
{
break;
}
}
if(j==n)
{
q[k++]=p[i];
}
}
}
voidPrint(elementa[],intn)//输出集合
{
cout<<"{";
for(inti=0;i{
cout<<"<"<";
if(i!
=n-1)
{
cout<<",";
}
}
cout<<"}"<}
boolJudge_3(inta[],intm,intb[],intn)
//判断两个数组中是否存在相同的元素,用于判断是否为格的函数
{
for(inti=0;i{
for(intj=0;j{
if(a[i]==a[j])
{
returntrue;
}
}
}
returnfalse;
}
boolJudge_ge(inta[],intm,elementp[],intn)//判断偏序集是否为格
{
for(inti=0;i{
for(intj=0;j{
if(i!
=j)
{
intr,s;
for(r=0;r{
if(Judge_1(a[i],a[r],p,n)&&Judge_1(a[j],a[r],p,n))
{
break;
}
}
for(s=0;s{
if(Judge_1(a[s],a[i],p,n)&&Judge_1(a[s],a[j],p,n))
{
break;
}
}
if(r==m||s==m)
{
returnfalse;
}
}
}
}
returntrue;
}
boolJudge_quanxiajie(inta[],intm,elementp[],intn,int&down)
//判断格是否有全下界
{
inti,j;
for(i=0;i{
for(j=0;j{
if(Judge_1(a[i],a[j],p,n))
{
continue;
}
else
{
break;
}
}
if(j==m)
{
down=a[i];
returntrue;
}
}
returnfalse;
}
boolJudge_quanshangjie(inta[],intm,elementp[],intn,int&up)
//判断格是否有全上界
{
inti,j;
for(i=0;i{
for(j=0;j{
if(Judge_1(a[j],a[i],p,n))
{
continue;
}
else
{
break;
}
}
if(j==m)
{
up=a[i];
returntrue;
}
}
returnfalse;
}
boolJudge_youjiege(inta[],intm,elementp[],intn,int&up,int&down)
//判断格是否为有界格
{
if(Judge_quanxiajie(a,m,p,n,down)&&Judge_quanshangjie(a,m,p,n,up))
{
returntrue;
}
returnfalse;
}
voidUp_and_down(intx,inty,inta[],intm,elementp[],intn,int&ss,int&xx)
//求有界格中x和y组成的集合的最小上界和最大下届,用于判断有界格的函数
{
intk=0,j=0;
int*s=newint[k];//储存上界的数组
int*r=newint[j];//储存下界的数组
for(inti=0;i{
if(Judge_1(x,a[i],p,n)&&Judge_1(y,a[i],p,n))
{
s[k++]=a[i];
}
if(Judge_1(a[i],x,p,n)&&Judge_1(a[i],y,p,n))
{
r[j++]=a[i];
}
}
inth;
for(inti=0;i{
for(h=0;h{
if(Judge_1(s[i],s[h],p,n))
{
continue;
}
else
{
break;
}
}
if(h==k)
{
ss=s[i];
}
}
for(inti=0;i{
for(h=0;h{
if(Judge_1(r[h],r[i],p,n))
{
continue;
}
else
{
break;
}
}
if(h==j)
{
xx=r[i];
}
}
}
boolJudge_youbuge(inta[],intm,elementp[],intn)
{
intup,down,ss,xx;//up为全上界,down为全下界
if(Judge_ge(a,m,p,n)&&Judge_youjiege(a,m,p,n,up,down))
{
intj;
for(inti=0;i{
for(j=0;j{
if(i==j)
{
continue;
}
else
{
Up_and_down(a[i],a[j],a,m,p,n,ss,xx);
if(ss==up&&xx==down)
{
break;
}
}
}
if(j==m)
{
returnfalse;
}
}
returntrue;
}
else
{
returnfalse;
}
}
intmain()
{
intflag=1;
while(flag==1)
{
system("cls");
cout<<"欢迎使用!
"<intnumber_1;
cout<<"请输入全集中元素的个数:
";
cin>>number_1;
int*all=newint[number_1];
cout<<"请输入全集中的各个元素:
";
for(inti=0;i{
cin>>all[i];
}
cout<<"你输入的全集为:
"<<"{";
for(inti=0;i{
cout<if(i!
=number_1-1)
{
cout<<",";
}
}
cout<<"}"<intnumber_2;
cout<";
cin>>number_2;
element*pianxu=newelement[number_2];
cout<<"请输入偏序集中的每个元素:
"<for(inti=0;i{
inta,b;
cin>>a>>b;
pianxu[i]=element(a,b);
}
cout<";
Print(pianxu,number_2);
intnumber_3=0;
element*cov=newelement[number_3];
Judge_2(pianxu,number_2,all,number_1,cov,number_3);
cout<";
Print(cov,number_3);
if(!
Judge_ge(all,number_1,pianxu,number_2))
{
cout<"<}
else
{
if(Judge_youbuge(all,number_1,pianxu,number_2))
{
cout<"<}
else
{
cout<"<}
}
cout<(继续使用请输入1,否则输入0):
";
cin>>flag;
}
return0;
}
流程图:
举例使用:
1、偏序集不是格的例子
2、偏序集是格但不是有补格的例子
3、偏序集是格,且为有补格的例子
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
这次实验主要分为两个部分,一个是设计出求偏序集的盖住关系的函数,另一个是设计出判断偏序集是否为格以及有补格的函数。
做第一个函数时,我把盖住关系中x≠y这个条件忘了导致出错,经检查修改后便没有问题了。
建立第二个函数时,我根据定义依次判断偏序集是否为格、有界格、有补格,最后输出对偏序集的判定,我弄完之后发现如果利用第一个函数得出的盖住关系来写判定有补格的函数代码量应该会少一些,但我写的判定有补格的函数是完全按照定义一步步判断的,也算是另一种方法,因此也就没有改掉重写了。
这次离散实验让我对C++的编程语言有了更强的运用能力,让我明白了有些相关联的函数如果可以相互利用起来会使程序变得简便一些,因此在写函数时要多思考,应有一个良好的大局观。
离散数学和编程知识是息息相关、密不可分的。
以后我将更加认真学习离散数学,并且更多地将编程的知识运用起来,提升自己的实际运用能力。
五、指导教师评语
成绩
批阅人
日期