python作業day4計算器


思路:

用循環提取最里面的括號,再進行運算

運算時利用正則表達式尋找相應的運算符

先進行乘除,再進行加減

(參考武sir和金角大王的代碼)


流程圖:

day4


代碼:

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 import re
  4 def cheng_and_chu(arg):			#計算乘除
  5     val = arg[0]				#把傳入的列表中第0個元素賦值給val
  6     mch = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val)	#利用正則表達式的查找字符串功能匹配val中的算數符賦值給mch
  7     if not mch:					#如果mch中沒有乘除
  8         return					#結束函數返回這個mch中的值
  9     content = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val).group()	#利用正則表達式的查找字符串功能匹配val中的算數符,並使用group獲取分組賦值給content
 10     if len(content.split('*'))>1:		#將content中的組以*分割,分割后的字符串長度大於1
 11         n1,n2 = content.split('*')		#將content中的組以*分割,分割后的兩部分分別賦值給n1,n2
 12         value = float(n1) * float(n2)	#將n1,n2轉換為浮點數,並相乘,結果賦值給value
 13     else:
 14         n1,n2 = content.split('/')
 15         value = float(n1) / float(n2)
 16     qianzhui,houzhui = re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val, 1)		#用正則中的分割方法,吧val中的值以\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*分割,並將分割后的值分別賦值給qianzhi,后綴
 17     new_str = "%s%s%s"%(qianzhui,value,houzhui)		#將字符串重新格式化拼接
 18     arg[0] = new_str								#講新的字符串復制給arg中的第0個元素
 19     cheng_and_chu(arg)								#繼續運行乘除函數
 20 
 21 def jia_and_jian(arg):			#計算加減
 22     while True:
 23         if arg[0].__contains__('+-') or arg[0].__contains__("++") or arg[0].__contains__('-+') or arg[0].__contains__("--"):	#如果arg的第0個元素是'+-','--','++','-+'
 24             arg[0] = arg[0].replace('+-','-')	#將-替換掉+-
 25             arg[0] = arg[0].replace('++','+')	#將+替換掉++
 26             arg[0] = arg[0].replace('-+','-')	#將-替換掉-+
 27             arg[0] = arg[0].replace('--','+')	#將+替換掉--
 28         else:
 29             break
 30     if arg[0].startswith('-'):				#如果arg的第0個元素是以-開頭
 31         arg[1] += 1							#arg的第一個元素自加1
 32         arg[0] = arg[0].replace('-','&')
 33         arg[0] = arg[0].replace('+','-')
 34         arg[0] = arg[0].replace('&','+')#將-變+,+變-
 35         arg[0] = arg[0][1:]#將arg中第0個元素中前面多出來的符號去掉
 36     val = arg[0]
 37     mch = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val)
 38     if not mch:
 39         return
 40     content = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val).group()
 41     if len(content.split('+'))>1:
 42         n1, n2 = content.split('+')
 43         value = float(n1) + float(n2)
 44     else:
 45         n1, n2 = content.split('-')
 46         value = float(n1) - float(n2)
 47     before, after = re.split('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val, 1)
 48     new_str = "%s%s%s" % (before,value,after)
 49     arg[0] = new_str
 50     jia_and_jian(arg)
 51 
 52 def jisuan(sr):						#計算函數
 53     new_sr = [sr.strip('()'),0]		#將傳入的值兩邊括號去掉,並組成列表賦值給new_sr
 54     cheng_and_chu(new_sr)			#調用乘除函數
 55     jia_and_jian(new_sr)			#調用加減函數
 56     if divmod(new_sr[1],2)[1] == 1:	#將運算后的傳回的列表中的第1個元素處於2,除后得到的元組第1個元素等於1的話,
 57         jieguo = float(new_sr[0])	#將運算后傳回的列表中的第0個元素轉化為浮點型,賦值給jieguo
 58         jieguo = jieguo * -1		#並將jieguo乘-1
 59     else:						    #如果不等於1
 60         jieguo = float(new_sr[0])	#將運算后傳回的列表中的第0個元素轉化為浮點型,賦值給jieguo
 61     return jieguo					#結束函數返回jieguo
 62 
 63 def kuohao(sr):						#去除括號函數
 64     flag = True						#設置一個標志位
 65     while flag:
 66         m = re.search("\([^()]+\)",sr)		#找出sr中最里面的括號,賦值給m
 67         if m:
 68             sub_sr = m.group()				#截取m中第一個括號
 69             sub_res = jisuan(sub_sr)		#調用計算函數,返回值賦值給sub_res
 70             sr = sr.replace(m.group(),str(sub_res))		#將m截取的第一個括號內容替換為轉化為str類型的sub_res
 71         else:
 72             print('結果:',jisuan(sr))		#如果沒有括號了,打印計算函數返回的結果
 73             flag = False					#將標志位設置為False,用於跳出循環
 74 
 75 if __name__ == "__main__":
 76     print("----------歡迎使用計算器----------")
 77     while True:
 78         flag = True							#設置一個標志位
 79         sr = input("輸入要計算的函數(q:退出):")	#讓用戶輸入計算函數,賦值給sr
 80         sr = re.sub("\s*","",sr)			#在sr中找到所有的空格,刪除
 81         error = re.search('[0-9q\*\/\-\+]',sr)	#使用正則查找方法,在sr中找到0-9q\*\/\-\+這些字符,賦值給error
 82         while flag:
 83             if not error:					#如果error為空
 84                 print("輸入有誤")			#打印輸入有誤
 85                 sr = input("請重新輸入要計算的函數(q:退出):")	#重新讓用戶輸入
 86             else:
 87                 if error.group() == 'q':		#如果用戶輸入的是q
 88                     exit("感謝使用,再見")						#則推出整個程序
 89                 kuohao(sr)						#用戶輸入的是計算函數,則調用去除括號函數
 90                 flag = False					#並將標志位設置為False
計算器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM