zoukankan      html  css  js  c++  java
  • Python程序练习5--模拟计算器

    1.功能简介

    此程序模拟计算器操作,可实现带括号的加减乘除运算。

     

    2.实现方法

    本程序采用python语言编写,主要运用了正则表达式来解析和匹配输入的计算式,按照先括号、再乘除、后加减的顺序逐步匹配计算缩减计算公式,直到不含运算符了即为最终结果。通过calculate计算器主函数完成整个输入公式的计算,内部调用子函数four_opera完成去除里层括号的表达式的加减乘除四则运算,运算过程中再调用cal_cell完成单个计算单元的计算。程序主要函数如下: 
    (1)calculate(formula) 
    计算器主函数,返回输入的计算公式formula的计算结果,计算时先进行最里层括号表达式的提取,再调用four_opera函数完成不含括号的表达式的四则计算,再将结果替换整个包含里层括号的表达式。 
    (2)four_opera(formula) 
    无括号的加减乘除四则运算函数,返回无括号的表达式formula的四则运算结果,计算时先匹配形如a*b或a/b的乘除法计算单元,调用cal_cell函数完成该单元乘除计算,并将结果替换原乘除法单元表达式;式中没有乘除法了,形如a+b或a-b的加减法计算单元,调用cal_cell函数完成该单元加减计算,并将结果替换原乘除法单元表达式;直到最终四则运算表达式缩减到不含运算符了为计算结果。 
    (3)cal_cell(formula_cell) 
    单个计算单元的计算函数,完成形如a+b,a-b,a*b,a/b的单个表达式的计算,返回计算结果。

     

    3.流程图

    4.代码

     1 #!usr/bin/env python3
     2 #_*_coding:utf-8_*_
     3 __author__='Byron Li'
     4 import re
     5 def calculate(formula):      #计算器主函数
     6     while True:
     7         if '(' in formula:
     8             inside_pare=re.search(r'([^()]+)',formula).group().strip('()')    #提取出一个最里层括号的表达式,并将两端号去除
     9             formula=re.sub(r'([^()]+)',four_opera(inside_pare),formula,1)      #计算去括号后表达式的四则运算,并将计算结果替换提取的包含括号的整个表达式
    10         else:
    11             return four_opera(formula)                                            #表达式中已不含括号,做四则运算得到最终计算结果
    12 
    13 def four_opera(formula):     #无括号的加减乘除四则运算函数
    14     while True:
    15         if (re.search(r'[*/]',formula)):                                                                               #判断表达式是否包含*、/运算符,乘除法优先计算
    16             formula_cell=re.search(r'(^-?d+.?d*|d+.?d*)([*/])(-?d+.?d*)',formula).groups()              #提取出一个乘除计算单元,形如a*b或a/b,若计算单元在表达式开头,左端数字为负数的话要匹配负号,若不在开头左端数字只匹配数字不匹配符号。
    17             formula =re.sub(r'(^-?d+.?d*|d+.?d*)([*/])(-?d+.?d*)', cal_cell(formula_cell), formula, 1)  #计算乘除法结果,并将结果替换提取到的乘除法计算单元
    18         elif re.search(r'(-?d+.?d*)([+-])(-?d+.?d*)', formula):                                             #表达式已不含乘除法,若能匹配出形如a+b或a-b加减法计算单元的,则进行加减法计算
    19             formula_cell=re.search(r'(-?d+.?d*)([+-])(-?d+.?d*)',formula).groups()                           #提取出形如a+b或a-b加减法计算单元
    20             formula =re.sub(r'(-?d+.?d*)([+-])(-?d+.?d*)', cal_cell(formula_cell), formula, 1)               #计算加减法结果,并将结果替换提取到的加减法计算单元
    21         else:
    22             return formula                                                                                             #表达式已不含乘除和加减法计算单元,即为四则运算的结果
    23 
    24 def cal_cell(formula_cell):   #单个计算单元的计算函数,形如a+b,a-b,a*b,a/b的计算
    25     if formula_cell[1]=='+':
    26         return str(float(formula_cell[0])+float(formula_cell[2]))     #加法计算
    27     elif formula_cell[1]=='-':
    28         return str(float(formula_cell[0])-float(formula_cell[2]))     #减法计算
    29     elif formula_cell[1]=='*':
    30         return str(float(formula_cell[0])*float(formula_cell[2]))     #乘法计算
    31     else:
    32         return str(float(formula_cell[0])/float(formula_cell[2]))     #除法计算
    33 
    34 if __name__=='__main__':
    35     while(True):
    36         formula=input("请输入计算公式:")                            #输入计算式
    37         # formula ='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    38         formula = ''.join(formula.split())
    39         if formula=='exit':break
    40         print('计算结果是:%s'%calculate(formula))                   #计算并打印结果
    View Code
  • 相关阅读:
    odoo 错误 Resource interpreted as Stylesheet but transferred with MIME type application/x-css:
    Android架构师之路-架构到代码的演练
    Android架构师之路-架构师的决策
    EventBus
    Android架构师之路-UML图形思考
    Android架构师之路-oop
    EventBus
    java定义接口监听器详解
    INSTALL_FAILED_NO_MATCHING_ABIS
    android---NDK开发helloworld(jni)
  • 原文地址:https://www.cnblogs.com/byron-li/p/7930033.html
Copyright © 2011-2022 走看看