有关计算思维在程序设计类课程中的研究,已经引起很 多学者的兴趣[4-6]。这些研究虽然从案例设计和项目过程 等角度做了有益探索,但却忽略了对计算思维本质的讨论。
C语言程序设计课程中,我们采用李廉教授的观点,即计算 思维的本质是抽象和自动化。抽象指的是使用符号系统对问 题进行精确而严格的描述;
自动化指的是对这些符号系统施 加一定操作并按照某种结构自动地执行。
一、C语言程序中的计算思维本质之一:抽象 有些C语言程序设计课程教学的一开始就提倡使用案例 教学。这虽然能够使得学生可以迅速进入实际编程环节并建 立直观感性认识,但案例教学由于往往出现“程序就是编程 工具”的工具论现象,导致出现“只知其然,而不知其所以 然”的学习后果,不利于学生的后续发展。
对于C语言程序来说,抽象指的是使用符号系统对求解 问题进行精确而严格的描述,抽象的过程就是对实际系统建模的过程。实际上,程序是用来描述现实生活中某个实际存 在的或不存在的系统。程序就是对系统的抽象。系统之所以 存在,是因为系统具有一些关键特征和核心功能。程序中对 系统特征进行抽象的就是操作对象,对系统功能进行抽象的 就是函数。系统功能往往有多个且存在着复杂的调用关系。
例如,求一个函数定积分的功能必然涉及求函数在某一个点 的取值功能,如果该函数比较复杂且含有正弦、余弦和正切 等三角函数,还需要继续调用求这些三角函数值的功能,形 成多级调用;
有时函数执行过程中还需要调用本身,形成递 归调用。
C语言程序中的操作对象分为变量和常量。常量是对系 统中的取值不变的特征进行抽象,如圆的圆周率;
而变量是 对系统中取值可以改变的特征进行抽象,如圆的半径。不管 是哪类特征,都会有一个取值范围以及所允许的操作。例如, 对于课程成绩,其取值范围一般是从0~100,而允许对该特 征进行的操作可以是加法和减法等算术操作以及大于和小 于等比较运算;
而对于课程名字这一特征,就不能进行加法 和减法这样的算术操作。C语言程序中用来对特征的取值范 围及允许的操作进行抽象的概念是数据类型。C语言程序中 的抽象模块如表1所示。
现实生活中,经常需要描述多个相同数据类型的一个系 统特征,如所有同学的高等数学课程的成绩,可以使用一维 数组来进行描述;
而描述多个不同数据类型的多个系统特征,如学生的姓名、学生的身高和学生的年龄等,可以使用结构 体来进行描述;
如果要描述多个相同数据类型的多个系统特 征,如全班所有同学的高等数学和大学英语课程的成绩,则 可以使用二维数组来进行描述。
表1 C语言程序中的抽象模块 C语言程序中的元素 现实生活中的元素 程序 系统 函数 系统功能 函数调用 功能调用 数据类型 常量 系统特征 变量 一维数组 多个相同类型的一个系统特征 多维数组 多个相同类型的多个系统特征 结构体 多个不同类型的多个系统特征 链表或结构体数组 多个不同类型的多个系统特征的集 合 二、C语言程序中的计算思维本质之二:自动化 计算思维的另一个本质是自动化。自动化指的是对符号 系统建模的各种元素施加一些操作,并按照某种顺序的或非 顺序的结构自动地执行。对于C语言程序来说,自动化体现 为函数内部的语句在EIP寄存器加法操作支持下顺序自动地 执行以及函数之间的调用在内存堆栈区支持下自动地进行 跳转。EIP是32位机的指令指针寄存器,用来存放下一条要执行的指令的地址。EIP寄存器中增加值的大小需要根据实 际存储指令的大小来确定。
对于C语言程序来说,自动化过程中执行的对象是语句。
不同类型的语句,执行的结果和效用是不一样的。例如,一 个变量定义语句“int a”的执行结果是在内存中分配4个字 节的空间,一个返回语句“return t”的执行结果是将程序 的执行流程返回到主调函数中。这些语句的组合构成一个个 函数,程序的执行就是在某个函数之中顺序自动地执行以及 在多个函数之间来回自动地跳转。
既然程序的执行过程是在某个函数之中顺序自动地执 行以及在多个函数之间来回自动地跳转,这种自动执行需要 有相应的计算机软件和硬件基础。支持程序自动执行的软件 基础是操作系统,支持程序自动执行的硬件基础是计算机硬 件结构,即冯·诺依曼原理的程序存储思想。当用户点击执 行按钮后,程序被提交给操作系统来执行,可以不需要人为 干预。此后,程序在操作系统中以进程的方式出现。操作系 统协调内存、中央处理器和外存等硬件资源执行该进程。
函数中的语句之所以能够一个接着一个顺序地执行,主 要依赖于EIP寄存器的加法操作。当一条指令执行完成之后, EIP寄存器在原有内容的基础上再加上当前指令所占存储空 间大小,其内容便是下一条指令的地址。如此进行下去,就 可以一个一个顺序地执行函数中的语句。
程序控制之所以能够在函数之间进行跳转,主要依赖于操作系统管理的内存堆栈区。内存堆栈区是满足“后进先 出”操作约束的存储区。当操作系统开始执行用户提交的C 语言程序时,首先开始从main函数执行,main函数的相关局 部变量被压入栈中;
当执行到被调函数时,被调函数的相关 局部变量再次被压入栈中,程序控制转移到被调函数,且操 作只能对当前栈顶进行,而此时栈顶存储的就是被调函数的 相关局部变量;
而当被调函数执行结束时,被调函数的相关 局部变量从栈中退出,程序控制转移到main函数继续执行, 此时栈顶存储的是main函数的相关局部变量;
当main函数执 行结束时,main函数的局部变量从栈中退出,整个程序执行 结束。下列程序执行时的堆栈变化过程示意如图1所示。
#include "stdio.h" double s(double r) { return r*r;
} int main() { double r;
double area;
r=2.0;
area= s(r);
printf("area=%f",area);
return 0;
} 图1 函数调用过程的堆栈变化自动化过程实际反映了C语言程序解决实际问题的算法 流程。算法是解决某一问题的执行步骤。一般而言,使用C 语言进行编程之前,需要进行相应的算法设计,即构思解决 实际问题的思路和步骤。一旦这些步骤变成C语言程序语句 并形成一个完整的程序,就可以提交给操作系统自动地执行 这些步骤,这正是计算机解决问题的高效率的体现。
三、以计算思维为导向的C语言程序设计课程教学 1.教学内容 针对计算思维的抽象和自动化两大本质特征,C语言程 序设计课程的教学内容需要在原有的基础上特别强调一些 针对性的观点。例如,C语言中的各种数据类型和数据结构 可以完成实际系统中各种不同元素的抽象,一个函数之中的 顺序语句自动执行的基础是EIP寄存器的加法操作,多个函 数之间的来回自动跳转的基础是内存堆栈区的支持等。具体 强调的观点如表2所示。
表2 教学内容中需要强调的观点 C语言程序设计 课程的内容 强调的观点 C语言概述 程序是对系统的抽象 抽象过程就是C语言的建模过程 自动化过程反映C语言的算法流程 数据类型、表达式和语句 操作对象是对系统特征的抽象 语句是系统自动化执行的基本对象控制结构 控制结构是问题求解步骤的抽象 函数中顺序语句自动执行的基础是EIP寄存器的加法操 作 数组 一维数组是对多个相同类型的一个系统特征的抽 象,多维数组是对多个相同类型的多个系统特征的抽象 函数 函数是对系统功能的抽象 函数调用是功能调用的抽象 函数之间的来回自动跳转的基础是内存堆栈区的支持 结构体 结构体是对多个不同类型的多个系统特征的抽 象 指针 链表是多个不同类型的多个系统特征集合的抽象 2.教学方式 计算思维的本质是抽象和自动化。C语言程 序设计课程一般都是面向大一新生,理解抽象和自动化 进而培养计算思维,对于还处在计算机学习起点的学生来说 是比较困难的。
对于C语言程序来说,抽象过程实际就是运用C语言中各 种符号对所描述系统的建模过程,培养抽象的计算思维方式 就是培养使用C语言描述实际系统的思维过程。因此,可以 通过启发式教学方式引导学生思考如何使用C语言中的符号 来描述系统。可以提出这样的一系列问题:C语言中如何描 述一个人的身高?如何综合描述一个人的姓名、年龄和籍贯 等?如何描述一个班中所有学生的高等数学成绩?如何描述各路公共汽车站的网状信息?通过启发学生对这些问题 的思考,让学生所学的C语言中的各种符号不再“虚幻”, 让学生真正理解这些符号实际是一种建模元素,每种符号有 着其特别的抽象描述能力。
对于C语言程序来说,理解自动化过程必须借助一些形 象化的手段。例如,借助于Visual C++ 6.0平台的单步调试 功能,可以形象地演示上述C语言程序的自动化过程,如表3 所示。
表3 C语言程序执行过程中EIP和ESP寄存器内容的变化 断点 EIP寄存器内容 ESP寄存器内容 当前栈顶函数 r=2.0;
语句 00401068 0013FF24 main函数 area=s(r);
语句 00401076 0013FF24 main函数 return r*r;
语句 00401020 0013FF18 s函数 printf("area=%f",area);
语 句 00401089 0013FF24 main函数 从表3可以看出,随着EIP寄存器内容的增加,main函数 中的语句顺序自动执行,即从语句“r=2.0”到语句“area=s (r)”再到语句“printf("area=%f",area)”。ESP寄 存器是另一个重要的寄存器,它始终存放栈顶的地址。随着 main函数对s函数的调用开始,栈顶工作函数由main函数变 化为s函数;
当s函数调用结束后,栈顶工作函数又由s函数 回到main函数。
3.考核内容针对C语言程序设计课程的计算思维培养要求,考核方 式上必须从以考查语言的语法知识为主转变为以考查学生 的系统建模能力和算法设计能力为主。
系统建模能力的考查主要针对计算思维的抽象特征。例 如,可以给出各种系统特征,考查学生使用数据类型进行描 述的能力。
算法设计能力的考查主要针对计算思维的自动化特征。
当然,C语言程序设计课程中涉及的都是一些如迭代、枚举 和排序等简单算法。可将这些算法封装成各种函数来进行调 用,以考查函数中顺序语句的执行以及函数间的伴随参数传 递的跳转来理解自动化过程。因此,必须以简单算 法设计和函数调用为重点考核内容,突出对函数接口设 计和算法流程设计的考核。
参考文献:
[1] Jeannette M. Wing. Computational Thinking[J]. Communications of the ACM, 2006, 49(3):33-35. [2] 陈国良. 计算思维[J]. 中国计算机学会通讯,2012, 8(1):31-34. [3] 李廉. 计算思维——概念与挑战[J]. 中国大学教 学,2012(1):7-12. [4] 张耀文. 基于计算思维的程序设计课程案例教学法 研究[J]. 重庆电子工程职业学院学报,2012,21(3):
149-150.[5] 吴绍兵. 计算思维和程序设计能力的培养[J]. 计 算机教育,2011(16):11-14. [6] 苏海英. 计算思维理论指导下的程序设计教学改革 实践[J]. 现代计算机,2012(4):
32-34.
扩展阅读文章
推荐阅读文章
推荐内容
钻爱网 www.zuanai.cn
Copyright © 2002-2018 . 钻爱网 版权所有 湘ICP备12008529号-1