求给定命题公式的真值表并根据真值表求公式的主范式文档格式.docx
《求给定命题公式的真值表并根据真值表求公式的主范式文档格式.docx》由会员分享,可在线阅读,更多相关《求给定命题公式的真值表并根据真值表求公式的主范式文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
求任意一个命题公式的真值表,并根据真值表求主范式
详细说明:
求任意一个命题公式的真值表
本实验要求大家利用C/C,,语言,实现任意输入公式的真值表计算。
一般我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。
命题变元可用数值变量表示,合适公式的表示及求真值表转化为逻辑运算结果;
可用一维数表示合式公式中所出现的n个命题变元,同时它也是一个二进制加法器的模拟器,每当在这个模拟器中产生一个二进制数时,就相当于给各个命题变元产生了一组真值指派。
算法逻辑如下:
(1)将二进制加法模拟器赋初值0
(2)计算模拟器中所对应的一组真值指派下合式公式的真值。
(3)输出真值表中对应于模拟器所给出的一组真值指派及这组真值指派所对应的一行真值。
n(4)产生下一个二进制数值,若该数值等于2-1,则结束,否则转
(2)。
三.实验环境;
使用visualC++6.0为编程软件,采用C语言为编程语言实现。
四.实验原理和实现过程(算法描述);
1.实验原理
(1)真值表:
表征逻辑事件输入和输出之间全部可能状态的表格。
列出命题公
-2-
式真假值的表。
通常以1表示真,0表示假。
命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。
真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
(2)主范式:
主析取范式:
在含有n个命题变元的简单合取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项。
由若干个不同的小项组成的析取式称为主析取范式;
与A等价的主析取范式称为A的主析取范式。
任意含n个命题变元的非永假命题公式A都存在与其等价的主析取范式,并且是惟一的。
主合取范式:
在含有n个命题变元的简单析取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项。
由若干个不同的大项组成的合取式称为主合取范式;
与A等价的主合取范式称为A的主合取范式。
任意含n个命题变元的非永真命题公式A都存在与其等价的主合取范式,并且是惟一的。
(2)首先是输入一个合理的式子,然后从式子中查找出变量的个数,开辟一个二进制函数,用来生成真值表,然后用函数运算,输出结果,并根据结果归类给范式,最后输出范式。
函数部分,主要是3个函数,一个为真值表递加函数,通过二进制的加法原理递进产生,一个为分级运算函数,这个函数是通过判断括号,选出最内级括号的内容执行运算函数,这样一级一级向外运算,最后得出最终结果,剩下一个为主运算函数,按照运算符号的优先级按顺序进行运算,如先将所有非运算运算完,再执行与运算。
如此运算。
-3-
2.实验流程图如下:
开始
输入式子计算变量个数生成真值表输出真值表
变量赋值
运算式子
输出结果归类主范式
N
循环是否结束Y
输出主范式
结束
主函数
-4-
检查括号
N是否是最内级
括号
Y分级运算函数
运算内容
N是否是最后结
果
Y
返回结果
非运算
与运算
或运算
主运算函数
蕴含运算
等值运算
-5-
五.实验代码
#include"
stdio.h"
stdlib.h"
string.h"
conio.h"
math.h"
#defineN50
voidpanduan(intb[N],intf);
//赋值函数
inttkh(charsz[N],charccu[N],inticu[N],inth0);
//分级运算函数intfkh(charsz[N],charccu[N],inticu[N],inth0);
//主运算函数
main()
{
inti1,i2,d=1,icu[N],kh=0,jg,j=0,h0;
//icu[N]用于存放变量值,kh括号计数,jg存放结果
intbj=0,hq[N],h=0,x=0,xq[N];
//hq[N]存放合取结果xq[N]存放析取结果
charsz[N],ccu[N],sz0[N],s;
//sz[N]存放式子,ccu[N]存放变量,sz0[N]也是用于存放式子
hq[0]=-1;
xq[0]=-1;
printf("
***************************************\n"
);
//标语
****\n"
**欢迎进入逻辑运算软件**\n"
**(可运算真值表,主范式,支持括号)**\n"
**用!
表示非**\n"
**用&
表示与**\n"
**用|表示或**\n"
**用^表示蕴含**\n"
**用~表示等值**\n"
***************************************\n\n"
请输入一个合法的命题公式:
\n"
//输入式子
gets(sz);
//读取式子
strcpy(sz0,sz);
//复制式子
for(i1=0;
i1<
strlen(sz);
i1++)
if(sz[i1]=='
)'
||sz[i1]=='
('
)//存储括号数量
kh++;
if(sz[i1]>
='
a'
&
&
sz[i1]<
z'
||sz[i1]>
A'
Z'
)
for(i2=0;
i2<
j;
i2++)//判断并储存变量。
if(ccu[i2]==sz[i1])//去除重复变量
-6-
d=0;
if(d==1)
ccu[j]=sz[i1];
j++;
}
d=1;
\nd该式子中的变量个数为:
%d\n"
j);
//输出变量个数
h0=j;
\n输出真值表如下:
\n\n"
//输出真值表表头
h0;
%c"
ccu[i1]);
"
puts(sz);
i1++)///////先将所有的变量赋值为零。
icu[i1]=0;
i2++)//输出真值表前项
%d"
icu[i2]);
jg=tkh(sz,ccu,icu,h0);
//用函数求结果
if(jg==0)//结果为0,合取加1
hq[h++]=bj;
else//否则,析取加1
xq[x++]=bj;
%d\n"
jg);
//输出运算结果
strcpy(sz,sz0);
(int)pow(2,j)-1;
++bj;
panduan(icu,j-1);
//赋值变量
//恢复被修改的数组。
i2++)
//输出真值表前项
if(hq[0]==-1)//不存在合取范式时
\n该命题公式不存在主合取范式。
-7-
else
\n该命题公式的主合取范式:
\n\t"
h;
if(i1>
0)//判断并添加符号
\\/"
M(%d)"
hq[i1]);
//输出主合取范式
if(xq[0]==-1)//不存在析取范式时
\n该命题公式不存在主析取范式。
\n\n该命题公式的主析取范式:
x;
/\\"
m(%d)"
xq[i1]);
//输出主析取范式
\n欢迎下次再次使用~\n"
//结束
getch();
voidpanduan(intb[N],intf)//二