基于计算思维的计算机表达式教学方法实践

2017-06-19 19:31张化川杨林黎在万
现代计算机 2017年13期
关键词:数据类型结合律表达式

张化川,杨林,黎在万

(重庆邮电大学软件工程学院,重庆 400065)

基于计算思维的计算机表达式教学方法实践

张化川,杨林,黎在万

(重庆邮电大学软件工程学院,重庆 400065)

针对计算机表达式教学中普遍存在重知识轻运用,甚至有些教材中有违反计算机编译原理等问题,提出按照运算符的优先级、结合律以及运算符中操作数的顺序确定运算符的执行顺序和按照运算符的语义在冯·诺依曼机上逐个计算表达式中运算符的两步教学方法。学生在运用该方法的过程中,学习数据类型、变量和运算符等相关的知识和技术,培养其程序流程的编程思维方式,真正落实CDIO工程教育思想中“做中学”和“基于项目教育和学习”的方针,培养学生的“计算思维”能力。

重庆市研究生教育教学改革研究项目(No.yjg143008)、全日制专业硕士研究生实践创新能力提升研究(No.yjg153037)、重庆市大学生创新创业训练计划项目、重庆邮电大学教学改革研究项目(No.XJG1215)

0 引言

表达式是计算机语言的核心内容,在程序设计课程的教学中具有重要地位,但实际的教学过程中,注重语法等方面的知识传授,对语义等方面的知识重视不够,也没有将所涉及到的基础知识系统组织起来讲授,缺少运用这些知识解决实现问题的教学内容,导致学生只能从一般的数学角度理解计算机表达式,不能理解计算机表达式在计算机中的运算过程,没有真正理解计算机表达式,出现阅读、编写和调试程序等困难情况,最终严重影响了学生编程能力的培养。

本文在CDIO工程教育思想指导下,分析了目前教学中存在的主要问题,根据计算机编译表达式的基本原理,提出了按照运算符的优先级、结合律以及运算符中操作数的顺序确定运算符的执行顺序和按照运算符的语义在冯·诺依曼机上逐个计算表达式中运算符的两步教学方法。

在这种教学方法下,学生在确定表达式中运算符的执行顺序和计算运算符的过程中,学习数据类型、变量和运算符等相关的知识和技术,培养其程序流程的编程思维方式,真正落实CDIO工程教育思想中“做中学”和“基于项目教育和学习”的方针[1-2],培养学生的“计算思维”,探寻一种计算思维能力培养“落地”[3]的新方法。

1 以计算思维培养为目标重新确定教学重点和方法

2006年3月,美国卡内基·梅隆大学计算机科学系主任周以真(Jeannette M.Wing)教授在美国计算机权威期刊Communications of the ACM杂志上给出,并定义了计算思维(Computational Thinking)。周教授认为:计算思维是运用计算机科学的基础概念进行问题求解、系统设计,以及人类行为理解等涵盖计算机科学之广度的一系列思维活动[4-5]。

计算思维即运用计算机科学的基础概念去求解问题 、设计系统和理解人类的行为[6-7]。计算思维包含两个A[4,8]:Abstraction抽象,计算思维同时在多个抽象层次上同时进行,计算思维定义层次间的关系;Automa鄄tion自动化,即计算思维的思考方式是:使抽象层次及其关系机械化。

计算机表达式来源于数学表达式,表示了计算机中的一个操作序列,从计算思维角度来讲,就是将计算机中的一个操作序列抽象为表达式,将操作抽象为运算符,序列抽象为运算符的优先级和结合律,以及运算符操作数的计算顺序,将操作的对象抽象为变量和数据类型,并Automation自动化地计算这个操作序列。因此,计算机表达式的教学重点为,根据表达式的数学特性确定表达式中运算符的计算顺序,并在冯·诺依曼体系结构(又称冯·诺依曼机)上Automation自动化地计算这个操作序列。在确定运算符的计算顺序中,学习运算符的优先级和结合律,从数学的抽象层次理解掌握表达式,在计算表达式过程中,学习运算符所规定的操作步骤,学习理解运算符的语义,学习理解变量及数据类型,从计算机技术层次理解掌握表达式。

