资源简介 中小学教育资源及组卷应用平台第四单元 二叉树项目七 探究计算机中算术表达式的计算——了解二叉树及其基本操作第一课时 探究计算机中算术表达式的计算原理 教材分析本节的主要内容是探究计算机中算术表达式的计算原理。以探究计算机中算术表达式的计算原理为主线,整个项目分为探究计算机中算术表达式的计算原理、探究为何二叉树能将算术表达式转换为后缀表达式、构建二叉树三部分。本节课时是从问题“在计算中输入计算式后,计算机是如何判断运算顺序并进行运算的呢”导入,先通过举例分析后缀表达式的计算过程,说明计算机如何完成算术表达式的运算。在这一课时过程中,让学生逐步理解算术表达式的值是按运算符间优先级从高到低来计算的,这与四则运算的规则完全相同。通过这一项目学习过程,进一步培养学生的信息意识和计算思维。 教学目标1.探究计算机中算术表达式的计算原理;2.理解什么是后缀表达式;3.培养学生的信息意识和计算思维能力。 教学重点1.计算机中算术表达式的计算原理;2.理解后缀表达式; 教学难点1.计算机中算术表达式的计算原理;2.培养学生的信息意识和计算思维能力。 教学方法体验法、讲授法、讨论法、示例法 教学准备 计算机教室、多媒体设备、多媒体广播软件、教学课件等。 教学过程一、新课导入日常生活中,人们经常要进行四则运算,如计算3×(4+5)-7,相信大家都知道该计算式正确的运算顺序,但是在计算机中输入这个计算式后(图4-1),计算机是如何判断运算顺序并进行运算的呢?这样的计算式在计算机中称为算术表达式,书写为3*(4+5)7,须将其转换成方便计算机处理的表达式形式,并通过一定的算法来让计算机实现正确运算。二、探究计算机中算术表达式的计算原理算术表达式的值是按运算符间优先级从高到低来计算的,这与四则运算的规则完全相同。由于算术表达式的多样性和复杂性,人们很难设计很好的算法编程来求解任意表达式的值。在计算机中进行算术表达式的计算是通过栈来实现的。这一节首先讨论算术表达式的两种表示方法,即中缀表示法和后缀表示法,接着讨论后缀表达式求值的算法,最后讨论中缀表达式转换为后缀表达式的算法。1.算术表达式的两种表示通常书写的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。操作数可以是常量、变量和函数,同时还可以是表达式。运算符包括单目运算符和双目运算符两类,单目运算符只要求一个操作数,并被放在该操作数的前面,双目运算符要求有两个操作数,并被放在这两个操作数的中间。单目运算符为取正’+’和取负’-’,双目运算符有加’+’,减’-’,乘’*’和除’/’等。为了简便起见,在我们的讨论中只考虑双目运算符。如对于一个算术表达式2+5*6,乘法运算符’*’的两个操作数是它两边的5和6;对于加法运算符’+’的两个操作数,一个是它前面的2,另一个是它后面的5*6的结果即30。我们把双目运算符出现在两个操作数中间的这种习惯表示叫做算术表达式的中缀表示,这种算术表达式被称为中缀算术表达式或中缀表达式。中缀表达式的计算比较复杂,它必须遵守以下三条规则:①先计算括号内,后计算括号外;②在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;③同一优先级运算,从左向右依次进行。从这三条规则可以看出,在中缀表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。因此,各运算符实际的运算次序往往同它们在表达式中出现的先后次序是不一致的,是不可预测的。当然凭直观判别一个中缀表达式中哪个运算符最先算,哪个次之,……,哪个最后算并不困难,但通过计算机处理就比较困难了,因为计算机只能一个字符一个字符地扫描,要想得到哪一个运算符先算,就必须对整个中缀表达式扫描一遍,一个中缀表达式中有多少个运算符,原则上就得扫描多少遍才能计算完毕,这样就太浪费时间了,显然是不可取的。那么,能否把中缀算术表达式转换成另一种形式的算术表达式,使计算简单化呢 回答是肯定的。波兰科学家卢卡谢维奇(Lukasiewicz)很早就提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。采用后缀表示的算术表达式被称为后缀算术表达式或后缀表达式。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成,显然比中缀表达式的计算要简单得多。例如,对于后缀表达式12!4!-!5!/,其中’!’字符表示成分之间的空格,因减法运算符在前,除法运算符在后,所以应先做减法,后做除法;减法的两个操作数是它前面的12和4,其中第一个数12是被减数,第二个数4是减数;除法的两个操作数是它前面的12减4的差(即8)和5,其中8是被除数,5是除数。中缀算术表达式转换成对应的后缀算术表达式的规则是:把每个运算符都移到它的两个运算对象的后面,然后删除掉所有的括号即可。例如,对于下列各中缀表达式:①3/5+6②16-9*(4+3)③2*(x+y)/(1-x)④(25+x)*(a*(a+b)+b)对应的后缀表达式分别为:①3!5!/!6!+②16!9!4!3!+!*!-③2!x!y!+!*!1!x!-!/④25!x!+!a!a!b!+!*!b!+!*2.后缀表达式求值的算法后缀表达式的求值比较简单,扫描一遍即可完成。它需要使用一个栈,假定用S表示,其元素类型应为操作数的类型,假定为浮点型float,用此栈存储后缀表达式中的操作数、计算过程中的中间结果以及最后结果。假定一个后缀算术表达式以字符’@’作为结束符,并且以一个字符串的方式提供。后缀表达式求值算法的基本思路是:把包含后缀算术表达式的字符串定义为一个输入字符串流对象,每次从中读入一个字符(空格作为数据之间的分隔符,不会被作为字符读入)时,若它是运算符,则表明它的两个操作数已经在栈S中,其中栈顶元素为运算符的后一个操作数,栈顶元素的下一个元素为运算符的前一个操作数,把它们弹出后进行相应运算即可,然后把运算结果再压入栈S中;否则,读入的字符必为操作数的最高位数字,应把它重新送回输入流中,然后把下一个数据作为浮点数输入,并把它压入到栈S中。依次扫描每一个字符(对于浮点数只需扫描它的最高位并一次输入整个浮点数)并进行上述处理,直到遇到结束符’@’为止,表明后缀表达式计算完毕,最终结果保存在栈中,并且栈中仅存这一个值,把它弹出返回即可。具体算法描述为: float Compute( char * str) // 计算由str字符串所表示的后缀表达式的值, // 表达式要以'@'字符结束。{StackS;//用S栈存储操作数和中间计算结果InitStack(S);//初始化栈istrstreamins(str);//把str定义为输入字符串流对象inscharch;//用于输入字符floatx;//用于输入浮点数ins>>ch;//从ins流对象(即str字符串)中顺序读入一个字符while(ch!='@'){//扫描每一个字符并进行相应处理switch(ch){case'+':x=Pop(S)+Pop(S);break;case'-':x=Pop(S);//Pop(S)弹出减数x=Pop(S)-x;//Pop(S)弹出的是被减数break;case'*':x=Pop(S)*Pop(S);break;case'/':x=Pop(S);//Pop(S)弹出除数if(x!=0.0)x=Pop(S)/x;//Pop(S)弹出的是被除数else {//除数为0时终止运行cerr<<"Divideby0!"}break;default://读入的必为一个浮点数的最高位数字ins.putback(ch);//把它重新回送到输入流中ins>>x;//从字符串输入流中读入一个浮点数}Push(S,x);//把读入的一个浮点数或进行相应运算//的结果压入到S栈中ins>>ch;//输入下一个字符,以便进行下一轮循环处理}if(!StackEmpty(S)){//若栈中仅有一个元素,则它是后缀表达式的值,否则为出错x=Pop(S);if(StackEmpty(S))returnx;else {cerr<<"expressionerror!"}}else {//若最后栈为空,则终止运行cerr<<"Stackisempty!"}}此算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n个数据组成,则此算法的时间复杂度为O(n)。此算法在运行时所占用的临时空间主要取决于栈S的大小,显然,它的最大深度不会超过表达式中操作数的个数,因为操作数的个数与运算符(假定把’@’也看作为一个特殊运算符,即结束运算符)的个数相等,所以此算法的空间复杂度也同样为O(n)。假定一个字符串a为:chara[30]="123204/*8-6*+@";对应的中缀算术表达式为12+(3*(20/4)-8)*6@,则使用如下语句调用上述函数得到的输出结果为54。三、课堂活动结合第三单元所学的栈的相关知识,按上述方法,画出通过进栈和出栈完成后缀表达式345+*7-计算的过程。栈操作示意图:21世纪教育网 www.21cnjy.com 精品试卷·第 2 页 (共 2 页)HYPERLINK "http://21世纪教育网(www.21cnjy.com)" 21世纪教育网(www.21cnjy.com)(共31张PPT)第一课时 探究计算机中算术表达式的计算原理信息技术沪教版 选择性必修1第四单元 二叉树项目七 探究计算机中算术表达式的计算——了解二叉树及其基本操作一、新课导入二、探究计算机中算术表达式的计算原理三、课堂活动一、新课导入日常生活中,人们经常要进行四则运算,如计算3×(4+5)-7,相信大家都知道该计算式正确的运算顺序,但是在计算机中输入这个计算式后,计算机是如何判断运算顺序并进行运算的呢?这样的计算式在计算机中称为算术表达式,书写为3*(4+5)7,须将其转换成方便计算机处理的表达式形式,并通过一定的算法来让计算机实现正确运算。二、探究计算机中算术表达式的计算原理算术表达式的值是按运算符间优先级从高到低来计算的,这与四则运算的规则完全相同。由于算术表达式的多样性和复杂性,人们很难设计很好的算法编程来求解任意表达式的值。在计算机中进行算术表达式的计算是通过栈来实现的。这一节首先讨论算术表达式的两种表示方法,即中缀表示法和后缀表示法,接着讨论后缀表达式求值的算法,最后讨论中缀表达式转换为后缀表达式的算法。1.算术表达式的两种表示通常书写的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。操作数可以是常量、变量和函数,同时还可以是表达式。运算符包括单目运算符和双目运算符两类,单目运算符只要求一个操作数,并被放在该操作数的前面,双目运算符要求有两个操作数,并被放在这两个操作数的中间。单目运算符为取正’+’和取负’-’,双目运算符有加’+’,减’-’,乘’*’和除’/’等。为了简便起见,在我们的讨论中只考虑双目运算符。1.算术表达式的两种表示如对于一个算术表达式2+5*6,乘法运算符’*’的两个操作数是它两边的5和6;对于加法运算符’+’的两个操作数,一个是它前面的2,另一个是它后面的5*6的结果即30。我们把双目运算符出现在两个操作数中间的这种习惯表示叫做算术表达式的中缀表示,这种算术表达式被称为中缀算术表达式或中缀表达式。1.算术表达式的两种表示123先计算括号内,后计算括号外;在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;三条规则同一优先级运算,从左向右依次进行。1.算术表达式的两种表示在中缀表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。那么,能否把中缀算术表达式转换成另一种形式的算术表达式,使计算简单化呢 回答是肯定的。1.算术表达式的两种表示波兰科学家卢卡谢维奇(Lukasiewicz)很早就提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。采用后缀表示的算术表达式被称为后缀算术表达式或后缀表达式。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成,显然比中缀表达式的计算要简单得多。1.算术表达式的两种表示例如,对于后缀表达式12!4!-!5!/,其中’!’字符表示成分之间的空格,因减法运算符在前,除法运算符在后,所以应先做减法,后做除法;减法的两个操作数是它前面的12和4,其中第一个数12是被减数,第二个数4是减数;除法的两个操作数是它前面的12减4的差(即8)和5,其中8是被除数,5是除数。中缀算术表达式转换成对应的后缀算术表达式的规则是:把每个运算符都移到它的两个运算对象的后面,然后删除掉所有的括号即可。1.算术表达式的两种表示例如:中缀表达式:①3/5+6②16-9*(4+3)③2*(x+y)/(1-x)④(25+x)*(a*(a+b)+b)后缀表达式:①3!5!/!6!+②16!9!4!3!+!*!-③2!x!y!+!*!1!x!-!/④25!x!+!a!a!b!+!*!b!+!*2.后缀表达式求值的算法后缀表达式的求值比较简单,扫描一遍即可完成。它需要使用一个栈,假定用S表示,其元素类型应为操作数的类型,假定为浮点型float,用此栈存储后缀表达式中的操作数、计算过程中的中间结果以及最后结果。假定一个后缀算术表达式以字符’@’作为结束符,并且以一个字符串的方式提供。2.后缀表达式求值的算法后缀表达式求值算法的基本思路是:把包含后缀算术表达式的字符串定义为一个输入字符串流对象,每次从中读入一个字符(空格作为数据之间的分隔符,不会被作为字符读入)时,若它是运算符,则表明它的两个操作数已经在栈S中,其中栈顶元素为运算符的后一个操作数,栈顶元素的下一个元素为运算符的前一个操作数,把它们弹出后进行相应运算即可,然后把运算结果再压入栈S中;2.后缀表达式求值的算法后缀表达式求值算法的基本思路是:否则,读入的字符必为操作数的最高位数字,应把它重新送回输入流中,然后把下一个数据作为浮点数输入,并把它压入到栈S中。依次扫描每一个字符(对于浮点数只需扫描它的最高位并一次输入整个浮点数)并进行上述处理,直到遇到结束符’@’为止,表明后缀表达式计算完毕,最终结果保存在栈中,并且栈中仅存这一个值,把它弹出返回即可。2.后缀表达式求值的算法具体算法描述为:float Compute( char * str)// 计算由str字符串所表示的后缀表达式的值,// 表达式要以'@'字符结束。{StackS;//用S栈存储操作数和中间计算结果InitStack(S);//初始化栈istrstreamins(str);//把str定义为输入字符串流对象inscharch;//用于输入字符floatx;//用于输入浮点数ins>>ch;//从ins流对象(即str字符串)中顺序读入一个字符2.后缀表达式求值的算法具体算法描述为:while(ch!='@'){//扫描每一个字符并进行相应处理switch(ch){case'+':x=Pop(S)+Pop(S);break;case'-':x=Pop(S);//Pop(S)弹出减数x=Pop(S)-x;//Pop(S)弹出的是被减数2.后缀表达式求值的算法具体算法描述为:break;case'*':x=Pop(S)*Pop(S);break;case'/':x=Pop(S);//Pop(S)弹出除数if(x!=0.0)x=Pop(S)/x;//Pop(S)弹出的是被除数else {//除数为0时终止运行cerr<<"Divideby0!"2.后缀表达式求值的算法具体算法描述为:}break;default://读入的必为一个浮点数的最高位数字ins.putback(ch);//把它重新回送到输入流中ins>>x;//从字符串输入流中读入一个浮点数}Push(S,x);//把读入的一个浮点数或进行相应运算//的结果压入到S栈中ins>>ch;//输入下一个字符,以便进行下一轮循环处理}2.后缀表达式求值的算法具体算法描述为:if(!StackEmpty(S)){//若栈中仅有一个元素,则它是后缀表达式的值,否则为出错x=Pop(S);if(StackEmpty(S))returnx;else {cerr<<"expressionerror!"}else {//若最后栈为空,则终止运行cerr<<"Stackisempty!"}}2.后缀表达式求值的算法具体算法描述为:假定一个字符串a为:chara[30]="123204/*8-6*+@";对应的中缀算术表达式为12+(3*(20/4)-8)*6@,则使用如下语句调用上述函数得到的输出结果为54。三、课堂活动结合第三单元所学的栈的相关知识,按上述方法,画出通过进栈和出栈完成后缀表达式345+*7-计算的过程。栈操作示意图:栈操作示意图:栈操作示意图:谢谢21世纪教育网(www.21cnjy.com) 中小学教育资源网站有大把高质量资料?一线教师?一线教研员?欢迎加入21世纪教育网教师合作团队!!月薪过万不是梦!!详情请看:https://www.21cnjy.com/help/help_extract.php 展开更多...... 收起↑ 资源列表 项目七(第一课时).doc 项目七(第一课时).pptx