ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:37.09KB ,
资源ID:25665139      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25665139.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(离散数学逻辑学命题公式求真值表.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

离散数学逻辑学命题公式求真值表.docx

1、离散数学逻辑学命题公式求真值表离散逻辑学实验班级:10电信实验班 学号:Q10600132 姓名:王彬彬一、实验目的 熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。二、实验内容1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。(A) 2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C)三、实验环境 C或C语言编程环境实现。4、实验原理和实现过程(算法描述)1.实验原理(1)合取:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题PQ, 读作P、Q的合取, 也可读作P与Q。这个新命题的真值与构成它的命题P、Q的真值

2、间的关系为只有当两个命题变项P = T, Q = T时方可PQ =T, 而P、Q只要有一为F则PQ = F。这样看来,PQ可用来表示日常用语P与Q, 或P并且Q。(2)析取:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题PQ, 读作P、Q的析取, 也可读作P或Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = F, Q = F时方可PQ =F, 而P、Q只要有一为T则PQ = T。这样看来,PQ可用来表示日常用语P或者Q。(3)条件:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题PQ, 读作P条件Q, 也可读作如果P,那么Q。这个新命题的真

3、值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = F时方可PQ =F, 其余均为T。(4)双条件:二元命题联结词。将两个命题P、Q联结起来,构成一个新的命题PQ, 读作P双条件于Q。这个新命题的真值与构成它的命题P、Q的真值间的关系为当两个命题变项P = T, Q =T时方可PQ =T, 其余均为F。(5)真值表:表征逻辑事件输入和输出之间全部可能状态的表格。列出命题公式真假值的表。通常以1表示真,0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。 真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否

4、为真或有效。(6)主范式:主析取范式:在含有n个命题变元的简单合取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项。由若干个不同的小项组成的析取式称为主析取范式;与A等价的主析取范式称为A的主析取范式。任意含n个命题变元的非永假命题公式A都存在与其等价的主析取范式,并且是惟一的。主合取范式:在含有n个命题变元的简单析取式中,若每个命题变元与其否定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项。由若干个不同的大项组成的合取式称为主合取范式;与A等价的主合取范式称为A的主合取范式。任意含n个命题变元的非永真命题公式A都存在与其等价的主合

5、取范式,并且是惟一的。5、代码设计结果:6、代码:#include #include #include #include conio.h#include math.h#define N 50 void panduan(int bN,int f);/赋值函数int tkh (char szN, char ccuN, int icuN, int h0);/分级运算函数int fkh (char szN, char ccuN, int icuN, int h0);/主运算函数void zhumain() int i1,i2,d=1,icuN,kh=0,jg,j=0,h0;/icuN用于存放变量值,k

6、h括号计数,jg存放结果 int bj=0,hqN,h=0,x=0,xqN;/hqN存放合取结果xqN存放析取结果 char szN,ccuN,sz0N,s;/szN存放式子,ccuN存放变量,sz0N也是用于存放式子 hq0=-1; xq0=-1; printf(*n);/标语 printf(* *n); printf(* 欢迎进入逻辑运算软件 *n); printf(* (可运算真值表,主范式,支持括号) *n); printf(* *n); printf(* 用!表示非 *n); printf(* 用&表示与 *n); printf(* 用|表示或 *n); printf(* 用表示蕴含

7、 *n); printf(* 用表示等值 *n); printf(* *n); printf(*nn); printf(请输入一个合法的命题公式:n);/输入式子 gets(sz);/读取式子 strcpy(sz0,sz);/复制式子 for(i1=0;i1=a & szi1=A & szi1=Z) for(i2=0;i2j;i2+) /判断并储存变量。 if(ccui2=szi1)/去除重复变量 d=0; if(d=1) ccuj=szi1; j+; d=1; printf(nd该式子中的变量个数为:%dn,j);/输出变量个数 h0=j; printf(n输出真值表如下:n n); /输出

