真值表的C++算法实现.docx
- 文档编号:3902395
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:22
- 大小:101.78KB
真值表的C++算法实现.docx
《真值表的C++算法实现.docx》由会员分享,可在线阅读,更多相关《真值表的C++算法实现.docx(22页珍藏版)》请在冰豆网上搜索。
真值表的C++算法实现
08届课程(设计)论文
题目
命题公式的真值表算法
专业班级
信息与计算科学
(1)班
学号
0809030116
学生姓名
上官业云
指导教师
李圆媛
指导教师职称
讲师
学院名称
理学院
完成日期:
2010年09月27日
目录
目录I
摘要III
前言IV
第1章课题背景1
1.1背景1
1.2性质1
1.3意义1
1.4实验数据与结果1
1.5文献综述2
第2章问题的分析与算法的实现3
2.1问题的分析3
2.2算法的实现3
第3章总结13
致谢14
参考文献15
附录16
摘要
为了解决命题公式的真值表算法问题,本文采用面向对象编程,输入命题变元,并以字符串形式读入命题公式,应用运算符重载来进行相关运算,并在C++(使用的编译工具为VS2010)下,给出了问题的具体解决方案。
关键词:
命题公式;真值表;类;运算符重载;递归;字符串
前言
本文解决了计算任意含
个命题变元的命题公式的真值表的C++算法。
全文共3章。
第1章介绍了问题背景、问题以及性质问题的意义。
在本章中,还给出了具体的实验数据和我们查阅并借用的一些参考文献的主要内容。
第2章主要介绍了在对问题的分析后设计的算法,并编写程序,求出其具体调度方案。
第3章是本次课程设计的总结。
全文的最后是致谢、参考文献和程序的源代码。
上官业云
武汉工程大学理学院
第1章课题背景
1.1背景
设
为含有命题变元
的命题公式,给
一组确定的取值,称为公式
关于
的一组真值指派。
含有
个命题变元的公式有
组不同的真值指派,对于每一组真值指派,公式都有一个确定的真值(一般用“0”表示假,“1”表示真)。
公式与其命题变元之间的真值关系可以用真值表的方法方便的表示出来。
1.2性质
含有
个命题变元的公式有
组不同的真值指派,对于每一组真值指派,公式都有一个确定的真值(一般用“0”表示假,“1”表示真)。
1.3意义
使用计算机来完成各种复杂的真值表计算,尤其是当命题变元增多时,对应的取值成指数增长,计算量也指数增长,紧靠人很难完成。
应用计算机强大的计算能力,可以又好又快的完成任意命题公式的真值表的计算。
1.4实验数据与结果
实验时,本文主要是用编写的程序计算参考资料[1]上的相关命题公式来验证相关算法的正确性,稳定性。
由程序计算得出的命题公式
的真值表:
[1]上236页给出的答案:
000
1
1
0
0
001
1
1
1
1
010
0
0
1
0
011
0
0
1
0
100
0
1
0
0
101
0
1
1
0
110
1
0
1
1
111
1
0
1
1
二者除命题变元取值顺序不一样外,最后的真值结果完全吻合,表明算法的正确性、稳定性。
1.5文献综述
文献[1]介绍了命题变元与命题公式真值表的相关知识。
文献[2]介绍了C++程序设计基础知识。
文献[3]提供了C++面向对象的程序设计相关知识。
第2章问题的分析与算法的实现
2.1问题的分析
对于含有
个命题变元的公式有
组不同的真值指派,对于每一组真值指派,公式都有一个确定的真值(这里“0”表示假,“1”表示真)。
为了枚举出所有的情形,须用
重for循环,为了使程序具有通用性,
的取值是不确定的。
这时,使用递归的算法就较方便。
给命题变元赋值的问题解决后,还得解决计算问题,在这里,本文采用面向对象的方法,通过运算符的重载来完成相关计算。
定义了类Proposition,它包括两个变量——命题变元名和命题变元的真值,和相关成员函数、需重载的运算符。
再设计计算真值的函数,考虑到命题公式中可能会出现括号,改变了运算的优先级,本文同样采用递归的算法,当遇到括号时,把括号里面的部分作为一个命题公式来计算,再把结果作为一个命题变元放到整个命题公式进行计算,而当遇到相关的运算符时,重载运算符进行计算。
最后返回真值。
最后,主函数只需完成输入并存储命题变元与命题公式,调用赋值函数就行了。
由以上方法可以进行真值的运算,但程序冗余太长,再对其进行优化处理,用另一函数来代替大量重复的代码,使程序更简洁。
2.2算法的实现
定义命题变元类Proposition:
classProposition
{
intdata;chardata1;//data:
命题的真值(0/1)data1:
命题名
public:
Proposition(){data=2;data1='A';};
friendPropositionoperator!
(Proposition&q);//定义否定运算符!
friendPropositionoperator&(Proposition&p,Proposition&q);//定义合取运算符&
friendPropositionoperator|(Proposition&p,Proposition&q);//定义析取运算符|
friendPropositionoperator>(Proposition&p,Proposition&q);//定义蕴含运算符>
friendPropositionoperator<(Proposition&p,Proposition&q);//定义等值运算符<
voidinput1(intx){data=x;}//输入data
voidinput2(charx){data1=x;}//输入data1
intget(){returndata;}//获取真值
intget1(){returndata1;}//获取命题名
};
Propositionoperator!
(Proposition&q)
{q.input1(1-q.get());returnq;}
Propositionoperator&(Proposition&p,Proposition&q)
{p.input1((p.get()+q.get())/2);returnp;}
Propositionoperator|(Proposition&p,Proposition&q)
{if(p.get()+q.get()>0)p.input1
(1);
elsep.input1(0);
returnp;}
Propositionoperator>(Proposition&p,Proposition&q)
{if(p.get()==1&&q.get()==0)
p.input1(0);
elsep.input1
(1);
returnp;}
Propositionoperator<(Proposition&p,Proposition&q)
{if(p.get()==q.get())p.input1
(1);
elsep.input1(0);
returnp;}
其中函数voidinput1(intx)用于输入命题变元的真值,函数voidinput2(charx)用于输入命题名,intget()与intget1()分别用于获取命题真值和命题名,运算符重载部分由[1]中的知识得出。
给命题变元赋值(voidfuzhi(stringA,intN,intM,Propositiona[])):
for(intj=0;j<2;j++)
{
a[N-1].input1(j);
if(N>1)
{
fuzhi(A,N-1,M,&a[0]);
}
else
{
for(inti=0;i { cout< } cout< } } 其中bds(A,M,&a[0])为计算真值的函数,后面再叙。 A为命题公式(以字符串形式储存),a[]为Proposition类的对象,用于存储命题变元的相关信息。 识别输入的表达式并计算真值(intbds(stringA,intN,Propositiona[])): PropositionANS,Temp; chard[5]={'! ','|','&','>','<'}; intL; inti=0; L=strlen(&A[0]);//计算表达式长度 while(i { if(A[i]=='(')//括号的处理 { intk=1; for(intj=i+2;j { if(k! =0) { if(A[j]=='(') k++; if(A[j]==')') k--; } if(k==0) { intl=j-i-1; char*p=newchar[l+1]; stringB; for(intm=0;m p[m]=A[i+1+m]; p[l]='\0'; B=p; deletep; Temp.input1(bds(B,N,&a[0])); if(i==0) ANS.input1(Temp.get()); i=j+1; break; } } } else { if(A[i]=='! ')//否定的计算 { Temp.input1(jisuan(A,i,L,N,&a[0])); ANS=! Temp; i++; continue; } elseif(A[i]=='|') { Temp.input1(jisuan(A,i,L,N,&a[0])); ANS=ANS|Temp; i++; continue; } elseif(A[i]=='&') { Temp.input1(jisuan(A,i,L,N,&a[0])); ANS=ANS&Temp; i++; continue; } elseif(A[i]=='<') { Temp.input1(jisuan(A,i,L,N,&a[0])); ANS=ANS i++; continue; } elseif(A[i]=='>') { Temp.input1(jisuan(A,i,L,N,&a[0])); ANS=ANS>Temp; i++; continue; } else { for(intj=0;j {if(A[i]==char(a[j].get1())) { Temp.input1(a[j].get()); if(i==0) ANS.input1(Temp.get()); i++; break; } } } } } returnANS.get(); } 其中strlen(&A[0])为C++字符串库函数,功能是返回字符串的长度,需加头文件string,chard[5]={'! ','|','&','>','<'}存储的是5个重载的运算符名,用于识别运算符。 jisuan(A,i,L,N,&a[0])是为了减少程序的冗余而设计的,具体内容如下: PropositionTemp; if(A[i+1]=='(') { intk=1; for(intj=i+2;j { if(k! =0) { if(A[j]=='(') k++; if(A[j]==')') k--; } if(k==0) { intl=j-i-1; char*p=newchar[l+1]; stringB; for(intm=0;m p[m]=A[i+2+m]; p[l-1]='\0'; B=p; deletep; Temp.input1(bds(B,N,&a[0])); i=i+j; break; } } } else { intj=0; while(j { if(A[i+1]==char(a[j].get1())) { i++; Temp=a[j]; break; } j++; } } returnTemp.get(); 为了使主函数看起来更简洁,把以上内容都放入头文件zzb.h中,主函数部分同时还完成命题变元及命题公式的输入与储存,最后调用函数voidfuzhi(stringA,intN,intM,Propositiona[])完成全部计算,其内容如下: Propositiona[30]; charx='1'; inti=0,N; cout<<"请输入涉及的命题变元(输入‘0’按回车结束)"< while(int(x)! =48) { cin>>x; if(i>19)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 真值 C+ 算法 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)