求给定命题公式的真值表并根据真值表求公式的主范式
(求给定命题公式的真值表并根据真值表求公式的主范式)
专 业 网络工程
班 级 1202班
学 号 12407442
姓 名 张敏慧
2013.12.14
目录
一.实验目的 ....................................................... 3
二.实验内容„„„„„„„„„„„„„„„„„„„„„„„„„„„.3
求任意一个命题公式的真值表 .......................................................................... 3 三.实验环境 ....................................................... 3
四. 实验原理和实现过程(算法描述) ............................ 3
1.实验原理 ........................................................................................................... 3 2.实验流程图 ....................................................................................................... 5 五.实验代码 ............................................. 6
六. 实验结果 ........................................... 14
七. 实验总结 .................................................... 19
- 1 -
一.实验目的
本实验课程是网络工程专业学生的一门专业基础课程,通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和
。
熟悉掌握命题逻辑中的真值表、主范式等,进一步能用它们来解决实际问题。
二.实验内容
求任意一个命题公式的真值表,并根据真值表求主范式
详细
:
求任意一个命题公式的真值表
本实验要求大家利用C/C,,语言,实现任意输入公式的真值表计算。一般我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。命题变元可用数值变量表示,合适公式的表示及求真值表转化为逻辑运算结果;可用一维数表示合式公式中所出现的n个命题变元,同时它也是一个二进制加法器的模拟器,每当在这个模拟器中产生一个二进制数时,就相当于给各个命题变元产生了一组真值指派。算法逻辑如下:
(1)将二进制加法模拟器赋初值0
(2)计算模拟器中所对应的一组真值指派下合式公式的真值。 (3)输出真值表中对应于模拟器所给出的一组真值指派及这组真值指派所对应的一行真值。
n(4)产生下一个二进制数值,若该数值等于2-1,则结束,否则转(2)。
三.实验环境;
使用visual C++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"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "math.h"
#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()
{
int i1,i2,d=1,icu[N],kh=0,jg,j=0,h0;//icu[N]用于存放变量值,kh括号计数,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("** (可运算真值表,主范式,支持括号) **\n");
printf("** **\n");
printf("** 用!表示非 **\n");
printf("** 用&表示与 **\n");
printf("** 用|表示或 **\n");
printf("** 用^表示蕴含 **\n");
printf("** 用~表示等值 **\n");
printf("** **\n");
printf("***************************************\n\n");
printf("请输入一个合法的命题公式:\n");//输入式子
gets(sz);//读取式子
strcpy(sz0,sz);//复制式子
for(i1=0;i1
='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z')
{
for(i2=0;i20)//判断并添加符号
printf("\\/");
printf("M(%d)",hq[i1]); //输出主合取范式
}
}
if(xq[0]==-1)//不存在析取范式时
printf("\n该命题公式不存在主析取范式。\n");
else
{
printf("\n\n该命题公式的主析取范式:\n\t");
for(i1=0;i10)//判断并添加符号
printf("/\\");
printf("m(%d)",xq[i1]);//输出主析取范式
}
}
printf("\n");
printf("\n欢迎下次再次使用~\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);
}
}
int tkh (char sz[N],char ccu[N],int icu[N],int h0)//分级运算函数
{
int i,j,h,s,kh=0,wz[N],a;
char xs1[N],ckh[N]; //xs1用来保存括号内的字符 ckh用来保存括号。
- 8 -
s=strlen(sz);
for(i=0;i