Python制作简易版计算器(可用于初学者,课程设计,毕业设计,大作业) !!!

阅读: 评论:0

Python制作简易版计算器(可用于初学者,课程设计,毕业设计,大作业) !!!

Python制作简易版计算器(可用于初学者,课程设计,毕业设计,大作业) !!!

前文

      大家手机里都有一个出厂自带的计算器,需要用的时候直接掏出手机就能计算,特别的方便。
还记得我上小学and中学的时候,都会花10几块钱,买一个计算器、方便数学题目计算。
那时候好像进考场也可以带着计算器??
应该也许有可能是叭!!

​还有小时候很多大妈大爷的菜市场见到的计算器是很常见的,所以可见计算器的应用之广泛。

SO  大家已经猜到小编要做啥子了哈 @小粉今天带大家用Pyhton做一款简易版本的计算器小程序哦!!!

正文

该计算器思路:

ps:思路不一样哈 仅供参考

1、递归寻找表达式中只含有 数字和运算符的表达式,并计算结果

2、由于整数计算会忽略小数,所有的数字都认为是浮点型操作,以此来保留小数

使用技术:

1、正则表达式

2、递归

二、流程图:

​效果图如下😍😍😍😍😍😍:

​​​

​附代码:

import re,os,sysdef compute_exponent(arg):""" 操作指数:param expression:表达式:return:计算结果"""val = arg[0]pattern = repile(r'd+.?d*[*]{2}[+-]?d+.?d*')mch = pattern.search(val)if not mch:returncontent = pattern.search(val).group()if len(content.split('**'))>1:n1, n2 = content.split('**')value = float(n1) ** float(n2)else:passbefore, after = pattern.split(val, 1)new_str = "%s%s%s" % (before,value,after)arg[0] = new_strcompute_exponent(arg)def compute_mul_div(arg):""" 操作乘除:param expression:表达式:return:计算结果"""val = arg[0]pattern = repile(r'd+.?d*[*/%//]+[+-]?d+.*d*')mch = pattern.search(val)if not mch:returncontent = pattern.search(val).group()if len(content.split('*'))>1:n1, n2 = content.split('*')value = float(n1) * float(n2)elif len(content.split('//'))>1:n1, n2 = content.split('//')value = float(n1) // float(n2)elif len(content.split('%'))>1:n1, n2 = content.split('%')value = float(n1) % float(n2)elif len(content.split('/'))>1:n1, n2 = content.split('/')value = float(n1) / float(n2)else:passbefore, after = pattern.split(val, 1)new_str = "%s%s%s" % (before,value,after)arg[0] = new_strcompute_mul_div(arg)def compute_add_sub(arg):""" 操作加减:param expression:表达式:return:计算结果"""while True:if arg[0].__contains__('+-') or arg[0].__contains__("++") or arg[0].__contains__('-+') or arg[0].__contains__("--"):arg[0] = arg[0].replace('+-','-')arg[0] = arg[0].replace('++','+')arg[0] = arg[0].replace('-+','-')arg[0] = arg[0].replace('--','+')else:breakif arg[0].startswith('-'):arg[1] += 1arg[0] = arg[0].replace('-','&')arg[0] = arg[0].replace('+','-')arg[0] = arg[0].replace('&','+')arg[0] = arg[0][1:]val = arg[0]pattern = repile(r'd+.?d*[+-]{1}d+.?d*')mch = pattern.search(val)if not mch:returncontent = pattern.search(val).group()if len(content.split('+'))>1:n1, n2 = content.split('+')value = float(n1) + float(n2)else:n1, n2 = content.split('-')value = float(n1) - float(n2)before, after = pattern.split(val, 1)new_str = "%s%s%s" % (before,value,after)arg[0] = new_strcompute_add_sub(arg)def compute(expression):""" 操作加减乘除:param expression:表达式:return:计算结果"""inp = [expression,0]# 处理表达式中的指数compute_exponent(inp)# 处理表达式中的乘除求余等compute_mul_div(inp)# 处理表达式的加减compute_add_sub(inp)if divmod(inp[1],2)[1] == 1:result = float(inp[0])result = result * -1else:result = float(inp[0])return resultdef exec_bracket(expression):""" 递归处理括号,并计算:param expression: 表达式:return:最终计算结果"""pattern = repile(r'(([+-*/%//**]*d+.*d*){2,})')# 如果表达式中已经没有括号,则直接调用负责计算的函数,将表达式结果返回,如:2*1-82+444#if not re.search('(([+-*/]*d+.*d*){2,})', expression):if not pattern.search(expression):final = compute(expression)return final# 获取 第一个 只含有 数字/小数 和 操作符 的括号# 如:#    ['1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']#    找出:(-40.0/5)content = pattern.search(expression).group()# 分割表达式,即:# 将['1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']# 分割更三部分:['1-2*((60-30+(    (-40.0/5)      *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']before, nothing, after = pattern.split(expression, 1)print('before:',expression)content = content[1:len(content)-1]# 计算,提取的表示 (-40.0/5),并活的结果,即:-40.0/5=-8.0ret = compute(content)print('%s=%s' %( content, ret))# 将执行结果拼接,['1-2*((60-30+(      -8.0     *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']expression = "%s%s%s" %(before, ret, after)print('after:',expression)print("="*10,'previous result is',"="*10)# 循环继续下次括号处理操作,本次携带者的是已被处理后的表达式,即:# ['1-2*((60-30+   -8.0  *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']# 如此周而复始的操作,直到表达式中不再含有括号return exec_bracket(expression)# 使用 __name__ 的目的:
#   只有执行 python index.py 时,以下代码才执行
#   如果其他人导入该模块,以下代码不执行
if __name__ == "__main__":flag = Trueos.system('clear')                                                     ###清屏###print('n================================================================')print('33[33m 欢迎使用计算器 :33[0m')print('n================================================================')while flag:calculate_input = raw_input('33[32m请输入计算的表达式 | (退出:q)33[0m')calculate_input = re.sub('s*','',calculate_input)if len(calculate_input) == 0:continueelif calculate_input == 'q':it('退出程序')elif re.search('[^0-9.-+*/%//**()]',calculate_input):print('33[31m 输入错误,请重新输入!!!33[0m')else:result = exec_bracket(calculate_input)print('the expression result is %s' % result)

结尾

好啦!最后写完了哈。

完整的文章项目代码可以来小白解答学习的Python交流圈:959755565 大家一起学习、成长,Figthing!!

如文章对你有帮助,“关注点赞”和评论是对我最大的支持!!!

本文发布于:2024-02-04 13:51:02,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170708689656130.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23