关于程序设计入门语言的教学改革研究
2015-03-16卢信文武志学
卢信文 武志学
摘要:程序设计语言的初学者往往对第一门语言感觉异常困难,这表现在拿到问题不知如何下手分析,从而无法动手编写代码上。这也是各个高校计算机专业在入门程序设计语言教学上的一道门槛。通过选择几种主流编程语言开展对比教学实验、进行问卷调查和开展教学研讨会的形式,去探讨如何在入门语言的教学中直接开展主流的面向对象的程序设计方法。同时,在程序语言之外,帮助学生建立起从分析、设计到实现的整体程序设计框架意识。将程序教学语言和教学方式结合起来,解决程序设计入门教学的本质问题。
关键词:程序设计;入门语言;教学改革;逻辑能力;面向对象
中图分类号:G424 文献标识码:A 文章编号:1009-3044(2015)04-0101-03
Abstract: It is very difficult for the beginners of a programming language to analyze and write the code. This is also the biggest problem of the computer specialty of the universities to carry out the teaching. By choosing to carry out several mainstream programming language teaching comparative experiments, carrying out in the form of questionnaires and teaching seminars, to discuss how to carry out the program design methods of teaching introductory language directly mainstream object-oriented. Meanwhile, in addition to programming languages ??to help students build from the analysis, design and overall program design framework to achieve consciousness. The combined program of instruction and teaching methods together to resolve the nature of teaching introductory programming problem.
Key words: programming language; Introductory language; teaching method; ogical capability; object-oriented
目前国内高校计算机相关专业程序设计入门教学语言普遍采用C语言,虽然C语言可面向硬件编程,在嵌入式开发方面发挥着重要作用,但存在以下严重不足:
1) C语言是面向过程的语言,逻辑简单的项目还看不出多少问题,一旦项目逻辑很复杂,当需要对某些逻辑进行修改的时候,这种面向过程的语言就会使事情变得异常麻烦。因为C是在面向对象方法流行之前开发的,这大大降低了C语言复杂设计的可能性。
2) 由于C语言是面向过程的语言,因此不提供数据封装的功能,这一点使得C在数据的安全性上有很大缺陷。
3) C语言对语法的限制不太严格,这就使得编程出错的概率要高一些,其它语言编译时就能发现的错误,C语言的编译器却可能发现不了,因此,从应用的角度,C语言比其他高级语言较难掌握。
4) C语言的指针是它学习的一个难点,也是一个优势,因为有了指针,可以直接访问物理地址,也就可以对硬件进行一些操作,但是,这样的操作在安全性方面就有了缺陷。
5) 类型检查机制相对较弱、缺少支持代码重用的语言结构。
面向对象的程序设计思想自上个世纪80年代以来,经历了近40年的发展,目前已经非常成熟,在软件工程领域和程序设计领域已经非常普及。目前计算机软件技术的主要应用领域是Web应用开发,作为底层开发语言的C语言,已不再适合作为入门教学语言。作为计算机教育工作者,我们有责任深入研究,寻找最佳的入门语言和教学方法。
1 主流编程语言的比较
对于刚进入大学的学生来说,选择哪种程序语言作为他们的入门教学语言,是目前各个高校都在思考的问题。针对这个问题,我们将四种主流的编程语言-C,C++,JAVA和C#进行了比较,同时展开了对比教学,希望能找到最适合学生进行入门学习的程序语言。
1.1 C语言和C++的比较
C语言应该算是比较底层的语言,同时也是一个面向过程的语言。C语言只有40个关键词,9种控制语句,对于初学者来说,C语言没有过多的抽象概念需要理解,因此学习起来感觉会很简单。初学者往往还没有建立起整体的程序设计思想,编写程序总是想到哪儿写到哪儿,C语言作为结构化的语言,为他们学习编程提供了方便。C语言应该说没有什么真正的难点,可能最让初学者头疼的就是指针,而指针又是理解计算机底层结构精髓的关键。因为有了指针,可以允许对硬件进行操作,但是指针操作也带来了安全问题。由于C语言是面向过程的语言,因此不提供数据封装的功能,这一点使得C语言在数据的安全性上有很大的缺陷,同时由于C语言对语法的限制不太严格,会使得编译出错的概率升高,对于初学者来说,常常会发生出现错误却不知道哪里出错的现象,从实际应用的角度来看,C语言比其他高级语言更难掌握,因此目前很少再用C语言写应用程序。
接下来看看C++。C++是从C语言发展起来的面向对象的程序设计语言。C++不仅和C语言一样具有高效、可移植的特征,同时还支持包括面向对象程序设计、数据抽象、过程化程序设计、泛型程序设计在内的多种程序设计风格。C++没有复杂的编程环境,也没有不使用会带来额外开销的问题。C++的很多特性并没有直接添加到语言里去,而是以类库的形式存在,这样可以保证语言的简洁和运行的高效。C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。不过C++在一定程度上来讲,并不是纯粹的面向对象的程序设计语言,它在提出了面向对象的特征的同时,还具有面向过程的特性,同时,C++的语法相比较于C语言,复杂很多,这让初学者感觉很难理解,因此学习起来困难重重。C++的扩展性很好,这个语言使用的基本要素就是模拟语言,也就是可以创造语言,所以很适合编写类库。但是很多事物都是有正反两面,C++的扩展性能好的这个优点,又会导致初学者很难上手,或者说很难入门,因为什么都要自己去写,对于初学者来说,难度比较大。写完程序以后,就面临着编译,C++的编译系统受到C++的复杂性的影响,也变得过于复杂,尤其是要把预处理和语法分析放在一起的时候,这种复杂程度变得更明显。很多程序即使能够被编译,其实本身也存在了大量的问题,而这些问题大多难于被发现。由于语法上的复杂、概念上的复杂和编译上的复杂,使得C++对于初学者来说,如同一座大山,想翻过却感觉力不从心。
在对比班进行了的C语言和C++的对比教学后,发现C语言由于语言简洁而容易让学生理解,但是C语言特有的指针是学生理解的难点,同时,C语言是面向过程的语言,使得学生在后续面向对象的学习中理解难度增大。C++语言融合了面向对象的编程思想和C语言的指针,使得学生学习起来的难度增大,大部分学生表示C++的概念很难理解。
1.2 JAVA和C#的比较
JAVA是SUN公司在1995年推出的具有跨平台特性的面向对象的程序设计语言。与JAVA程序设计语言一起推出的还有JAVA平台,包括了JavaSE、JavaEE和JavaMEJava。JAVA是到目前为止跨平台做得最好的语言,由JAVA编写的程序可以不经过任何修改就能移植到另一个平台上使用。由于JAVA具有这样高效、安全、通用和平台移植的特性,使得其广泛地应用于个人应用程序开发、大型数据平台、游戏开发、超级计算机、移动应用开发和企业级web应用开发,同时它还拥有最大的开发者专业社群。特别是在移动应用开发方面的优势,使得JAVA在当前全球云计算和移动互联网的产业环境下,更具备了显著的优势和广阔的前景。从语法结构上来看,Java语言的语法与C语言和C++语言很接近,但是它又是一个纯的面向对象的程序设计语言,它沿用了C++的一些核心的面向对象的技术,丢弃了C++ 中那些很少使用的、很难理解的特性,这样对于初学者来说,要更容易接受。指针作为C的特征,有它的优势,也带来了安全问题。C++虽然改进了指针应用,但由于本身的复杂性,还是难以让初学者接受。而Java语言彻底丢弃了指针概念,在安全性上迈出了一大步,同时,JAVA还提供了自动的垃圾收集机制,使得程序员不必为内存管理而担忧。不过JAVA的编译器不同于一般的语言编译器,它是将代码编译成二进制的字节码,然后由不同的平台上的虚拟机来解释并执行这些字节码,这种编译机制,实现了JAVA语言的跨平台性,但也在一定程度上降低了JAVA运行的效率。
.NET平台是微软公司推出的构建windows窗体程序和web应用程序的应用平台,C#语言则是微软公司为这个平台量身打造的面向对象的程序设计语言。C#的语法定义同样也是从C语言和C++那里继承而来的,这一点同JAVA很类似。C#提出了中间代码的概念,在.NET上用不同语言编写的程序在编译时,都不是直接转换成机器语言,而是编译成微软中间代码,这样也就实现了.NET平台的跨语言性。同时,C#的类库也是一个不容忽视的组件,C#的类库是一个综合性的面向对象的可重用类型集合,里面封装了很多方法和属性,开发者可以很方便地直接拿过来用,这一点对于初学者来说,至关重要。
在对比班进行了C#语言和JAVA语言的对比教学后,发现由于两种语言从基础知识上来讲差不多,学生对基本知识的理解比较清楚,但是由于JAVA特有的编译环境和配置环境,使学生在学习基础知识的基础上还要掌握其他的知识点,对于初学者来说,难度比较大。而C#的编译环境很适合初学者使用,同时,.NET提供的类库也在学生学习界面设计时提供了不少帮助,使得界面设计变成一件容易的事情。
2 教学方法的研究
通过问卷调查和开展学生教学研讨会的方式,我们了解到新生在学习程序设计语言里,感觉最难的是如何理顺问题中的逻辑。每当他们面对一个问题,常常无从下手,不知道如何分析,不知道问题中的逻辑在哪里,这些问题恰恰是在任何程序语言本身以外的。这些问题不涉及语法、不涉及概念,仅仅反映的是学生的逻辑思维能力和分析问题的能力。
所谓程序设计,就是给出解决特定问题程序的过程。这个过程包括分析、设计、编码、测试、排错等不同阶段。在拿到一个实际问题之后,应对问题的性质与要求进行深入分析,从而确定求解问题的数学模型或方法,接下来进行算法设计,并画出流程图。有了算法流程图,最后才是写代码实现。也就是说,在整个程序设计流程里面,用编程语言写代码其实是在最后的,代码的实现仅仅是将人们思考分析出来的流程图转变成机器能读懂的语言罢了。
目前来看,学生们比较缺乏的就是分析问题内在的逻辑。观察学生平时的学习状况,我们发现95%的学生在拿到实验任务后,做的第一件事情就是打开开发平台,然后开始想代码怎么写。通常在1个半小时的实验时间里,如果没有老师要求,大部分学生会一直坐在那里对着电脑屏幕思考代码怎么写,极少有人拿出纸和笔来,分析一下这个任务的逻辑流程是怎样的,要用到哪些知识点,把整个流程图画出来以后再动手写代码。如果在学习程序语言一开始就没有让学生建立起先分析设计,再实现代码的意识,那么要真正理解程序设计,或者说要真正入程序设计这个门就要难很多。
一般来说,程序设计有5个能力层面,会、熟练、分析总结、全面规划和运筹帷幄,那么对于教育工作者来说,应该引导学生从“会”升级到“熟练”。何为“会”?“会”,就是对知识点的一般性的、孤立的掌握,也就是还处于仅仅掌握工具的阶段。学生在学完一门程序设计语言并做了相关的一些实验以后,可以说会某某语言。这时,只要有详细的设计,他们就可以把设计变成代码。何为详细的设计,也就是要把整个问题的流程图、细节实现部分统统告诉他们。在这一个层面,其实学生并没有建立整体程序设计框架,他们做的只是实现部分。而“熟练”,则意味着能够快速而有效地完成既定设计,在这个层面上,学生的分析能力、判断能力都会有一个提升,从实现者变成设计者。
3 结论
当前计算机软件工程专业的程序入门教学应顺应行业发展的趋势,选择面向对象程序设计语言。在面向对象程序设计语言中,C++由于融合了面向对象的概念和C语言的指针,使得新生学习起来更加困难和难于理解,而JAVA虽然在设计思想和语法结构上和C#很相似,但由于JAVA要搭配环境,以及使用各种jar包,使得入手涵盖的知识点稍微广了些。C#作为.NET平台的标识性语言,为开发者提供了80多种控件,使得界面的设计变得异常简单,这样便于将学生入门学习的重点转移到代码的分析和编写上去,而不用过多去考虑界面如何实现,因此采用C#作为程序入门语言既符合当前web应用为主流的行业趋势,又便于学生掌握相关基础知识。
同时,我们在程序语言之外,还应加强学生分析问题、建立逻辑流程的概念。要让学生养成在面对问题时,不是首先去考虑代码如何实现,而是通过画框图、流程图等方法分析和建立问题模型,要真正为学生建立起程序设计整体框架,从分析到实现,从画流程图到编写代码,提高学生的逻辑思维能力,只有逻辑思维能力得到了提高,学生才能自己分析问题,找到问题的逻辑所在,从而完成程序设计的整个流程。
参考文献:
[1] 孙利辉.C语言指针教学难点探讨[J].电脑知识与技术,2006(17).
[2] 宋振方.以管理者的视角突破C++指针教学难点[J].现代计算机,2011(3).
[3] 亓建芸.关于提高Java语言教学质量的研究与实践[J].中国教育技术装备,2011(24).
[4] 胡能发.面向对象程序设计语言C#教学研究[J].长江大学学报,2009(1).