首页 理论教育 工科专业C语言教学目标与方法的探讨

工科专业C语言教学目标与方法的探讨

时间:2022-10-20 理论教育 版权反馈
【摘要】:工科专业C语言教学目标与方法的探讨李骏扬陈汉武C++语言是学生未来科研或工作中一种实用工具,也可以成为学习其他语言的基础。本文从对学生综合能力培养的角度出发,提出在工科领域,C++语言的教学应注重其实用性,不拘泥于语法,学生要会写程序,学会对复杂问题的分解,并能写出规范的程序。

工科专业C语言教学目标与方法的探讨

李骏扬 陈汉武

(东南大学计算机科学与工程学院,江苏南京,210096)

【摘要】 C++语言是学生未来科研或工作中一种实用工具,也可以成为学习其他语言的基础。本文从对学生综合能力培养的角度出发,提出在工科领域,C++语言的教学应注重其实用性,不拘泥于语法,学生要会写程序,学会对复杂问题的分解,并能写出规范的程序。教师在教学实践中,可以利用实例教学、现场编程等各种方法,引导学生写好程序,鼓励学生克服困难。

【关键词】 计算机语言教学 C++教学 程序设计

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

【文章编号】 1672-5913(2007)16-0016-03

一、引言

长期以来,C++语言被认为是较难学习的开发语言。在教学过程中,笔者逐步发现,C++是一门实践性很强的课程,有些教师在教学中注重各个知识点,却忽略了对学生综合能力的培养。笔者从软件开发实践和对学生综合能力培养的角度出发,对C++的教学目标和方法作了一些分析和研究,并在教学实践中取得了较好的效果。

二、教学中遇到的困难

1.C++课程特点

C++课程在我校作为一门公共基础课程开设,安排在大学本科一年级学习。C++是一门特殊的课程,编写程序的思维方式和学生在高中时期学习数学物理完全不同,这可能是学生学习C++语言遇到的第一个难题。

C++是一门实践的课程。如果与C++同时开设的课程,如果高等数学、大学物理等都是理论教学为主,那么C++几乎可以说是学生进入大学最早遇到的以实践为主的课程。我们在教学中,应该把C++作为一门实践课程而非理论课程来对待。

2.C++语言的特点

目前,比较流行的开发语言有C++、Java、VB、Delphi、VB.NET、C#等,比较这些语言,虽然C++关键字的个数并不算多,但是C++的语法灵活,这些灵活性往往带来一些负面效应。例如,C++中的case语句中不一定需要break,而C#中,break是必须的,除非多个case直接连用。C++的这些情况会导致很多难以觉察的陷阱,即使熟练的程序员也未必能够幸免。

C++虽然运行效率高,但是很多商用应用程序却不会选择C++来开发,因为C++对数据库以及其他组件拼接过于繁琐,头文件的存在也使得C++不适合作为脚本。目前,C++语言被主要使用在硬件驱动的开发,或者对运算效率非常敏感的场合(如实时图像处理)。

3.C++学习的困难和误区

C++语言自身的特点给学生的学习带来一定的难度,在编程和运行过程中容易出现许多难以察觉的错误,这些挫折也使得学生感到学习C++的难度倍增。

也由于语法灵活,有些教师在教学中往往过多的注重语法,似乎只有完全掌握语法才能写出好的程序,于是,C++题目中常常出现复杂的表达式分析,没有实际功能的程序分析。这些缺乏可读性的程序不仅没有实际意义,还会大大降低学生对C++课程的认同感。当授课的重心偏向于语法,就会忽略对实际编程能力的培养,使学生失去学习C++的兴趣和信心。

三、学习的目标

1.语法的学习

