不想看过程的话,直接看文章最后的正式源码
作业需求及分析:
流程图
https://www.processon.com/diagraming/580c5276e4b03c844a5a9716
初期感受
今天10/23,这个作业是我19号拿到的,当时一脸蒙逼,知道么?这里我不可能不可能做出来的感觉!!!
觉得不可能不是没有理由的,
1. 有多括号要怎么区配出最里面那个?? 虽然我前两篇博文有写关与正则表达式的,但还是不会。
2.输入的可是字符串字符串啊
3.如何加减乘除
4.如何先乘除,后加减
实际上遇到比这些还多,但现在就只记起这些……
分析需求:
1.先判断有无括号,无括号直接+-*/
2.有括号先提取出最里面的括号(利用正则表达式)
3.括号外面还有括号怎么办?我这里是用迭代,直到没有括号
4.没有括号,再传给1处理,OK ,搞定
我不会,但我可以去我别人的博客么,但我也看不懂……
妈的,这怎么行!
先写加减乘除,试试吧
1 def mul_mov(s):2 result = 0
3 if s[1] == '*':4 result = int(s[0]) * int(s[2])5 elif s[1] == '/':6 result = float(s[0]) / int(s[2])7 result = int(result)8
9 for i in range(3): # 去掉前三个10 s.remove(s[0])11
12 s.insert(0, result) #局部变量引用赋值前的结果13
14 if len(s) == 1:15 print(result)16 else:17 mul_mov(s)18
19
20 def main():21 choose = input("请选择:1.加减;2.乘除")22 num = input("please input:")23 if choose == '1':24 sa = re.split(r'(\D)', num)25 add_substract(sa)26 elif choose == '2':27 sa = re.split(r'(\D)', num)28 mul_mov(sa)29
30
31 if __name__=="__main__":32 main()
大概花了半个晚上,死活总算是搞出来了!
但这样肯定还有问题。我当时是这样想的:
#问题:让用户选择1,2不现实,如何让用户输入然后自动加减乘除
#思考:现在已经能够处理,单个的加减或乘除
#可否在混合中先分组出(乘除) eg: ['8+9+','9*4/3','-','4*2‘,‘+5-2’]
#这样可以处理乘除,如何分组呢??
再后来,我卡住了,我回去看我写正则表达式的文章一遍双一遍,还是想不出怎么分组? 感觉太难了,
eg: ['8+9+','9*4/3','-','4*2‘,‘+5-2’] 如何单独的匹配出'9*4/3' ??
PS:如果大神你知道,可以评论和我说下,谢谢!
卡住怎么办?我+-*/乘除都做出来了,肯定不能就此打住的。
于是我打别人的博客看,终于找到一篇我看得懂看得懂的了!!http://www.cnblogs.com/loyfee/p/5764926.html#3538071
参考代码
#coding:utf-8
#将输入的字符串格式统一转换成列表,将数字、符号、括号都成一个独立元素,#如: 12+3*(14+5) ----> ["12","+","3","*","(","14","+","5",")"]
defformat_input(input_re_value):
input_re_value= input_re_value.replace(" ","")
format_list=[]for i ininput_re_value:
format_list.append(i)
snum=0while 1:try:ifformat_list[snum].isnumeric():if format_list[snum+1].isnumeric():
format_list[snum]= format_list[snum] + format_list[snum+1]
format_list.pop(snum+1)else:
snum+= 1
else:
snum+= 1
exceptIndexError:returnformat_listbreak
#计算没有括号的列表的值。
defcomput(re_value):while "*" in re_value or "/" inre_value:for i,j inenumerate(re_value):if j == "*":
re_cheng= float(re_value[i-1])*float(re_value[i+1])
re_value.pop(i-1)
re_value.pop(i-1)
re_value.pop(i-1)
re_value.insert(i-1,re_cheng)if j == "/":
re_chu= float(re