32/19-中括号怎么打13/19 1/3中括号怎么打加1/3简便计算

作业需求:
开发一个简单的python计算器
1、实现加减乘除及拓号优先级解析
2、用户输入&1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
上图是实现的逻辑思路图,下面是对上图的分析:
整体的思想就是先匹配最小的括号例如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 从这个公式来看,应该先匹配到(-40/5),将这个括号里的公式进行计算,计算后将内容把(-40/5)替换掉,依次类推,将所有的括号都进行这样的计算与替换,在计算括号里的公式的时候需要注意的问题应该先匹配乘除进行计算与替换直到公式中没有乘除,然后再匹配加减进行计算与替换,直到匹配不到加减,这样最后的结果就是首先将括号里的内容计算并匹配,得到了一个只存在加减乘除的公式,这个时候和计算括号里的公式的方法一样,先匹配乘除计算并替换,然后匹配加减计算并替换,这样最后就能计算得出答案。
下列代码是整个的实现过程:注意:下面的代码并没有对输入公式的正确进行判断,但是已经实现了如果输入正确的公式都能正常计算
1 import re
2 #匹配整数或小数的乘除法,包括了开头存在减号的情况
3 mul_pile("(-?\d+)(\.\d+)?(\*|/)(-?\d+)(\.\d+)?")
4 #匹配整数或小数的加减法,包括了开头存在减号的情况
5 plus_minus = re.compile("(-?\d+)(\.\d+)?(-|\+)(-?\d+)(\.\d+)?")
6 #匹配括号
7 pile("\([^()]*\)")
8 #匹配乘法的时候出现乘以负数的情况,包括了开头存在减号的情况
9 mul_minus_minus = re.compile("(-?\d+)(\.\d+)?(\*-)(\d+)(\.\d+)?")
10 #匹配除法的时候出现乘以负数的情况,包括了开头存在减号的情况
11 div_minus_minus = re.compile("(-?\d+)(\.\d+)?(/-)(\d+)(\.\d+)?")
14 #定义一个两位数的加减乘除法的运算,匹配左边的右边的数字和左边的数字,然后进行计算
15 def touble_cale(str_expire):
if str_expire.count("+") == 1:
right_num = float(str_expire[(str_expire.find("+")+1):])
left_num = float(str_expire[:str_expire.find("+")])
return str(right_num+left_num)
elif str_expire[1:].count("-") == 1:
right_num = float(str_expire[:str_expire.find("-",1)])
left_num = float(str_expire[(str_expire.find("-", 1) + 1):])
return str(right_num - left_num)
elif str_expire.count("*") == 1:
right_num = float(str_expire[:str_expire.find("*")])
left_num = float(str_expire[(str_expire.find("*")+1):])
return str(right_num * left_num)
elif str_expire.count("/") == 1:
right_num = float(str_expire[:str_expire.find("/")])
left_num = float(str_expire[(str_expire.find("/") + 1):])
return str(right_num / left_num)
34 #定义一个方法用于判断是否存在乘以负数和除以负数的情况
35 def judge_mul_minus(str_expire):
#判断公式中乘以负数的部分
if len(re.findall("(\*-)", str_expire)) != 0:
#调用上面的正则取得*-的公式
temp_mul_minus = mul_minus_minus.search(str_expire).group()
#将匹配的部分的*-换成*并将-放到前面
temp_mul_minus_2 = temp_mul_minus.replace(temp_mul_minus,"-" + temp_mul_minus.replace("*-","*"))
#经更改的的部分与原来的部分进行替换
str_expire=str_expire.replace(temp_mul_minus,temp_mul_minus_2)
return judge_mul_minus(str_expire)
#return str_expire
# 判断公式中除以负数的部分
elif len(re.findall(r"(/-)", str_expire)) != 0:
# 调用上面的正则取得/-的公式
temp_dev_minus = div_minus_minus.search(str_expire).group()
# 将匹配的部分的/-换成/并将-放到前面
temp_dev_minus_2 = temp_dev_minus.replace(temp_dev_minus,"-" + temp_dev_minus.replace("/-","/"))
# 经更改的的部分与原来的部分进行替换
str_expire = str_expire.replace(temp_dev_minus,temp_dev_minus_2)
return judge_mul_minus(str_expire)
#调用change_sign将公式中的++换成= +-换成-
return change_sign(str_expire)
58 #定义一个方法取将--更改为+ +-改为-
59 def change_sign(str_expire):
if len(re.findall(r"(\+-)", str_expire)) != 0:
str_expire = str_expire.replace("+-", "-")
return change_sign(str_expire)
elif len(re.findall(r"(--)", str_expire)) != 0:
str_expire = str_expire.replace("--", "+")
return change_sign(str_expire)
return str_expire
69 #定义一个方法用于计算只有加减乘除的公式,优先处理乘法
70 def cale_mix(str_expire):
#如果公式中出现符号数字的情况即+5
/8的这种情况直接放回数字否则则先计算乘除在处理加减
while len(re.findall("[-+*/]",str_expire[1:])) != 0:
if len(re.findall("(\*|/)",str_expire)) != 0:
str_expire = str_expire.replace(mul_div.search(str_expire).group(),touble_cale(mul_div.search(str_expire).group()))
elif len(re.findall("(\+|-)",str_expire)) !=0:
str_expire = str_expire.replace(plus_minus.search(str_expire).group(),touble_cale(plus_minus.search(str_expire).group()))
return str_expire
79 #定义一个方法用于去括号,并调用上述的方法进行计算
80 def remove_bracket(str_expire):
#判断公式中是否有括号
if len(bracket.findall(str_expire)) == 0:
return cale_mix(judge_mul_minus(str_expire))
elif len(bracket.findall(str_expire))!=0:
while len(bracket.findall(str_expire)) !=0:
#print(bracket.search(str_expire).group())
#只有存在括号优先处理括号中的内容并对内容进行替换,直到没有括号位置
str_expire = str_expire.replace(bracket.search(str_expire).group(),cale_mix(judge_mul_minus(bracket.search(str_expire).group()[1:-1])))
str_expire = cale_mix(judge_mul_minus(str_expire))
return str_expire
93 if __name__ == "__main__":
while True:
user_input_expire = input("请输入你的公式:(不要带空格,q表示退出):")
print("%s=%s" %(user_input_expire,remove_bracket(user_input_expire)))
下面将代码进行分析:
首先是用写正则,一次匹配乘除法的正则,但是写的时候需要注意正则前面哟一个"-?",表示匹配乘除的时候需要匹配前面的减号。同样类似的方法匹配加减法,
然后是匹配括号,这个也是整个过程中非常重要的一个地方:pile("\([^()]*\)")
&接着是匹配乘以负数的情况已经除以负数的情况
1 #匹配整数或小数的乘除法,包括了开头存在减号的情况
2 mul_pile("(-?\d+)(\.\d+)?(\*|/)(-?\d+)(\.\d+)?")
3 #匹配整数或小数的加减法,包括了开头存在减号的情况
4 plus_minus = re.compile("(-?\d+)(\.\d+)?(-|\+)(-?\d+)(\.\d+)?")
5 #匹配括号
6 pile("\([^()]*\)")
7 #匹配乘法的时候出现乘以负数的情况,包括了开头存在减号的情况
8 mul_minus_minus = re.compile("(-?\d+)(\.\d+)?(\*-)(\d+)(\.\d+)?")
9 #匹配除法的时候出现乘以负数的情况,包括了开头存在减号的情况
10 div_minus_minus = re.compile("(-?\d+)(\.\d+)?(/-)(\d+)(\.\d+)?")
接着下面的这个方法是用于匹配两位数的四则运算
1 #定义一个两位数的加减乘除法的运算,匹配左边的右边的数字和左边的数字,然后进行计算
2 def touble_cale(str_expire):
if str_expire.count("+") == 1:
right_num = float(str_expire[(str_expire.find("+")+1):])
left_num = float(str_expire[:str_expire.find("+")])
return str(right_num+left_num)
elif str_expire[1:].count("-") == 1:
right_num = float(str_expire[:str_expire.find("-",1)])
left_num = float(str_expire[(str_expire.find("-", 1) + 1):])
return str(right_num - left_num)
elif str_expire.count("*") == 1:
right_num = float(str_expire[:str_expire.find("*")])
left_num = float(str_expire[(str_expire.find("*")+1):])
return str(right_num * left_num)
elif str_expire.count("/") == 1:
right_num = float(str_expire[:str_expire.find("/")])
left_num = float(str_expire[(str_expire.find("/") + 1):])
return str(right_num / left_num)
这个方法是用于判断存在乘以负数的时候和除以负数的情况如何处理,这里的操作是将负号放到公式的前面,然后将公式中的*-和/-都换成*和/
1 #定义一个方法用于判断是否存在乘以负数和除以负数的情况
2 def judge_mul_minus(str_expire):
#判断公式中乘以负数的部分
if len(re.findall("(\*-)", str_expire)) != 0:
#调用上面的正则取得*-的公式
temp_mul_minus = mul_minus_minus.search(str_expire).group()
#将匹配的部分的*-换成*并将-放到前面
temp_mul_minus_2 = temp_mul_minus.replace(temp_mul_minus,"-" + temp_mul_minus.replace("*-","*"))
#经更改的的部分与原来的部分进行替换
str_expire=str_expire.replace(temp_mul_minus,temp_mul_minus_2)
return judge_mul_minus(str_expire)
#return str_expire
# 判断公式中除以负数的部分
elif len(re.findall(r"(/-)", str_expire)) != 0:
# 调用上面的正则取得/-的公式
temp_dev_minus = div_minus_minus.search(str_expire).group()
# 将匹配的部分的/-换成/并将-放到前面
temp_dev_minus_2 = temp_dev_minus.replace(temp_dev_minus,"-" + temp_dev_minus.replace("/-","/"))
# 经更改的的部分与原来的部分进行替换
str_expire = str_expire.replace(temp_dev_minus,temp_dev_minus_2)
return judge_mul_minus(str_expire)
#调用change_sign将公式中的++换成= +-换成-
return change_sign(str_expire)
下面的方法用于将公式中可能会出现++和--的情况,将其替换为++替换为+将--替换为+
1 #定义一个方法取将--更改为+ +-改为-
2 def change_sign(str_expire):
if len(re.findall(r"(\+-)", str_expire)) != 0:
str_expire = str_expire.replace("+-", "-")
return change_sign(str_expire)
elif len(re.findall(r"(--)", str_expire)) != 0:
str_expire = str_expire.replace("--", "+")
return change_sign(str_expire)
return str_expire
这个方法用于处理括号里面的四则运算以及整个公式没有括号,只剩下四则运算的情况,优先匹配乘除计算,如果没有乘除了匹配加减进行计算
1 #定义一个方法用于计算只有加减乘除的公式,优先处理乘法
2 def cale_mix(str_expire):
#如果公式中出现符号数字的情况即+5
/8的这种情况直接放回数字否则则先计算乘除在处理加减
while len(re.findall("[-+*/]",str_expire[1:])) != 0:
if len(re.findall("(\*|/)",str_expire)) != 0:
str_expire = str_expire.replace(mul_div.search(str_expire).group(),touble_cale(mul_div.search(str_expire).group()))
elif len(re.findall("(\+|-)",str_expire)) !=0:
str_expire = str_expire.replace(plus_minus.search(str_expire).group(),touble_cale(plus_minus.search(str_expire).group()))
return str_expire
下面的方法用于匹配括号用,匹配到括号后调用上面的方法进行计算和替换,直到整个公式计算完毕
1 #定义一个方法用于去括号,并调用上述的方法进行计算
2 def remove_bracket(str_expire):
#判断公式中是否有括号
if len(bracket.findall(str_expire)) == 0:
return cale_mix(judge_mul_minus(str_expire))
elif len(bracket.findall(str_expire))!=0:
while len(bracket.findall(str_expire)) !=0:
#print(bracket.search(str_expire).group())
#只有存在括号优先处理括号中的内容并对内容进行替换,直到没有括号位置
str_expire = str_expire.replace(bracket.search(str_expire).group(),cale_mix(judge_mul_minus(bracket.search(str_expire).group()[1:-1])))
str_expire = cale_mix(judge_mul_minus(str_expire))
return str_expire
1 if __name__ == "__main__":
while True:
user_input_expire = input("请输入你的公式:(不要带空格,q表示退出):")
print("%s=%s" %(user_input_expire,remove_bracket(user_input_expire)))
阅读(...) 评论()脱式计算.在前面括号填得数.把得数看成公元年份.那一年发生什么重大事件.填在后面的括号内. (1)47×36+257=( ) ( ) (2)=( ) ( ) (3)=( ) ( ) (4)()÷6=( ) ( ) 题目和参考答案——精英家教网——
成绩波动大?难提高?听顶级名师视频辅导,
& 题目详情
脱式计算,在前面括号填得数,把得数看成公元年份,那一年发生什么重大事件,填在后面的括号内.
(1)47×36+257=(  )
(    )
(2)3679-58×29=(  )
(    )
(3)1643+45×8=(  )
(    )
(4)(10000+2048)÷6=(  )
(    )
答案:解析:
(1)1949 中华人民共和国成立
(2)1997 香港回归
(3)2003 “非典”传播 中国载人飞船发射成功
(4)2008 第29届奥运会在北京举行
请在这里输入关键词:
科目:小学数学
来源:数学教研室
脱式计算,在前面括号填得数,把得数看成公元年份,那一年发生什么重大事件,填在后面的括号内.
(1)47×36+257=(  )
(    )
(2)3679-58×29=(  )
(    )
(3)1643+45×8=(  )
(    )
(4)(10000+2048)÷6=(  )
(    )
科目:小学数学
来源:数学教研室
脱式计算.把得数填在前面的括号里,把得数看成几月几日,在后面的(  )里填上是什么纪念日.
(1)26×35-859=(  )
(    )
(2)925-24×36=(  )
(    )
(3)270÷6+26=(  )
(    )
(4)94-448÷8=(  )
(    )
精英家教网新版app上线啦!用app只需扫描书本条形码就能找到作业,家长给孩子检查作业更省心,同学们作业对答案更方便,扫描上方二维码立刻安装!
请输入姓名
请输入手机号扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
求解数字推理1.4、13、40、121、364()2.3、1/3、1/3、1/9、1/27、1/27()A.1/243 B.1/155 C.1/162 D.1/164 3.1、1/2、6/11、17/29、()、23/38A.117/191 B.122/199 C.28 /45 D.31/47
jンs00115lん
扫二维码下载作业帮
2亿+学生的选择
这几道题目很简单啊,详细如下:1、4X3+1=13 13X3+1=40 40X3+1=121 121X3+1=364 括号里应为364X3+1=10932、你题目错了吧?我做过这道题目,应该是1,1/3,1/3,1/9,1/27,( ) 你说的这个我做不出答案,如果是 1,1/3,1/3,1/9,1/27,() 的话就好解决了,直接前两个分母相乘等于第三项分母,分子全是1不用考虑,就得出1/243了.3、第三题后面的括号和23/38位置颠倒了,应该是23/38在前,括号在末尾,变式为1/1,2/4,6/11,17/29,46/76 (),前一项的分子加分母=后一项的分子,前一项的分母加后一项的分子+1=后一项的分母,得出122/199.
为您推荐:
其他类似问题
第一道题:也可以是3的平方加第一项=第二项,3的3次方+第二项=第三项,3的4次方+第三项=第四项,3的5次方+第四项=第五项,3的6次方+第五项=1093第二道题:前项和后项相乘虚1/81,选A第三题:B
可以改写成1/1,2/4,6/11,17/29,23/38(46/76) 122/199前一项的分子加分母=后一项的分子,前一项的分母加后一项的分子+1=后一项...
第一道:后一个数是前一个数乘以三加一第二道:3=3/1 这样的话,分母陈三就是了然后就是前两个的分母相乘得第三个数的分母第三道:B先约分出来:1/1,2/4,6/11,17/29,46/76每个分数的分子为前个分数的分子分母和,分母为前个分数的分母自身分子的和加1谢了,不过
第二题有疑惑,1/9、1/27、1/27?好像不是前两个分母相...
扫描下载二维码}

我要回帖

更多关于 中括号怎么打 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信