离散数学实验——求真值表

合集下载

离散数学双箭头真值表

离散数学双箭头真值表

离散数学双箭头真值表
离散数学中,双箭头是一个用于表示逻辑函数的符号。

它表示一个函数具有两个输入和一个输出。

双箭头函数的真值表可以用来描述函数的输入输出关系。

在双箭头函数的真值表中,每一行代表一组输入的取值情况,而每一列代表一个输入或输出变量。

输入变量通常用字母p和q表示,而输出变量通常用字母r表示。

每个输入变量的取值通常为0或1,分别表示False和True。

输出变量的取值也是0或1,表示函数的输出结果。

以下是一个示例的双箭头函数真值表:
p | q | r
--|---|--
0 | 0 | 1
0 | 1 | 0
1 | 0 | 1
1 | 1 | 1
在这个示例中,函数的输入变量是p和q,输出变量是r。

根据真值表,当输入为p=0和q=0时,输出r=1;当输入为p=0和q=1时,输
出r=0;当输入为p=1和q=0时,输出r=1;当输入为p=1和q=1时,输出r=1。

通过真值表,我们可以分析逻辑函数的性质和规律。

例如,可以观察到当p=0时,无论q的取值如何,函数的输出都是1。

这表明函数的输出与p无关,只与q有关。

这种分析方法可以帮助我们理解函数的逻辑结构和行为。

双箭头函数真值表在离散数学和计算机科学中被广泛应用。

它们用于逻辑门电路的设计和分析,也用于描述和验证逻辑推理和布尔代数。

进一步拓展,双箭头函数的真值表也可以用于构建复杂的逻辑系统和进行逻辑运算的推导。

《离散数学》双语教学 第一章 真值表,逻辑和证明

《离散数学》双语教学 第一章   真值表,逻辑和证明

