也论“天下文章一大抄,看你会抄不会抄”

2009-08-31 07:45章小莉李晓东王艳红
计算机教育 2009年13期
关键词:设计模式数据结构

章小莉 李晓东 王艳红

摘要:“数据结构”教学中如何提升学生编程能力,是教学难点,设立课程设计是新培养方案中处理这一难点的常规做法。本文提出编程能力培养过程中,“抄”是新手上路的起点,“会抄”是老手的技巧,“善抄”是高手的秘诀之“数据结构”编程技能提升的教学新思路。

关键词:数据结构;编程能力;抄写;设计模式;集合框架

中图分类号:G642 文献标识码:A

“数据结构”课程自1968年成为计算机学科的专业基础课程以来,其讲述的理论知识至今发展不多,但是教材却在不断更新,主要变化在于算法所用描述语言不断追新。一定要追新?追新对编程能力培养有意义吗?如何提高学生编程能力?值得教师深思,因为只有处理好这一问题,才可能在课堂上把教学内容讲得清楚,说得明白,才可能让学生学习时不糊涂,让他们真地爱上“数据结构”课程,在学习中提升编程能力,掌握快速编程的技巧。

1数据结构课程难点

通常“数据结构”教材给出课程的教学目标是“研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科”,与编程关系不明确。只有参考文献[1]中开门见山地指出“这是一本关于编程方面的书籍”。查阅各类”数据结构”课程教材发现,数据结构涉及的理论知识主要有:(1)关于非数值计算要解决的3大基本数据结构——线性、树型和图形——的逻辑关系和两种物理关系(顺序存储和链式存储),(2)关于两大常见应用——查找与排序——的几种基本算法理论。教材上对3类数据结构的主要操作和查找与排序算法进行了代码实现,并讨论实现代码的时间复杂度和空间复杂度。这些内容始终变化不太多。但是,教材却在不断更新,主要是算法描述语言在追新,从Pascal到C(C++)和Java。国内教材即使是用C++描述的基本算法,其实现上也不一定是采取面向对象的编程思想。虽然Java语言提供了集合框架LinkedList、TreeSet类等,可以大大降低基本算法的实现,提高代码的复用,但是目前在学校教学中真正使用集合框架的不多,因为框架的使用让算法编程实现发生很大的改变,会转移教学难点。所以,从算法思想描述上追新的必要性可以商榷。

“数据结构”是“高级语言程序设计”的延伸,是从高级语言课程的学语句、语法,走向求解实际问题的过程。对学生来说,学习第一门编程语言时,常常花很多的精力研究语言使用的符号、语法、语言环境,忽略实际问题的分析与求解。在不断压缩的理论课时面前,面向过程的模块化思想训练有限。而在“面向对象程序设计”课程中又很难涉及到数据结构的集成框架介绍。如此之基础上,学生学习“数据结构”时,鉴于非数值计算问题解决过程复杂,算法代码量提升快,由十几行突然猛增到几十行,甚至好几百行。尤其,当强调模块划分时,子程序数量会达到十几至二十几个。这种“大规模”的程序开发,往往使学生陷入一堆语法错误的处理中,忽略知识本身的学习。教学中,放弃实践环节,则肯定不可能。毕竟探究“数据结构”课程的本质,还是在培养学生编程,以解决非数值计算的能力。

由于教材上给出的只是基本算法模块,代码量只有几行,一种数据结构的知识连贯性不明显,学生通读课本时不容易理解这些基本算法的实际作用。教材上列举的实际应用例子解决的都是小问题。而实际需要中,无论是游戏软件,还是编译、操作系统、数据库等大型计算机系统软件都与数据结构知识紧密相关。教材与实际的脱节,难于提起学生的学习兴趣,也是教学的一大难点。

2拉近理论与实践距离的探索

实践环节可以帮助学生理解和消化理论知识点,并且使学生自己动手编程解决实际问题。为了不同层次的学生都能自己动手做实验,实践内容分层设立教学目标。

初级:验证型实验。本着自己动手练习一遍,以帮助理解理论知识点的目的,依据理论学习,设置验证型题目。如线性结构应用题目有:教材43页的多项式相加的实现;53页的10以内数据的表达式求值等。这类题目的主要算法已经在课堂上详细讲述,所以学生在实验中的任务就是把教学内容验证一遍。