2 表达式的教学方法和教学重点

本文根据计算机编译表达式的原理,提出了按照运算符的优先级、结合律以及运算符中操作数的顺序确定运算符的执行顺序和按照运算符的语义在冯·诺依曼机上逐个计算表达式中运算符的两步教学方法。

学生在确定表达式中运算符的执行顺序和计算运算符的过程中,学习数据类型、变量和运算符等相关的知识和技术,培养程序流程的编程思维方式。

从本质上讲,计算机表达式描述的是一个计算机中的操作序列,并没有要求满足交换律和结合律等数学定律,在实际编程中,程序员也不会关注这些数学定律,而是关注按照表达式规定操作顺序,逐个进行运算,最后能否得预期的结果。因此,确定表达式中运算符的顺序,是一个程序员必须掌握的方法。

计算机语言很多,对表达式的编译方法有一定的区别,但都基于相同的原理和方法,这些原理和方法都要落脚到表达式的递归定义,表达式的递归定义实际上规定了表达式的语法。为了便于理解,我们给出了如下的递归定义。

(1)常量和变量等是表达式;

(2)表达式经过运算符运算后仍然是一个表达式。

“递归”这种方法,在中学数学的数学归纳法中已深入学习,很容易从递归或递推两个方向理解递归定义,递推方向的顺序刚好是表达式的运算顺序,递归过程就是确定一个表达式中运算顺序的过程,这也是编译表达式的数学基础。我们将这个过程总结如下:

(1)根据优先级和结合性找到表达式中最后计算的运算符;

(2)根据这个运算符规定的操作数顺序依次计算所包含的表达式,然后再计算这个运算符;

(3)若表达式已是变量或常量,不用计算。

C++标准文档[9-10]中,计算机语言中的大多数运算符都没有规定操作数的计算顺序,只有少部分运算符,如逻辑运算符,规定了操作数的计算顺序,导致了不同的编译器可能计算顺序不同,但在一个编译器上计算顺序一定是确定的,这可能导致编写的表达式出现兼容性问题,在教学中需要重复强调。为了便于讲解和学习,本文假设没有规定操作数计算顺序的运算符,它的操作数计算顺序都是从左到右依次计算。

确定了表达式中运算符的计算顺序后,再根据运算符的语义,在冯·诺依曼机上依次计算所有运算符。从硬件上讲,计算机的种类很多,但直到现在,仍然没有突破冯·诺依曼体系结构,仍然是程序设计的理论基础,所以选择从逻辑上在冯·诺依曼机上运行表达式。

学生在确定表达式中运算符的执行顺序和计算运算符的过程中,学习数据类型、变量和运算符等相关的知识和技术。

(1)变量和数据类型

变量的概念来源于数学中的“变量”,具有数学层次的抽象特性,也具有计算机技术层面的抽象特性,即代表计算机中的内存,这也导出了数据类型的概念。从数学层次理解变量比较容易,教学的重点是从计算机技术层面掌握变量及数据类型的概念。

从计算机技术层面来讲,变量代表的就是计算机中的一块内存,涉及到变量名、数据类型、存贮的值等概念,内存的首地址、内存的长度等术语,还涉及到为变量分配内存、从变量中取数据,将数据存到变量等3个基础操作,这些是教学的重点也是教学的难点。

如图1所示,描述了变量相关教学内容之间的关系,便于从计算机技术层面掌握相关的概念。

图1 变量相关教学内容间的关系

(2)运算符

从计算机技术层面讲,运算符表示了一个操作序列,包含语法和语义两方面的内容,运算符语法相对比较好理解,语义是教学的重点,它规定了运算符表示的操作序列以及操作对象的要求,每个运算符还应有一个运算结果,因此,运算符的主要教学内容包括操作对象、操作序列、运算结果及类型转换等内容。这些在计算机语言标准文本中都有详细的规定,但对学生是新的内容,是教学的难点。下面举例说明教学的过程。