《离散数学》双语教学第一章真值表,逻辑和证明《离散数学》双语教学第一章真值表,逻辑和证明CHAPTER 1TRUTH TABLES, LOGIC, AND PROOFSGlossarystatement, proposition:命题 logical connective:命题联结词compound statement:复合命题 propositional variable:命题变元negation:否定(式)truth table:真值表conjunction:合取 disjunction:析取 propositional function:命题公式fallacy: 谬误syllogism:三段论universal quantification:全称量词化 existential quantification:存在量词化 hypothesis(premise): 假设~前提~前件 conditional statement, implication:条件式~蕴涵式 consequent, conclusion:结论~后件 converse:逆命题contrapositive:逆否命题biconditional, equivalence:双条件式~等价(逻辑)等价的 logically equivalent:contingency:可满足式tautology:永真式(重言式)contradiction, absurdity:永假(矛盾)式 logically follow:是…的逻辑结论 argument:论证axioms:公理第 1 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明 postulate:公设rules of reference:推理规则modus ponens:肯定律 modus tollens:否定律reductio ad absurdum:归谬律proof by contradiction:反证法counterexample:反例 minterm:极小项disjunctive normal form:主析取范式maxterm:极大项conjunctive normal form:主合取范式第 2 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明本章内容及教学要点:1.1 Statements and Connectives教学内容:statements(propositions)~compound statement~connectives:negation~conjunction~disjunction~truth tables 1.2 Conditional Statements教学内容:implications(conditional statements)~biconditional~equivalent~and quantifications1.3 Equivalent Statements教学内容:logical equivalence~converse~inverse~contrapositive~tautology~contradiction(absurdity)~contingency~properties of logical connectives1.4 Axiomatic Systems: Arguments and Proofs教学内容:rules of reference~augument~valid argument~hypotheses~premises~law of detachment(modus ponens)~syllogism~modus tollens~addition~proof by contradiction 1.5 Normal Forms教学内容:minterm~disjunctive normal form~maxterm~conjunctive normal form定理证明及例题解答第 3 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明Logic, developed by Aristotle, has been used through the centuries in the development of many areas of learning including theology, philosophy, and mathematics. It is the foundation on which the whole structure of mathematics is built. Basically it is the science of reasoning, which may allow us to determine statements about mathematics whether are true or false based on a set of basic assumptions called axioms. Logic is also used in computer science to construct computer programs and to show that programs do what they are designed to do.逻辑学是研究人的思维形式的科学. 而数理逻辑是逻辑学的一个重要分支~是用数学形式化的方法研究思维规律的一门学科. 由于它使用了一套符号来简洁地表达出各种推理的逻辑关系~故它又称符号逻辑.数理逻辑用数学方法研究推理、利用符号体系研究推理过程中前提和结论之间的关系. 数理逻辑的主要内容:逻辑演算(L和L)、公理化集合论、模型论、S p构造主义与证明论. 数理逻辑在电子线路、机器证明、自动化系统、编译理论、算法设计方法方面有广泛的应用.The rules of logic specify the meaning of mathematicalstatements. Logic is the basis of all mathematical reasoning, and it has practical applications to the design of computing machines, to system specifications, to artificial intelligence(AI), to computer programming, to programming languages, and to other areas of computer science, as well as to many other fields of study.第 4 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明1.1 Statements and Connectivess(命题和联结词)命题逻辑研究的对象是命题及命题之间的逻辑关系.Propositions are the basic building blocks of logic. Many mathematical statements are constructed by combining one or more propositions.定义1.1.1 A proposition is a statement or declarative sentence that is either true or false, but not both,命题是一个非真即假的陈述句,.因此不能判断真假的陈述句、疑问句、祈使句和感叹句都不是命题.,1, The true or false value assigned to a statement is called its truth value; (一个命题的真或假称为命题的真值. 真用T或1表示~假用F或0表示),2, 一个陈述句有真值与是否知道它的真假是两回事.例1.1.1 判断下列语句是不是命题,若是~给出命题的真值: (1) 陕西师大不是一座工厂.(2) 你喜欢唱歌吗,(3) 给我一块钱吧:(4) 我不是陕西师大的学生.(5) 我正在说谎.Logical connectives(命题联结词)数理逻辑的特点是并不关心具体某个命题的真假~而是将逻辑推理变成类似数学演算的形式化过程, 关心的是命题之间的关联性. 因此需要进行命题符号化.命题联结词的作用是为了将简单命题组合成复合命题.We will now introduce the logical connectives that are used to form new propositions from existing propositions. And once truth values have been assigned to simple propositions, we can progress to more complicated compound statements.A statement that contains no connectives is called a simple第 5 页共 47 页 2010-12-27《离散数学》双语教学第一章真值表,逻辑和证明statement. We will use p,q,r…to represent simple statements(简单命题就是简单陈述句~用字母p,q,r…(或带下标)表示),Sometimes, the letters p,q,r,s,…are used to denote propositional variables that can be replacedby statements(命题变元:可以用命题代替的变元).A statement that contains logical connectives(命题联结词) is called compound statements(复合命题). In general, a compound statement may have many component parts, each of which is itself a statement, represented by some propositional variable. The truth of a compound proposition is determined by the truth or falsity of the component parts.propositional constant(命题常元):T(1)或F(0)~或者表示一个确定的命题,propositional variable(命题变元):可用一个特定的命题取代。

离散数学课件真值表和等价公式PPT文档16页

离散数学课件真值表和等价公式PPT文档16页
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
离散数学课件真值表和等价公式
1、 舟 ቤተ መጻሕፍቲ ባይዱ 遥 以 轻飏, 风飘飘 而吹衣 。 2、 秋 菊 有 佳 色,裛 露掇其 英。 3、 日 月 掷 人 去,有 志不获 骋。 4、 未 言 心 相 醉,不 再接杯 酒。 5、 黄 发 垂 髫 ,并怡 然自乐 。
谢谢你的阅读
❖ 知识就是财富 ❖ 丰富你的人生

左孝凌离散数学13命题公式与翻译-14真值表与等价

