离散数学实验指导书及其答案

余年寄山水
642次浏览
2021年01月30日 00:39
最佳经验
本文由作者推荐

成绩单评语-我不后悔

2021年1月30日发(作者:漫漫人生路邓丽君)
实验一

命题逻辑公式化简

【实验目的】加深对五个基本联结词 (否定、合取、析取、条件、双条件)的理解、掌
握利用基本等价公式化简公式的方法。

【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。

实验用例:
用化简命题逻辑公式的方法设计一个
5
人表决开关电路,
要求
3
人 以上
(含
3
人)同意则表决通过(表决开关亮)


【实验原理和方法】


1

写出
5
人表 决开关电路真值表,
从真值表得出
5
人表决开关电路的主合取公式
(或
主析取公式)
,将公式化简成尽可能含五个基本联结词最少的等价公式。


2
)上面公式中的每一个联结词是一个开关元件,将它们定义成
C
语言中的函数。< br>

3
)输入
5
人表决值(
0

1

,调用上面定义的函数,将
5
人表决开关电路真值表的
等价公式写 成一个函数表达式。


4
)输出函数表达式的结果,如果是
1,则表明表决通过,否则表决不通过。

参考代码:

#include
int vote(int a,int b,int c,int d,int e)
{

/
/
五人中任取三人的不同的取法有
10
种。


i
f( a&&b&&c || a&&b&&d || a&&b&&e || a&&c&&d || a&&c&&e || a&&d&&e || b&&c&&d
|| b&&c&&e || b&&d&&e || c&&d&&e)



}

void main()
{

i
nt a,b,c,d,e;

p
rintf(
请输入第五个人的表决值(
0

1
,空格分开)



s
canf(

i
f(vote(a,b,c,d,e))


}
//
注:联结词不定义成函数,否则太繁



e
lse
printf(
遗憾,表决没有通过!
n

printf(
很好,表决通过!
n
return 1;
return 0;

e
lse
实验二

命题逻辑推理

【实验目的】加深对命题逻辑推理方法的理解。

【实验内容】用命题逻辑推理的方法解决逻辑推理问题。

实验用例:根据下面的命题,试用逻辑推理方法确定谁是作案者,写出推理过程。


1
)营业员
A

B
偷了手表;


2
)若
A
作案,则作案不在营业时间;


3
)若
B
提供的证据正确,则货柜末上锁;


4
)若
B
提供的证据不正确,则作案发生在营业时间;


5
)货柜上了锁。

【实验原理和方法】


1
)符号化上面的命题,将它们作为条件,营业员
A
偷了手表作为结论,得一 个复合
命题。


2
)将复合命题中要用到的联结词定义成
C
语言中的函数,用变量表示相应的命题变
元。将复合命题写成一个函数表达式。
< br>(
3
)函数表达式中的变量赋初值
1
。如果函数表达式的值为
1
,则结论有效,
A
偷了
手表,否则是
B
偷了手表。

用命题题变元表示:

A:
营业员
A
偷了手表

B:
营业员
B
偷了手表

C:
作案不在营业时间

D:B
提供的证据正确

E:
货柜末上锁

则上面的命题符号化为
(A||B) && (!A||C) && (!D||E) && (D||!C) && !E
要求找到满足上面式子的变元
A

B
的指派便是结果。

C
语言算法:


i
nt A,B,C,D,E;

f
or(A=0;A<=1;A++)






}
/*
实验结果是:
A=0

B= 1
,即
B
偷了手表
*/


for(B=0;B<=1;B++)





for(C=0;C<=1;C++)




for(D=0;D<=1;D++)



for(E=0;E<=1;E++)


if((A||B) && (!A||C) && (!D||E) && (D||!C) && !E)

printf(
实验三

集合运算

【实验目的】掌握用计算机求集合的交、并、差和补运算的方法。

【实验内容】编程实现集合的交、并、差和补运算。

【实验原理和方法】


1
)用数组
A

B

C
E
表示集合。输入数组
A

B

E
(全集)< br>,输入数据时要求检查
数据是否重复(集合中的数据要求不重复)
,要求集合
A

B
是集合
E
的子集。

以下每一个运算都要求先将集合
C
置成空集。


2
)二个集合的交运算:把数组
A
中元素逐一与数组
B
中的元素进行比较,将 相同的
元素放在数组
C
中,数组
C
便是集合
A
和集 合
B
的交。

C
语言算法:


f
or(i=0;i

for(j=0;j
if(a[i]==b[j]) c[k++]=a[i];

3
)二个集合的并运算:把数组
A
中 各个元素先保存在数组
C
中。将数组
B
中的元素
逐一与数组
B
中的元素进行比较,
把不相同的元素添加到数组
C
中,
数组
C
便是集合
A
和集

B
的并。




{





}


4
)二个集合的差运算:把数组
A
中各个元素先保存在数组
C
中。将数组
B
中的元素
逐一与数组
B
中的元素进行比较 ,
把相同的元素从数组
C
中删除,
数组
C
便是集合
A
和集合
B
的差
A-B


