逻辑命题定律计算
逻辑运算律公式大全

分配律
A×(B+C)=(A×B)+(A×C)(或A∧(B∨C)=(A∧B)∨(A∧C))<br>A+(B×C)=(A+B)×(A+C)(此公式在标准逻辑运算中不常见,但展示了分配律的一种形式)
逻辑与对逻辑或满足分配律
吸收律
A+(A×B)=A(或A∨(A∧B)=A)<br>A×(A+B)=A(或A∧(A∨B)=A)
逻辑非运算对逻辑或和逻辑与的变号分配律
“异或”运算
A⊕B=(A+B)×(A−1+B−1)(或A⊕B=(A∨B)∧(¬A∨¬B))<br>=(A×B−1)+(A−1×B)(或=(A∧¬B)∨(¬A∧B))
异或运算的公式
反演律
¬(A×B)=¬A+¬B(或¬(A∧B)=¬A∨¬B)<br>¬(A+B)=¬A׬B(或¬(A∨B)=¬A∧¬B)
逻辑非辑与都满足吸收律
重合律
A+A=A(或A∨A=A)
逻辑或满足重合律
互补律
A+Ā=1(或A∨¬A=1)<br>A×Ā=0(或A∧¬A=0)
逻辑非运算的互补律
“非”运算的变号分配律
(A+B)−1=A−1×B−1(或(A∨B)¬=¬A∧¬B)<br>(A×B)−1=A−1+B−1(或(A∧B)¬=¬A∨¬B)
逻辑运算律公式大全
逻辑运算律
公式
备注
交换律
A+B=B+A(或A∨B=B∨A)<br>A×B=B×A(或A∧B=B∧A)
命题逻辑的推理理论,证明方法

31
⑨p
前提引入
⑩ pp
⑧⑨合取
推理正确, q是有效结论
.
武汉大学国际软件学院
唐存琛 刘峰
32
课堂实训
应用实例1 分析下列事实“如果我有很高的收 入,那么我就能资助许多贫困学生;如果我能资 助许多贫困学生,那么我很高兴;但我不高兴, 所以我没有很高的收入。”试指明前提和结论, 并给予证明。
.
武汉大学国际软件学院
.
武汉大学国际软件学院
唐存琛 刘峰
20
归谬法(反证法)的说明
欲证明
前提:A1, A2, … , Ak 结论:B
将B加入前提, 若推出矛盾, 则得证推理正确.
理由: A1A2…AkB (A1A2…Ak)B (A1A2…AkB)
括号内部为矛盾式当且仅当 (A1A2…AkB)为重言式
.
武汉大学国际软件学院
12
一、自然推理系统P的定义(续)
3. 推理规则 (1) 前提引入规则 (2) 结论引入规则 (3) 置换规则 (4) 假言推理规则 (5) 附加规则 (6) 化简规则
(7) 拒取式规则 (8) 假言三段论规则 (9) 析取三段论规则 (10)构造性二难推理
规则 (11) 破坏性二难推理
规则 (12) 合取引入规则
.
武汉大学国际软件学院
唐存琛 刘峰
16
(5)分情况证明法
为了证明 A1 A2 An B , 只需证明对任意的 i (1 i n) ,均有 Ai B 。
(6)附加前提证明法
为了证明 A1 A2 An A B ,
只需证明 A1 A2 An A B
.
武汉大学国际软件学院
武汉大学国际软件学院唐存琛 刘峰
逻辑运算法则