左孝凌离散数学13命题公式与翻译-14真值表与等价
公式与翻译
• 1.3.2 复合命题的符号化(翻译) • 自然语言的语句用Wff 形式化:
① 要准确确定原子命题,并将其形式化。 ② 要选用恰当的联结词,尤其要善于识别自然语言中的联 结词(有时它们被省略),否定词的位置要放准确。 ③ 必要时可以进行改述,即改变原来的叙述方式, 但要保证表达意思一致。 ④ 需要的括号不能省略,而可以省略的括号, 在需要提高公式可读性时亦可不省略。
4
第一章 命题逻辑(Propositional Logic)1.3命题
公式与翻译
• 联结词的优先级:┐、∧、∨、→、。
则:
P∧Q→R 是合式公式
等价于Wff : ((P∧Q)→Wff : (P∧Q)→R
不等价于Wff : P∧(Q→R)
第一章 命题逻辑(Propositional Logic)1.3命题
离散数学( ) Discrete Mathematics
1.3.1 命题公式 1.3.2 复合命题的符号化(翻译)
1
第一章 命题逻辑(Propositional Logic)1.3命题
公式与翻译
1.3.1 合式公式(Well-formed formula)(wff) 定义1.3.1:原子公式
单个命题变元和命题常量称为原子公式。
2
第一章 命题逻辑(Propositional Logic)1.3命题
公式与翻译
定义1.3.2:合式公式
(1)原子公式是合式公式(wff)。 (2)若A,B是合式公式,则( A), (A∧B),
(A∨B),(AB),(AB)也是合式公式。 (3)当且仅当有限次地应用(1)(2)所得到的包含原
子公式、联结词和括号的符号串是合式公式。
32
表1-4.8命题定律

离散数学之逻辑运算和命题公式真值表

离散数学之逻辑运算和命题公式真值表
}
return 0;
}
{
int show();
show();
return 0;
}
int hequ(int P,int Q)
{
return(P&Q);
}
int xiqu(int P,int Q)
{
return(P|Q);
}
int tiaojian(int P,int Q)
{
if(P==1&&Q==0)
return(0);
else
实现任意输入公式的真值表计算。一般我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。命题变元可用数值变量表示,合适公式的表示及求真值表转化为逻辑运算结果;可用一维数表示合式公式中所出现的n个命题变元,同时它也是一个二进制加法器的模拟器,每当在这个模拟器中产生一个二进制数时,就相当于给各个命题变元产生了一组真值指派。算法逻辑如下:
return(1);
}
int shuangtiaojian(int P,int Q)
{
return(!P^Q);
}
int Pfaoding(int P)
{
return(!P);
}
int show()
{
cout<<"P Q R P∧Q P∧R┐P∧R (P∧Q)∨(┐P∧R)"<<endl;
for(int p=0;p<2;p++)
1、逻辑联接词的运算
从键盘输入两个命题变元P和Q的真值,输出它们的合取、析取、条件、双条件和P的否定的真值。
#include <iostream.h>

任意命题公式的真值表

任意命题公式的真值表

实验报告实验名称:任意命题公式的真值表实验目的与要求:通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,包括联结词、真值表、运算的优先级等,提高学生编写实验报告、总结实验结果的能力,培养学生的逻辑思维能力和算法设计的思想,能够独立完成简单的算法设计和分析,进一步用它们来解决实际问题,帮助学生学习掌握C/C++语言程序设计的基本方法和各种调试手段,使学生具备程序设计的能力。

实验内容提要:求任意一个命题公式的真值表实验步骤:(一)、关于命题公式的形式和运算符(即联结词)的运算首先根据离散数学的相关知识,命题公式由命题变元和运算符(即联结词)组成,命题变元用大写字母英文表示(本次试验没有定义命题常元T和F,即T、F都表示命题变元),每个命题变元都有两种真值指派0和1,对应于一种真值指派,命题公式有一个真值,由所有可能的指派和命题公式相应的真值按照一定的规范构成的表格称为真值表。

目前离散数学里用到的包括扩充联结词总共有九种,即析取(或)、合取(与)、非、蕴含、等值、与非、或非、异或、蕴含否定,常用的为前五种,其中除了非运算为一元运算以外,其它四种为二元运算。

所以本次实验设计时只定义了前五种运算符,同时用“/”表示非,用“*”表示合取,用“+”表示析取,用“>”表示蕴含,用“:”表示等值,且这五种运算符的优先级依次降低,如果需用括号改变运算优先级,则用小括号()改变。

以下为上述五种运算符运算时的一般真值表,用P和Q表示命题变元:1.非,用“/”表示2.合取(与),用“*”表示3.析取(或),用“+”表示4.蕴含,用“>”表示5.等值,用“:”表示(二)、命题公式真值的计算对于人来说,计算数学表达式时习惯于中缀表达式,例如a*b+c,a*(b+c)等等,而对于计算机来说,计算a*b+c还好,计算a*(b+c)则困难,因为括号的作用改变了运算的顺序,让计算机识别括号而改变计算顺序显得麻烦。

离散数学201024

例3.3.7
写出下列公式的真值表,并验证其公式是重 言式、矛盾式、可满足公式。 (1)G1=(P→Q)↔(¬P∨Q); (2)G2=(P↔Q)↔(¬(P→Q)∨¬(Q→P)); (3)G3=(P→¬Q)∨¬Q。
2012-3-8
1
例3.3.7 解
三个公式的真值表如下: 三个公式的真值表如下:
P Q (P→Q) ↔(¬P∨ (P↔ Q)↔ ¬(P Q) →Q)∨¬(Q→P) 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 (P→¬Q)∨¬ ¬ Q 1 1 1 0
2012-3-8
15
例3.3.10∨证明 (¬P∧¬Q)∨(¬P (1)((P∨Q)∧¬ (¬P∧(¬Q ¬R)))∨ ¬ ) P ∧ ¬ ¬ ∨ ∨¬
∧¬ R) = ((P∨Q)∧(P∨(Q∧R)))∨¬((P∨Q)∧(P∨R)) P ∧P Q ∨ P ∧P = ((P∨Q)∧((P∨Q)∧(P∨R)))∨¬ ((P∨Q)∧(P∨ P ∧ P ∧P ∨ P ∧P R)) = ((P∨Q)∧(P∨Q)∧(P∨R))∨ ¬( (P∨Q)∧(P∨ P ∧P ∧P ∨ P ∧P R)) = ((P∨Q)∧(P∨R))∨¬((P∨Q)∧(P∨R)) = T P ∧P ∨ P ∧P 即:((P∨Q)∧¬ (¬P∧(¬Q∨¬R)))∨(¬P∧¬Q)∨(¬P P ∧ ¬ ¬ ∨¬ ∨¬ 为永真公式; ∧¬R)为永真公式; 为永真公式
2012-3-8
4
“=” 与“↔”的区别
首先,双条件词“↔”是一种逻辑联结词,公式 G↔H是命题公式,其中“↔”是一种逻辑运算, G↔H的结果仍是一个命题公式。而逻辑等价“=” 则是描述了两个公式G与H之间的一种逻辑等价关系, G=H表示“命题公式G等价于命题公式H”,G=H 的结果不是命题公式。 其次,如果要求用计算机来判断命题公式G、H是 否逻辑等价,即G=H那是办不到的,然而计算机却 可“计算”公式G↔H是否是永真公式。

