|
存3个数字和2个足矣,能计算任意长度的计算。这里用python写了个草稿在上面加了注释。C++版本和Fortran90版本放在附件里面,尽管编程语言不同编程的思想没啥差别。当然python确实有更简单的做法,当然最简单的大概就是exec或ast.literal_eval了,那也就没啥好讨论的了。
- #作者:卡开发发
- #日期:2019-9-20
- #计算加减乘除
- #给定a、b两个数和当中的计算符号,返回计算结果。
- def calc(a,string,b):
- if string=='+':
- return a+b
- if string=='-':
- return a-b
- if string=='*':
- return a*b
- if string=='/':
- return a/b
- #键盘输入获取计算的表达式。
- string=input('input the expression:')
- #保存三个数和两个符号,
- #例如a+b*c会被保存为tmp=[a,b,c],sign=['+','*']。
- tmp=[0,0,0]
- sign=['+','+']
- #遍历所输入的字符串
- for i in range(len(string)):
- s=string[i]
- #遇到数字就x10+新的数字,这样就将连续的数字构成的字符数组转化为数字,
- #即'abc..'=str(10*(10*a+b)+c...)
- #通过ASCII来判断是否为数字。
- if ord(s)>=48 and ord(s)<=57:
- tmp[2]=float(tmp[2]*10+ord(s)-48)
- #遇到符号就对前面三个数和两个符号进行计算。
- if s=='*' or s=='/'or s=='+' or s=='-':
- #如果第二个符号是乘除号,直接计算这乘法,
- #这样就相当于将tmp[1]和tmp[2]还有sign[1]合并为一个新的tmp[2]。
- #例如a+b*c+d...,表示为tmp=[a,b,c],sign=['+','*'],
- #现在遇到字符是第三个符号'+',则计算b*c,
- #计算后的结果就变成了tmp=[a,a,b*c],sign=['+','+']。
- if sign[1]=='*' or sign[1]=='/':
- tmp[2]=calc(tmp[1],sign[1],tmp[2])
- tmp[1]=tmp[0]
- sign[1]=sign[0]
- else:
- #如果两个符号都是加减号,直接计算第一个加减法,
- #这样就相当于将tmp[0]和tmp[1]还有sign[0]合并为一个新的tmp[1]。
- #例如a+b+c*d...,表示为tmpp=[a,b,c],sign=['+','+'],
- #现在遇到字符是第三个符号'*',则计算a+b,
- #计算后结果变成tmp=[a,a+b,c],sign=['+','+']。
- if (sign[1]=='+' or sign[1]=='-') and \
- (sign[0]=='+' or sign[0]=='-'):
- tmp[1]=calc(tmp[0],sign[0],tmp[1])
- #扔掉tmp[0]和sign[0],
- #tmp[2]设置为0用来存放新的数字,
- #sign[1]用来存放当前读取到的符号。
- tmp[0]=tmp[1]
- tmp[1]=tmp[2]
- tmp[2]=0
- sign[0]=sign[1]
- sign[1]=s
- #读取到字符串末尾后,表达式就会变成三个数的运算。
- #如果加号在前面,如a+b*c,先计算b*c,其余情况按照顺序计算。
- if sign[0]=='+' or sign[0]=='-':
- result=calc(tmp[0],sign[0],calc(tmp[1],sign[1],tmp[2]))
- else:
- result=calc(calc(tmp[0],sign[0],tmp[1]),sign[1],tmp[2])
- #输出计算结果。
- print(string+'='+str(result))
复制代码
calculator.f90
(1.18 KB, 下载次数 Times of downloads: 1)
calculator.cpp
(1.14 KB, 下载次数 Times of downloads: 2)
|
|