逻辑命题公式计算
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
存放在二维数组中),转化(将化简后的中缀表达式变成后缀表达式)。
( 1)化简: 先用一个字符数组存放输入的中缀表达式(表达式以‘#'号结束),然后
将一维的中缀表达式中的字符串逻辑变元用一个字符进行标识, 这样我们就可以将原来复杂 的中缀表达式变成熟悉而又简单的中缀表达式,同时用二维数组存放那些字符串逻辑变元。 实现的过程就是首先扫描一维中缀表达式, 如果遇到逻辑符号, 那么记住这个逻辑符号在数 组中的相对位置用一个变量存放, 然后继续扫描中缀表达式直到再次遇到逻辑符号, 记住它在中缀表达式中的相对位置,这两个逻辑符号之间的部分就是一个完整的逻辑变元, 将这个字符串逻辑变元用一个字符代替并将这个பைடு நூலகம்符串逻辑变元保存在二维数组中。 程的实现我把它放在change()函数中。
要求:
(1)利用二叉树来计算公式的真值。首先利用堆栈将中缀形式的公式变为后缀形式; 然后根据后缀形式, 从叶结点开始构造相应的二叉树; 最后按后序遍历该树, 求各子树之值, 即每到达一个结点, 其子树之值已经计算出来, 当到达根结点时, 求得的值就是公式之真值。
(2)逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。
描,如果遇到的是单目运算符(非号“!”)也将它构造成一个树节点然后从堆栈里面弹出 一个树形节点,将弹出的元素的作为它的左子树,右子树设置为NULL然后将这个树节点
压入相应的堆栈;如果扫描到的是双目运算符(与号“&”或者或号“ | ”)将它也构造成一
棵树,然后将这个树节点压入相应的堆栈, 然后从栈中弹出两个元素, 一个作为它的左子树, 一个作为它的右子树,如此重复n(n为后缀表达式的长度)次。这个过程我把它放在
(3)树节点数据结构定义typedef struct Node{
DataType data;
struct Node *leftChild; struct Node *rightChild; }BiTreeNode;
<2>算法设计详细思路如下:首先实现将中缀表达式变成后缀表达式:在将中缀表达式变成后缀表达式的时候会用到堆栈,因此首先需要初始化一个堆栈。又由于逻辑变元可能是字符也可能是字符串, 所以它又不同于将单字符的逻辑变元的中缀表 达式变成后缀表达式。 我的设计是这样的, 我将中缀表达式变成后缀表达式的过程分成了两 部:化简 (将一维的复杂的中缀表达式变成一维的简单的中缀表达式,并将字符串逻辑变元
到的是双目运算符(与号“ &”或者或号“ I ”)则从栈中弹出两个元素,并对这两个元素进 行相应的运算,然后将这个运算后的值压入堆栈, 这个过程我把它放在Prin t()函数中。
其中第一,二过程的流程图描述分别为:
(3)根据用户的要求显示表达式的真值表。
2
<1>,数据结构设计 :
(1)线性堆栈1的数据结构定义typedef struct
{
DataType stack [MaxStackSize];
int top;/*当前栈的表长*/
}SeqStack;
用线性堆栈主要是用来存储输入的字符, 它的作用就是将中缀表达式变成后缀 表达式。
(2) 线性堆栈 2 的数据结构定义
typedef struct
{
BiTreeNode *stack [MaxStackSize];
int top;/* 当前栈的表长 */
}TreeStack;这个堆栈和上面的堆栈的唯一不同就是它们存储的数据的类型不同, 储的是树节点,它的作用是将后缀表达式构成一棵二叉树。
再一次
这个过
'#'
'('
')'
'|'
的优先
(逻辑
MaketreeO函数中。
最后打印真值表:
打印真值表也用到了前面的简单的后缀表达式,其实现的基本思想为和构造二叉树差 不多,它实现了每到一个根节点就计算一个运算的值。在打印之前需要统计字符的个数,有
m个字符则要打印2^m行,因为他有这么多情况。具体实现为:用一个字符型的数组来存放 每个元素的一次取值, 然后扫描后缀表达式, 如果遇到逻辑变元就通过这个标识将相应的取 值赋给它,然后它压入堆栈;接着继续扫描,如果遇到的是单目运算符(非号“!”)则从 堆栈里面弹出一个元素,并对它进行非运算,然后又将这个运算后的值压入堆栈;如果扫描
题号:第一题
题目:电梯模拟
1
计算命题演算公式的真值
所谓命题演算公式是指由逻辑变量(其值为TRUE或FALSE和逻辑运算符A(AND、
V(OR和「(NOT按一定规则所组成的公式 (蕴含之类的运算可以用A、V和「来表示)。
公式运算的先后顺序为「、A、V,而括号()可以改变优先次序。已知一个命题演算公式 及各变量的值,要求设计一个程序来计算公式的真值。
若x1的优先级低于x2的优先级,将x2的值进栈,然后接着读下一个单词;若x1的优先级
等于x2的优先级且x1为“(”,x2为“)”,将x1退栈,然后接着读下一个单词;若x1的优先级等于x2的优先级且x1为“ #”,x2为“#”,算法结束。这个过程我把它放在InToPost()函数中。
然后用后缀表达式构造出二叉树: 在这个过程中,我用到了之前所定义的存放树的堆栈。具体实现为:扫描后缀表达式, 如果遇到逻辑变元然后将这个变元变成一个树节点,它的实现就是将该逻辑变元赋给树的data域,然后将它的左右子树赋为NULL然后将这个树节点压入相应的堆栈;接着继续扫
(2)转化: 在实现该功能时,首先需要定义各符号的优先级,即:'(' 和
级最高; '!' (逻辑非号)的优先级次之; '&' (逻辑与号)的优先级又低一级, 或号)的优先级跟低; '#' (他不是逻辑符号,只是为了方便使用堆栈而设置)的优先级最 低,接着将 '#' 压入堆栈。在这之后就是正式的转化了, 其过程为:当读到的是逻辑变元时 直接输出,并保存到保存后缀表达式的数组中,当读到的单词为运算符时,令x1为当前栈 顶运算符的变量,x2为当前扫描到的简单中缀表达式的运算符的变量,把当前读入的单词 赋予变量x2,然后比较x1和x2的优先级。若x1的优先级高于x2的优先级,将x1退栈作 为后缀表达式的一个单词输出,然后接着比较新的栈顶运算符x1的优先级与x2的优先级;
( 1)化简: 先用一个字符数组存放输入的中缀表达式(表达式以‘#'号结束),然后
将一维的中缀表达式中的字符串逻辑变元用一个字符进行标识, 这样我们就可以将原来复杂 的中缀表达式变成熟悉而又简单的中缀表达式,同时用二维数组存放那些字符串逻辑变元。 实现的过程就是首先扫描一维中缀表达式, 如果遇到逻辑符号, 那么记住这个逻辑符号在数 组中的相对位置用一个变量存放, 然后继续扫描中缀表达式直到再次遇到逻辑符号, 记住它在中缀表达式中的相对位置,这两个逻辑符号之间的部分就是一个完整的逻辑变元, 将这个字符串逻辑变元用一个字符代替并将这个பைடு நூலகம்符串逻辑变元保存在二维数组中。 程的实现我把它放在change()函数中。
要求:
(1)利用二叉树来计算公式的真值。首先利用堆栈将中缀形式的公式变为后缀形式; 然后根据后缀形式, 从叶结点开始构造相应的二叉树; 最后按后序遍历该树, 求各子树之值, 即每到达一个结点, 其子树之值已经计算出来, 当到达根结点时, 求得的值就是公式之真值。
(2)逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。
描,如果遇到的是单目运算符(非号“!”)也将它构造成一个树节点然后从堆栈里面弹出 一个树形节点,将弹出的元素的作为它的左子树,右子树设置为NULL然后将这个树节点
压入相应的堆栈;如果扫描到的是双目运算符(与号“&”或者或号“ | ”)将它也构造成一
棵树,然后将这个树节点压入相应的堆栈, 然后从栈中弹出两个元素, 一个作为它的左子树, 一个作为它的右子树,如此重复n(n为后缀表达式的长度)次。这个过程我把它放在
(3)树节点数据结构定义typedef struct Node{
DataType data;
struct Node *leftChild; struct Node *rightChild; }BiTreeNode;
<2>算法设计详细思路如下:首先实现将中缀表达式变成后缀表达式:在将中缀表达式变成后缀表达式的时候会用到堆栈,因此首先需要初始化一个堆栈。又由于逻辑变元可能是字符也可能是字符串, 所以它又不同于将单字符的逻辑变元的中缀表 达式变成后缀表达式。 我的设计是这样的, 我将中缀表达式变成后缀表达式的过程分成了两 部:化简 (将一维的复杂的中缀表达式变成一维的简单的中缀表达式,并将字符串逻辑变元
到的是双目运算符(与号“ &”或者或号“ I ”)则从栈中弹出两个元素,并对这两个元素进 行相应的运算,然后将这个运算后的值压入堆栈, 这个过程我把它放在Prin t()函数中。
其中第一,二过程的流程图描述分别为:
(3)根据用户的要求显示表达式的真值表。
2
<1>,数据结构设计 :
(1)线性堆栈1的数据结构定义typedef struct
{
DataType stack [MaxStackSize];
int top;/*当前栈的表长*/
}SeqStack;
用线性堆栈主要是用来存储输入的字符, 它的作用就是将中缀表达式变成后缀 表达式。
(2) 线性堆栈 2 的数据结构定义
typedef struct
{
BiTreeNode *stack [MaxStackSize];
int top;/* 当前栈的表长 */
}TreeStack;这个堆栈和上面的堆栈的唯一不同就是它们存储的数据的类型不同, 储的是树节点,它的作用是将后缀表达式构成一棵二叉树。
再一次
这个过
'#'
'('
')'
'|'
的优先
(逻辑
MaketreeO函数中。
最后打印真值表:
打印真值表也用到了前面的简单的后缀表达式,其实现的基本思想为和构造二叉树差 不多,它实现了每到一个根节点就计算一个运算的值。在打印之前需要统计字符的个数,有
m个字符则要打印2^m行,因为他有这么多情况。具体实现为:用一个字符型的数组来存放 每个元素的一次取值, 然后扫描后缀表达式, 如果遇到逻辑变元就通过这个标识将相应的取 值赋给它,然后它压入堆栈;接着继续扫描,如果遇到的是单目运算符(非号“!”)则从 堆栈里面弹出一个元素,并对它进行非运算,然后又将这个运算后的值压入堆栈;如果扫描
题号:第一题
题目:电梯模拟
1
计算命题演算公式的真值
所谓命题演算公式是指由逻辑变量(其值为TRUE或FALSE和逻辑运算符A(AND、
V(OR和「(NOT按一定规则所组成的公式 (蕴含之类的运算可以用A、V和「来表示)。
公式运算的先后顺序为「、A、V,而括号()可以改变优先次序。已知一个命题演算公式 及各变量的值,要求设计一个程序来计算公式的真值。
若x1的优先级低于x2的优先级,将x2的值进栈,然后接着读下一个单词;若x1的优先级
等于x2的优先级且x1为“(”,x2为“)”,将x1退栈,然后接着读下一个单词;若x1的优先级等于x2的优先级且x1为“ #”,x2为“#”,算法结束。这个过程我把它放在InToPost()函数中。
然后用后缀表达式构造出二叉树: 在这个过程中,我用到了之前所定义的存放树的堆栈。具体实现为:扫描后缀表达式, 如果遇到逻辑变元然后将这个变元变成一个树节点,它的实现就是将该逻辑变元赋给树的data域,然后将它的左右子树赋为NULL然后将这个树节点压入相应的堆栈;接着继续扫
(2)转化: 在实现该功能时,首先需要定义各符号的优先级,即:'(' 和
级最高; '!' (逻辑非号)的优先级次之; '&' (逻辑与号)的优先级又低一级, 或号)的优先级跟低; '#' (他不是逻辑符号,只是为了方便使用堆栈而设置)的优先级最 低,接着将 '#' 压入堆栈。在这之后就是正式的转化了, 其过程为:当读到的是逻辑变元时 直接输出,并保存到保存后缀表达式的数组中,当读到的单词为运算符时,令x1为当前栈 顶运算符的变量,x2为当前扫描到的简单中缀表达式的运算符的变量,把当前读入的单词 赋予变量x2,然后比较x1和x2的优先级。若x1的优先级高于x2的优先级,将x1退栈作 为后缀表达式的一个单词输出,然后接着比较新的栈顶运算符x1的优先级与x2的优先级;