离散数学中的命题逻辑与真值表

离散数学是数学中的一个重要分支,研究的是具有离散状态的问题。

在离散数学中,命题逻辑是一个重要的概念,它使用符号和规则来描述命题之间的关系。

而真值表则是命题逻辑中用来表示命题的真值的一种方法。

命题逻辑是一种研究命题真假关系的形式方法,它不关心命题的内容,只关注命题的逻辑结构。

在命题逻辑中,命题是指只有真假两种可能取值的陈述。

命题可以用符号表示,通常用大写字母P、Q、R等来表示,例如P表示“今天下雨”。

命题与其他符号之间通过逻辑运算符进行连接,常见的运算符有“与”(∧)、“或”(∨)和“非”(¬)等。

例如,P∧Q表示“今天下雨并且明天晴朗”,P∨Q表示“今天下雨或者明天晴朗”,¬P表示“今天不下雨”。

真值表是一种用来表示命题真值的工具,它通过给定命题的不同情况,列出所有可能的真值组合,并计算命题的真假情况。

真值表是通过行列表示的,其中每一行代表一种可能的真值组合,每一列代表一个命题或运算符。

真值表中的值可以是“真”(T)或“假”(F),分别表示命题为真或为假。

例如,对于P∧Q的真值表,一共有四种可能的真值组合(P为真Q为真、P为真Q为假、P为假Q为真、P为假Q为假),并且可以得到相应的结果(真、假、假、假)。

