逻辑函数真值表生成程序
离散数学实验——求真值表.docx
一实验目的 (1)二实验内容 (1)三实验环境 (1)四实验原理和实现过程(算法描述) (1)五实验数据及结果分析; (3)六源程序清单; (5)七其他收获和体会。
(14)一实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二实验内容1.从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2.求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三实验环境C或C++语言编程环境实现。
四实验原理和实现过程(算法描述)A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。
最后提示按#键退出, 否则继续循环求真值。
B:主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi ()每次调用zzhi ()时都使数组zhi □中的真值加1, (利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi ()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhiO将真值指派的数组加1, 最后外围利用while 语句循环输出每个不同的真值指派和该指派下表达式的值。
将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2 个栈,一个作为临时存储运算符的栈fu[], —个作为输入逆波兰式的栈nibol:],从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是字母,则该字母直接送入nibol[]栈。
同时为了找出所有变量,将该变量名与数组bianl[]中已有的元素比较, 如果bianl □中还没有该字母,则该字母是新出现的变量,将其录入数组bianl []中。
真值表的C++算法实现
08届课程(设计)论文题目命题公式的真值表算法专业班级信息与计算科学(1)班学号**********学生姓名上官业云指导教师李圆媛指导教师职称讲师学院名称理学院完成日期:2010 年09月27日武汉工程大学本科课程设计(论文)目录目录 (I)摘要 ......................................................... I I 前言 ........................................................ I II 第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)下,给出了问题的具体解决方案。
关键词:命题公式;真值表;类;运算符重载;递归;字符串武汉工程大学本科课程设计(论文)前言本文解决了计算任意含)n 个命题变元的命题公式的真值表的C++算(Nn法。
全文共3章。
第1章介绍了问题背景、问题以及性质问题的意义。
在本章中,还给出了具体的实验数据和我们查阅并借用的一些参考文献的主要内容。
第2章主要介绍了在对问题的分析后设计的算法,并编写程序,求出其具体调度方案。
第3章是本次课程设计的总结。
全文的最后是致谢、参考文献和程序的源代码。
上官业云武汉工程大学理学院武汉工程大学本科课程设计(论文)第1章 课题背景1.1背景设F 为含有命题变元n P P P ,,,21⋅⋅⋅的命题公式,给n P P P ,,,21⋅⋅⋅一组确定的取值,称为公式F 关于n P P P ,,,21⋅⋅⋅的一组真值指派。
布尔代数真值表
布尔代数真值表一、引言在数字电路设计和计算机编程中,布尔代数是一个至关重要的数学工具。
而布尔代数的真值表(Truth Table)则是该理论的重要体现之一,通过它将逻辑运算和关系以表格的形式呈现出来,使复杂的逻辑问题变得清晰易懂。
本篇文章将向读者介绍布尔代数真值表的基本概念、应用场景,以及如何构建和使用这样的表格。
二、布尔代数真值表的基础知识1. 定义:布尔代数真值表是用来表示逻辑函数所有可能输入组合下的输出结果的一种表格。
每个单元格代表一个特定的输入组合对应的输出结果。
2. 基本形式:标准的布尔代数真值表通常采用2x2矩阵的形式,其中每一行代表一种可能的输入状态,列则代表相应的输出状态。
3. 应用范围:布尔代数真值表适用于任何需要处理二元逻辑问题的场合,如硬件设计、软件调试、算法优化等。
三、布尔代数真值表的构建方法1. 根据所需表达的逻辑函数,确定函数的输入和输出变量;2. 将输入变量按照一定的顺序排列成矩阵;3. 对于每一个可能的输入组合,计算并记录对应的输出结果;4. 最后形成完整的布尔代数真值表。
四、布尔代数真值表的应用案例假设我们需要设计一个简单的电子门禁系统,需要考虑刷卡人和门的状态(开或关)。
我们可以使用布尔代数真值表来分析和实现这个系统的逻辑功能。
首先,我们将刷卡人状态设为A,门的状态设为B,打开门的条件设置为C=AB。
然后根据不同的刷卡人和门状态,可以列出所有的输入组合并在真值表中记录对应的输出结果。
这样就可以清楚地看到只有在刷卡人和门都满足特定条件时,门才会被打开。
五、其他注意事项1. 布尔代数真值表只是一种表示逻辑函数的方法,并不代表实际的电路设计或程序实现。
在实际应用中,还需要考虑硬件的实现成本、性能等因素。
2. 对于复杂的逻辑问题,可能需要使用更高级的算法和工具来分析和优化结果。
因此,对于一些特殊情况,可能需要根据具体情况选择合适的方法和技术。
3. 在构建和使用布尔代数真值表时,需要注意输入变量的取值范围和精度要求,以确保结果的准确性和可靠性。
根据真值表写程序
编写程序时,可以使用真值表来描述逻辑关系,并使用适当的编程语言来实现这些逻辑关系。
以下是一个简单的示例,演示如何使用真值表编写程序:
假设有两个输入信号A和B,以及一个输出信号Y,它们之间的逻辑关系可以用真值表表示如下:
A B Y
000
011
101
110
根据这个真值表,可以使用编程语言(如Python)编写程序,实现逻辑关系:
python复制代码
# 定义输入和输出变量
A, B, Y = [input() for _ in range(3)]
# 根据真值表实现逻辑关系
if A == 0and B == 0:
Y = 0
elif A == 0and B == 1:
Y = 1
elif A == 1and B == 0:
Y = 1
elif A == 1and B == 1:
Y = 0
这个程序接受输入信号A和B,根据真值表计算输出信号Y,并将其输出。
注意,这个程序只是一个简单的示例,实际的逻辑关系可能更加复杂,需要使用更复杂的逻辑表达式或算法来实现。
(完整版)构造任意合式公式的真值表
构造任意合式公式的真值表#include "stdio.h"#include"thesis.h"int main(){Thesis a[30];char x='1';int i=0,N;cout<<"请输入命题变元(不超过30个)(输入'0'结束输入):"<<endl;while(int(x)!=48){cin>>x;if(i>19){cout<<"Error:变元个数太多!"<<endl;break;}if(x!='0'){a[i].inname(x);i++;}}N=i;int M;M=N;string A;cout<<"请输入命题公式( 否定:!,合取:&,析取:| )"<<endl;cin>>A;cout<<A<<"的真值表为:"<<endl;for(int j=0;j<M;j++)cout<<char(a[j].getvalue())<<" ";cout<<"真值"<<endl;assignment(A,N,M,&a[0]);system("pause");return 0;}#include"thesis.h"#ifndef THESIS_H#define THESIS_H#include<string>#include<stdlib.h>#include<iostream>using namespace std;class Thesis //命题类{int value;char name; //value:命题的真值(0/1) name:命题名public:Thesis(){value=2;name='A';};friend Thesis operator !(Thesis &q){q.invalue(1-q.getvalue()); return q;} //重载逻辑运算符friend Thesis operator &(Thesis &p,Thesis &q){p.invalue((p.getvalue()+q.getvalue())/2);return p;}friend Thesis operator |(Thesis &p,Thesis &q){if(p.getvalue()+q.getvalue()>0)p.invalue(1);else p.invalue(0);return p;}friend Thesis operator >(Thesis &p,Thesis &q){if(p.getvalue()==1&&q.getvalue()==0)p.invalue(0);else p.invalue(1);return p;}friend Thesis operator <(Thesis &p,Thesis &q) {if(p.getvalue()==q.getvalue())p.invalue(1);else p.invalue(0);return p;}void invalue(int x){value=x;} //输入valuevoid inname(char x){name=x;} //输入nameint getvalue(){return value;} //获取真值int getname(){return name;} //获取命题名};void assignment(string A,int N,int M,Thesis a[]); //声明函数int bds(string A,int N,Thesis a[]);int run(string A,int &i,int L,int N,Thesis a[]);void assignment(string A,int N,int M,Thesis a[])//命题赋值并计算真值{for(int j=0;j<2;j++){a[N-1].invalue(j);if(N>1){assignment(A,N-1,M,&a[0]);}else{for(int i=0;i<M;i++){cout<<a[i].getvalue()<<" ";}cout<<bds(A,M,&a[0])<<endl;}}}int bds(string A,int N,Thesis a[]) //识别输入的表达式并计算真值{Thesis answer,Temp;char d[5]={'!','|','&','>','<'}; //定义运算符号集合int L;int i=0;L=strlen(&A[0]); //表达式长度while(i<L){if(A[i]=='('){int k=1;for(int j=i+2;j<L;j++){if(k!=0){if(A[j]=='(')k++;if(A[j]==')')k--;}if(k==0){int l=j-i-1;char *p=new char[l+1];string B;for(int m=0;m<l;m++)p[m]=A[i+1+m];p[l]='\0';B=p;delete p;Temp.invalue(bds(B,N,&a[0]));if(i==0)answer.invalue(Temp.getvalue());i=j+1;break;}}}else{if(A[i]=='!') //否定的计算{Temp.invalue(run(A,i,L,N,&a[0]));answer=!Temp;i++;continue;}else if(A[i]=='|'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer|Temp;i++;continue;}else if(A[i]=='&'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer&Temp;i++;continue;}else if(A[i]=='<'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer<Temp;i++;continue;}else if(A[i]=='>'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer>Temp;i++;continue;}else{for(int j=0;j<N;j++){if(A[i]==char(a[j].getname())){Temp.invalue(a[j].getvalue());if(i==0)answer.invalue(Temp.getvalue());i++;break;}}}}}return answer.getvalue();}int run(string A,int &i,int L,int N,Thesis a[]) {Thesis Temp;if(A[i+1]=='('){int k=1;for(int j=i+2;j<L;j++){if(k!=0){if(A[j]=='(')k++;if(A[j]==')')k--;}if(k==0){int l=j-i-1;char *p=new char[l+1];string B;for(int m=0;m<l-1;m++)p[m]=A[i+2+m];p[l-1]='\0';B=p;delete p;Temp.invalue(bds(B,N,&a[0]));i=i+j;break;}}}else{int j=0;while(j<L){if(A[i+1]==char(a[j].getname())){i++;Temp=a[j];break;}j++;}}return Temp.getvalue(); }#endif。
逻辑函数真值表生成程序
逻辑函数真值表生成程序(一)实验任务:设计一个能生成具有13个输入逻辑变量的逻辑函数真值表生成程序。
功能要求:规定函数文本的书写方式,将逻辑函数写入文本文件中(如logic_funs.txt);2,程序从包含有逻辑函数表达式的文本文件(如logic_funs.txt)中读入变量个数和函数3,函数运算优先顺序的识别与函数运算转换4,得到函数输出结果5,将真值表存入文本文件(如truth_table.txt)中。
6,逻辑函数表达式的文本文件及真值表文本文件的文件名应能独立输入。
扩展设计:将原要求实现的过程扩展为具有8个函数处理能力的程序。
(二)实验方法:(三)功能实现:1. 函数文本的书写方式:函数值+函数体,注意函数以分号结束,如:F=(A+B'+C*D*E*(F*G+H+I))*X+Y*W*Z*(A+B+C*H*F);2.采用文件流形式从文本文件读入函数表达式,并将真值表写入文本文件中,文件地址既可采用当前目录的默认地址,也可采用自定义的路径。
3. 函数运算优先顺序的识别与函数运算转换通过两个顺序栈(sk1存储运算符,sk2存储操作数)来实现。
算法描述:从左到右扫表达式,如读入的是操作数,则压入操作数栈sk2;入读入的是操作符,则需按一下规则进一步判断:1) 若读入的是左括号“(”,或读入的运算符优先级大于栈顶运算符优先级,则将读出的符号进运算符栈,然后依次读下一个符号,注意括号并未参与运算符优先级比较,故需特别判断;2) 若读出的符号为表达式结束符“;”,且运算符栈顶也是表达式结束符“;”,则表达式处理结束;3) 非运算符“‘”直接对操作数栈顶元素运算,运算结果进操作数栈,非运算符不进栈;4) 若读出的符号为右括号“)”,且运算符栈顶是左括号“)”,则表示括号内的表达式处理结束,将左括号“)出栈,然后依次读入下一个符号;5) 如读入的运算符优先级不大于栈顶运算符优先级,则从操作数栈依次推出两个操作数,从运算符栈退出一个运算符,将这两个操作数按这种运算符做相应运算,并将运算结果压入操作数栈。
Java 显示逻辑运算符的真值表
Java 显示逻辑运算符的真值表(1)新建Java项目。
打开eclipse,【新建】|【Java项目】命令,弹出【创建Java 项目】对话框,在【项目名】里输入要创建的项目名eclipsehello1。
(2)新建一个命名为NewTest1.Java类。
打开eclipse,【新建】|【类】命令,弹出【新建Java类】对话框,如图3-16所示。
图3-16 创建Java类(3)在该对话框【名称】里输入要创建的类名称,这里填写NewTest1。
在【想要创建哪些方法存根】里选择“public static void main (String[] args)”复选框,并单击【完成】按钮。
创建好的Java类,如图3-17所示。
图3-17 创建NewTest1类(4)在代码编辑区输入如下代码并保存:public class NewTest1{public static void main(String[] args){boolean x,y;System.out.println("x\ty\tAND\tOR\tNOT");x=true;y=false;System.out.println(x+"\t"+y+"\t"+(x&&y)+"\t"+(x||y)+"\t"+(!x));x=false;y=true;System.out.println(x+"\t"+y+"\t"+(x&&y)+"\t"+(x||y)+"\t"+(!x));x=true;y=true;System.out.println(x+"\t"+y+"\t"+(x&&y)+"\t"+(x||y)+"\t"+(!x));x=false;y=false;System.out.println(x+"\t"+y+"\t"+(x&&y)+"\t"+(x||y)+"\t"+(!x));}}(5)System.out.println()语句中包含逻辑运算的贺括号。
逻辑函数的表示方法有哪几种?
逻辑真值表 逻辑表达式 逻辑电路图
已知真值表求逻辑表达式和逻辑电路图
一、逻辑真值表转逻辑表达式
方法:将真值表中每一组输出函数值为1的输入变量都写成一 个乘积项。在这些乘积项中,取值为1的变量,则该因子写成 原变量,取值为0的变量,则该因子写成反变量,将这些乘积 项相加,就可以得到逻辑函数表达式。
做一做
P30 1.21
部分资料从网络收集整 理而来,供大家参考,
感谢您的关注!
解:逻辑电路图为
小结
逻辑真值表转逻辑表达式:
方法:将真值表中每一组输出函数值为1的输入变量都写成一个 乘积项。在这些乘积项中,取值为1的变量,则该因子写成原变 量,取值为0的变量,则该因子写成反变量,将这些乘积项相加, 就可以得到逻辑函数表达式。
小结
逻辑真值表转逻辑电路图:
方法:首先转换成逻辑表达式,然后对逻辑表达式化简,然后根 据“非” “与” “或”的先后原则,用正确的逻辑符号连接起来。
讲一讲
例:已知逻辑真值表将它转换成相应的逻辑表达式
输入
输出
A
B
C
Y
0
0
0
0
0
0
1
0
பைடு நூலகம்
0
1
0
0
0
1
1
1
1
0
0
0
1
0
1
1
1
1
0
0
1
1
1
1
解:逻辑表达式为
二、逻辑真值表转逻辑电路图
方法:首先转换成逻辑表达式,然后对逻辑表达式化简,然后根据“非” “与” “或”的先后原则,用正确的逻辑符号连接起来。
化简:
巧用真值表法编写PLC时序控制程序
巧用真值表法编写PLC时序控制程序中高职维修电工专业的课程设置中《PLC基础与实训》是理论和实践性很强的一门课程,对于基础薄弱的中职学生及一些渴望自学成才的初中级电工而言,非常感兴趣,但是编程却没有好的思路和方法。
PLC梯形图的设计方法有很多,如经验设计法、继电接触器电路图转化法、逻辑设计法、波形图设计法等等。
在PLC入门初期,在教师讲授并演示了继电接触器电路图的转化法后,大多数的学生都能够很好地加以应用,但是到了定时器的学习,一些需要按一定时序要求循环工作的项目设计时,学生们一片茫然不知道如何下手。
笔者尝试了逻辑设计法、波形图设计法进行讲授,但是逻辑设计法的理论基础是逻辑代数,编程者需要根据控制要求,利用“与”、“或”、“非”3种基本运算关系,写出逻辑表达式,最后化成梯形图。
波形图设计法则需要学生根据任务要求,画出触点线圈的动作时序图,然后利用时序图,写出逻辑表达式,最后化成梯形图。
这两种方法对大学生而言容易接受,但是在中职课堂里,只有少数资质好的同学可以灵活应用,而大多数同学,还是不得其道。
为此,笔者借签了很多经验,总结出一套行之有效的真值表编程方法使很多同学如醍醐灌顶豁然开朗。
2 真值表编程方法与步骤可编程序控制器(PLC )的时序控制程序,是指能够实现PL C 各输出端信号的状态在时间上按一定的顺序要求进行变化的用户程序。
通常,对于时序控制系统,用户通过分析各输出状态发生变化的时刻和相应的条件,依据输出与输入的时序逻辑关系,采用多个定时器,来编制相应的PLC 时序控制程序。
由于程序中使用了较多的定时器,涉及到多个定时器的启动信号、时间设定、触点动作方式等诸多因素,因此这种时序控制程序往往存在着逻辑关系复杂、程序过长、不易读懂调试麻烦等问题。
真值表法是在波形图法基础上改进而来,以绘制随时序变化的真值表为基础,利用编程规律,实现PLC程序设计的一种方法。
适用于按时序控制的程序的编写,当系统复杂时,也可将其动作分解,其局部也可采用这种方法。
r语言构建真值表
r语言构建真值表【原创实用版】目录1.引言2.R 语言与真值表3.构建真值表的方法4.应用示例5.总结正文1.引言在数据分析和机器学习领域,真值表(True Value Table)是一种重要的数据结构,用于展示二元变量之间的真实关系。
R 语言作为一种广泛应用于数据处理和可视化的编程语言,可以方便地构建真值表。
本文将介绍如何使用 R 语言构建真值表,并通过实际应用示例加以说明。
2.R 语言与真值表R 语言是一种功能强大的数据处理语言,其内置的 data.frame(数据框)和 matrix(矩阵)等功能可以方便地表示和处理数据。
真值表是一种特殊的矩阵,用于表示二元变量之间的真实关系。
例如,在二分类问题中,真值表可以表示为:```真阳性真阴性假阳性 FP FN假阴性 FN TP```3.构建真值表的方法在 R 语言中,可以使用矩阵或数据框来构建真值表。
下面分别介绍这两种方法:方法一:使用矩阵```R# 创建一个矩阵表示真值表true_table <- matrix(c(0, 1, 1, 0), nrow = 2, ncol = 2)rownames(true_table) <- c("真阳性", "真阴性")colnames(true_table) <- c("假阳性", "假阴性")```方法二:使用数据框```R# 创建一个数据框表示真值表true_table <- data.frame(真阳性 = 1, 真阴性 = 0, 假阳性 = 1, 假阴性 = 0)```4.应用示例假设我们有一个二分类问题,其中真阳性(TP)表示正确地预测为正,真阴性(TN)表示正确地预测为负,假阳性(FP)表示错误地预测为正,假阴性(FN)表示错误地预测为负。
我们使用 R 语言构建真值表并计算混淆矩阵:```R# 构建真值表true_table <- matrix(c(1, 0, 0, 1), nrow = 2, ncol = 2)rownames(true_table) <- c("真阳性", "真阴性")colnames(true_table) <- c("假阳性", "假阴性")# 计算混淆矩阵confusion_matrix <- matrix(0, nrow = 2, ncol = 2)confusion_matrix[1, 1] <- sum(true_table[1, 1])confusion_matrix[1, 2] <- sum(true_table[1, 2])confusion_matrix[2, 1] <- sum(true_table[2, 1])confusion_matrix[2, 2] <- sum(true_table[2, 2])rownames(confusion_matrix) <- c("真阳性", "真阴性")colnames(confusion_matrix) <- c("假阳性", "假阴性")print(confusion_matrix)```5.总结通过 R 语言构建真值表,可以方便地展示二元变量之间的真实关系,为数据分析和机器学习提供有力支持。
离散数学-逻辑学-命题公式求真值表
离散逻辑学实验班级:10电信实验班学号:Q10600132 姓名:王彬彬一、实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二、实验内容1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三、实验环境C或C++语言编程环境实现。
四、实验原理和实现过程(算法描述)1.实验原理(1)合取:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P∧Q, 读作P、Q的合取, 也可读作P与Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = T时方可P∧Q =T, 而P、Q只要有一为F则P∧Q = F。
这样看来,P∧Q可用来表示日常用语P与Q, 或P并且Q。
(2)析取:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P∨Q, 读作P、Q的析取, 也可读作P或Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = F, Q = F时方可P∨Q =F, 而P、Q只要有一为T则P∨Q = T。
这样看来,P∨Q可用来表示日常用语P或者Q。
(3)条件:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P→Q, 读作P条件Q, 也可读作如果P,那么Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = F时方可P→Q =F, 其余均为T。
(4)双条件:二元命题联结词。
将两个命题P、Q联结起来,构成一个新的命题P←→Q, 读作P双条件于Q。
这个新命题的真值与构成它的命题P、Q的真值间的关系为当两个命题变项P = T, Q =T时方可P←→Q =T, 其余均为F。
(5)真值表:表征逻辑事件输入和输出之间全部可能状态的表格。
列出命题公式真假值的表。
通常以1表示真,0 表示假。
打印真值表程序
SA11226003 李云鹏程序目的:编写程序输入一行逻辑串,打印真值表。
编写语言:JA V A策略:运用算符优先分析法,难点就是算符优先分析法。
概念来自编译原理,不过在这里也仅仅是一个简单的应用。
如果翻书的话,就发现这个分析法主要就是用了一个栈。
在不同的条件下,进行出栈、入栈操作,在这个过程中就可以把逻辑表达式的结构分析出来。
最终分析得出的是一个树状结构(编译原理中,称之为语法树)然后,看看总共用了多少个变量,对这些变量的值进行穷举,就可以输出真值表了。
算符有限分析法:将一个普通的中序表达式转换为逆波兰表达式的一般算法是:首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。
可指定其他字符,不一定非#不可。
从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈;若取出的是运算符,并且当前S1栈顶为(,则当前运算符直接入S1栈。
(2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否者,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。
(3)若取出的字符是“(”,则直接送入S1栈栈顶。
(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
(5)重复上面的1~4步,直至处理完所有的输入字符(6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。
算符优先级:+ - | & ! ( )+ > < < < < < >- > > < < < < >| > > > < < < >& > > > > < < >! > > > > > < >( < < < < < < =) > > > > > E >异或介于了|与&之间程序清单:输入模式是标准的逻辑串而且格式要正确,变量不限个数,逻辑符号包括“&”(逻辑与/合取) 、“|”(逻辑或/析取)、“^”(即异或/○+)、“!”(逻辑非),如果输入不正确的格式会有错误提示。
(赋值)列出真值表2.从真值表写出逻辑函数式3.选定器件
4. 画出逻辑图
4.3.2 复杂电路的设计
采用层次化的设计方法
1. 将整个逻辑电路划分成若干个比较大的顶级模块。 2. 再将其逐级划分成更小的模块,直到划分为能够实现的、
QA QB QC QD QE QF QG
11 10 9 8 6 13 12
七段 译码 器
显示 数码 驱动 显示 电路 电路
4.4 组合逻辑电路中的竞争-冒险现象
一、什么是“竞争”
两个输入信号“同时向相反的逻辑电平变化”,称存在 “竞争”
二、只要存在输入信号的竞争,就有可能产生输出尖 峰脉冲噪声的危险,这种现象称为“竞争-冒险” 现象。
S
Q
Q*
R (现态) (次态)
功能
0
0
0
0
0
0
1
1
保持
0
1
0
0
置0
0
1
1
0
1
0
0
1
置1
1
0
1
1
1
1
0
0#
不定
1
1
1
0#
特性方程:Q* = S+R’Q(约束条件: SR = 0)
3)工作波形(设初态为0)
S1
0
0
1
0
1
1
R0
0
1
1
0
1
0
Q Q’
提问:锁存器的特点及逻辑功能的描述方法?
Hale Waihona Puke 小结 •掌握组合逻辑电路的设计方法。 •掌握或非门组成的SR锁存器的工作原理。
7442逻辑功能和真值表
7442逻辑功能和真值表逻辑功能和真值表是逻辑学中的重要概念,用来描述逻辑电路的功能和工作原理。
逻辑功能是指逻辑电路实现的具体逻辑操作,真值表则是描述逻辑函数的一种方式。
在逻辑设计和分析中,逻辑功能和真值表起着至关重要的作用。
逻辑功能是指逻辑电路实现的具体逻辑操作,如与、或、非等。
逻辑电路可以实现各种逻辑功能,通过组合不同的逻辑门,可以构建出复杂的逻辑电路,实现各种复杂的逻辑操作。
逻辑功能描述了逻辑电路的具体功能和操作方式,是逻辑电路设计的基础。
真值表是描述逻辑函数的一种方式,通过真值表可以清晰地展示逻辑函数的输入输出关系。
真值表的每一行描述了逻辑函数在不同输入条件下的输出结果,通过真值表可以直观地了解逻辑函数的工作原理和逻辑操作。
真值表是逻辑设计和分析中常用的工具,可以帮助我们理解逻辑函数的逻辑关系和运算规则。
逻辑功能和真值表之间有着密切的关系,逻辑功能描述了逻辑电路的功能和操作方式,而真值表则是描述逻辑函数的一种方式,通过真值表可以清晰地展示逻辑函数的输入输出关系。
在逻辑设计和分析中,逻辑功能和真值表起着至关重要的作用,帮助我们理解逻辑电路的功能和工作原理,指导我们设计和分析复杂的逻辑电路。
总的来说,逻辑功能和真值表是逻辑学中的重要概念,用来描述逻辑电路的功能和工作原理。
逻辑功能描述了逻辑电路实现的具体逻辑操作,真值表则是描述逻辑函数的一种方式。
逻辑功能和真值表之间有着密切的关系,在逻辑设计和分析中起着至关重要的作用。
通过理解逻辑功能和真值表,我们可以更好地设计和分析逻辑电路,实现各种复杂的逻辑操作。
逻辑功能和真值表是逻辑学习和应用中不可或缺的重要概念,对于理解和应用逻辑学有着重要的意义。
如何根据真值表反推逻辑表达式
如何根据真值表反推逻辑表达式
一般我们都是采用公式法或者卡诺图的方法。
不过用程序自动化来实现,这两种方法都不合适。
在计算逻辑代数里面有个叫做Quine-McCluskey (奎因-麦克拉斯基)算法的,用于化简逻辑公式的,并且它还给出了检查布尔函数是否达到了最小化形式的确定性方法。
不过这个算法是NP-完全的,因此运行时间随输入变量个数呈指数增长。
比如逻辑变量个数有几十个的时候,这时候找到最简表达式已经是不太可能,只能通过启发式算法(Espresso 算法)来寻求次优解。
根据输入端的变化,写出输出端的状态,真值表就出来了。
相反,从输出端倒推回输出端,就是逻辑表达式
第一种方法:以真值表内输出端1为准
第一步:从真值表内找输出端为1的各行,把每行的输入变量写成乘积形式;遇到0的输入变量上加非号。
第二步:把各乘积项相加,即得逻辑函数的表达式。
逻辑函数真值表生成程序报告
逻辑函数真值表生成程序报告逻辑函数真值表生成程序设计报告一.问题:设计一个能够分解成具备13个输出逻辑变量的逻辑函数真值表分解成程序。
二.原理:逻辑函数(logicalfunction)就是数字电路(一种开关电路)的特点及叙述工具,输出、输出量就是低、低电平,可以用二元常量(0,1)去则表示,输入量和输出量之间的关系就是一种逻辑上的因果关系。
效仿普通函数的概念,数字电路可以用逻辑函数的的数学工具去叙述。
真值表是表征逻辑事件输入和输出之间全部可能状态的表格。
列举命题公式真假值的表中。
通常以1则表示真,0则表示假。
命题公式的值域由共同组成命题公式的命题变元的值域和命题联结词同意,命题联结词的真值表得出了真假值的算法。
真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。
(表达式可以是论证;就是说,表达式的合取,它的每个结合项(conjunct)都是最后要做的结论的一个前提。
)三.测试结果:四.附录(代码):#include#include#definemaxnum100//栈最小元素个数#definemaxexp30//允许用户输入的表达式最大字符数#include\#include\constcharand='&',or='|',then='-';boolinopt(charc){return(c=='&'||c=='|'||c=='-'||c=='#');}boolisnum(charc){return(c>='0'&&c<='9');}boolisalp(charc){return((c<='z'&&c>='a')||(c>='a'&&c<='z'));}boolchecksyntax(char*exp){char*cp=exp;while(*cp!='\\0'){if(!(isnum(*cp)||isalp(*cp)||inopt(*cp)||*cp=='('||*cp==')'))returnfalse;cp++;} if(*(--cp)!='#')returnfalse;returntrue;}pbintreetransfertree(char*exp){pbintreenodepbt=crtbintree();stackst;stacksc;char*ch=exp,c;sc.push('#');while(!(sc.gettop()=='#'&&*ch=='#')){if(isalp(*ch)){pbintreenodet=crtbintree();t->data=*ch;st.push(t);}elseif(isnum(*ch)){while(isnum(*ch)){ch++;}ch--;pbintreenodet=crtbintree();t->data=*ch;st.push(t);}else{switch(*ch){case'(':sc.push(*ch);break;case')':{c=sc.pop();while(c!='('){pbintreenodet=crtbintree();t->data=c;t->rchild=st.pop();t->lchild=st.pop();st.push(t);c=sc.pop();}break;}default:{while(sc.gettop()!='#'&&sc.gettop()!='('){pbintreenodet=crtbintree();c=sc.pop();t->data=c;t->rchild=st.pop();t->lchild=st.pop();st.push(t);}if(*ch!='#')sc.push(*ch);break;}}}if(!sc.isempty()&&*ch!='#')ch++;}pbt=st.pop();returnpbt;}voidgetvariable(pbintreepbt){pbintreevpt=pbt;if((pbt->data>='a'&&pbt->data<='z')||(pbt->data>='a'&&pbt->data<='z')){ printf(\恳请输出%c的值(1或0):\\n\scanf(\getchar();}if(vpt->lchild!=null)getvariable(vpt->lchild);if(vpt->rchild!=null)getvariable(vpt->rchild);}charcaculate(pbintreepbt){pbintreevpt=pbt;if(vpt==null){printf(\没有任何表达式可计算!\returnfalse;}if(vpt->lchild==null)//找出叶子结点returnvpt->data;if(inopt(vpt->data)&&caculate(vpt->lchild)&&caculate(vpt->rchild)){switch(vpt->data){。
逻辑函数以及其表示方法
逻辑函数以及其表⽰⽅法
1,逻辑真值表
2,逻辑函数式:由与或⾮等各种运算符所构成的逻辑表达式
3,逻辑图:由各种门的逻辑符号连接所构成的逻辑电路图。
以上三种表⽰放都可以互相转化
1.逻辑函数式求真值表:把输⼊变量的所有可能的取值组合代⼊对应函数式算出其中输出函数值
2.真值表求逻辑函数式:根据给定真值表,先找出Y的值为1的部分以及其对应的输⼊组合,然后把这些输⼊组合分别写成乘积项,值为1的写成原变量,值为0的写成反变量,最后把这⼏个乘积项相或即可。
3,逻辑函数式求逻辑图:将逻辑符号替换后连线
4,逻辑图写逻辑函数式:⽤逻辑变量替换后,化简即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
逻辑函数真值表生成程序
(一)实验任务:
设计一个能生成具有13个输入逻辑变量的逻辑函数真值表生成程序。
功能要求:
规定函数文本的书写方式,将逻辑函数写入文本文件中(如
logic_funs.txt);
2,程序从包含有逻辑函数表达式的文本文件(如logic_funs.txt)中读入变量个数和函数
3,函数运算优先顺序的识别与函数运算转换
4,得到函数输出结果
5,将真值表存入文本文件(如truth_table.txt)中。
6,逻辑函数表达式的文本文件及真值表文本文件的文件名应能独立输入。
扩展设计:
将原要求实现的过程扩展为具有8个函数处理能力的程序。
(二)实验方法:
(三)功能实现:
1. 函数文本的书写方式:函数值+函数体,注意函数以分号结束,如:
F=(A+B'+C*D*E*(F*G+H+I))*X+Y*W*Z*(A+B+C*H*F);
2.采用文件流形式从文本文件读入函数表达式,并将真值表写入文本文
件中,文件地址既可采用当前目录的默认地址,也可采用自定义的路
径。
3. 函数运算优先顺序的识别与函数运算转换通过两个顺序栈(sk1存储
运算符,sk2存储操作数)来实现。
算法描述:
从左到右扫表达式,如读入的是操作数,则压入操作数栈sk2;入读入的是操作符,则需按一下规则进一步判断:
1) 若读入的是左括号“(”,或读入的运算符优先级大于栈顶运算符优先
级,则将读出的符号进运算符栈,然后依次读下一个符号,注意括号并
未参与运算符优先级比较,故需特别判断;
2) 若读出的符号为表达式结束符“;”,且运算符栈顶也是表达式结束符
“;”,则表达式处理结束;
3) 非运算符“‘”直接对操作数栈顶元素运算,运算结果进操作数栈,非
运算符不进栈;
4) 若读出的符号为右括号“)”,且运算符栈顶是左括号“)”,则表示
括号内的表达式处理结束,将左括号“)出栈,然后依次读入下一个符
号;
5) 如读入的运算符优先级不大于栈顶运算符优先级,则从操作数栈依次推
出两个操作数,从运算符栈退出一个运算符,将这两个操作数按这种运
算符做相应运算,并将运算结果压入操作数栈。
注意在这种情况下,当
前读出的操作符下次将重新考虑,即(不再读下一个符号);
例如:对函数表达式F=(X+Y+Z)*X'*Y;
a.初始状态
b.读出(、X、+、Y
topp->
OPS topv-> OVS OPS OPS
C .计算T1=X+Y d.重新考虑+,将+入栈
e .读入Z
f.计算T2=T1+Z,
h .读入*,X
i.直接对X ‘进行运算,结果入栈
OPS
OPS
topp->
OPS
OPS
OPS
tovp->
OVS
tovp->
OPS
tovp->
OPS
OPS
tovp->
OPS
OPS
j .计算T4=T3+T2Y 入栈
4. 用循环的方法(while (getline (ifstream&in ,string s )))读入函数表达式,故
可生成任意多个函数的真值表。
附件:程序代码(VS 编译通过)digtal.cpp
真值码表logic_funs.txt ,My_Trurh_Table.txt
tovp-> OPS
OPS
tovp->
OPS
OPS
tovp-> l .计算T5=T4+Y ’操作符栈顶相同,运算结束 T5。