Python实现简单计算器

实验要求

使用标准输入输出(cmd界面)完成一个支持以下功能的计算器程序:

  1. 支持加、减、乘、除、乘方、开方、整除、求余等算术运算;

  2. 支持括号,多重括号可统一使用()小括号,也可以使用{}等三种括号混合,任选一种策略;

  3. 支持用户多次计算,直到用于输入”exit“,”quit“,”Q“等命令退出程序;

  4. 支持历史计算过程的显示(即可以查看历史记录);

  5. 支持程序说明帮助,如输入help命令给出使用方法和注意事项;

  6. 支持参数解析,该参数决定系统启动后是否将历史记录保存。

代码呈现

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()

你可能感兴趣的:(python,开发语言,正则表达式)