通过真值表,我们可以对复杂的命题逻辑进行推理和分析。

例如,如果我们希望判断命题P∧Q的真假情况,可以通过查看真值表中相应的行来得到答案。

在真值表中,只要有一组真值组合使得命题为真,那么命题就为真。

如果所有的真值组合都使得命题为假,那么命题就为假。

除了用来判断命题的真假情况,真值表还可以用来进行逻辑推理。

通过对真值表的分析,可以得到一些逻辑上的结论。

例如,如果我们希望证明一个逻辑等式成立,可以通过对真值表进行分析来判断。

如果两个命题在所有的真值组合下都有相同的真假情况,那么它们就是等价的。

在计算机科学和数理逻辑中,真值表还有广泛的应用。

计算机中的逻辑电路可以使用真值表来描述和分析,通过真值表,我们可以判断逻辑电路的输出情况。

(完整版)离散数学实验指导书及其答案

实验一命题逻辑公式化简【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。

【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。

实验用例:用化简命题逻辑公式的方法设计一个5人表决开关电路,要求3人以上(含3人)同意则表决通过(表决开关亮)。

【实验原理和方法】(1)写出5人表决开关电路真值表,从真值表得出5人表决开关电路的主合取公式(或主析取公式),将公式化简成尽可能含五个基本联结词最少的等价公式。

(2)上面公式中的每一个联结词是一个开关元件,将它们定义成C语言中的函数。

(3)输入5人表决值(0或1),调用上面定义的函数,将5人表决开关电路真值表的等价公式写成一个函数表达式。

(4)输出函数表达式的结果,如果是1,则表明表决通过,否则表决不通过。

参考代码:#include<stdio.h>int vote(int a,int b,int c,int d,int e){//五人中任取三人的不同的取法有10种。

i f( a&&b&&c || a&&b&&d || a&&b&&e || a&&c&&d || a&&c&&e || a&&d&&e || b&&c&&d || b&&c&&e || b&&d&&e || c&&d&&e)return 1;e lsereturn 0;}void main(){i nt a,b,c,d,e;p rintf("请输入第五个人的表决值(0或1,空格分开):");s canf("%d%d%d%d%d",&a,&b,&c,&d,&e);i f(vote(a,b,c,d,e))printf("很好,表决通过!\n");e lseprintf("遗憾,表决没有通过!\n");}//注:联结词不定义成函数,否则太繁实验二命题逻辑推理【实验目的】加深对命题逻辑推理方法的理解。

离散数学

离散数学复习题一. 有两个小题1.分别说明联结词⌝、∧、∨、→和↔的名称,再分别说明它们在自然语言中表示什么含义。

解:(1) ⌝叫做否定。

(2) ∧叫做合取。

(3) ∨叫做析取。

(4) →叫做蕴涵。

(5) ↔叫做等价。

“⌝”表示“…不成立”,“不…”。

“∧”表示“并且”、“不但…而且...”、“既…又...”等。

“∨”表示“或者”,是可兼取的或。

“→”表示如果… ,则…;只要… ,就…;只有… , 才…;仅当… 。

“↔”表示“当且仅当”、“充分且必要”。

