逻辑函数真值表生成程序

合集下载

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

离散数学实验——求真值表.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++算法实现

真值表的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  显示逻辑运算符的真值表

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
解:逻辑表达式为
二、逻辑真值表转逻辑电路图
方法:首先转换成逻辑表达式,然后对逻辑表达式化简,然后根据“非” “与” “或”的先后原则,用正确的逻辑符号连接起来。
化简:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档