简易计算器的制作

目的:实现简易计算器

实行功能:实现包含加减乘除括号在内的四则运算

在自学任何技能的过程中,一定要自己亲自做一遍,才能学习到真正的技能,走马观花的学习充其量只能了解,并不会应用,在此勉励自己,不忘初心 方得始终 ,断续续编了几天的计算器代码,终于把它完成了,可以接着往下学习了,加油

代码如下所示:

'''
Created on 

@author: hcl
'''
import re

def mult(str_test):
    '''
        功能:对字符串str_test内只含有  * / 时,进行从左到右运算,并返回运算结果
        输入:字符串
        输出:字符串
    '''
    if (str_test[0] == '('):
        str_test = str_test[1:-1]
    content = re.split('[*,/]', str_test)
    len_str_test = len(content)
    if len_str_test > 1 : 
        if str_test[len(content[0])] == '/':
            stemp =  float(content[0])/float(content[1])
        else:
            stemp =  float(content[0])*float(content[1])  
        str_test = str(stemp)+str_test[len(content[0])+len(content[1])+1:]
        return mult(str_test)
    else:
        return str_test

def pas(str_test):
    '''
        功能:对字符串str_test内只含有+ - 时,进行从左到右运算,并返回运算结果
        输入:字符串
        输出:字符串
    '''
    if (str_test[0] == '('):
        str_test = str_test[1:-1]
    content = re.split('[+,-]', str_test)
    if str_test[0] == '-':
        content[1] = '-' + content[1]
        content = content[1:]
    len_content = len(content)
    if len_content > 1 : 
        if str_test[len(content[0])] == '+':
            stemp =  float(content[0])+float(content[1])
        else:
            stemp =  float(content[0])-float(content[1])  
        str_test = str(stemp)+str_test[len(content[0])+len(content[1])+1:]
        return pas(str_test)
    else:
        return str_test

def find_kh(str_test):
    """
       功能:寻找字符串str_test中的最里层括号
    
    """
    try:
        itm = re.search("\([^()]*\)", str_test).group() #截取最底层括号及其包含内容 如 (2+4)
        n = re.search("\([^()]*\)", str_test).span() #截取内容的序号
        return itm,n[0],n[1]
    except AttributeError :
        pass
        
def replaceStr(str_test,start,end,new_str_test):
    """
       功能:替换字符串,str_test为原字符串,new_str_test为经过加减乘除以后的结果
    
    """
    return str_test.replace(str_test[start:end],new_str_test)

def change_sign(str_test):
    """
       功能:处理str_test中的符号
    
    """
    str_test = re.sub(r'--','+',str_test)
    str_test = re.sub(r'\+-','-',str_test)
    str_test = re.sub(r'\+\+','+',str_test)
    str_test = re.sub(r'-\+','-',str_test)
    while re.findall(r'\*-',str_test):              #处理特殊字符 *-
        if re.search(r'\*-',str_test):
            start,end = re.search(r'\*-',str_test).span()
            str_test= str_test[0:start+1]+str_test[start+2:]
            while start > 0:
                pattern = re.compile(r'-')
                if pattern.search(str_test,start-1,start):              
                    str_test= str_test[:start-1] + '+' + str_test[start:]
                    break
                    
                pattern2 = re.compile(r'\+')
                if pattern2.search(str_test,start-1,start):           
                    str_test= str_test[:start-1] + '-' + str_test[start:]
                    break                
                start = start - 1 
    while re.findall(r'/-',str_test):               #处理特殊字符 /-
        if re.search(r'/-',str_test):
            start,end = re.search(r'/-',str_test).span()
            str_test= str_test[0:start+1]+str_test[start+2:]
            while start > 0:
                pattern = re.compile(r'-')
                if pattern.search(str_test,start-1,start):              
                    str_test= str_test[:start-1] + '+' + str_test[start:]
                    break                    
                pattern2 = re.compile(r'\+')
                if pattern2.search(str_test,start-1,start):           
                    str_test= str_test[:start-1] + '-' + str_test[start:]
                    break               
                start = start - 1      
    return str_test

def lTor(str_test):
    """
       功能:处理无括号的加减乘除操作
       输入:字符串
       输出:字符串
    
    """
    str_test = change_sign(str_test)
    matchObj = re.search('[*,/]', str_test)
    if matchObj:
        content = re.split('[+,-]', str_test)
        while re.search('[*,/]', str_test):
            start = 0
            content = re.split('[+,-]', str_test)
            for item in content:
                if re.search('[*,/]', item): 
                    stemp = mult(item)    
                    str_test = str_test.replace(str_test[start:start+len(item)],stemp)
                    break
                start += len(item)+1
        else:
            str_test = change_sign(str_test)
            str_test = pas(str_test)
            return str_test  
    else:
        str_test = change_sign(str_test)
        str_test = pas(str_test)
        return str_test  
    
def cac(str_test):
    """
        功能:计算主入口
        输入:待计算的字符串
        输出:返回计算结果字符串
    """
    str_test = change_sign(str_test)   
    if find_kh(str_test):
        itm,start,end = find_kh(str_test)
#         if itm[0] == '(':
#             itm = itm[1:-1]
        if itm[0:2] == '(+':
            itm = itm[2:-1]
        if itm[0] == '(':
            itm = itm[1:-1]    
        str_test = replaceStr(str_test,start,end,lTor(itm))
        return cac(str_test)
    else:
        str_test = lTor(str_test)
        return str_test
     
test123 = "2-4*(3*2)"
test = "3-5-5"
test11 = "1-2*((-40/-5)-5+5*2+3/2)+(-40*-5)"
t = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"

ttttt = "1-2*-1.5+1+2*-1.5-1-2*-1.5"
#print(cac(test11))
#print(cac(test123))
#print(cac(test))

#change_sign(test11)

print(cac(t))

#print(cac(t))

计算结果:2776672.6952380957

 

六、有兴趣接电子设计相关小型项目的请加下群,每个项目一般在1000元以内,非诚勿扰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值