2解:二. 将下面命题写成符号表达式。

(3,4题要使用句后给定的谓词。

)1.如果小张去,则小王与小李都不去,否则小王与小李不都去。

解:设P:小张去。

Q:小王去。

R:小李去。

此命题的表达式为:(P→(⌝Q∧⌝R))∧(⌝P→⌝(Q∧R))2.我们不能既划船又跑步。

解:令 P:我们划船。

Q:我们跑步。

此命题的表达式为⌝(P∧Q)3.有些运动员是大学生。

(L(x): x是运动员,S(x): x是大学生。

)解:∃x(L(x)∧S(x))4.每个运动员都钦佩一些教练。

( L(x):x是运动员,A(x,y):x钦佩y,J(x):x是教练。

)解:∀x(L(x)→∃y(J(y)∧A(x,y)))三. 有三个问题1.先说明什么叫永真式(也叫重言式)。

解:A(P1,P2,…,Pn) 是含有命题变元P1,P2,…, Pn的命题公式,如不论对P1,P2,…, Pn作任何指派,都使得A(P1,P2,…,Pn) 为真,则称之为重言式,也称之为永真式。

2.指出下面的命题公式中哪些是永真式(只写题号即可)。

(1). (P∨Q)→P (2). P→(P∨Q)(3). (P∧(P→Q))→Q (4). (P∧Q)→Q解:(2),(3),(4)为永真式。

3.然后对上面的永真式任选其中一个给予证明(方法不限)。

证明 (4). (P∧Q)→Q设前件(P∧Q)为真,则得Q为真。

所以(P∧Q)→Q是永真式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0 一 实验目的 ............................................................................................................................................ 1 二 实验内容 ............................................................................................................................................ 1 三 实验环境 .......................................................................................................................................... 1 四 实验原理和实现过程(算法描述) ................................................................................................ 1 五 实验数据及结果分析; .................................................................................................................... 3 六 源程序清单; .................................................................................................................................... 7 七 其他收获和体会。 .......................................................................................................................... 16 1

一 实验目的 熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。

二 实验内容 1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。(A) 2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))

三 实验环境 C或C++语言编程环境实现。

四 实验原理和实现过程(算法描述) A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。最后提示按#键退出,否则继续循环求真值。 B: 主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi()每次调用zzhi()时都使数组zhi[]中的真值加1,(利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhi()将真值指派的数组加1,最后外围利用while语句循环输出每个不同的真值指派和该指派下表达式的值。 2

