栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python求主范式(python 主函数)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python求主范式(python 主函数)

目录

一、主要思路

二、主要步骤

1.输入所求的式子

2.化简所求的式子

3.求得真值表的所有情况

 4.进行计算,得出结果

三.代码实现

四.运行结果


我们已经学习了主范式的相关知识,为了更加简便的求出主范式,可以用下面这个代码求,会变得更加简单。

一、主要思路

先化简输入的式子,比如:条件,双条件等无法被计算机直接计算,所以我们可以对式子进行化简。然后通过真值表便可以自然求出主析取范式和主合取范式了。

二、主要步骤

1.输入所求的式子

 

2.化简所求的式子

3.求得真值表的所有情况

 

 4.进行计算,得出结果

三.代码实现
aInput=''#输入的命题公式字符串
aHuajian=''#化简后的sInput
va=[]#保存公式中的变量
xiqu=[]#主吸取范式最小项
hequ=[]#主合取范式最大项
fo=''#符号前面的部分
ba=''#符号后的部分
def myinput():#输入所求命题式子
    global aInput
    print("请输入一个任意命题公式('~'表示非,'&'表示合取,'|'表示析取,'>'表示条件,'<'表示双条件,'@'表示异或,可以有括号哦!):")
    aInput=input()
def getva():#获取其中每一部分
    global aInput,va
    for c in aInput:
        if c >='A'and c <='Z'or c >='a'and c<='z':
            if c not in va:
                va.append(c)
            elif c!='~'and c!='&'and c!='|'and c!='('and c!=')'and c!='>'and c!='<'and c!='@':
                print('输入错误!')
    va=sorted(va)
def getFB(c):
    global aInput,aHuajian,fo,ba
    alen=len(aHuajian)
    for i in range(0,alen):#遍历aHuajian中的所有字符
        if aHuajian[i] == c:
            if aHuajian[i-1] != ')':#找到fo
                fo=aHuajian[i-1]
            else:
                flag=1
                j=i-1
                while flag != 0:
                    if aHuajian[j] == '~':
                        j-=1
                    if aHuajian[j] == '(':
                        flag-=1
                    if aHuajian[j] == ')':
                        flag+=1
                    j-=1
                fo=aHuajian[j+1:i]
            if aHuajian[i+1] != '(':#找到ba
                ba=aHuajian[i+1]
            else:
                flag=1
                j=i+2
                while flag != 0:
                    if aHuajian[j] == '~':
                        j+=1
                    if aHuajian[j] == ')':
                        flag-=1
                    if aHuajian[j] == '(':
                        flag+=1
                    j+=1
                ba=aHuajian[i+1:j]
            if c == '>':
                aHuajian=aHuajian.replace(fo+'>'+ba,'('+'~'+fo+'|'+ba+')')
            elif c == '<':
                aHuajian=aHuajian.replace(fo+'<'+ba,'('+fo+'&'+ba+')|(~'+fo+'&~'+ba+')')
            elif c == '@':
                aHuajian=aHuajian.replace(fo+'@'+ba,'~('+'('+fo+'&'+ba+')|(~'+fo+'&~'+ba+')'+')')
def huajianinput():
    global aInput,aHuajian
    aHuajian=aInput
    getFB('>')
    getFB('<')
    getFB('@')
def cal():
    global aInput,aHuajian,va,xiqu,hequ,xiqujieguo,hequjieguo
    vlen=len(va)#变量个数
    n=2**vlen#所有情况个数
    print('真值表如下图所示:')
    print(va,aInput+'即',aHuajian)
    for n1 in range(0,n):#遍历所有的情况
        value=[]#数值
        j=n1#真值表当前行
        for i in range(0,vlen):#遍历所有变量
            value.append(0)
        i=0
        while j!=0:
            value[i]=j%2
            j=j//2
            i+=1
        value.reverse()#反转这个列表
        value=list(map(str,value))#将value中的数字变成字符形式,此时仍为一个列表
        a=aHuajian#将化简后的式子赋值给a
        for x in range(0,vlen):#遍历所有变量
            a=a.replace(va[x],value[x])#用数字字符代替变量,那样计算机就可以进行计算了。p&q&r这些无法计算但是0&1可以计算
        result=eval(a)&1#将字符变为数字
        if result == 1:
            xiqu.append(n1)
        else:
            hequ.append(n1)
        print(value,result)
        
def outprint():
    print('主析取范式:')
    print('求和',xiqu,sep='')
    print('主合取范式:')
    print('求积',hequ,sep='')
def main():
    myinput()
    getva()
    huajianinput()
    cal()
    outprint()
if __name__=='__main__':
    main()

    

            

四.运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773064.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号