一、题目描述
请用Python3编写一个计算器的控制台程序,支持加减乘除、乘方、括号、小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算。
二、输入描述
数字包括"0123456789",小数点为".",运算符包括:加("+")、减("-")、乘("*")、除("/")、乘方("^",注:不是**!)、括号("()")
需要从命令行参数读入输入,例如提交文件为main.py,可以用python3 main.py "1+2-3+4"的方式进行调用,Java程序也是类似的,如果你的程序需要通过键盘输入,那么是不符合要求的,例如python使用input()来等待用户输入,这会因为自动评测时不会有用户输入所以不会有任何结果。
输入需要支持空格,即 python3 main.py "1 + 2 - 3 + 4" 也需要程序能够正确给出结果,Java程序也是类似的
所有测试用例中参与运算的非零运算数的绝对值范围保证在 10^9-10^(-10) 之内, 应该输出运算结果时非零运算结果绝对值也保证在该范围内
三、输出描述
数字需要支持小数点,输出结果取10位有效数字,有效数字位数不足时不能补0
对于不在输入描述内的输入,输出INPUT ERROR
对于格式不合法(例如括号不匹配等)的输入,输出 FORMAT ERROR
对于不符合运算符接收的参数范围(例如除0等)的输入,输出VALUE ERROR
对于2、3、4的情况,输出即可,不能抛出异常
同时满足2、3、4中多个条件时,以序号小的为准
四、样例
输入: 1 + 2 - 3 + 4
输出: 4
输入: 1 + 2 - 3 + 1 / 3
输出: 0.3333333333
输入: 1 + + 2
输出: FORMAT ERROR
输入: 1 / 0
输出: VALUE ERROR
输入: a + 1
输出: INPUT ERROR
五、思路总结
python中有一个eval函数可以直接进行算式的计算,但我估计这个作业的目的是让我们自己实现,故先对式子进行处理,式子的处理查阅了网上的一些方法,觉得自己能理解和写出来的就是利用正则表达式将字符串形式的算式变成列表,然后进行处理
1 importre2
3 defconversionFormula(formula):4
5 format_list = re.findall('[\w\.]+|\(|\+|\-|\*|\/|\^|\)',formula)6
7 return format_list
这里要用到re库的方法对接收的字符串进行列表的转换,例如接受[1+2*3],转换后为[ '1', '+', '2', '*', '3' ],转换完成后就是对式子进行分析,最重要的就是对括号的处理,我采取的方法是对列表进行遍历,找到最内层的括号,然后对里面的式子进行求解,然后将此括号及中间的算式替换成答案,然后递归进行新式子的求解。下面贴出的方法可以将将列表里的括号及括号里的式子处理完毕后进行返回,格式依然是列表
1 defremove_bracket(formula):2 leftBracket =03 count = 0 #用遍历列表进行计数
4
5 for i informula:6 if i == '(': #记录最内侧左括号的位置
7
8 leftBracket=count9
10 elif i == ')':11
12 smallestFomula = formula[leftBracket+1:count] #提取最内层括号里式子
13 smallestFomulaAnswer = calculator(smallestFomula) #调用calculator方法进行计算
14
15 if smallestFomulaAnswer < 0: #更新式子,对去括号后的+-,--情况进行分析
16 if formula[leftBracket-1] == '-':17 formula[leftBracket-