将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2个栈,一个作为临时存储运算符的栈fu[],一个作为输入逆波兰式的栈nibol[],从中缀式的左端开始取字符,逐序进行如下步骤: (1)若取出的字符是字母,则该字母直接送入nibol[]栈。同时为了找出所有变量,将该变量名与数组bianl[]中已有的元素比较,如果bianl[]中还没有该字母,则该字母是新出现的变量,将其录入数组bianl[]中。 (2)若取出的字符是“(”,则直接送入fu[]栈栈顶。 (3)若取出的字符是“)”,则将距离fu[]栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入nibol[]栈,此时抛弃“(”。 (4)若取出的字符是运算符,则将该运算符与fu[]栈栈顶元素比较,如果该运算符优先级大于fu[]栈栈顶运算符优先级,(此处是编写程序时自己判断好优先级了再按不同情况处理)则将该运算符进fu[]栈,否者,将fu[]栈的栈顶运算符弹出,送入nibol[]栈中,直至fu[]栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入fu[]栈。 (5) 重复上面的1~4步,直至处理完所有的输入字符 (6)最后将残留在符号栈fu[]中的运算符依次出栈。 由于是用数组做的栈,所以,使用逆波兰式求值时只需直接从数组nibol[]的第一个元素nibol[0]开始依次读取就行了。

计算逆波兰式的值的算法:把转换好的逆波兰式从nibol[0]开始依次读取,如果是字母,则先判断字母是第几个变量,将数组zhi[](存放了真值指派)中对应的真值zhi[i]放入数组result[](作为一个栈)中,遇到双目运算符就将result[]中栈顶的两个元素出栈,执行运算,得到的结果再入栈,如果是单目运算符!,则只将一个元素出栈并计算和入栈。

增值:用一个数组存放每一次的真值指派,并用递推实现真值的加1进位: zzhi(int n) //数组zhi存每次的真值指派,调用zzhi(bl+1);时给n赋值为变量数加1,以防止最后一个输出完时再增值时溢出 3

{ if(zhi[n]==0) zhi[n]=1; else if(zhi[n]==1) { zhi[n]=0; zzhi(n-1); //递推,实现进位 } }

C:在B的基础上加了两个二维数组biao[],biao2[],将真值为1和0的真值指派分别存在数组biao[][]和biao2[][]中,然后按合取和析取主范式的不同定义,用循环将对应真值的变量以原或反变量形式输出期间也输出合取、析取符和括号,使之成为主范式

再编写好主要的功能之后,我又在源程序基础上加了一些判断输入错是的提示和处理。具体见实验数据分析和源程序的注释

五 实验数据及结果分析; A:当输入的真值不为0或者1时提示错误并要求重新输入 可循环输入直到输入#才退出,如图所示,以表格的形式输出结果,并且真值都正确 4

B和C:

首先提示输入表达式(合取、析取、蕴含、双条件分别用&,|,>,=表示),然后如果输入的是正确的表达式则以表格形式输出该表达式的真值表、主析取范式和主合取范式,如下图所示,所得真值表和主范式是正确的 5 6

当输入错误的表达式格式时,提示错误,并让用户选择是否继续输入表达式(按#退出)然后返回原界面,继续求真值表和主范式。如下图所示:当输入p&Q!R(!R前漏写运算符)时,提示表达式不合规范,要求重新输入,也可选择按#退出。

括号不匹配: 输入错误的符号: 7

六 源程序清单; A: #include main() { char flag; int he,xi,yunh,dengj,p,q; printf("***************欢迎进入***************\n"); printf("\t(本次实验计算二元表达式的值)\n\n"); do{ printf("请输入P,Q的真值指派(0或1)\n"); printf("p="); scanf("%d",&p); while(p!=0&&p!=1) { printf("输入有误!请重新输入!\np="); fflush(stdin); scanf("%d",&p); } printf("Q="); scanf("%d",&q); while(q!=0&&q!=1) { printf("输入有误!请重新输入!\nQ="); fflush(stdin); scanf("%d",&q); } he=(p==1&&q==1)?1:0; xi=(p==1||q==1)?1:0; yunh=(p==0||q==1)?1:0; dengj=(p==q)?1:0; printf("\tP\tQ\tP∧Q\tP∨Q\tP→Q\tP←→Q\n"); 8

printf("\t%d\t%d \t%d \t%d \t%d \t %d",p,q,he,xi,yunh,dengj); printf("\n\t(按#退出,其它任意键继续)\n"); fflush(stdin); scanf("%c",&flag); }while(flag!='#'); }

B和C: #include #include #include #include #define N 20 char yuan[N*N]={'\0'},fu[N]={'\0'},nibol[N*N]={'\0'},bianl[N]; int zhi[N]={0}; //全局变量分别存储原表达式yuan,求逆波兰式时的符号fu, //存储逆波兰式nibol,存储变量bianl,存储真值指派zhi, int nitop=-1,ftop=-1,bl=-1; //存储逆波兰式和求逆波兰式时要用到的存符号的数组的栈顶指针以及变量下标 int error0=0;

int biao[N*N][N],geshu=0;//存储使真值为一的真值指派,用来求主析取范式 int biao2[N*N][N],geshu2=0;

void main0();//函数声明 nibolan() //将输入的表达式转换为逆波兰式 { int i,j,k,flag,fg=-1; //flag记录某变量是否已出现,fg记录上个变量是字母1,运算符号2,左括号0,右括号3 j=strlen(yuan); for(i=0;i

相关文档
最新文档