集合上二元关系性质判断的实现.docx
- 文档编号:11337765
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:17
- 大小:279.76KB
集合上二元关系性质判断的实现.docx
《集合上二元关系性质判断的实现.docx》由会员分享,可在线阅读,更多相关《集合上二元关系性质判断的实现.docx(17页珍藏版)》请在冰豆网上搜索。
集合上二元关系性质判断的实现
实验报告
(/学年第一学期)
课程名称
离散数学
实验名称
集合上二元关系性质判断的实现
实验时间
年
月
日
指导单位
指导教师
学生姓名
班级学号
学院(系)
专业
实验报告
实验名称
集合上二元关系性质判断的实现
指导教师
实验类型
上机实验
实验学时
4
实验时间
一、实验目的和要求
能正确判定任意二元关系的自反性、对称性、传递性、反自反性和反对称性。
二、实验环境(实验设备)
硬件:
PC机。
软件:
Code:
:
Blocks(C++)
三、实验原理及内容
内容:
首先输入要求二元关系的集合所对应的全集中的元素个数以及各个元素,屏幕输出该全集以便使用者观看,然后输入要求二元关系的集合中的各个元素,程序调用判断各个关系的函数,最后在屏幕输出是否具有各个二元关系,并且询问是否继续使用,若继续使用则重复进行上述过程。
原理:
建立一个元素类,用来保存元素,根据各个二元关系的定义构造判断的函数,在主函数中建立一个字符数组保存全集,建立一个对象数组保存要求二元关系的集合调用判断的函数并输出。
程序:
#include
#include
usingnamespacestd;
classelement
{
private:
stringleft;
stringright;
public:
element();
element(stringa,stringb);
~element(){};
stringGetleft();
stringGetright();
};
element:
:
element()
{
left="";
right="";
}
element:
:
element(stringa,stringb)
{
left=a;
right=b;
}
stringelement:
:
Getleft()
{
returnleft;
}
stringelement:
:
Getright()
{
returnright;
}
boolZifan_or_not(stringa[],intm,elementc[],intn)//自反性的判断
{
inti,j;
for(i=0;i { for(j=0;j { if(c[j].Getleft()==a[i]&&c[j].Getright()==a[i]) { break; } else { continue; } } if(j==n) { returnfalse; } } returntrue; } boolDuichen_or_not(elementc[],intn)//对称性的判断 { inti,j; for(i=0;i { for(j=0;j { if(c[j].Getleft()==c[i].Getright()&&c[j].Getright()==c[i].Getleft()) { break; } else { continue; } } if(j==n) { returnfalse; } } returntrue; } boolChuandi_or_not(elementc[],intn)//传递性的判断 { inti,j,k; for(i=0;i { for(j=0;j { if(i==j) { continue; } else { if(c[j].Getleft()==c[i].Getright()) { for(k=0;k { if(c[k].Getleft()==c[i].Getleft()&&c[k].Getright()==c[j].Getright()) { break; } else { continue; } } if(k==n) { returnfalse; } } else { continue; } } } } returntrue; } boolFanzifan_or_not(stringa[],intm,elementc[],intn)//反自反性的判断 { inti,j; for(i=0;i { for(j=0;j { if((c[j].Getleft()==a[i])&&(c[j].Getright()==a[i])) { returnfalse; } } } returntrue; } boolFanduichen_or_not(elementc[],intn)//反对称性的判断 { inti,j; for(i=0;i { for(j=0;j { if(c[j].Getleft()==c[i].Getright()&&c[j].Getright()==c[i].Getleft()) { if(i==j) { break; } else { returnfalse; } } else { continue; } } } returntrue; } intmain() { intflag=1; while(flag==1) { system("cls"); cout<<"欢迎使用集合上的二元关系性质判断的工具! "< intnumber_1; cout<<"请输入全集中元素的个数: "; cin>>number_1; string*all=newstring[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*collection=newelement[number_2]; cout<<"请输入要求二元关系的集合中的每个元素: "< for(inti=0;i { stringa,b; cin>>a>>b; collection[i]=element(a,b); } cout< "<<"{"; for(inti=0;i { cout<<"<"< if(i! =number_2-1) { cout<<","; } } cout<<"}"< cout<<"自反性: "; if(Zifan_or_not(all,number_1,collection,number_2)) { cout<<"Yes"< } else { cout<<"No"< } cout<<"反自反性: "; if(Fanzifan_or_not(all,number_1,collection,number_2)) { cout<<"Yes"< } else { cout<<"No"< } cout<<"对称性: "; if(Duichen_or_not(collection,number_2)) { cout<<"Yes"< } else { cout<<"No"< } cout<<"反对称性: "; if(Fanduichen_or_not(collection,number_2)) { cout<<"Yes"< } else { cout<<"No"< } cout<<"传递性: "; if(Chuandi_or_not(collection,number_2)) { cout<<"Yes"< } else { cout<<"No"< } cout< "; cin>>flag; } return0; } 流程图: N 举例使用: 1、全集为整数: 2、全集为整数和字母的混合: 四、实验小结(包括问题和解决方法、心得体会、意见与建议等) 刚做这个实验的时候,我有两个思路,一个是用二维数组保存集合中的每个元素,判断性质时采用列出关系矩阵的方式来判断,另一个是建立一个元素类,用对象数组保存每个元素,判断的时候直接调用对象利用定义直接判断。 考虑到对象调用的灵活性以及可以灵活地设置成员函数,使用后者判断二元关系时只需要几个循环即可,最终我选择了第二套方案。 在编写程序的过程中,判断自反性、反自反性、对称性、反对称性的函数都比较简单,但是判断传递性的函数需要三个循环却不简单,但在我不断理清逻辑调整代码之后,终于让这个函数既简便又正确了。 刚完成时程序只支持全集为整数,为了使程序的应用性更广,我便做了相关调整,使得程序也可支持全集字母以及字母和数字混合的形式。 这次离散实验让我对C++的编程语言有了更强的运用能力,让我明白了每个程序都可以有不同的设计方案,需要先思考各个方案的优缺点,选择一个石河子的方案并坚持去做,就一定能做成并且收获一定是很大的。 离散数学和编程知识是息息相关、密不可分的。 以后我将更加认真学习离散数学,并且更多地将编程的知识运用起来,使得两者相辅相成。 五、指导教师评语 成绩 批阅人 日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合 二元关系 性质 判断 实现