8、真值表表头 for(i1=0;i1h0;i1+) printf( %c ,ccui1); printf( ); puts(sz); printf(n); for(i1=0;i1j;i1+) /先将所有的变量赋值为零。 icui1=0; for(i2=0;i2j;i2+)/输出真值表前项 printf( %d ,icui2); jg=tkh(sz,ccu,icu,h0); /用函数求结果 if(jg=0)/结果为0,合取加1 hqh+=bj; else /否则,析取加1 xqx+=bj; printf( %dn,jg);/输出运算结果 strcpy(sz,sz0); for(i1=0;i1(in

9、t)pow(2,j)-1;i1+) +bj; panduan(icu,j-1); /赋值变量 jg=tkh(sz,ccu,icu,h0); if(jg=0)/结果为0,合取加1 hqh+=bj; else /否则,析取加1 xqx+=bj; strcpy(sz,sz0); /恢复被修改的数组。 for(i2=0;i2j;i2+) printf( %d ,icui2);/输出真值表前项 printf( %dn,jg);/输出运算结果 if(hq0=-1)/不存在合取范式时 printf(n该命题公式不存在主合取范式。n); else printf(n该命题公式的主合取范式:nt); for(i1

10、=0;i10)/判断并添加符号 printf(/); printf(M(%d),hqi1); /输出主合取范式 if(xq0=-1)/不存在析取范式时 printf(n该命题公式不存在主析取范式。n); else printf(nn该命题公式的主析取范式:nt); for(i1=0;i10)/判断并添加符号 printf(/); printf(m(%d),xqi1);/输出主析取范式 printf(n);void panduan(int bN,int f) / 二进制赋值。 int i; i=f; if(bf=0)/加1 bf=1; else/进位 bf=0; panduan(b,-i); i

11、nt tkh (char szN,char ccuN,int icuN,int h0)/分级运算函数 int i,j,h,s,kh=0,wzN,a; char xs1N,ckhN; /xs1用来保存括号内的字符 ckh用来保存括号。 s=strlen(sz); for(i=0;is;i+) if(szi=( | szi=)/判断括号 wzkh=i;/存储括号位置 ckhkh=szi;/存储括号类型 kh+; if(kh=0) return fkh(sz,ccu,icu,h0);/如果无括号,直接运行 else for(i=0;ikh;i+) if(ckhi=)/找到第一个) break; fo

12、r(j=wzi-1+1,h=0;jwzi;j+,h+) /存储最内级括号中的内容 xs1h=szj; xs1h=0; a=fkh(xs1,ccu,icu,h0);/运行最内级括号的式子,得到结果 if(a=1)/判断并存储结果 szwzi-1=1; else szwzi-1=-2; for(j=wzi-1+1;js+wzi-1-wzi;j+)/将括号后内容前移 szj=szj+wzi-wzi-1; szj=0; return tkh(sz,ccu,icu,h0);/循环执行 int fkh(char szN,char ccuN,int icuN,int h0)/主运算函数 int i,h=0,

13、j=0,j1=0,j2=0,j3=0,j4=0,j5=0,i1,i2,p1=-1,p2=-1,s; char dtN; s=strlen(sz); if(s=1) if(sz0=-2)/判断是否是最后一项 return 0; else return 1; /1 就是sz0的值、 else for(i=0;is-j;i+) /先处理非 if(szi=!) for(i1=0;i1h0;i1+) if(szi+1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=-2)/如果是前运算结果的0,则P1等于0 p1=0; if(p1=-1)/如果是数字,直接给P1 p1=szi+1

14、; dtj+2=!p1;/非运算 szi=j+2; j+; p1=0; for(i1=i+1;i1s-j;i1+) szi1=szi1+1;/将后续式子前移一项 p1=-1; j1=j; for(i=0;is-j1-2*j2;i+) / 处理与 if(szi=&) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=ccui1)/将变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算结果,将结果赋值并给P1 p1=dti2; if(szi+1=i2) /

