+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-03(70)

2020-04(60)

2020-05(24)

2020-06(39)

2020-07(23)

使用python输出真值表

发布于2019-12-15 11:53     阅读(706)     评论(0)     点赞(18)     收藏(2)


0

1

2

3

4

首先创建一个类,利用python自身的优势对表达式进行解析

  1. # &为合取,v为析取,~为非,>为条件联结词,*为双条件联结词
  2. class Variable:
  3. def __init__(self, value=0):
  4. self.value = value
  5. # 返回两个对象的合取
  6. def __and__(self, other):# 对 & 运算符的定义
  7. return Variable(1) if (self.value==1 and other.value==1) else Variable(0)
  8. def __or__(self, other):# 对 | 运算符的定义
  9. return Variable(0) if self.value==other.value==0 else Variable(1)
  10. # 对象的条件连接
  11. def __gt__(self, other):# 对 > 运算符的定义
  12. return Variable(0) if (self.value==1 and other.value==0) else Variable(1)
  13. # 对象的取反
  14. def __invert__(self):# 对 ~ 运算符的定义
  15. return Variable(1) if self.value==0 else Variable(0)
  16. # 对象的双条件连接
  17. def __mul__(self, other):# 对 * 运算符的定义
  18. return Variable(1) if self.value==other.value else Variable(0)
  19. def __str__(self):# 对打印显示的重载
  20. return str(self.value)

然后我们输入一个字符串

formula = input("输入你的公式:")
  1. # 所有的变量字符组成的列表,使用集合去掉了重复的变量字符
  2. var_chars = list(set(formula).difference(set("()&|>*~")))
  3. variables = []# 用来存储所有的Variable对象
  4. for v in var_chars:
  5. # 对于每一个解析得到的变量字符为变量名生成一个Variable对象
  6. exec(v+'=Variable(0)')
  7. variables.append(eval(v))# 添加到上面的列表中

使用一个递归函数输出真值表,用于对每个对象赋值并打印真值表

此处关于递归的算法,我借鉴了大佬的代码,在此声明https://blog.csdn.net/Kprogram/article/details/83686154

  1. def give_value(i):
  2. global formula
  3. if i == len(variables):
  4. for v in variables:
  5. print(v.value, end=" ")
  6. print(eval(formula))
  7. return
  8. variables[i].value = 0# 先赋值为0
  9. give_value(i+1)# 递归调用自己
  10. variables[i].value = 1# 后赋值为1
  11. give_value(i+1)# 递归调用自己

先输出真值表的第一行

  1. for v in variables:
  2. print(v, end=" ")
  3. print(formula)

显示真值表里面的内容

give_value(0)

效果截图

有很多小伙伴的离散数学可能会需要做实验,一般要求是使用c语言或者是matlab,而我们的老师说python也是可以接受的,但是不能使用人家已经写好的模块,而对输入的公式(一个字符串)进行解析又是一件十分复杂的事情,还需要对括号进行匹配等,我个人不喜欢那么复杂,所以我用了eval()函数,直接把字符串两端的引号给去掉,从而执行里面的内容,所以我的代码:

首先解析输入的字符串,使用集合工具去掉相同的变量,再转换成列表;

根据列表里面的字符使用exec()函数直接生成对应的变量,从而每个变量的内容就是字符本身;

把得到的每一个Variable对象都添加到一个列表中便于管理;

使用递归对列表里面的每一个对象的value属性进行赋值,同时输出真值表。

 

发布了2 篇原创文章 · 获赞 1 · 访问量 18

0

1

2

3

4

5

6

7

8

9



所属网站分类: 技术文章 > 博客

作者:9384vfnv

链接: https://www.pythonheidong.com/blog/article/176838/d8b05cedf27f98eb9c5a/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)