离散实验报告.docx
《离散实验报告.docx》由会员分享,可在线阅读,更多相关《离散实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
离散实验报告
学生实验报告册
(理工类)
课程名称:
离散结构专业班级:
17信息安全
学生学号:
**********学生姓名:
所属院部:
网络安全学院指导教师:
2017——2018学年第2学期
金陵科技学院教务处制
实验报告书写要求
实验报告原则上要求学生手写,要求书写工整。
若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。
纸张一律采用A4的纸张。
实验报告书写说明
实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。
各院部可根据学科特点和实验具体要求增加项目。
填写注意事项
(1)细致观察,及时、准确、如实记录。
(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。
(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明
实验报告的批改要及时、认真、仔细,一律用红色笔批改。
实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。
实验报告装订要求
实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:
联结词逻辑运算实验学时:
2
同组学生姓名:
陈希等实验地点:
B栋415
实验日期:
2018年4月12日实验成绩:
批改教师:
批改时间:
实验1五种联结词的逻辑运算
一.实验目的
用C语言实现两个命题变元的否定、合取、析取、蕴涵和等价表达式的计算。
熟悉联结词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
二.实验仪器和设备
TurboC2.0
三.实验内容
从键盘输入两个命题变元P和Q的真值,求它们的否定、合取、析取、蕴涵和等价五种运算的的真值。
要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。
四.实验过程
1.算法分析:
编程语言为c语言
否定:
p,q为0时,值为1,其他为0
合取/\:
p,q都为1的时候为1,其他为0析取\/:
p,q都为0的时候为0,其他为1
蕴含->:
p为1,q为0时为0,其他为1等价<->:
p,q同真同假
2.程序代码:
#include
usingnamespacestd;
intmain()
{
intp,q;
while(true)
{
cout<<"请输入合法数字(p,q为0或1)"<<":
";
cin>>p>>q;
if(p==1&&q==1)
{
cout<<"p否定q"<<":
"<<0<cout<<"p合取q"<<":
"<<1<cout<<"p析取q"<<":
"<<1<cout<<"p蕴含q"<<":
"<<1<cout<<"p等价q"<<":
"<<1<}
elseif(p==1&&q==0)
{
cout<<"p否定q"<<":
"<<0<cout<<"p合取q"<<":
"<<0<cout<<"p析取q"<<":
"<<1<cout<<"p蕴含q"<<":
"<<0<cout<<"p等价q"<<":
"<<0<}
elseif(p==0&&q==1)
{
cout<<"p否定q"<<":
"<<0<cout<<"p合取q"<<":
"<<0<cout<<"p析取q"<<":
"<<1<cout<<"p蕴含q"<<":
"<<1<cout<<"p等价q"<<":
"<<0<}
elseif(p==0&&q==0)
{
cout<<"p否定q"<<":
"<<1<cout<<"p合取q"<<":
"<<0<cout<<"p析取q"<<":
"<<0<cout<<"p蕴含q"<<":
"<<1<cout<<"p等价q"<<":
"<<1<}
else
{
cout<<"ERRORINPUTING!
"<}
}
return0;
}
3.实验数据及结果分析:
五.实验体会(遇到问题及解决办法,编程后的心得体会)
在实验的过程中,首先我的逻辑是p,q为0或1,四种情况,全部罗列出来也不会太麻烦,所以我选择用四个if,当四个情况写完之后,当输入的值不合法时(p,q有一个为非0或1的值),我又写了一个if使得排除这种情况。
在实验的过程中我又充分理解并巩固了离散中否定,析取,合取,蕴含,等价的运算。
实验项目名称:
关系的闭包运算实验学时:
2
同组学生姓名:
陈希等实验地点:
B栋415
实验日期:
2018年4月19日实验成绩:
批改教师:
批改时间:
实验2关系的闭包运算
一.实验目的
熟悉关系的闭包运算,利用C语言编程实现关系闭包运算算法。
二.实验仪器和设备
TurboC2.0
三.实验内容
利用矩阵求有限集上给定关系的自反、对称和传递闭包。
四.实验过程
1.算法分析:
在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为1就可;对称闭包则加上关系的转置矩阵(逻辑加法);传递闭包可直接根据转化为矩阵计算,其相对应的矩阵Mt=M+M2+M3+…
2.程序代码:
#include
usingnamespacestd;
intmain()
{
inti,j,n,m,R[100][100],r[100][100],s[100][100],t[100][100];
while(true)
{
cout<<"请输入矩阵的行数"<cin>>m;
cout<<"请输入矩阵的列数"<cin>>n;
cout<<"请输入R的关系矩阵"<for(i=0;i{
for(j=0;jcin>>R[i][j];
}
for(i=0;i{
for(j=0;j{
r[i][j]=R[i][j];//进行R的自反运算
s[i][j]=R[i][j];//进行R的对称运算
t[i][j]=R[i][j];//进行R的传递运算
}
}
for(i=0;i{
for(j=0;j{
if(i==j)
r[i][i]=1;
}
}//z自反
cout<<"R的自反闭包为:
"<for(i=0;i{
for(j=0;j{
cout<}
cout<}
for(i=0;i{
for(j=0;j{
if(s[i][j]==0&&s[j][i]==0)
{
s[i][j]=0;
}
else
{
s[i][j]=s[j][i]=1;
}
}
}
cout<<"R的对称闭包为:
"<for(i=0;i{
for(j=0;j{
cout<
}
cout<}
for(i=0;i{
for(j=0;j{
if(t[j][i]==1)
{
for(intk=0;k{
t[j][k]=t[j][k]+t[i][k];
if(t[j][k]>=1)
{
t[j][k]=1;
}
}
}
}
}
cout<<"R的传递闭包为:
"<for(i=0;i{
for(j=0;j{
cout<}
cout<}
}
return0;
}
3.实验数据及结果分析
五.实验体会(遇到问题及解决办法,编程后的心得体会)
在试验的过程中,对称和传递先后都有一些困难,对称是逻辑加,除了1+1是1外其他都符合规律,所以我将这一种情况单独列出来。
后来传递闭包,如果按Mt=M+M2+M3+…算的话,如果阶数大了,那么效率不是很高,所以我找到了传递闭包的规律,从而进行运算。
实验项目名称:
全域关系和恒等关系实验学时:
2
同组学生姓名:
陈希等实验地点:
B栋415
实验日期:
2018年4月26日实验成绩:
批改教师:
批改时间:
实验3全域关系和恒等关系
一.实验目的
通过上机编写程序,可以进一步加深我们对关系中集合A上的恒等关系,以及从集合A到集合B上的全域关系的理解。
二.实验仪器和设备
TurboC2.0
三.实验内容
用C语言实现,求集合A上的恒等关系以及从集合A到集合B上的全域关系。
四.实验过程
1.算法分析
对于A上的恒等关系,只需让二元关系的第一个元素和第二个元素相等即可;对于从A到B上的全域关系,即求A和B的笛卡尔积。
让A中的第一个元素对应B中的每一个元素,让A中的第二个元素对应B中的每一个元素,依次进行下去,即可得到从A到B上的全域关系。
2.程序代码:
#include
usingnamespacestd;
intmain()
{
intm,n,i,j,x[100],y[100];
while(true)
{
cout<<"请输入集合A的元素个数:
"<cin>>m;
cout<<"请输入集合B的元素个数:
"<cin>>n;
cout<<"请输入合法集合A:
"<for(i=0;i{cin>>x[i];}
cout<<"请输入合法集合B:
"<for(j=0;j{cin>>y[j];}
cout<<"A的恒等关系为:
"<cout<<"{";
for(i=0;i{
cout<<"<"<";
}
cout<<"}"<cout<<"集合A到集合B上的全域关系为:
"<cout<<"{";
for(i=0;i{
for(j=0;j{
cout<<"<"<";
}
}
cout<<"}"<}
return0;
}
3.实验数据及结果分析
五、实验体会(遇到问题及解决办法,编程后的心得体会)
在实验的过程中,首先考虑恒等关系以及全域关系的算法,需要用到数组关系,所以我分别定义两个数组解决两个问题,然后只需要套用循环即可。
实验项目名称:
集合的交、并和差集运算实验学时:
2
同组学生姓名:
陈希等实验地点:
B栋415
实验日期:
2018年5月3日实验成绩:
批改教师:
批改时间:
实验4集合的交、并和差集运算
一.实验目的
集合论是一切数学的基础,集合的运算规则是集合论中的重要内容。
通过该项实验,目的是让我们更加深刻地理解集合的概念和性质,并掌握集合的运算规则等。
二.实验仪器和设备
TurboC2.0
三.实验内容
通过对集合的掌握,利用C语言编程计算任意两个集合的交集、并集和差集运算。
四.实验过程
1.算法分析
1.在求交集时,利用if找出两个集合的相同元素,并输出。
2.在求并集时,将两个集合的元素属于其一或另一个。
3.在求差集时,将一个集合减去交集,然后将其输出。
2.程序代码:
#include
usingnamespacestd;
#definemax10000
intmain()
{
intm,n,i,j,k=-1,x[100],y[100],a[100],b[100],c[100];
while(true)
{
cout<<"请输入集合A中元素的个数:
"<cin>>m;
cout<<"请输入集合B中元素的个数:
"<cin>>n;
cout<<"请输入集合A:
"<for(i=0;i{
cin>>x[i];
}
cout<<"请输入集合B:
"<for(j=0;j{
cin>>y[j];
}
for(i=0;i{
for(j=0;j{
if(x[i]==y[j])
{
++k;
a[k]=x[i];
}
}
}
cout<<"A与B的交集为:
"<for(i=0;i<=k;++i)
{
cout<<""<}
cout<<"}"<
for(i=0;i{
b[i]=x[i];
}
for(i=m;i{
b[i]=y[i-m];
}
for(i=0;i{
for(j=i+1;j<=m+n-1;++j)
{
if(b[i]==b[j])
b[j]=max;
}
}
cout<<"A与B的并集为:
"<for(i=0;i{
if(b[i]!
=max)
cout<
}
cout<<"}"<for(i=0;i{
for(j=0;j{
if(x[i]==y[j])
c[i]=-1;
}
}
cout<<"A与B的差集为:
"<for(i=0;i{
if(c[i]!
=-1)
cout<}
cout<<"}"<}
return0;
}
3.实验数据及结果分析
五、实验体会(遇到问题及解决办法,编程后的心得体会)
(1)求交集:
根据集合中交集的定义,将数组x、y中元素挨个比较,把共同元素选出来,并存入数组a(交集集合)中,即求得集合A、B的交集。
(2)求并集:
根据集合中并集的定义,先将数组x中元素依次存入数组b(并集集合)中,存储集合A中某元素前,先将其与已存入y中的元素依次比较,若相同则存入下一个元素,否则直接存入b中,直到所有A中元素存储完毕。
(3)求差集:
将集合A中元素依次与B中元素比较,若B中无元素与该元素相同,则将其存入数组c中(同时删除c中相同的元素,操作方法与求并集时删除相同元素类似),否则进行下一轮比较,直到A中所有元素比较完毕,即求得A对B的差集(数组c)。