(共17张PPT)
项目挑战:口算批改
单击此处添加副标题
项目挑战:口算批改
为了帮助小学生检查口算作业,我们计划开发一款“口算批改”APP,以提高口算批改的效率。该程序的基本设想是:将手机对着作业本拍照,利用OCR(光学字符识别)技术,从图片中识别出算式,然后逐一计算,判断答案是否正确。
知识回顾
后缀表达式计算
def op_js(n,m,op):
s=0
if op=='*':
s=n*m
elif op=='/':
s=n/m
elif op=='+':
s=n+m
elif op=='-':
s=n-m
return s
ss=[‘6’,’7’,’8’,’5’,’-’,’*’,’+’]
stack=[ ]
for i in ① :
if i in '+-*/':
n2=stack.pop()
n1=stack.pop()
stack.append( ② )
else:
stack.append(int(i))
print(‘结果为:’+ ③ )
op_js(n1,n2,i)
str(stack[0])
ss
是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。
与前缀或后缀不同的是,中缀表达式中括号是必需的。还需要考虑算数运算符的优先级。
中缀表达式
知识链接
探索新知——中缀转后缀
中缀表达式
后缀表达式
6+7-8
6 7 + 8 -
6+7*8-5
6 7 8 * + 5 -
6+7*(8-5)
6 7 8 5 - * +
1.转换前后,数字的顺序有无改变?
2.转换前后,运算符的顺序有无改变?
3.可以用什么数据结构
来处理运算符?
没有发生改变
发生改变
栈结构
①创建一个符号栈ops,用来暂存运算符 ops=[]
②创建一个列表exp,用来存放后缀表达式 exp=[]
中缀转后缀——抽象与建模
活动一:同级表达式转换
活动二:不同级表达式转换
活动三:小括号表达式转换
中缀转后缀
活动一:同级表达式转换
取到运算符时,该进行什么判断
中缀转后缀——设计算法
栈为空,入栈
栈不为空,栈顶元素出栈,再入栈
s='6+7-8'
ops=[]
exp=[]
for ch in s:
if '0'<=ch<='9':
________①_________
else:
while len(ops)!=0:
op= ____②____
exp.append(op)
else:
______③______
while ops:
op=ops.pop()
exp.append(op)
print(exp)
exp.append(ch)
ops.pop()
ops.append(ch)
活动一:同级表达式转换
不同优先级的运算符如何出入ops栈
如何表达运算符的优先级
使用字典来表示运算符的优先级
活动二:不同级表达式转换
中缀转后缀——设计算法
优先级高的先计算,先出栈
①栈为空,入栈
②当前优先级>栈顶元素优先级,直接入栈
③当前优先级<=栈顶元素优先级,栈顶元素出栈
活动二:不同级表达式转换
s='6+7*8-5’
________________
………
while len(ops)!=0:
op=ops.pop()
if ops_rules[ch]>ops_rules[op]:
ops.append(op)
ops.append(ch)
break
else:
exp.append(op)
else:
ops.append(ch)
………
ops_rules={'+':1,'-':1,'*':2,'/':2}
s='6+7-8'
ops=[];exp=[]
for ch in s:
if '0'<=ch<='9':
exp.append(ch)
else:
while len(ops)!=0:
op=ops.pop()
exp.append(op)
else:
ops.append(ch)
while ops:
op=ops.pop()
exp.append(op)
print(exp)
若取到’(‘,如何存储
若取到’)’,该如何处理
活动三:小括号表达式转换
中缀转后缀——设计算法
直接入栈
ops栈顶元素依次出栈,
直到取到“(“
s='6+7*(8-5)’
………
for ch in s:
if '0'<=ch<='9':
exp.append(ch)
elif _______①______:
while len(ops)!=0:
op=ops.pop()
if _____②______ ops_rules[op]ops.append(op)
ops.append(ch)
break
else:
exp.append(op)
else:
ops.append(ch)
for ch in s:
if '0'<=ch<='9':
exp.append(ch)
else:
while len(ops)!=0:
op=ops.pop()
if ops_rules[op]ops.append(op)
ops.append(ch)
break
else:
exp.append(op)
else:
ops.append(ch)
ch in '+-*/'
op==‘(‘ or
活动三:小括号表达式转换
f=open('shibie.txt','r')
line=f.readline()
while line:
pos=line.find('=')
expleft=line[:pos]
expright=line[pos+1:]
expleft=change(expleft)
if ________①________________==int(expright):
print(expleft+'='+expright+" ")
else:
print(expleft+'='+expright+" ")
line=f.readline()
判断等式
after_js(mid_to_after(expleft))
小结
中 缀 转 后 缀 同级运算符 栈为空,入栈
栈不为空,栈顶元素出栈,再入栈
不同级运算符 优先级高的先计算,先出栈
①栈为空,入栈
②当前优先级>栈顶元素优先级,直接入栈
③当前优先级<=栈顶元素优先级,栈顶元素出栈
小括号 ①“(“直接入栈
②取到“)“,栈顶元素依次出栈,直到取到“(“
if '0'<=ch<='9':
exp.append(ch)
多位数值的读取该如何实现?
课后思考