- 3.3.1 栈的概念、特性及基本操作 教学设计 教案 13 次下载
- 3.3.2 栈的应用 教学设计 教案 13 次下载
- 4.1 树与二叉树 教学设计 教案 13 次下载
- 4.2 二叉树的基本操作及抽象数据类型 教学设计 教案 12 次下载
- 4.4 利用二叉树实现信息加密项目分析报告样例教案 教案 12 次下载
3.4 口算作业批改项目分析报告样例教案
展开“口算批改”项目作业报告
为了帮助小学生检查口算作业,你所在的软件开发团队计划开发一款“口算批改”APP,以提高口算批改的效率。该程序的基本设想是:将手机对着作业本拍照,利用OCR(光学字符识别)技术,从图片中识别出算式,然后逐一计算,判断答案是否正确。
一、口算等式采集
为了便于学生进行后面的“口算批改”项目的进行,可以采用手工录入、互联网查找、OCR采集等各种方式,采集口算等式,并将所有等式存入“算式.csv”文件中。
二、抽象与建模过程
采集到的算式存储在“算式.csv”文件中,每行一个口算等式。判断一个等式是否正确,需要计算等号左边的运算式的值。等式中包括数字与运算符号,可以以字符串的形式,整体读入,存入字符串变量中。对于等号左边的算式,计算其结果时,用数字栈存储算式中的数字,用符号栈存储运算符号。由于算式中的运算符号加、减、乘、除、括号等存在着优先级别,以算式中的运算符号与符号栈栈顶元素进行比较,如果算式中的优先级别小于等于栈顶元素的优先级别,则栈顶元素出栈,否则入栈。如果是左括号,则直接入栈。如果是右括号,则栈中元素依次出栈,直至左括号。数字与运算符号的计算,把数字栈、符号栈结合起来操作。
三、算法与设计
采用文件读取的方式,从“算式.csv”中读取所有的算式。一个算式占一行,以字符串存储该算式。利用字符串的find函数,找到“=”在算式中的位置,并用字符串中求子串的操作,取出等号左边的算式与右边的值。对于左边等式,建立数字栈和符号栈,从左往右扫描,依次处理算式的中间计算过程。按如下方式处理:
(1)当遇到的字符是数字时,继续扫描,直至遇到非数字字符。把这次的数字串转换成整数,压入数字栈中。
(2)当遇到的是非数字时,必定为运算符号(因为字符串中仅有数字字符与运算符号),设该运算符号为x,符号栈顶元素为y,分以下几种情况处理:
①如果x为“(”时,或栈空时,则把x压入符号栈。
②如果x为“+”或“-”时,同时y为“(”,则入栈,否则, y出栈,同时,把数字栈最顶上的两个元素出栈,用运算符号y进行运算,并把运算结果压入数字栈。再把x压入符号栈。
③如果x为“*”或“/”时,同时y为“*”或“/”时,则y出栈,同时,把数字栈最顶上的两个元素出栈,用运算符号y进行运算,并把运算结果压入数字栈。再把x压入符号栈。
④如果x为“)”时,则把符号栈中元素逐一出栈,直至遇到第一个左括号。
⑤继续扫描,直至左边的算式结束,则数字栈中的元素为左边的答案。
⑥如果答案与等号右边的值一样时,则输出“✓”,否则输出“?”。
四、编写程序与测试
用Python语言编程实现。
import csv
number=[0]*100
ops=[' ']*100
top1=-1
top2=-1
#数字栈顶两个元素参与运算,并将运算结果压入栈
def cal():
op1=number[top1]
top1-=1
op2=number[top1]
top1-=1
op=ops[top2]
top2-=1
anwser=0
if op=='+':
anwser=op2+op1
if op=='-':
anwser=op2-op1
if op=='*':
anwser=op2*op1
if op=='//m.enxinlong.com/m/':
anwser=op2/op1
top1+=1
number[top1]=anwser
f=open("算式.csv","r")
f_csv=csv.reader(f)
for row in f_csv:
exp=row[0]
pos=exp.find('=')
expleft=exp[0:pos]
expright=exp[pos+1:]
print(expleft)
explen=len(expleft)
i=0
top1=-1
top2=-1
while i<explen:
num=0
while i<explen and expleft[i]>='0' and expleft[i]<='9':
num*=10+ord(expleft[i])-48
i+=1
top1+=1
number[top1]=num
if i<explen and expleft[i]=='+' or expleft[i]=='-':
if top2>-1 and ops[top2]!='(':
cal;
top2+=1
ops[top2]=expleft[i]
if i<explen and expleft[i]=='*' or expleft[i]=='//m.enxinlong.com/m/':
if top2>-1 and ops[top2]=='*' or ops[top2]=='//m.enxinlong.com/m/':
cal;
top2+=1
ops[top2]=expleft[i]
if expleft[i]=='(':
top2+=1
ops[top2]=expleft[i]
if expleft[i]==')':
while(ops[top2]!='('):
cal;
top2-=1
top2-=1
i+=1
if number[top1]==int(expright):
print("对")
else:
print("错")
f.close()
四、结论与建议
本项目在用字符串存储后,在处理左边的算式时,也可以先把中缀表达式转后缀表达式,再用栈结构处理后缀表达式的值。