内容正文:
5.3算术表达式求值
高中信息技术/教科版/选择性必修1
目录
1.引入、表达式计算卡片游戏
2.分析与抽象
3.编程解决算术表达式求值
4.课堂小结
1.引入、表达式计算卡片游戏
同学们,我们来做一个纸牌游戏,通过该游戏得到四则运算式的值,而且是任意四则运算式的值。我们来看一看这个游戏怎么玩。
任务一体验手动算术表达式求值 活动1四则运算游戏
第一步:每人手里都有一张A4纸,请大家对折4次,然后把纸裁开,可以得到16张小纸牌。
第二步:任意写一个四则运算式,为了简单,数和运算符不要超过10个。把这个四则运算式,从左到右写在纸牌上,每张纸牌只能写一个数字或运算符。比如我写的算式为 3+2 * 4-5,从左到右,把这些数字和运算符写在纸牌上。如图所示。
任务一体验手动算术表达式求值 活动1四则运算游戏
第三步:桌面上设置两个区域,一个是数字区,一个是符号区,如表所示。游戏的目标是求出算术表达式的值,把手中的牌全部放入数字区或符号区。最初所有牌都拿在手中,从左到右取牌。
放牌: 指把牌放入数字区或符号区的最上面。
消牌:指取出数字区最上面的两张牌、运算符区最上面的一张牌,用两个数字做运算符指明的运算,把结果写入空牌并放入数字区。
任务一体验手动算术表达式求值 活动1四则运算游戏
游戏规则如下:
①如果取出的牌上是数字,直接把牌放入数字区。
②如果取出的牌上是乘除号,而符号区最上面也是乘除号,就不断消牌,直到遇到加减号或符号区清空,然后把牌放入符号区。
③如果取出的牌上是加减号,就不断消牌,直到符号区清空,然后把牌放入符号区。
④当手中没有牌但符号区还有牌时,不断消牌,直到符号区清空。
⑤最后数字区的数值就是表达式的结果。
任务一体验手动算术表达式求值 活动1四则运算游戏
通过以上游戏可以发现,先进入数字区的数后运算,后进入数字区的数先运算;先进入符号区的运算符后计算,
后进入符号区的运算符先计算,就像两个栈一样,所以可以利用栈来实现表达式求值。
2.分析与抽象
任务一编程实现算术表达式求值 活动1设计数据结构
编写函数expressCalc(s)实现算术表达式求值。任务一的游戏主要涉及符号区、数字区及手上的牌。把符号区和数字区分别用栈opStack和numStack表示,手中的牌用字符串表示。前面已经学习了栈的相关知识,这里直接使用栈对象。
01.#计算表达式s的值
02. def expressCalc(s): #符号区
03.opStack=Stack() #数字区
94.numStack=Stack()
为了简单起见,这里假设四则表达式的数字都小于10。
任务一编程实现算术表达式求值 活动2设计算法
算法描述如下。
(1) 依次取字符串s中的各个字符,依字符做不同处理。
D如果字符是数字,把字符压入栈numStack。
如果字符是乘除号,当栈opStack的栈顶也是乘除号时,就不断消牌,然后把字符压入栈opStack。
3如果字符是加减号,就不断消牌,直到符号区清空,然后把字符压入栈opStack。
(2)当栈opStack不为空时,则消牌,直到栈空。
(3)程序结束时,栈numStack的栈顶数值就是表达式的值。
任务一编程实现算术表达式求值 活动2设计算法
根据以上算法,请补全下面的代码。
05.for c in s: #取表达式的各个字符
06.if C=="*”or C=="/”: #如果是乘号或除号
07.#如果符号区顶部是乘号或除号
08.while not opStack.isEmpty() and 09.opStack.peek()=="*“oropStack.peek()=="/" :
10.calculate(numStack, opStack) #消牌
11.opStack.push(c) #入符号区
12.elif C=="+”or C=="_": #如果是加减号
13.#如果符号区不为空,则不断消牌
任务一编程实现算术表达式求值 活动2设计算法
14.while not opStack.isEmpty():
15.calculate(numStack, opStack) #消牌
16.opStack.push(c) #入符号区
17.else:
18. #入数字区
19.while not opStack.isEmpty(): #如果符号区不为空
20.calculate(numStack, opStack) #消牌
21.return #得到答案
numStack.push(c)
numStack.peek( )
任务一编程实现算术表达式求值 活动2设计算法
在以上代码中,方法calculate(numStack,opStack) 完成消牌操作。消牌的算法为:取出栈numStack的两个数字,取出栈opStack的一个运算符,用两个数字做运算符指明的运算,把结果压入栈numStack。请补全下面的代码。
22.#消牌
23. def calculate(nums, ops):
24.b=float(nums.pop()) #获得第1个操作数
25.a=float(nums.pop()) #获得第2个操作数
26.op=ops.pop() #获得符号区的操作符
27.if op=="+" #如果操作符是加号,做加法
28.nums.push(a+b)
任务一编程实现算术表达式求值 活动2设计算法
29.if op=="-": #如果操作符是减号,做减法
30. .
31.if op=="*" #如果操作符是乘号,做乘法
32. .
33.if op=="/": #如果操作符是除号,做除法
34.nums.push(a/b)
nums.push(a-b)
nums.push(a*b)
3.编程解决算术表达式求值
任务一编程实现算术表达式求值 活动2设计算法
活动2已经完成了对算术表达式求值的算法设计和代码实现,请将代码集中输入到一个程序文件中,并用以下代码进行测试:
35.answer=expressCalc("3+2*4-5"
36.print(answer)
输入的时候请注意,数字要小于10。
4.课堂小结
栈是计算机科学中的一个重要概念,利用计算机科学的相关概念解决问题离不开对栈的使用。符号匹配是栈结构的典型应用。本节课我们学习了符号匹配的基本原理和基本过程,体会了栈在符号匹配中的应用以及符号匹配的算法。
作业布置:请同学们认真完成教材中的拓展练习。
下节课见!
$$