离散数学实验报告课案
萌到你眼炸
727次浏览
2021年01月30日 01:25
最佳经验
本文由作者推荐
year函数-灰心丧气的意思
实
验
报
告
(
2015
/ 2016
学年
第
二
学期)
课程名称
实验名称
离散数学
利用真值表法求取主析取范式
以及主合取范式的实现
实验时间
指导单位
指导教师
2016
年
9
月
20
日
计算机科学与技术系
刘茜萍
学生姓名
学院
(
系
)
吉峰
班级学号
B14041515
软件工程
计算机学院、
软
专
业
件学院
实
验
报
告
实验名称
利用真值表法求取主析取范式
指导教师
以及主合取范式的实现
实验类型
验证
实验学时
4
实验时间
2016
年
9
月
20
日
刘茜萍
一、
实验目的和要求
实验目的:通过编程实现主析取范式以及主 合取范式的真值表求
法以巩固相关理论的掌握。
实验要求:
从屏 幕输入含三个以内变量的合式公式(其中联结词按照从高到
底的顺序出现)
。
规范列出所输合式公式的真值表。
给出相应主析取和主合取范式。
二、
实验环境
(
实验设备
)
Windows+VC
三、实验原理及内容
实验原理:开始时在屏幕提示上提示非、合取、析取、条件、双条件在计算机上的字符表示,因为有些数学符号在计算机上不能表示出来。
然后在屏幕中输入含三个以 内变量的合式公式,其中联结词按照从高到底
的顺序出现。把输入的合式公式,分别存放在相应的数组中 ,设计一个真
值判断表达式,并使其赋值计算。依次从左向右计算对应的一组真值指派
下合式公 式的真值。多重循环计算,并将最终的结果存入相应的数组里,
而后输出真值表。最后根据真值表求主析 取范式和主合取范式的方法输出
所求的相应的主析取范式和主合取范式。
实验内容:
#include
#include
#include
#include
#include
#define N 50
void panduan(int b[N],int f);//
赋值函数
int tkh (char sz[N], char ccu[N], int icu[N], int h0);//
分级运算函数
int fkh (char sz[N], char ccu[N], int icu[N], int h0);//
主运算函数
main()
{
2
int i1,i2,d=1,icu[N],jg,j=0,h0 ;//icu[N]
用于存放变量值
,jg
存放结果
int bj=0,hq[N],h=0,x=0,xq[N];//hq[N]
存放合取结果
xq[N]
存放析取结果
char
sz[ N],ccu[N],sz0[N],s;//sz[N]
存放式子
,ccu[N]
存 放变量
,sz0[N]
也是用
于存放式子
hq[0]=-1;
xq[0]=-1;
printf(
******************** *******************n
标语
printf(
n
printf(
欢迎进入菜单
n
printf(
printf(
用
!
表示非
n
printf(
用
&
表示合取
n
printf(
用
|
表示析取
n
printf(
用
^
表示条件
n
printf(
用
~
表示双条件
n
printf(
n
printf(
***************************************nn
printf(
请输入一个合法的命题公式
:n
输入式子
gets(sz);//
读取式子
strcpy(sz0,sz);//
复制式子
for(i1=0;i1
{
3
if(sz[i1]==')' || sz[i1]=='(')//
存储括号数量
kh++;
if(sz[i1]>='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z')
{
for(i2=0;i2
if(ccu[i2]==sz[i1])//
去除重复变量
d=0;
if(d==1)
{
ccu[j]=sz[i1];
j++;
}
d=1;
}
}
printf(
该式子中的变量个数为:
%dn
输出变量个数
h0=j;
printf(
输出真值表如下:
n n
输出真值表表头
for(i1=0;i1
printf(
printf(
puts(sz);
4
printf(
for(i1=0;i1
icu[i1]=0;
for(i2=0;i2
printf(
jg=tkh(sz,ccu,icu,h0); //
用函数求结果
if(jg==0)//
结果为
0
,合取加
1
hq[h++]=bj;
else //
否则,析取加
1
xq[x++]=bj;
printf(
%dn
输出运算结果
strcpy(sz,sz0);
for(i1=0;i1<(int)pow(2,j)-1;i1++)
{
++bj;
panduan(icu,j-1); //
赋值变量
jg=tkh(sz,ccu,icu,h0);
if(jg==0)//
结果为
0
,合取加
1
hq[h++]=bj;
else //
否则,析取加
1
xq[x++]=bj;
strcpy(sz,sz0); //
恢复被修改的数组。
5
for(i2=0;i2
printf(
输出真值表前项
printf(
%dn
输出运算结果
}
if(hq[0]==-1)//
不存在合取范式时
printf(
该命题公式不存在主合取范式。
n
else
{
printf(
该命题公式的主合取范式:
nt
for(i1=0;i1
{
if (i1>0)//
判断并添加符号
printf(
printf(
输出主合取范式
}
}
if(xq[0]==-1)//
不存在析取范式时
printf(
该命题公式不存在主析取范式。
n
else
{
printf(
该命题公式的主析取范式:
nt
for(i1=0;i1
{
if (i1>0)//
判断并添加符号
printf(
printf(
输出主析取范式
}
}
printf(
printf(
欢迎下次再次使用!
n
结束
getch();
}
void panduan(int b[N],int f) //
二进制赋值。
{
int i;
i=f;
if(b[f]==0)//
加
1
b[f]=1;
else//
进位
{
b[f]=0;
panduan(b,--i);
}
7
}
int fkh(char sz[N],char ccu[N],int icu[N],int h0)//
主运算函数
{
int i,h=0,j=0,j1=0,j2=0,j3=0,j4=0,j5 =0,i1,i2,p1=-1,p2=-1,s;
char dt[N];
s=strlen(sz);
if(s==1)
if(sz[0]==-2)//
判断是否是最后一项
return 0;
else
return 1; //1
就是
sz[0]
的值、
else
{
for(i=0;i
if(sz[i]=='!')
{
for(i1=0;i1
if(sz[i+1]==ccu[i1])//
将变量赋值并给
P1
p1=icu[i1];
if(sz[i+1]==-2)/ /
如果是前运算结果的
0
,则
P1
等于
0
p1=0;
if(p1==-1)//
如果是数字,直接给
P1
8