这类实验题目比较合适前导课程“高级语言程序设计”学得不好的学生,他们不会因为语言基础差,又需要理解很多“数据结构”的内容,而难于自己动手。但是对于成绩好的学生,显然,训练力度太小。

中级:扩展型实验。这是为有一定能力进行程序设计的学生设置。实验题目主体内容与初级要求相同,结果却要求更多。如整型数或实型数表达式计算、多项式相乘等。学生在完成初级题目的基础上,做适当的扩充能达到中级要求。

高级:设计型实验。这类题目主要是针对程序设计能力强、有自我发挥愿望的学生设置。题目本身的内容与生活贴切,如“超市大赢家”电视节目中的猜商品价格、计算机与人对弈五子棋等。学生必须独立分析问题和设计问题。

分层设立教学目标的优点是:不同学习能力的学生都有机会实际动手,每个人都有可以独立完成实验的空间。

3 “抄”的由来、作用与方法

具体教学实施中发现,实验内容设置的良好愿望未必能激发学生的学习兴趣,跨不过自己能编码的这道“鸿沟”,学生的学习兴趣依然不高。究其原因是教材上的理论与实践题目,尤其是高级目标题目离得太远。新问题是如何跨越“鸿沟”?

抄作业、抄实验是时下校园里很常见的现象,教师如何引导学生以杜绝抄袭?惩罚!没见本质上的改变;放任!肯定不可取。鉴于“数据结构”教材上的知识是基本操作的实现,在实际问题求解中引用这些知识点可获得较好的结果,因此在教学中,提出可以“抄”。课堂上注重分析不同代码之间的异同点,如教材24页线性表结点插入和删除算法中,移动元素代码是相同的,不同是前一算法插入一个元素,后一算法删除一个元素。再如,“数据结构”中每种结构定义一个抽象数据类型,分析它们的相同和不同,再进一步对比它们的实现代码的异同点,学生会发现:基本操作相同的不同数据结构之间,其基本算法实现有很多相同点,从而理解教师说的:“抄袭不是copy,而是理解了之后的copy and rewrite”,是根据情况找到一段功能相似的代码,按需要修改,而不是乱抄、瞎抄。教师平时在作业批改中,注意区分两类不同性质的“抄”,对乱抄提出批评,介绍如何判断乱抄。在实验中,给出数据结构基本操作算法的可调用代码,让学生直接引用,以便他们有精力关注待求解问题的核心内容。

“抄”的点子源于学习与工作的体会——大量实例的阅读与积累,可以提高工作效率。也源于“数据结构”课程本身的特点,树型结构和图形结构中,核心算法思想只有“遍历”,其他关于这两大类结构的基本算法都是遍历算法的变形和应用。实际教学中,对比遍历算法和实际应用问题求解的核心思想,分析“抄”的作用。

“抄”的作用非常强大。现在市场上有很多“百例”书籍,给出各种典型应用问题的设计思想与实现代码。学生在实习、课程设计以及毕业设计中需要完成的任务,虽然与这些典型实例不相同,但是若干典型实例具体求解的局部思想完全可以借鉴和参考。因此,在指导实习与实验中,建议学生找到与求解问题的最接近解,以之为核心,逐步修改或扩展,完成任务。这种方法比完全从空白开始设计到代码编写更快,结果常常也相对更好。

“抄”是否会阻碍学生创新能力的发挥呢?回答是:不会!因为提倡的是为我所用的“抄”,是理解之后依据需要合理的“抄”,是围绕自己求解问题的主题思想来抄。这种学习方法,“抄”仅仅是一个用词而已,实质是“参考”和“复用”。但是对学生来说,教师提倡他们“参考”,他们会有畏难情绪,感觉学不会。改用“抄”一词,从心理上给他们简单容易、顺手拈来的感觉,更利于引导他们自信地自己动手解决问题。例如,在“线性结构应用”实验中有题目“求解两个多项式之间的相乘C(x)=A(x) *B(x)”,分析题目要求可知,复用教材第2章多项式相加算法,再在调用复用代码前编程子算法得到first(x)(A(x)前一项与B(x)之积)和second(x)(A(x)后一项与B(x)之积),就可以实现实验要求。实验指导中提示学生用连续加法完成乘法的思想,他们自己就能很好地复用教材代码。再如,教材上“图结构”内容虽然和“树结构”一样主算法是“遍历”,树结构中应用主要是直接修改遍历算法中的“访问”语句,图结构的最小生成树、拓扑排序等问题却不是直接调用遍历算法,而是另外编写代码,然而分析代码可以发现,它们贯穿的是遍历思想。所以在“图结构”授课之后的章节小结中围绕“遍历”算法,分析其他应用算法实现中如何用遍历思想,有利于学生在完成图相关的“城市巡游”“星球大战”等实验题目编码时,参考“遍历”算法实现的方法。

4高手“抄袭”之门道

“抄袭”可以说也是计算机业界的行规。面向对象设计是现在软件开发的重要方法,其目标是提高代码的复用率。而复用的更高境界是设计模式。C. Alexander说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心思想。这样,就能一次又一次地使用该方案而不必做重复劳动”。设计模式,实现了同类问题求解的思维方式的共享。用通俗的话来说,使用设计模式就是“抄袭”他人求解问题的思想。在面向模式的软件体系结构一书中,归纳了常见的软件体系结构,并给出了这些软件实现的设计模式思想。一个编程高手,必然会对设计模式有深入的了解,并在自己的编码工作中使用各种设计模式实现框架来搭建自己任务的程序代码架构,随后按任务的要求编写必要的模块代码。如Struts和Hibernate框架在数据库应用系统的开发中被广泛使用。如今作为计算机软件工程方向的专业课程——《软件工程》——就在软件设计中包含了“复用设计”,全方位的介绍组件、应用框架和设计模式的复用。

Java语言集合框架以几个相关的组件:接口、抽象类和完全定义的类,对基本数据结构进行了实现,如List、Set、Collection等接口,ArrayList、LinkedList、HashSet、HashMap等类,这些集合框架在具体用Java语言做数据结构实验时可以直接导入(import)引用,大大缩小了编码量。当然,集合框架具有软件特性:逻辑产品,不可见。因此,对新手来说,有一定的使用难度。不过,集合框架从旁证明了:如今不该再从零开始编写问题求解代码,而应该首先“抄”一段来,再下手改,以达到问题的快速求解。

5小结

每个计算机专业的学生必须具备编程能力,学校知识的学习只是进入编程的起点,掌握各类问题的程序设计方法,是教师和学生共同需要完成的任务。本文提出的“数据结构”课程中编程能力培养的教学方法,意在探索如何快速提高学生编程能力、训练学生编程思维。

参考文献:

[1] [美]William J. Collins.数据结构和Java集合框架[M]. 陈曙晖,译.北京:清华大学出版社,2006.

[2] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,1997.

[3] [美]Erich Gamma, Richard Helm.设计模式——可复用面向对象软件的基础[M]. 李英军,等译.北京:机械工业出版社,2000.

[4] [英]Ian Sommerville.软件工程[M]. 程一剑,等译.北京:机械工业出版社,2005.

[5] [德]Frank Buschmann, Regine Meunier.面向模式的软件体系结构(I):模式系统[M]. 贲可荣,等译.北京:机械工业出版社,2005.

Debating on “Copying and Rewriting rather than Plagiarizing ”

——Exploring A Way to Improve Students Ability for Program in Teaching of Data Structure

ZHANG Xiao-li; LI Xiao-dong; WANG Yan-hong

(Department of Computer Science and Technology, Beijing Electronic Science and Technology Institute, Beijing 100070, China)

Abstract: A Difficulty in the teaching of Data Structure is how to improve students ability for programming. Course Design is a frequent way that can overcome this difficult in new educating project. The paper shows “Copying and rewriting rather than plagiarizing” is a way that can improve the students programming capability while they study Data Structure. Authors deem that “copy” is a jumping-off point for novice, “able to copy” is a skill for veteran, and “be good at copy” is recipe for master-hand.

Key words: Data Structure; program; copy; design model; collections framework

猜你喜欢
设计模式数据结构
“1+1”作业设计模式的实践探索
新媒体下的广告设计教学改革与创新方法研究
数据结构线上线下混合教学模式探讨
智慧图书馆环境下的融贯式服务设计模式研究
重典型应用,明结构关系
信息化教学模式构建研究
基于生产者/消费者设计模式的连续音频信号采集系统
浅析基于问题的教学设计模式
数据结构与算法课程设计教学模式的探讨
高效学习数据结构