zoukankan      html  css  js  c++  java
  • 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
    计算器
  • 相关阅读:
    23种设计模式中的模板模式
    23种设计模式中的外观模式
    div,li,span自适应宽度换行问题
    监听自定义ItemRender的事件
    flex acionscript png图片去除多余空白,生成合适大小图片
    项目中用到RouteTable,发布到IIS7中无法访问
    记录Castle ActiveRecord访问Sqlite的配置
    如何卸载软件
    linux 下route命令
    linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别
  • 原文地址:https://www.cnblogs.com/spykids/p/5195689.html
Copyright © 2011-2022 走看看