Python程式練習5--類比計算機,python5--

來源:互聯網
上載者:User

Python程式練習5--類比計算機,python5--
1.功能簡介

此程式類比計算機操作,可實現帶括弧的加減乘除運算。

 2.實現方法

本程式採用python語言編寫,主要運用了Regex來解析和匹配輸入的計算式,按照先括弧、再乘除、後加減的順序逐步匹配計算縮減計算公式,直到不含運算子了即為最終結果。通過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':break40         print('計算結果是:%s'%calculate(formula))                   #計算並列印結果
View Code

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.