逻辑运算法则逻辑运算一直是人类思维中重要的组成部分,对于逻辑运算法则的研究则进一步拓展了人们对于逻辑思维的认识。
本文将从逻辑运算法则的基本概念出发,深入探讨其在不同情景下的应用,并探讨其对于日常生活和决策制定的重要性。
逻辑运算法则的基本概念逻辑运算法则是指在逻辑思维中使用的一系列规则和原则,旨在确保推理和论证的准确性和有效性。
其基本概念包括三大部分:命题逻辑、联结词和推理规则。
命题逻辑命题逻辑是逻辑运算法则的基础,它涉及命题的真假和逻辑关系的推断。
在命题逻辑中,命题可以是真可以是假,用符号P、Q、R等表示。
通过逻辑运算法则可以对命题之间的关系进行推理和推断,帮助我们更好地理清思路。
联结词联结词是连接命题的逻辑符号,包括“与”、“或”、“非”等。
它们用于表达不同的逻辑关系,帮助我们更准确地描述信息之间的关系。
推理规则推理规则是逻辑运算法则的重要组成部分,包括假言推断、析取三段论、假言三段论等。
通过这些推理规则,我们可以从已知的命题中得出新的结论,进行更深入的推理和论证。
逻辑运算法则在实际生活中的应用逻辑运算法则不仅仅是一种抽象的概念和原则,它还广泛应用于我们的日常生活中。
决策制定在面对日常生活中的选择和决策时,逻辑运算法则可以帮助我们分析各种因素的优劣,做出明智的决策。
通过逻辑运算法则,我们可以更好地评估风险和机会,提高决策的准确性和效率。
辩论和讨论在辩论和讨论中,逻辑运算法则可以帮助我们更好地组织自己的观点,避免逻辑混乱和谬误。
通过合理运用推理规则和联结词,我们可以更有说服力地表达自己的观点,并有效地驳倒对方的论证。
问题解决在解决问题和处理矛盾时,逻辑运算法则可以帮助我们快速定位问题的关键点,并找出解决问题的方法。
通过正确应用逻辑运算法则,我们可以更系统地分析问题,找出最佳解决方案。
总结逻辑运算法则作为人类思维中重要的一部分,对于我们的日常生活和决策制定具有重要意义。
通过深入理解逻辑运算法则的基本概念和应用,我们可以提高自己的逻辑思维能力,更好地应对各种挑战和问题。
逻辑推理公式

直言命题所有的都是上反对必有一假所有的都不是包容矛盾包容有的是必有一真下反对有的不是所有的A是B 上反对必有一假所有的A都不是B 包容矛盾包容有的A是B 必有一真下反对有A的不是B三段论A→BB→CA→B 有的B是CA→C 有的C是B—B →—A 逆否(A→B的矛盾关系A∧—B)A→B 有的A→B有的B→A—A∨BB→C充分假言:前推后(A推B),肯前肯后,否后否前如果A,那么B;只要A,就B 若A,则B所有A,是B 凡是A,是B 为了A,一定B 为了A,必须B A指的就是B 除非不A,否则B必要假言B推A只有A,才B 没有A,就没有B 不A,不B除非A,否则不B A是B的前提,保障,基础,条件/谁是条件谁在后选言命题P、Q √相容性P∨Q —P、Q √P、—Q √选言—P、—Q ×不相容性P∕Q 要么P要么Q不是P就是QP∨Q的矛盾命题—(P∨Q)→—P ∧—QP∨Q= —P →Q—Q →PP∨Q 排中律排除一个选中一个必须先排—A∨B = A→B (鲁宾逊定律)—A∨B的矛盾命题是A∧—B A→B的矛盾命题是A∧—B模态命题必然P 上反对必有一假必然非P 包容矛盾包容可能P 必有一真下反对可能非P模态命题的具体关系“并非必然P”等值于“可能非P”,即:不必然=可能不;“并非必然非P”等值于“可能P”,即:不必然不=可能;“并非可能P”等值于“必然非P”,即:不可能=必然不;“并非可能非P”等值于“必然P”,即:不可能不=必然;模态命题与非模态命题的推出关系必然P→P →可能P ;必然非P →非P→可能非P。
逻辑运算规则

逻辑运算规则
逻辑运算规则是逻辑学中的基本概念之一,它指的是对命题或命题符号进行逻辑运算时所遵循的规则。
逻辑运算规则主要包括以下几种:
1. 否定规则:如果一个命题为真,则它的否定命题为假;反之,如果一个命题为假,则它的否定命题为真。
2. 合取规则:如果两个命题都为真,则它们的合取命题为真;反之,如果其中一个或两个命题为假,则它们的合取命题为假。
3. 析取规则:如果两个命题中至少有一个为真,则它们的析取命题为真;反之,如果两个命题都为假,则它们的析取命题为假。
4. 蕴含规则:如果前提命题为真,且结论命题为假,则它们的蕴含命题为假;反之,如果前提命题为真,且结论命题为真,则它们的蕴含命题为真。
5. 等价规则:如果两个命题的真假性相同,则它们的等价命题为真;反之,如果两个命题的真假性不同,则它们的等价命题为假。
逻辑运算规则是逻辑学中的基础知识,它们对于理解和分析各种命题的真假性以及推理过程中的逻辑关系具有重要意义。
- 1 -。
逻辑运算公式大全

