利用离散数学知识和C语言相关知识
此处有两种类型
1、
根据下面的命题,试用逻辑推理方法确定谁是作案者,写出推理过程。
(1)营业员A或B偷了手表;
(2)若A作案,则作案不在营业时间;
(3)若B提供的证据正确,则货柜末上锁;
(4)若B提供的证据不正确,则作案发生在营业时间;
(5)货柜上了锁。
主要分为三步:
第一步:命题符号化:
A表示A偷的,B表示B偷的,C表示作案不在营业时间,D表示B提供的证据正确,E:表示货柜未上锁
第二步:
用连接词连接 A V B ∧ (┓AVC)∧(┓B V E)∧(┓B V ┓C) ∧┓E
第三步:
最后再用C语言中的连接符号接连 或 是||,且是&&或者+
最后编写成程序。
程序代码:
#include<stdio.h>
int main(){
int A,B,C,D,E;
//A表示A偷的,B表示B偷的,C表示作案不在营业时间,D表示B提供的证据正确,E:表示货柜未上锁
for(A=0;A<2;A++)
for(B=0;B<2;B++)
for(C=0;C<2;C++)
for(D=0;D<2;D++)
for(E=0;E<2;E++)
{
if(5==(A||B)+(!A||C)+(!D||E)+(D||!C)+(!E))
{
if(A==1){
printf("A");
}
if(B==1){
printf("B");
}
}
}
return 0;
}
基础C语言解释:|| 表示逻辑或
if 中的条件5==(A||B)+(!A||C)+(!D||E)+(D||!C)+(!E)
表示上述五个条件需要同时满足,其实这五个条件可以用连接词&&实现
即(A||B)&&(!A||C)&&(!D||E)&&(D||!C)&&(!E)
运行结果截图:
2、
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
原理:
1表示真,0表示假;
离散数学命题符号化后即可利用C程序编写运行
每位运动员都有五种排名可能,
由已知得每位选手各答对一半,每个人说的两个条件有一个成立,两个条件相加之和为1
即可用循环+判断实现,又需要保证每位选手排名只有一种情况
程序代码:
#include<stdio.h>
int main(){
int A,B,C,D,E;
for(A=1;A<6;A++)
for(B=1;B<6;B++)
for(C=1;C<6;C++)
for(D=1;D<6;D++)
for(E=1;E<6;E++){
if(((A==3)+(B==2))==1&&((B==2)+(E==4))==1&&((C==1)+(D==2))==1&&((C==5)+(D==3))==1&&((E==4)+(A==1))==1)
//每位选手都说对了一半,1为真,0为假,两者相加为1
{
if ((A != B) && (A != C) && (A != D) && (A != E) &&
(B != C) && (B != D) && (B != E) &&
(C != D) && (C != E) && (D!= E)) //每个人的排名都不能相等
{
printf("A=%d B=%d C=%d D=%d E=%d",A,B,C,D,E);
return 0;
}
}
}
return 0;
}
简要说明:((A==3)+(B==2))==1 表示:
== 此符号是一个判断符号,如果符号两边的量相等,则表达式的值为1,否则为0;
A==3、B==2和(…)==1都是逻辑表达式,其值只能是1或0。当表达式为真时,值为1,否则值为0。先判断A==3是否为真,是则值为1,否则为0,再判断B==2的值。设此二式的值的和为C,则再判断C==1的值(1或0)
运行结果截图: