模式在程序设计教学中的应用

时间:2022-05-18 11:15:10

模式在程序设计教学中的应用

摘要:基于模式的程序设计教学方法是有益的尝试。本文分析客观存在于程序设计教学中的模式,并以算法实现级模式、程序构建级模式为例,探讨模式在程序设计教学中的应用,从思维工具、知识关联、教学效用三个方面总结这种教学新思维对于提高教学效率的作用。

关键词:程序设计;模式;算法实现级模式;程序构建级模式

程序设计是思维的艺术,而思维是没有定式的。对于程序设计的初学者来说,他们显然对这种无定式的思维呈现出不同程度的不适应。尤其是程序设计的初学者,他们的知识结构、能力构成、学习兴趣等客观因素都限制了程序设计课程教学的效果。同样一个循环累加求和问题,既可用while、do/while来实现,也可以用for循环来求解,而后者的应用形式更是千姿百态。因此,学生不能准确把握问题的本质,也不能集中精力于一种思路并加以熟练应用,无法迅速建立起一个成功的普适性经验以应对类似问题。

从人工智能中知识表达的观点来看,学生还没有用程序语言建立起关于某类问题解法的知识框架。这些知识框架对程序设计初学者显得尤为重要,有了框架,就有了依靠,简单修改现有知识框架,就能够把它们应用到具体问题,并得到满意解答,从而逐渐积累必要的自信心和成就感,这对于保持学生积极学习的兴趣具有重要的意义。从数学教学来看,人们有这样的共识,即只要对数学公式理解得好、应用得好,没有什么难题解决不了。

上述问题对于程序设计教学具有启示意义,即从特定类型问题中抽象出一些普适的“公式”,或者确立一些实用的框架,让学生利用这些“公式”和框架来解决程序设计问题。这就是客观存在于程序设计中的模式(Pattern)。

从具体问题中得来的模式反过来又能够促进具体问题的解决,指导人们正确把握事物的本质规律,并在实践中正确应用规律。在模式的基础上,人们反复修改以往的认识,积累正确的经验,坚定他们对正确模式的自信心,并逐渐形成对于特定问题的解决方案,从而成为领域中的行家里手。因此,好的模式有助于人们对成功经验的复用。而对程序设计初学者来说,其重要意义则在于:有了模式这样一种助步器,他们能够更快地学会走路、走得更稳,即使是新手也能够较快写出漂亮的程序。

本文针对计算机程序设计类课程教学中存在的问题,以C/C++程序设计、面向对象程序设计为对象,探讨以模式为主要工具和手段,改革程序设计类课程教学方法和方式,构建程序设计类课程教学的新思维。

1程序设计教学中的模式

程序设计领域中关于模式的研究由来已久,且成果丰富[1]。本文并没打算象GOF著作那样讨论23种经典设计模式的应用,而只是从教学的角度为学生建立简单易行的程序设计模式。这些在程序设计教学中总结、抽象出来的模式可能不具备GOF模式般的高度抽象和精炼,但是它对课程教学具有良好的效果。

基于模式的程序设计教学是基于新的教育学思想的一种重要尝试[2],教师与学生需要用一种新的思维方式探讨程序设计这门课程,其桥梁就是模式。多年来,在教授C/C++程序设计、面向对象程序设计等课程中,我们体会到引入基于模式的程序设计教学方法,对于培养初学者的抽象、设计能力具有非常重要的作用,这是值得尝试的新教学思维。

本文探讨的模式主要针对计算机程序设计类课程,如C/C++程序设计、面向对象程序设计、算法与数据结构等。根据不同课程对于程序设计能力培养的目标,作者在教学中构建了许多不同层级的模式,其涵盖范围、抽象程度和应用场合各不相同,典型者有如算法实现级模式、程序构建级模式。算法实现级模式侧重于函数功能和算法过程的实现,主要是对动作序列的描述。程序构建级模式侧重于程序的功能结构和组织方式。

本文对模式的构成要素作了适当定制,以简明易用的原则来设计其构成,学生自行设计的模式也大致遵守这些构成要素以相互交流。对不同模式的描述各不相同,但都包括模式名称和模式概要两个基本要素。

2典型模式及其在教学中的应用

下面以顺序遍历模式和类职责模式分别作为算法实现级模式和程序构建级模式的典型代表,说明模式的构成及其在程序设计教学中的应用。

2.1顺序遍历模式

顺序遍历模式是一个应用较为广泛的算法实现级模式,其构成如图1所示。这类算法在遍历数据序列中每个元素的同时,对数据元素施行某个操作。

模式名称:顺序遍历模式(Sequential Traverse Pattern, STP)

问题特征:遍历数据序列,同时对每个元素施行某个操作

模式概要:对于数据序列E,①确定起始元素start;②判断是否到达终止元素end;③对数据元素应用操作模式op;④应用遍历模式T获得下一元素;⑤重复步骤②。

伪代码描述:e表示序列中某位置上的元素

E e(start);

while (e != end) {

op(e);

T(e);

}

图1顺序遍历模式STP的构成

在学生掌握上述模式后,应用模式求解问题的步骤为:(1)理解待求解问题的需求;(2)根据问题特征匹配模式;(3)分析并确定算法中的各个要素,如上述start、end、op、T;(4)按照伪代码组织程序。

应用STP可以解决的问题有如对数据累加求和、逆序输出数据元素、求序列中元素的个数、求序列中最大或最小的元素、求序列中重复的元素、统计某个元素出现的次数、复制数据序列,等等,只需设置不同的操作模式op和遍历模式T即可。

以“从1到n累加求和”为例,参照STP,学生能够确定:数据序列起始元素为1,终止元素为100,遍历序列元素的模式T为++,对元素操作的模式op为+=,改成具体的语句为sum+=e,即对每个元素e,都把它累加到变量sum中。

同样典型的应用还有基于数组的线性查找算法,其代码如下所示,数据元素的起始位置和终止位置分别是start和end,其操作模式op是==,即对序列中的每个元素进行比较,遍历模式T则是++,从当前位置递增访问到下一个位置。

template

T* find(T* start, T* end, const T& key)

{

while (start < end) {

if (*start == key)break;

++start;

}

return start;

}

此外,通过设置遍历模式T使得STP能够适用于数组、链表、甚至二叉树和图等各种存储方式的数据结构。上述数组应用中是通过++模式(对元素位置start实施++操作)访问每个元素。若存储结构为链表,则通过结点指针p和结点的指针域link,把遍历模式设置成p=p->link,如下所示即为应用STP计算链表长度的代码。而对于二叉树,其遍历模式T可以设置成前序Tpreorder、中序Tinorder、后序Tpostorder和层次序Tlevel等方式,对于图可以设置成深度优先Tdfs和广度优先Tbfs等方式。

template

int Length(ListNode* head)

{

ListNode* p = head;

int size = 0;

while (p != NULL) {

size++;

上一篇:“软件工程”课程教学改革的探讨 下一篇:多功能综合性实验方法研究