3 教学举例

国内外大部分高校都将C++列为计算机大类专业入门语言,并被程序员广泛使用。因此本文选用C++语言中具有代表性的数学表达式和计算机中特殊的表达式,举例阐述运用本文提出的教学方法进行教学的过程。

表达式x=c*f+(f/u-i%3)中c、f、u、i分别为char、float、unsigned、int类型的变量,该表达式不仅囊括了几乎所有算术运算,同时也涉及到不同数据类型间的转换,因此极具代表性。转换规则表大部分教材[11-13]中都有描述,本文不再累述,下文将举例说明。

图 2采用本文两步教学法确定的表达式执行顺序

(1)表达式中运算符的计算顺序

1)根据运算符的优先级和结合律确定表达式x= c*f+(f/u-i%3)中最后执行的运算符为“=”。

2)根据运算符“=”的操作数的顺序依次计算表达式x和c*f+(f/u-i%3)。由于表达式x中没有运算符,因此不需要计算,只需计算表达式c*f+(f/u-i%3)。

3)根据运算符的优先级和结合律确定表达式c*f+(f/u-i%3)中最后执行的运算符为“+”。

4)根据运算符“+”的操作数的顺序依次计算表达式c*f和(f/u-i%3)。

5)表达式c*f运算符只有 “*”,直接计算表达式c*f,在图2中标记为①。

6)根据运算符的优先级和结合律确定表达式 (f/ u-i%3)中最后执行的运算符为“-”。表达式(f/u-i%3)中的“()”的作用为改变运算符的优先级,并无其他语义。

7)根据运算符“-”的操作数的顺序依次计算表达式f/u和i%3。在图2中分别标记为②、③。

8)直接计算表达式(f/u-i%3)中的运算符“-”,在图2中标记为④。

9)直接计算表达式c*f+(f/u-i%3)中的运算符“+”,在图2中标记为⑤。

10)直接计算表达式x=c*f+(f/u-i%3)中的运算符“=”,在图2中标记为⑥。

(2)按顺序计算表达式中的运算符

1)根据运算符“*”的语义直接计算表达式c*f。从变量c中值取出一个char类型的值转换为double,再从变量f中取出一个float类型的值转换为double,相乘后得到一个double类型的值。

2)根据运算符“/”的语义直接计算表达式f/u。从变量f中取出一个float类型的值转换为double,再从变量u中取出一个unsigned char型的值转换为double,相除后得到一个double类型的值。

3)根据运算符“%”的语义直接计算表达式i%3。从变量i中取出一个int类型的值对3取余,得到一个int类型的值。