吸收率:A+AB=A;A(A+B;A(!A+B)=AB
以上逻辑运算基本定律中,恒等式大多是成对出现的,且具有对偶性。用完全归纳法可以证明所列等式的正确性,方法是:列出等式的左边函数与右边函数的真值表,如果等式两边的真值表相同,说明等式成立。
逻辑运算的公式有许多实际上只要经过证明的等式都可以在以后的变换和化简时使用
逻辑运算公式大全
逻辑运算公式大全
逻辑运算公式大全
逻辑运算的公式有许多,实际上,只要经过证明的等式都可以在以后的变换和化简时使用。
交换律:A+B=B+A;AB=BA;
结合律:(A+B)+C=A+(B+C);(AB)C=A(BC);
第1章 命题逻辑3
第1章 命题逻辑
定义1.6.3 设p和q是两个命题,复 合命题p↓q称作p和q的或非。定 义为:当且仅当p、q的真值都为 假时,p↓q的真值为真。联结词 “↓”称为或非联结词。
表1.20 p 0 0 q 0 1 p↓ q 1 0
1
1
0
1
0
0
由此定义可得到下面的公式: p↓q¬ (p∨q)
联结词↓还有下面的几个性质: ⑴ p↓p¬ (p∨p) ¬ p ⑵ (p↓q)↓(p↓q) ¬ (p↓q) ¬ ¬ (p∨q)p∨q ⑶ (p↓p)↓(q↓q) ¬ p↓¬q¬ (¬ p∨¬ q)p∧q
第1章 命题逻辑
蕴含式是逻辑推理的重要工具。下面是一些重要的蕴含 式。它们都可以用上述两种方法证明,其中A,B,C,D是 任意的命题公式。 1.附加律 AA∨B, BA∨B 2.化简律 A∧BA, A∧BB 3.假言推理 A∧(A→B)B 4.拒取式 ¬ B∧(A→B)¬ A 5.析取三段论 ¬ A∧(A∨B)B, ¬ B∧(A∨B)A 6.假言三段论 (A→B)∧(B→C)(A→C) 7.等价三段论 (A↔B)∧(B↔C)(A↔C) 8.构造性二难 (A∨C)∧(A→B)∧(C→D)B∨D (A∨¬ A)∧(A→B)∧(¬ A→B)B 9.破坏性二难 (¬ B∨¬ D)∧(A→B)∧(C→D)(¬ A∨¬ C)
第1章 命题逻辑
定义1.6.5 设S是全功能联结词集,如果去掉其中的任何 联结词后,就不是全功能联结词集,则称S是最小全功 能联结词集。 可以证明 ¬,∧ , ¬,∨ , ↑ , ↓ 是最小全 功能联结词集。
第1章 命题逻辑
讨论:n个命题变元可以构成多少个不等价的命题公式? 两个命题变元可以构成多少个不等价的命题公式? 由等价的概念知道,等价的命题公式有相同的真值表,所 以上述问题就转化为两个命题变元构成的命题公式有多少个不 同的真值表? 表1.21 两个命题变元构成的命题公式 p q 公式 的真值表的格式如表1.21所示。 0 0 1或0 真值表中每行公式的真值都 有1,0两种可能,所以命题公式 0 1 1或0 22 的真值有2×2×2×2=24= 2 =16 1 0 1或0 22 种可能,既有 2 个不同的真值表。 22 1 1 1或0 故有 种不等价的公式。 2 8= 23个不等价的命题公式,n个变元可 三个变元可构成 2 2 2n 构成 2 个不等价的命题公式。
逻辑推理公式整理
逻辑推理公式整理逻辑推理是一种基于事实和前提的推导过程,通过推理规则和逻辑公式来得出新的结论。
在逻辑推理中,公式扮演着重要的角色,可以帮助我们理解和描述逻辑关系。
以下是一些常见的逻辑推理公式。
1.求取命题的否定:公式:¬P说明:这个公式表示命题P的否定,即P不成立。
2.条件推理:公式:P→Q说明:这个公式表示如果P成立,则Q也成立。
这是一种常见的逻辑推理形式。
3.充分必要条件:公式:P↔Q说明:这个公式表示P与Q是充分必要条件,即当P成立时Q成立,且当Q成立时P也成立。
4.假言推理:公式:P,Q/P→Q说明:这个公式表示如果同时有P和Q成立,则可以得出P推出Q。
5.排中律:公式:P∨¬P说明:这个公式表示一个命题P或它的否定¬P一定成立。
这是一种基本的逻辑定律。
6.矛盾律:公式:P∧¬P说明:这个公式表示一个命题P与它的否定¬P是矛盾的,不可能同时成立。
7.分配律:公式:P∧(Q∨R)≡(P∧Q)∨(P∧R)说明:这个公式表示逻辑中的分配律,可以帮助我们简化复杂命题的形式。
8.合取范式:公式:(P∨Q)∧(¬P∨Q)∨(P∨¬Q)∧(¬P∨¬Q)说明:这个公式表示合取范式,可以将命题写成一组合取式的多个命题的析取。
9.析取范式:公式:(P∧Q)∨(¬P∧Q)∨(P∧¬Q)∨(¬P∧¬Q)说明:这个公式表示析取范式,可以将命题写成一组析取式的多个命题的合取。
10.假言三段论:公式:P→Q,Q→R/P→R说明:这个公式表示如果P推出Q,且Q推出R,则可以得出P推出R。
这些是一些常见的逻辑推理公式,可以应用于不同的逻辑推理问题中。
逻辑公式的运用能够帮助我们进行准确有效的推理和论证,提高逻辑思维能力。
在实际应用中,还有更多的逻辑推理公式可以用于解决复杂的问题。
德摩根定律
德·摩根定律:在命题逻辑中存在着下面关系:非(P 且 Q)=(非 P)或(非 Q)非(P 或 Q)=(非 P)且(非 Q)2012年的逻辑真题形式逻辑相当多,而不少同学都觉得形式逻辑很难。
其实形式逻辑就是那几个公式。
1)否定词代入的命题等价转化2)p->Q 等价于非Q-》非p ,3)如果p 则q,只要p就q 等价于p->q 等价于非p 或Q只有p,才q 等价于q->p除非p,否则q 等价于非q-》p4)相容选言和不相容选言的区别5)一些隐藏的形式逻辑的标志。
A必须B 等价于只有B 才有A =》A->B B是A的必要条件A是B的基础,A是B的前提,等价于只有有了A 才有B B->A A是必要条件 A当且仅当B,A是B的唯一条件等价于A->B所有的A 是B 等价于A->BMBA逻辑知识点与记忆口诀汇总大秘送注意:逻辑要考察我们对语言文字的体察和敏感度。
逻辑知识点分三大类:一是逻辑推理能力,二是综合归纳能力,三是评价论证能力。
一、逻辑推理能力。
(20分)答案一定不用多看,但是要死记住口诀,全答对没问题。
包括11性质命题、12充分条件、13必要条件假言命题,14联言、15选言、16模态命题,17复合命题 18三段论二、综合归纳能力(10分)21语义解释题2-4分,22争论焦点,23推出结论8-10分。
三、评价论证能力:(30分以上)31假设、32支持、33削弱、34评价论证分析,35指出论证缺陷、论证方法。
11、性质命题:方图记住。
Especially:下反对关系中,可能同真,不可同假,一个为真,另一个真假不能确定,一个为假,另一个一定为真。
原命题等价于逆否命题。
同理可得,否命题等价于逆命题。
负命题就是矛盾命题。
排中律、同一律和矛盾律。
同一律是形式逻辑的基本规律之一,就是在同一思维过程中,必须在同一意义上使用概念和判断,不能混淆不相同的概念和判断.公式是:”甲是甲”或”甲等于甲”包括三方面的内容:(1)思维对象的同一。
逻辑学知识点及公式
逻辑学知识点及公式逻辑学是一门研究思维形式、思维规律和思维方法的科学。
它对于我们正确地思考、表达和论证具有重要的意义。
下面为您介绍一些常见的逻辑学知识点及公式。
一、命题逻辑1、命题命题是具有真假值的陈述句。
例如,“今天是晴天”“2 + 3 =5”等。
2、逻辑连接词(1)“且”(用“∧”表示):两个命题都为真时,其组合命题才为真。
例如:命题 P:今天是晴天;命题 Q:我心情很好。
P∧Q 只有在今天是晴天并且我心情很好时才为真。
(2)“或”(用“∨”表示):两个命题中至少有一个为真时,其组合命题为真。
例如:命题 P:我吃苹果;命题 Q:我吃香蕉。
P∨Q 在我吃苹果或者我吃香蕉或者两者都有时为真。
(3)“非”(用“¬”表示):对原命题的否定。
例如:命题 P:今天下雨。
¬P 则表示今天不下雨。
3、命题公式的真值表通过列出命题中变量的所有可能取值,并计算出整个命题公式的真假值,可以得到真值表。
4、等价式(1)双重否定律:¬¬P = P(2)交换律:P∧Q = Q∧P,P∨Q = Q∨P(3)结合律:(P∧Q)∧R = P∧(Q∧R),(P∨Q)∨R = P∨(Q∨R)5、蕴含式如果 P 则 Q,记作P → Q。
只有当 P 为真且 Q 为假时,P → Q 为假。
二、谓词逻辑1、个体、谓词和量词个体是指可以独立存在的事物,谓词是描述个体性质或关系的词语,量词包括全称量词(“所有”,用“∀”表示)和存在量词(“存在”,用“∃”表示)。
2、公式例如,∀x (P(x) → Q(x))表示对于所有的 x,若 P(x) 成立则 Q(x) 成立。
三、推理规则1、假言推理如果P → Q 为真,且 P 为真,那么可以推出 Q 为真。
2、选言推理(1)否定肯定式:P∨Q,¬P ,则 Q。
(2)肯定否定式:P∨Q,P ,则¬Q (这种情况在不相容选言中成立)3、三段论推理例如:所有的人都会思考,张三是人,所以张三会思考。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题号:第一题题目:电梯模拟1,需求分析:计算命题演算公式的真值所谓命题演算公式是指由逻辑变量(其值为TRUE或FALSE)和逻辑运算符∧(AND)、∨(OR)和┐(NOT)按一定规则所组成的公式(蕴含之类的运算可以用∧、∨和┐来表示)。
公式运算的先后顺序为┐、∧、∨,而括号()可以改变优先次序。
已知一个命题演算公式及各变量的值,要求设计一个程序来计算公式的真值。
要求:(1)利用二叉树来计算公式的真值。
首先利用堆栈将中缀形式的公式变为后缀形式;然后根据后缀形式,从叶结点开始构造相应的二叉树;最后按后序遍历该树,求各子树之值,即每到达一个结点,其子树之值已经计算出来,当到达根结点时,求得的值就是公式之真值。
(2)逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。
(3)根据用户的要求显示表达式的真值表。
2,设计:2.1 设计思想:<1>,数据结构设计:(1) 线性堆栈1的数据结构定义typedef struct{DataType stack [MaxStackSize];int top; /* 当前栈的表长*/} SeqStack;用线性堆栈主要是用来存储输入的字符,它的作用就是将中缀表达式变成后缀表达式。
(2) 线性堆栈2的数据结构定义typedef struct{BiTreeNode *stack [MaxStackSize];int top; /* 当前栈的表长*/} TreeStack;这个堆栈和上面的堆栈的唯一不同就是它们存储的数据的类型不同,此堆栈存储的是树节点,它的作用是将后缀表达式构成一棵二叉树。
(3)树节点数据结构定义typedef struct Node{DataType data;struct Node *leftChild;struct Node *rightChild;}BiTreeNode;<2>算法设计详细思路如下:首先实现将中缀表达式变成后缀表达式:在将中缀表达式变成后缀表达式的时候会用到堆栈,因此首先需要初始化一个堆栈。
又由于逻辑变元可能是字符也可能是字符串,所以它又不同于将单字符的逻辑变元的中缀表达式变成后缀表达式。
我的设计是这样的,我将中缀表达式变成后缀表达式的过程分成了两部:化简(将一维的复杂的中缀表达式变成一维的简单的中缀表达式,并将字符串逻辑变元存放在二维数组中),转化(将化简后的中缀表达式变成后缀表达式)。
(1)化简:先用一个字符数组存放输入的中缀表达式(表达式以‘#’号结束),然后将一维的中缀表达式中的字符串逻辑变元用一个字符进行标识,这样我们就可以将原来复杂的中缀表达式变成熟悉而又简单的中缀表达式,同时用二维数组存放那些字符串逻辑变元。
实现的过程就是首先扫描一维中缀表达式,如果遇到逻辑符号,那么记住这个逻辑符号在数组中的相对位置用一个变量存放,然后继续扫描中缀表达式直到再次遇到逻辑符号,再一次记住它在中缀表达式中的相对位置,这两个逻辑符号之间的部分就是一个完整的逻辑变元,将这个字符串逻辑变元用一个字符代替并将这个字符串逻辑变元保存在二维数组中。
这个过程的实现我把它放在change()函数中。
(2)转化:在实现该功能时,首先需要定义各符号的优先级,即:'(' 和')' 的优先级最高;'!'(逻辑非号)的优先级次之;'&'(逻辑与号)的优先级又低一级,'|'(逻辑或号)的优先级跟低;'#' (他不是逻辑符号,只是为了方便使用堆栈而设置)的优先级最低,接着将'#'压入堆栈。
在这之后就是正式的转化了,其过程为:当读到的是逻辑变元时直接输出,并保存到保存后缀表达式的数组中,当读到的单词为运算符时,令x1为当前栈顶运算符的变量,x2为当前扫描到的简单中缀表达式的运算符的变量,把当前读入的单词赋予变量x2,然后比较x1和x2的优先级。
若x1的优先级高于x2的优先级,将x1退栈作为后缀表达式的一个单词输出,然后接着比较新的栈顶运算符x1的优先级与x2的优先级;若x1的优先级低于x2的优先级,将x2的值进栈,然后接着读下一个单词;若x1的优先级等于x2的优先级且x1为“(”,x2为“)”,将x1退栈,然后接着读下一个单词;若x1的优先级等于x2的优先级且x1为“#”,x2为“#”,算法结束。
这个过程我把它放在InToPost()函数中。
然后用后缀表达式构造出二叉树:在这个过程中,我用到了之前所定义的存放树的堆栈。
具体实现为:扫描后缀表达式,如果遇到逻辑变元然后将这个变元变成一个树节点,它的实现就是将该逻辑变元赋给树的data域,然后将它的左右子树赋为NULL,然后将这个树节点压入相应的堆栈;接着继续扫描,如果遇到的是单目运算符(非号“!”)也将它构造成一个树节点然后从堆栈里面弹出一个树形节点,将弹出的元素的作为它的左子树,右子树设置为NULL,然后将这个树节点压入相应的堆栈;如果扫描到的是双目运算符(与号“&”或者或号“|”)将它也构造成一棵树,然后将这个树节点压入相应的堆栈,然后从栈中弹出两个元素,一个作为它的左子树,一个作为它的右子树,如此重复n(n为后缀表达式的长度)次。
这个过程我把它放在Maketree()函数中。
最后打印真值表:打印真值表也用到了前面的简单的后缀表达式,其实现的基本思想为和构造二叉树差不多,它实现了每到一个根节点就计算一个运算的值。
在打印之前需要统计字符的个数,有m个字符则要打印2^m行,因为他有这么多情况。
具体实现为:用一个字符型的数组来存放每个元素的一次取值,然后扫描后缀表达式,如果遇到逻辑变元就通过这个标识将相应的取值赋给它,然后它压入堆栈;接着继续扫描,如果遇到的是单目运算符(非号“!”)则从堆栈里面弹出一个元素,并对它进行非运算,然后又将这个运算后的值压入堆栈;如果扫描到的是双目运算符(与号“&”或者或号“|”)则从栈中弹出两个元素,并对这两个元素进行相应的运算,然后将这个运算后的值压入堆栈,如此重复n(n为后缀表达式的长度)次。
这个过程我把它放在Print()函数中。
其中第一,二过程的流程图描述分别为:No2.2设计表示:<1>, 函数调用关系及函数说明:change()函数原型为:void change(char prefixStr1[],char prefixStr[],int length[],char store[][10],int* row,int* k )该函数含有有六个参数,其中prefixStr1[]为用户输入的中缀表达式,prefixStr[]为即将转化成为的简单中缀表达式,length[]为二维数组中存放的各个字符串的的长度store[][10]用来存放中缀表达式中的逻辑变元,row就是逻辑变元的个数,k简化后的中缀表达式的长度。
该函数的功能就是将复杂的中缀表达式变成简单的中缀表达式。
InToPost()函数原型为:void InT oPost(char prefixStr[],char postfixStr[],SeqStack* myStack,int* n,int k)该函数函数有五个参数prefixStr[]为中缀表达式,postfixStr[]为简化后的后缀表达式,myStack为在转化过程中用到的堆栈,n为后缀表达式的字符长度,k为中缀表达式的字符长度。
该函数的功能就是将简单的中缀表达式变成简单的后缀表达式。
Maketree()函数原型为:void Maketree(BiTreeNode *root,TreeStack* myTree,char postfixStr[],int n)该函数共有四个参数,其中root为所建立的树的根节点,myTree是在构造树时所用到的堆栈,另外两个参数和前面的同名参数具有相同意义。
这个函数的功能就是将简单的中缀表达式变成简单的后缀表达式。
Precede()函数原型为:DataType Precede(DataType x1,DataType x2)该函数有两个参数,返回值类型为DataType型,其中x1和x2就是要进行优先级比较的两个两个字符。
x1为栈顶元素,x2为扫描到的元素。
该函数的功能就是比较x1和x2的优先级并将比较结果返回给调用函数。
Print()函数原型为:void Print(char postfixStr[],char store[][10],int length[],int row,int n,SeqStack* myStack)该函数有六个参数,其中myStack是在输出真值表过程中要用到的堆栈,其余的参数和前面介绍的函数中的同名参数具有相同的意义。
该函数的功能就是打印真值表。
<2> 函数接口说明:函数的调用关系在上面的图中已经显示出来了,整个程序就是由一些子函数的集合,他们之间按所要实现的功能不同而调用不同的函数。
在这些函数中除主函数外,其它函数的级别相同。
2.3详细设计:(1),定义所需要的结构体,前面已经介绍了;(2),我将中缀表达式变成后缀表达式的过程分成了两部:化简(将一维的复杂的中缀表达式变成一维的简单的中缀表达式,并将字符串逻辑变元存放在二维数组中),转化(将化简后的中缀表达式变成后缀表达式)。
其中化简部分将要用伪代码描述为while(prefixStr1[m]!='#'){扫描中缀表达式while(prefixStr1[m]不为运算'符){继续扫描,直到扫描到运算符;}扫描到运算符后{构造简化的中缀表达式;得到这个字符串的长度;将这个字符串存放在store[][10]中;}}转化部分用伪代码描述为:循环扫描中缀表达式{if(扫描到逻辑变元)保存到后缀表达式中;else{StackTop(myStack,&x);res=Precede(x,扫描到的运算符);if(res=='>') x退栈;if(res=='<') 扫描到的运算符进栈;if(res=='=' && x=='(') 退栈if(res=='=' && x=='#') 结束;}}(3),构造二叉树,其思想就是将逻辑变元作为叶子节点,运算符作为根节点,用堆栈实现,用伪代码简单描述为:循环扫描后缀表达式{if(扫描到逻辑变元')讲逻辑变元进栈;else{if('扫描到双目运算符){StackPop1(myTree,&x1);StackPop1(myTree,&x2);将x1,x2作为它的左右子树;StackPush1(myTree,p);}else{StackPop1(myTree,&x1);将x1作为它的左子树,又子树为空;StackPush1(myTree,p);}}StackPop1(myTree,&x1);root->leftChild=x1;}(4),打印二叉树,其基本思想就是每到一个根节点就计算一个值,如此重复,直到总根节点,用伪代码简单描述为:循环赋值{if(扫描到逻辑变元'){赋值进栈;}else{if(扫描到双目运算符){从栈中弹出两数对两数进行相应的运算;将运算结构进栈;;}else{从栈中弹出两数;对两数进行非运算;将运算结构进栈;}每循环一次输出一个结构;}3,调试分析:<1>,调试过程中遇到的问题与解决方案:这个题我个人觉的是这几个中最麻烦的一个,因为它有几个难点去分析与实现:首先就是中缀表达式中的逻辑变元不是单个字符而是一些字符串,这样在将中缀表达式转化成后缀表达式的时候就会比较麻烦,起初我也不太清楚该怎么处理他,后来经过一番分析与调试后,我觉得用二维数组存放比较好,那样实现起来就会比较简单,当然虽然这么说,其实实现起来也还是有一定的困难的,比如怎样去找到一个完整的字符串逻辑变元,找到之后又怎样存放等等。