我们学习自然语言时,语法是基础,目标是和别人进行交流。同样的,在学习计算机语言时,语法也是基础,并使用计算机语言类编写出程序。对于大多数理工科专业的学生来说,计算机语言和英语一样,是将来研究工作中的一个工具(有别于研究的对象),所以我们应当把计算机语言当作一个工具去学习,要注重其实用性,而不是工具内部实现细节或者繁琐的语法现象。在语法之外,我们还应当学习怎么写程序,如何写好程序,以及学习如何去学习新的领域。语法不是全部,一位熟练的程序员学习一门新的计算机语言的语法,也许只要2个小时,但是要熟练掌握这门语言,特别是当这门语言有独特的类库,那么就必须阅读类库参考和例程,并进行大量的练习。所以,在C++教学过程中,要让学生了解常用的语法现象,但不拘泥于语法。

2.算法的学习

学生应当掌握一些基本的算法。虽然其他的课程(如数据结构)中会详细探讨各类算法,但算法是编写程序中必须的。通过C++的学习,学生们应该掌握最常用的经典算法。但是仅掌握这些经典算法是不够的。我们还是希望通过C++的学习,使学生掌握从算法到程序代码的转化,能够将一个陌生的、描述详细的算法转化为切实可行的代码。

3.对复杂问题的分析能力

无论是一个陌生的算法,还是一个新的用户需求,学生在将其变成可以运行之前,都必须对其进行分析。这种分析包含两层含义:算法的分析和程序结构的分析。

一个看似复杂的算法,都是一系列简单的算法问题的逻辑组合。例如,双向链表的操作对于很多学生来说,似乎是一个复杂的问题。图1描述了在双向链表中插入新节点的过程,该过程被分解为若干的步骤,其中每个步骤都不复杂。图中的每一个步骤都可以进一步分解。如步骤4,在链表头部插入新节点,该问题又可以由以下几个基本步骤组成:找到插入点左边的节点P1;找到插入点右边的节点P2;通过四个赋值语句建立和新节点P的连接。

img39

图1 双向链表插入节点时的步骤分析

在程序结构上,学生也应当具有一定的分析能力。C++的思想在于“面向对象”。但是要让学生真正了解“面向对象”却是不容易的。要理解“面向对象”的内涵,不仅需要了解封装、继承、多态的概念,还需要具有将这些概念运用到程序中去的能力,这些能力体现在对类的结构、继承关系的分析,以及对类的成员的设置、如何使用虚函数的分析。

例如,一段描述树结构的程序,其至少具有以下几个类:CTree表示整个树,CNode表示节点,CNodeCollection表示节点的集合,用双向链表实现。考虑各个类的公有成员,各个类的静态结构如图2所示:

img40

图2 树结构程序中各个类的静态结构图

然后考虑各个类内部的实现方式。比如,图2中,比较复杂的结构是CNodeCol-lection。可以采用一个链表来实现。它既可以从一个现有的链表类派生,也可以将一个链表作为其私有成员。

4.工程化思想的融入

如果将一个学生写的作业和一位专业程序员编写的代码放在一起,就不难看出其中的差别。从代码上来看,学生的作业普遍缺乏注解,变量或函数名混乱,吝惜空格和换行;从结构上讲,由于程序缺乏良好的分析过程,类的类成员的结构混乱;从功能上讲,程序功能简单,缺乏异常处理。

所以,我们应当引导学生,在编写程序的过程中,注重程序风格,使程序规范化,工程化,这需要学生在编写程序的过程中注意很多细节问题。这些问题包括:良好的程序结构,统一的程序风格,清晰的程序注解,周全的特殊情况处理,精确的异常处理,方便快捷且美观的用户界面等等。

四、教学方法

1.案例与实例分析

案例和实例是有所区别的。案例应当贴近现实,有较为完整的需求,程序必须具有一定的容错性和良好的用户界面,案例教学需要学生充分的发表自己的观点,而不仅仅是教师的灌输。但是,限于学生知识的能力和教学任务,真正的案例教学在目前的环境下是很难实现的。而实例更接近于普通的例题,但是这类例题更贴近于现实需求,是案例的简化。笔者在实际授课中,主要采用实例教学,并借鉴案例教学中的一些方法。

