计算机专业程序设计基础课程教学改革探索
2010-12-31郭艳燕张树粹胡潇琨谭征
计算机教育 2010年8期
摘要:本文从优化教学内容、改进教学方法、完善教学环节这几个方面对程序设计基础课程提出了一系列新的教学改革思想,力争提高程序设计基础课程的教学质量和教学效果,为今后的专业课程打下良好的基础。
关键词:程序设计;c++;面向对象;实例化教学
文章编号:1672-5913(2010)08-0072-04
中图分类号:G642
文献标识码:B
作为第一门计算机专业课,程序设计基础课程应该定位在培养学生良好的程序设计素养和对计算机科学的浓厚兴趣上,为后续的专业课程奠定良好的基础。本文就如何提高教学效果、培养学生的理论知识掌握能力和实践编程能力,对程序设计基础课程教学改革提出了一些切实可行的探索方法。从教学内容,教学方法和教学环节这几个方面论述了新的教学模式改革思想,力争提高程序设计基础课程的教学质量和教学效果。
1 优化教学内容
1,1教学语言的选择
以往的程序设计基础课程选用c语言作为编程语言,c语言是单纯的面向过程的程序设计语言。但随着程序设计的发展,面向过程的编程方式在实际应用中越来越显示出它的不足之处,随之出现面向对象的高级编程语言。所以光学习c语言跟不上时代发展的潮流,必须在程序设计基础课程的学习中引入面向对象的概念,所以c语言必定会被一种高级语言所代替是时代发展的潮流。
c++语言和Java语言是两种典型的面向对象编程语言,具有相似的特性,也具有各自的优缺点。c++语言是从c语言发展起来的,它作为一种过渡性编程语言,既有面向过程的特性,又有面向对象的特性,既具有与计算机底层打交道的能力,又有许多和其它高级语言一样的高级特性,并且学习起来更易理解。Java语言作为一种严格的完全的面向对象语言,在很多方面与c++语言是相同或类似的,但是与C/C++语言相比,它的灵活度要差了许多。曾有调查表明,学生在熟练掌握C/C++语言之后,基本上只需要数周的时间就可以熟练掌握Java语言的开发技巧。而反过来,要求一个只熟悉Java语言而没有任何C/C++知识的学生掌握c++语言往往要耗费数月时间,因此选取c++语言作为程序设计的先行语言会比选用JAVA语言更有优越性。
目前,有些高校的程序设计基础课程仍然讲授c语言,第二学期或者更高年级再来讲授C++程序设计语言。但这两门课程的内容很多重复,导致的直接后果是学生经过两学期的学习,对于结构化程序设计和面向对象程序设计仍然没有形成概念,也没有很好掌握基本程序设计方法。当学生进行一个c++程序设计题目时,经常会沉浸在先前的c语言解题思路里,使用在c++中已经不再适用的方法和语法,编写出来的程序不仅在程序运行效率还是在程序的健壮性上都有所欠缺。所以直接讲授c++语言教学效果会更好。
1,2教学内容的组织
c++是从面向过程的c语言发展而来的,并非是纯面向对象的语言,因此在讲授过程中,如果将面向过程和面向对象教学完全分离,将不利于学生掌握先进的面向对象程序设计方法。虽然使用c++主要是进行面向对象程序设计,但在进行面向对象类的设计过程中,对其成员函数的设计,是离不开面向过程的设计思想的,因此,面向过程的设计是贯穿于面向对象设计中,也是一个不可忽视的环节。
教学内容上要正确处理编程细节与总体构架的关系:建议本课程一学年完成,在第一学期注重面向过程程序设计方法的讲解,在教学中对算法的描述,侧重于采用c++语言编程细节的讲解。比例,讲解数组知识点时,对未排序的数列进行排序,我们主要讲解经典的冒泡排序算法和选择法排序算法。这两个算法在今后讲解别的知识点时会经常用到,所以要求学生对此算法的思路要理解和掌握。建议在第二学期的教学中,注重面向对象程序设计方法的讲解,主要讲解程序整体框架结构和实现机制,而不再注重内部细节的实现。怎样从一个现实问题抽象出其属性和行为封装成一个具体类;在代码复用的问题上,采用的是组合还是继承,以及程序是否用到多态机制,这些是我们第二学期学习的重点。
由于教学内容的组织先讲授面向过程的思想,再讲授面向对象的思想。一旦讲述到面向对象的思想时,以前用向过程的方法所能解决的问题都不应该提倡用面向过程的思路来解决,而应该提倡用面向对象的方法来实现。
2 改进教学方法
有了适当的教学内容组织,加上好的教学方法,可以使教学难度大大下降,更有利于学生接受和掌握。以下从4个方面来谈一下教学方法的改革思路。
2,1学习计算机系统的基础知识,做好课程入门前的准备工作
对于刚接触程序设计的学生来说,程序设计语言入门之前相关知识的掌握是至关重要的。程序设计语言的教学应与计算机系统紧密结合。对计算机系统有足够的认识和深刻的理解,才能掌握程序设计语言的精髓和充分发挥程序设计语言的潜能。因此,教师本人应该对计算机系统的一些特性和原理理解深刻,对程序设计语言的背景理解透彻,如果教师仅仅从纯语言的角度讲授语言,一系列类似问题得不到正确解释,致使学生不能知其所以然,会直接影响教学质量。
所以,在正式开始讲解程序设计语言之前,应该先讲授与编程相关的计算机基础知识,让学生对计算机运行机制产生一个初步的认识,尤其对于那些在开设程序设计基础课程之前没有开设过计算机文化基础课程的院校是极其必要的。计算机基本组成部分、计算机运行的基本原理、计算机怎样运行程序,组成程序的指令代码、机器代码是二进制形式、各种计算机数值进制种类以及之间的换算方法、计算机中数据的存储,以及内存分配的问题,这些都属于基本的计算机系统知识,理解了这些相关知识,对于学生以后理解程序设计语言的语法和基本概念以及各种其实现机制都会达到事半功倍的效果。
比如,如果学生已经理解了内存分配的相关知识,那就更容易明白为什么定义变量或对象的时候必须要指定类型,因为不同的类型决定了为此变量在内存中开辟空间的大小,内存空间的大小同时也限定了表数的范围。“为什么两个正数相加有时在计算机中会显示负数的结果”,就此问题从语言角度是无法解释的,但从计算机系统角度看,数的表示是有一定范围的,超过范围就会产生溢出,所出现的负数实际上就是溢出后的错误数据。同时,C++中的动态内存分配和释放符new和delete的应用,都与内存分配问题分不开。
再如,学生已经理解计算机程序的运行机制,那么学生更容易理解为什么一个程序从编写到运行必须要经历:编辑-编译-联接-调试-运行这几个基本步骤,这和计算机不能直接运行高级语言,只能直接运行机器代码这点基础知识是分不开的,从而理解为什么每个c++程序都需要编译这个重要环节。
2,2采用同一例题不同的实现方法进行知识点的分析对比,培养学生的创新精神
教师要启发学生自己去发现和扩展知识,这对于程序设计课程尤为重要。程序设计本身就是“活”的,任何一个问题都不仅只有一种解法,教师要经常鼓励学生充分发挥自己的聪明才智,启发学生通过自己编程的实践分析对比不同的算法,提高自己的实践能力,培养他们的创新精神。
由于程序设计思路的不唯一性,一个题目可运用不同的知识点来进行设计,运行出相同的正确结果。那么在讲解问题的过程中,可以采用同一例题题目,但用不同的语法、算法实现。例如,函数参数传递,分别用变量名传值、指针传值、引用传值这三种不同的传值机制来完成两个数的交换:再如,对于多个字符串的排序,我们可以利用字符数组,字符指针,指向字符数组的指针,指针数组,二级指针以及用运字符串类对象都能实现:再如比较经典的例题——Josephus问题,它的设计可以利用数组,结构体数组或链表这种面向过程的程序设计方法解决,也可以通过设计成一个Josephus类这种面向对象的程序设计方法来完成。它们的分析思路、解题难度和运行效率都是不同的,通过比较它们各自的优缺点,使学生能够对不同知识点进行比较分析,并且更有利于学生理解和掌握所运用的知识点,有助于他们在将来的程序设计工作中,不禁锢思路,有创新精神。
2,3注重教学实例的选择,将抽象的理论变得通俗易懂,注重新旧知识的融合
实例教学法是教学过程中根据每章每节的具体教学要求、教学内容选取恰当的程序实例。
c++语言中增加了许多抽象的面向对象的机制,这些机制是面向对象思想的精华,却又是c++语言中的难点,相对面向过程的思想来说,面向对象的思想更加抽象难理解,所以在实例的选取方面要精,要有代表性和典型性,同时更要考虑到学生的认知特点,好的通俗易懂的教学实例能帮助学生对抽象概念的理解。
同时要注意到新知识总是旧知识的组合或扩展,针对这个特点,在教学实施中,通过某一实例,以旧知识为基点,提出在问题解决上存在的缺陷和不足,而这些缺陷和不足又是即将学到的新知识点能解决的问题,从而使学生在较为连贯的基础上达到新知识点的扩展。
在讲解封装、继承、多态这一系列抽象概念时,应该从一个小的类例子逐步扩展。例如在讲解封装的概念时,我们可以举人类这个例子,对于抽象的人,我们应该抽象出它的共性,设计成具体的类,实现人的属性和行为的封装,由于封装性还体现在私有数据的安全性上,我们可以为人类增加一些隐私信息,不被外界所随便访问,c++类由访问控制符来限定成员的访问属性。在讲解继承的概念时,我们仍然以人类为例,派生出一个父类,然后根据父亲类再派生出一个儿子类,儿子可以继承一些父亲的共有财产,可是却不能继承父亲的一些隐私信息,这就体现了派生类对基公有成员和私有成员的访问权限问题;对于多态,我们可以在父亲类和儿子类的这个例子上继续,由于父亲类和儿子类都是以人类为最初的基类的,所有我们可以给他们发送同样的消息来让他们执行行为,因为他们又是不同的具体类,所以即使发送的消息都是相同的,可是执行的结果并非相同,这就体现了一个多态的概念。
2,4采用多媒体教学课件、黑板、教学网站等多种教学媒体的有机结合
在教学上采用黑板教授、多媒体教学课件以及教学网站手段的紧密结合,相互补充,发挥各自的长处,能够促进教学效果的改进和教学质量的提高。
教学课堂上讲授程序设计时,如果只用语言和文字表述会比较平淡,也比较抽象,让学生抓不住重点,理解起来有一定的难度;而用多媒体课件进行课堂辅助教学,尤其是利用其图示、图例的方式来辅助讲解,会使知识的表述的更加清晰易懂,利于学生理解和记忆。尤其是一些经典算法,如查找、排序、链表、递归,用学生感兴趣的Flash来进行动态的展示,可以很好的激发学生的学习兴趣,也能帮助他们很好的理解和记忆算法,同时,多媒体课件可以帮助学生进行课下自学和复习。
教学网站借助互联网的优势,能及时发布更多新的教学内容和学习资源,在突破传统课程教材封闭性的同时,更为实施研究性学习等探究活动提供了便利,从以下四个方面得以体现。
(1)通过教学网站能方便教师展示与课程相关的结构化知识,把课程学习内容相关的文本、多媒体课件等进行知识结构化重组,方便学生课后参考。
(2)教师可以将与课程相关的、扩展性的学习素材资源进行收集管理,教师可以将一些经典的算法以及以往学生好的作品进行保存和展示,提供进行程序设计的各种编程工具的下载和提供相关资源网站的链接。
(3)通过教学网站为师生提供了交流的平台,例如论坛、聊天室等等构建网上协商讨论、答疑指导,以及进行作业和上机实验任务的发布和进行网上作业提交等。
(4)教师收集与本课程相关的思考性问题、形成性练习和总结性考查的评测资料供学生网上学习或下载,让学习者能定期进行自我学习评价,检查自己的学习程度。
3 完善教学环节
程序设计是一门实践性很强的课程,仅仅满足“老师讲清、学生听懂”是不够的,学生的实际编程能力是更重要的培养目标。教学改革的重点是培养学生对计算机科学的兴趣,强调实践课程的重要性,着重培养学生的实际动手能力和协作开发能力。具体到程序设计这门课程上,教学环节应注重以下几个方面。
3,1课堂教学环节
教师要培养学生的逻辑思维能力、程序设计能力和综合解决问题的能力,自身要不断提高程序设计的能力,积累开发经验和编程技巧。有实践经验的教师,才能真正保证课堂教学的授课质量,把理论上先进的思想付诸实施,同时把实践中的体会用于教学,才能把程序设计语言课程讲解得更生动、更贴近实际应用,更能培养学生的学习兴趣,积极开展启发式、互动性教学工作,保证教学质量,提高教学效率。
3,2实验环节
要强化实验教学,注重实验内容和教学内容的配套。实验内容要有针对性,就必须安排好基本内容、提高内容、综合内容三个层次的设计。对重点知识要加强训练,要求学生按照一定的规范完成上机实验。具体要求为“明确实验目的,完成实验内容”。
实验辅导过程中,由具有丰富实际软件开发经验的青年教师担任实践课程辅导教师,并且配备能够使用c++熟练编程的指导学生辅助主讲教师辅导学生,确保每个学生都可以得到一对一的实践指导。在指导过程中,教师和指导学生会针对学生提出的程序问题进行相关讲解,保证学生知道问题出在哪,为什么出错,应该怎么修改,以保证学生得到甚解,从而达到对所学知识的理解和掌握。
实验课后,教师应该及时对上机情况进行总结,对学生上机存在的普遍问题进行归纳,在理论课上进行强调,因为这些问题是在学生学习过程中普遍忽视或出错的问题。
3,3课程设计环节
在课程学习结束,安排学生进行一个周或者更长时间的课程设计,来培养和检验学生对本课程的综合掌握能力、具体编程能力以及创新能力。实践中能够激发学生的创新思维,使学生的创新活动贯穿于整个学习过程,使创新成果通过程序设计更好的体现出来。
3,4课程考核环节
科学的课程考核方法可以有效地评价学生的学习情况。单一方面的考核是不能真实检验出学生对课程的真正掌握程度。笔试考试只能考核学生的理论知识,不能考核出学生的实际编程水平、综合分析能力及创新能力。因此,考核的方面要相对全面,主要包括三方面:笔试、上机实践、课程设计三大块。教师通过笔试考试考查学生对程序设计理论知识的掌握:教师通过每次上机实验检查学生的程序并且提问与此程序相关的问题来了解学生的程序设计能力;通过课程设计,可以考查学生的综合解决问题的能力、实际编程能力和创新能