4)根据运算符“-”的语义直接计算表达式(f/u-i% 3)。将(的计算结果与转换成double类型的(的计算结果相减,得到一个double类型的值。

5)根据运算符“+”的语义直接计算表达式c*f+(f/u-i%3)。将(的计算结果与(的计算结果相加,得到一个double类型的值。

⑥根据运算符“=”的语义直接计算表达式x=c*f+(f/u-i%3)。将(的计算得到的double类型的值存到表达式x的指定内存中,得到变量x。

图3 确定u=i++-,a=++i执行顺序的过程

根据前面讲述的方法,在图3中,标出了该表达式的计算顺序,计算次序如下。

①根据“++”的语义计算表达式i++。i++中的“++”为后增量,将1加到变量i中,并得到原来的值(未加1的整数)。

②根据运算符“=”的语义计算表达式u=i++。将①得到的值存在到表达式u指定的内存中,得到变量u。

③根据“++”的语义计算表达式++i。++i中的“++”为前增量,将1加到变量i中,并得到变量i(左值lval鄄ue)。

④根据运算符“=”的语义计算表达式a=++i。将③变量i的值存取出,存到表达式a指定的内存中。

⑤根据运算符“,”的语义计算表达u=i++,a=++i。运算符“,”的语义是从左到右依次计算各个表达式,结果是最后一个表达式的计算,即④得到的变量a。

4 结语

本文选取表达式作为教学研究实践内容,提出了按照运算符的优先级、结合律以及运算符中操作数的顺序确定运算符的执行顺序和按照运算符的语义在冯·诺依曼机上逐个计算表达式中运算符的两步教学方法,该方法在传授语法知识的同时,更加注重语义等方面知识的传授。学生运用该方法在确定表达式中运算符的执行顺序和计算运算符的过程中,系统学习数据类型、变量和运算符等相关的知识和技术,真正理解计算机表达式在计算机中的运算过程,真正理解计算机表达式,为阅读、编写和调试程序打下坚实基础,真正落实了CDIO工程教育思想中“做中学”和“基于项目教育和学习”的方针,培养了学生的“计算思维”能力。

[1]李竹林.基于CDIO教育理念的高校计算机专业课程教学改革探讨[J].教育与职业,2012(20):127-128.

[2]查建中.论“做中学”战略下的CDIO模式[J].高等工程教育研究,2008(03):1-6.

[3]冯博琴.对于计算思维能力培养“落地”问题的探讨[J].中国大学教学,2012(09):6-9.

[4]Jeannette M.Wing.Computational Thinking[J].Communication of the ACM,2006,49(3):33-35.

[5]姚天昉.在程序设计课程中引入“计算思维”的实践[J].中国大学教学,2012(02):61-62.

[6]韩秋枫,孔波,李祁.大学计算机课程引入基于计算思维的问题探究式教学的思考[J].计算机工程与科学,2014(04):186:190.

[7]陈杰华,戴丽娟.以培养计算思维为核心的程序设计实验教学[J].实验技术与管理,2011(01):125~127.

[8]董荣胜.计算思维与计算机导论[J].计算机科学,2009(04):50~52.

[9]Kenneth Slonneger,Barry L.Kurtz.Formal Syntax and Semantics of Programming Languages:a Laboratory Based Approach[M].USA:Addison-Wesley Pub.Co.,1995.

[10]Internationg Standard-C++Standard ISO/IEC14882[M].American National Standards Institute,1998.

[11]钱能.C++程序设计教程——设计思想与实现[M].北京:清华大学出版社,2009.

[12]谭浩强.C程序设计[M].北京:清华大学出版社,2009.

[13]叶乃文,王丹.Java语言程序设计教程[M].北京:机械工业出版社,2010.

Practice of Com puter Expression Teaching Method Based on Com putational Thinking

ZHANG Hua-chuan,YANG Lin,LIZai-wan
(School of Software Engineering,Chongqing University of Posts and Telecommunications,Chongqing 400065)

According to ignoring knowledge application,even violating compilation principle of computer about teaching programming expression, puts forward two steps teachingmethod.According to operator priority,associative property,and the sequential of operation number in the two sides of the operator,we can determine the order of executing operator and calculating expressions one by one in the John von Neu鄄mann machine.Applies thismethod,students are going to lean the knowledge and technologies about data types,variables and operators, and it is going to train way of programming thinking.It really implements the policy of CDIO engineering education thinking of learning by doing and educating and learning in project,and trains the ability of Computational Thinking.

张化川(1979-),男,四川大竹人,硕士,实验师,从事领域为计算机基础课程的教学以及神经网络研究工作

2017-03-09

2017-04-20

1007-1423(2017)13-0007-05

10.3969/j.issn.1007-1423.2017.13.002

计算机语言;计算思维;表达式;CDIO

杨林(1995-),男,山东青岛人,本科,从事领域为软件建模研究工作

黎在万(1995-),女,四川泸县人,本科,从事领域为软件建模研究工作

Programming Languages;Computational Thinking;Programming Expression;CDIO

猜你喜欢
数据类型结合律表达式
灵活选用二次函数表达式
如何理解数据结构中的抽象数据类型
表达式转换及求值探析
浅析C语言运算符及表达式的教学误区
究本溯源,提高计算能力
对“运算律”单元教学的思考与建构
基于SeisBase模型的地震勘探成果数据管理系统设计
探究求和问题
线上众筹产品的特征分析与研究
相似度计算及其在数据挖掘中的应用