使用标准输入输出(cmd界面)完成一个支持以下功能的计算器程序:
支持加、减、乘、除、乘方、开方、整除、求余等算术运算;
支持括号,多重括号可统一使用()小括号,也可以使用{}等三种括号混合,任选一种策略;
支持用户多次计算,直到用于输入”exit“,”quit“,”Q“等命令退出程序;
支持历史计算过程的显示(即可以查看历史记录);
支持程序说明帮助,如输入help命令给出使用方法和注意事项;
支持参数解析,该参数决定系统启动后是否将历史记录保存。
def BracketUnbalanceCheck(str_in): # 判断括号是否匹配
num = 0
for i in str_in:
if i == '(':
num += 1
elif i == ')':
num -= 1
if num != 0: # 括号不匹配
print("错误:输入的括号不匹配,请重新输入\n")
return 1
else: # 括号匹配
return -1
def main():
while True:
Str=input("请输入表达式")
if Str=="exit" or Str=="quit" or Str=="Q":
print("已退出")
break
elif Str=="help":
print("使用方法:用户由键盘输入要计算的表达式。当输入'exit'或'quir'或'Q'时停止运行,否则程序一直处于运行状态。\n输入'help'查看帮助指令\n添加命令参数'-s'即可保存本次计算记录")
else:
if BracketUnbalanceCheck(Str)==1:
continue
print(eval(Str))
cmd=input("请输入y或n选择是否保存本次记录")
if cmd=='y':
newfile=open("newfile.txt","a")
newfile.write(Str+"=")
newfile.write(str(eval(Str))+"\n")
newfile.close()
else:
pass
main()
另一个版本(使用正则表达式,参数解析功能与上例类似,此处未将其加入代码中)
import re
tarstr=input("请输入要计算的表达式")
def remove_braket(tarstr):
while True:
obj=re.search(r"\([^\(\)]+\)",tarstr)
if obj:
part1=obj.group()
part2=compute_exp(part1)
tarstr=tarstr.replace(part1,str(part2))
else:
return tarstr
def compute_exp(tarstr):
while True:
obj=re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?",tarstr)
if obj:
res1=obj.group()
res2=compute_res(res1)
tarstr=tarstr.replace(res1,str(res2))
else:
break
pattern=re.findall(r"[+-]?\d+(?:\.\d+)?",tarstr)
total=0
for i in pattern:
total+=float(i)
return total
def compute_res(tarstr):
if '/' in tarstr:
op1,op2=tarstr.split('/')
return float(op1)/float(op2)
elif '*' in tarstr:
op1,op2=tarstr.split('*')
return float(op1)*float(op2)
def main(tarstr):
tarstr=remove_braket(tarstr)
return compute_exp(tarstr)
file=open("file.txt","a")
file.write(tarstr+"=")
result=main(tarstr)
print(result)
res=str(result)
file.write(res+"\n")
file.close()