15、如果为前计算结果,将结果赋值并给P2 p2=dti2; if(szi-1=-2)/如果是前运算结果的0,则P1等于0 p1=0; if(szi+1=-2)/如果是前运算结果的0,则P2等于0 p2=0; if(p1=-1) /如果是数字,直接给P1 p1=(int)(szi-1); if(p2=-1)/如果是数字,直接给P2 p2=(int)(szi+1); dtj+2=p1 & p2;/与运算 szi-1=j+2; j+; j2+; p1=-1; p2=-1; for(i1=i;i1s-j1-2*j2;i1+)/将后续式子前移两项 szi1=szi1+2; i=i-1; for(i=0;is

16、-j1-2*j2-2*j3;i+) / 处理或。 if(szi=|) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=ccui1)/将变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算结果,将结果赋值并给P1 p1=dti2; if(szi+1=i2)/如果为前计算结果,将结果赋值并给P2 p2=dti2; if(szi-1=-2)/如果是前运算结果的0,则P1等于0 p1=0; if(szi+1=-2)/如果是前运算结果的0,则P2等于0 p2=

17、0; if(p1=-1)/如果是数字,直接给P1 p1=szi-1; if(p2=-1)/如果是数字,直接给P2 p2=szi+1; dtj+2=p1 | p2;/或运算 szi-1=j+2; j+; j3+; p1=-1; p2=-1; for(i1=i;i1s-j1-2*j2-2*j3;i1+)/将后续式子前移两项 szi1=szi1+2; i-; for(i=0;is-j1-2*j2-2*j3-2*j4;i+) / 处理蕴含。 if(szi=) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=ccui1)/将

18、变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算结果,将结果赋值并给P1 p1=dti2; if(szi+1=i2) /如果为前计算结果,将结果赋值并给P2 p2=dti2; if(szi-1=-2)/如果是前运算结果的0,则P1等于0 p1=0; if(szi+1=-2)/如果是前运算结果的0,则P2等于0 p2=0; if(p1=-1)/如果是数字,直接给P1 p1=szi-1; if(p2=-1)/如果是数字,直接给P2 p2=szi+1; dtj+2=!p1 | p2;/蕴含运算 szi-1=j+2; j+; j4+

19、; p1=-1; p2=-1; for(i1=i;i1s-j1-2*j2-2*j3-2*j4;i1+)/将后续式子前移两项 szi1=szi1+2; i-; for(i=0;is-j1-2*j2-2*j3-2*j4-2*j5;i+) / 处理等值。 if(szi=) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=ccui1)/将变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算结果,将结果赋值并给P1 p1=dti2; if(szi+1=i2)

20、/如果为前计算结果,将结果赋值并给P2 p2=dti2; if(szi-1=-2)/如果是前运算结果的0,则P1等于0 p1=0; if(szi+1=-2)/如果是前运算结果的0,则P2等于0 p2=0; if(p1=-1)/如果是数字,直接给P1 p1=szi-1; if(p2=-1)/如果是数字,直接给P2 p2=szi+1; dtj+2=(!p1 | p2)&(!p2 | p1);/等值运算 szi-1=j+2; j+; j5+; p1=-1; p2=-1; for(i1=i;i1s-j1-2*j2-2*j3-2*j4-2*j5;i1+)/将后续式子前移两项 szi1=szi1+2; i

21、-; return dtj+1;/返回结果 void sel() /合取、析取、条件、双条件的输出 int p,q; printf(输入两个字符的真值:); scanf(%d%d,&p,&q); printf(输出合取结果:); printf(%dn,p&q); printf(输出析取结果:); printf(%dn,p|q); printf(输出条件结果:); printf(%dn,!(p=1&q=0); printf(输出双条件结果:); printf(%dn,p=q); int main() printf(*班级:10电信实验班*学号:Q10600132*姓名:王彬彬n); printf( 1.求取命题公式的真值表,主合取和主析取nn); zhumain(); printf(n 2.求取合取析取等真值nn); sel(); return 0;7、实验心得:从这次实验中了解到如何通过程序,把字符串的逻辑公式,实现运算的功能。这是关键,同时对括号等的处理,这也很重要。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1