C
语言算法:


f
or(i=0;i






c[i]=a[i];
for(j=0;j




if(b[i]==c[j])
{



for(k=j;k
c[k]=c[k+1];/*
移位
*/
m--;

f
or(i=0;ifor(j=0;j
if(b[i]==c[j]) break;
if(j==m){ c[m+k]=b[i];k++;}
C
语言算法:

for(i=0;ic[i]=a[i];

f
or(i=0;i




}
break;

5
)集合的补运算:将数组
E
中的元素逐一与数组
A
中的元素进行比较,把不相同的
元素保存到数组
C< br>中,数组
C
便是集合
A
关于集合
E
的补集。

求补集是一种种特殊的集合差运算。



















实验四

二元关系及其性质


【实验目的】掌握二元关系在计算机上的表示方法,并掌握如果判定关系的性质。

【实验内容】

编程判断一个二元关系是否为等价关系,如果是,求其商集。

等价关系:
集合
A
上的二元关系
R
同时具有自反性、
对称性和传递性,
则称
R

A
上的
等价关系。

【实验原理和方法】


1

A
上的二元关系用一 个
n
×
n
关系矩阵
R=
(
r
ij
)
n

n
表示,
定义一个
n
×
n
数组
r[n][n]
表示
n
×
n
矩阵关系。

2
)若
R
对角线上的元素都是
1
,则
R具有自反性。

C
语言算法:





int i,flag=1;
for(i=0;i
if(r[i][i]!=1) flag=0;
如果
flag=1



R
是自反关系


3
)若
R
是对称矩阵,则
R
具有对称性。对称矩 阵的判断方法是:


r
ij

R
,
有< br>
r
ji

R


C
语言算法:






int i,j,flag=1;
for(i=0;i

for(j=i+1;j
if(r[i][j] &&r[j][i]!=1) flag=0;
如果
flag=1



R
是对称关系


4
)关系的传递性判断方法:对任意
i

j
,< br>k
,若
r
ij

1

r
jk

1

r
ik

1



C
语言算法:











int i,j,k,flag=1;
for(j=0;j

for(k=0;k
if(r[i][j] &&r[j][k] && r[i][k]!=1) flag=0;
for(i=0;i如果
flag=1



R
是传递关系


5
)求商集的方法:商集是由 等价类组成的集合。已知
R
是等价关系,下面的算法是
把等价类分行打印出来。

C
语言算法:

int i,j,flag=1;
int a[N];
for(i=0;i
{

if(a[i])
a[i]=i+1;/*i
代表第
i
个元素
*/
for(i=0;i
{

















}
}
printf(
for(j=0;j
if(r[i][j] && a[j]!=0)

{


printf(
打印和第
i
个元素有关系的所有元素
*/


a[j]=0;

}
printf(












实验五

关系闭包运算



【实验目的】掌握求关系闭包的方法。

【实验内容】编程求一个关系的闭包,要求传 递闭包用
warshall
方法。

【实验原理和方法】


N
元关元系用
r[N][N]
表示,
c[N][N]
表示 各个闭包,函数
initc(r)
表示将
c[N][N]
初始化为
r [N][N]



1
)自反闭包:
r
(
R
)

R

I
A


C
语言算法:

将关系矩阵的对角线上所有元素设为
1






initc(r);
/*
将关系矩阵的对角线上所有元素设为
1*/
for(i=0;i
c[i][i]=1;

2
)对称闭包:
s
(
R
)

R

R


C
语言算法:

在关系矩阵的基础上,若
r< br>ij

1
,

r
ji

1






initc(r);
for(i=0;i

for(j=0;j
if(c[i][j])
c[j][i]=1;/*
将关系矩阵的对角线上所有元素设为
1*/
(< br>3
)传递闭包:
t
(
R
)

R
< br>R
2



R
n
,或用
warsh all
方法。

方法
1

t
(
R
)

R

R
2



R
n
,下面求得的关系矩阵
T=
(
b
ij
)
n

n
就是
t
(
R
)















int b[N][N];
initc(r);/*

c
装好
r*/
for(m=1;m
r

m
次方
,

c
装好
*/
{









for(i=0;i






for(j=0;j{




}
b[i][j]=0;
for(k=0;k
b[i][j]+=c[i][k]*r[k][j];
if(b[i][j]) b[i][j]=1;
initc(b);/*

r

m
次方
b
赋给
c
保存
*/

成绩单评语-我不后悔


成绩单评语-我不后悔


成绩单评语-我不后悔


成绩单评语-我不后悔


成绩单评语-我不后悔


成绩单评语-我不后悔


成绩单评语-我不后悔


成绩单评语-我不后悔