在实例的选择上,应选择更贴近现实需求,或者带有趣味性的问题。有的实例讲究算法,有的实例没有很复杂的算法,但是有比较复杂的功能,讲究对程序整体结构的把握。在实例讲解的过程中,首先进行需求和核心算法分析,程序的总体框架设计,类静态结构设计,最后,依据教学要求有选择的分段实现程序。

2.现场编程

笔者在近几年的C++教学中,一直坚持在课堂上直接编写示例程序,并取得了非常好的教学效果。现场编可以让学生了解编写程序过程中所出现的各种困难和陷阱,着重讲解编程时需要注意的细节问题。在讲解完主要的语法和算法时,教师给出例题,分析例题的核心算法、类的静态结构等或函数构造等。然后开始编写程序,整个程序的编写时间不宜超过15分钟。教师一边编写,一边讲解,控制编程节奏,让学生紧跟教师的思维;在编程的过程中,时而发问,与学生互动。

教师在编写程序的过程中,可以让学生直观地看到编译环境是如何工作的。教师应当教会学生熟练地使用编译环境,如File View和Class View视图,WorkSpace和Project的含义与两者的区别等等。

教师应该具有良好的编写风格,如标识符的命名、注解甚至换行。与书本、试卷上的题目相比较,教师写的程序具有更强的示范作用,教师自身良好的编程习惯对学生编程习惯的培养具有重要意义。

教师必须具有良好的编程功底,能现场解决大多数编程时遇到的问题,并现场调试运行。在容易犯错的环节,可以采用试错法,让学生分析错误的原因;讲解编译器常见的错误和警告信息的原因和处理方法,教会学生如何调试。

3.调试技术

C++学习中,学生遇到的较大的困难之一,就是在调试过程中经常遇到各种错误,例如编译器报告了上百个错误、运行时死循环或者运行时弹出内存只读的对话框。这些挫折会使学生失去学习的动力和信心。所以,应当让学生学会一些调试方法,并且更多地鼓励学生克服困难。

要解决程序运行中的各种错误,调试技术是非常必要的。恰当的调试可以让学生在最短的时间内找到错误的原因。仅仅是一行一行地看程序是很难找到问题的。在VC6的环境下,工科的学生应当学会使用F10、F11、Shift+F11等快捷键来进行单步跟踪,使用F9来设置断点,使用Watch和Variables工具来查看变量的值。此外,对于能力较强的学生,学会使用Call Stack和Memory工具也是相当必要的。

4.鼓励学生战胜困难

对于初学C++语言者,尤其是对那些没有其他计算机语言基础的学生来说,C++的入门是一个比较艰难的过程。所以,尽可能多的鼓励也是相当的必要。当学生在调试过程中遇到困难时,需要耐心地调试,教导学生,编写程序所遇到的挫折是不可避免的,也是他们所必须经历的。学习C++应当具有耐心、细心和坚持不懈、百折不挠的精神。

5.MSDN和各类参考

授之以鱼,不如授之以渔。在学习过程中,掌握如何从网络上获得帮助,如何查阅MSDN,学会阅读各类Reference文档,掌握如何学习的能力,对学生将来的发展具有重要的意义。

五、结束语

笔者认为,C++本身是一个开发工具,将C++作为一个工具来对待,在教学中应注重其实用性,注重学生的编程能力、分析能力、学习能力等综合素质的培养。

参考文献

[1] 刘建华.计算机语言类课程教学模式初探[J].高教论坛,2005,2(1)

[2] 刘传平.“C++语言程序设计”课程教学改革的探讨[J].中国科技信息,2005(11)

[3] 赵志升,李静罗,德林.“问题解决”教学模式及其在计算机教学中的应用[J].教育与职业,2006,11(32)

(原载于《计算机教育》,2007年第16期)

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