尹宝林
摘要:本文论述了“C语言程序设计”课程建设的重点在于明确课程教学目标,改善教学内容的设置和组织、改进练习和考试的方法等。通过这些手段,进一步提高学生的自学能力,分析问题、解决问题的能力,理论联系实际的能力等,并促使其在程序设计的各个环节养成良好习惯,为深入掌握专业化程序设计打下基础。实践证明,以此思想指导的课程改革取得了显著成效。
关键词:C语言;程序设计;教学改革;能力培养;计算机辅助评测
中图分类号:G642 文献标识码:B
1背景
随着计算机技术的迅速发展和日益普及,越来越多的高校毕业生涌入计算机技术及应用产业,特别是软件产业。这些人中不仅有计算机专业的毕业生,也有些非计算机专业的毕业生。在与这些非计算机专业学生的竞争中,计算机专业的学生并未表现出明显的专业优势。造成这一现象的一个重要原因就是,计算机专业学生所掌握的基础专业知识和能力,缺乏专业性的深度和广度,计算机专业学生所学的一些专业课程和专业基础课程没有为学生提供足够的专业知识和训练。课程改革前的C语言课程就是这样一门在专业性方面有待加强的专业基础课程。
程序设计是计算机专业学生的基础课程,程序设计能力是计算机专业人员的重要专业基础能力,C语言是目前计算机专业工作者的第一语言。随着计算机技术和知识的普及,越来越多的非计算机专业学生也在这一层次和深度上掌握了C语言知识和运用能力。与此同时,计算机专业在C语言的教学方面依然采用原来的教学内容和教学方法,在程序设计知识的深度和广度以及C语言的运用方面没有大的进展,导致计算机专业学生与非计算机专业学生之间在这方面的专业能力差距逐渐缩小甚至消失。计算机专业学生所完成的程序在程序结构、程序的可靠性、可维护性、可扩展性、程序的时空效率、以及程序的风格和可读性等方面与非计算机专业学生的程序差别不大。
造成上述这种情况的原因,从教学方面看主要有三点:一是目前“C语言程序设计”课程的教学内容偏窄偏浅;二是教学方法不适当;三是实验考核手段落后。从学生学习的角度看,也存在对学习内容和方法不适应的问题。大多数的学生从小学到中学,已经适应了记概念、背知识点、应付书面考试的学习模式,对于灵活运用所学知识去分析解决问题,缺乏必要的训练。当程序设计教学仍然是以程序设计语言为主、以概念为主、以书面教学为主时,就更会强化学生原有的思维模式和学习方法,把这门课程当成以概念和知识点学习为主的理论型课程,忽视了对实际能力的培养。
2指导思想
C语言课程是培养学生专业能力的重要课程,其教学效果对学生今后其他专业课程的学习以及毕业后的专业工作前景都有重要的影响。为解决C语言课程在程序设计能力培养方面的不足,需要根据当前学生的特点,在课程教学目标、课程指导思想、课程内容设置和组织、练习和考试的方法及重点等方面进行调整和改革,使学生在掌握运用C语言进行程序设计的同时,在分析问题和解决问题的能力上有显著的进步,在程序设计的各个环节养成良好的习惯,为后续的专业课程学习提供必要的程序设计知识和能力,为今后深入掌握专业化的程序设计能力打下良好的基础。
对于计算机专业的学生来说,C语言课程的教学目标不仅仅是使学生了解和掌握C语言本身,而且应该使学生深入掌握程序设计的思路和方法。C语言课程应该是学习使用C语言进行程序设计的课程,而不是仅仅学习C语言本身的课程。程序设计语言与程序设计是互为表里的。程序设计的作用是表达程序设计者的思想,是按照计算机所能理解和执行的方式描述需要让计算机完成的工作,而程序设计语言则是表达这种思想的工具。在程序设计工作中,首先需要明确的是所要表达的思想到底是什么,也就是到底需要计算机按照什么样的步骤来执行计算过程,产生什么样的计算结果。至于采用什么样的语言,以及这种语言的细节,则是第二位的。因此,对于没有程序设计经验的学生的教学,必须把程序设计的思想和方法放在中心的位置,而把程序设计语言作为讲述程序设计思想和方法的工具。
3课程的内容和安排
为使学生通过C语言的学习掌握程序设计的能力,养成良好的程序设计习惯,并在分析问题和解决问题的能力上得到培养和锻炼,需要在课程的教学内容和侧重点上进行必要的调整,在教学方法上进行必要的改进,在实验和考核的手段上进行必要的革新,在教学过程的组织和安排上与其他相关课程更好地协调。
首先,需要把教学的重点从C语言本身转移到程序设计的思路和方法、以及运用C语言进行程序设计上来,把讲授语言的概念转变为讲授语言运用,把对概念的讲授由抽象的分析和讲解转变为通过实例和经验对概念的学习。教学内容应当围绕程序设计的思想和方法进行组织,把C语言作为讲解程序设计的工具,在讲解程序设计的思想、方法和步骤的过程中,根据程序描述的需要,本着由简到繁,由浅入深的原则,逐步讲解C语言中的知识点,特别是C语言要素在程序设计中的运用。
其次,“C语言程序设计”课程是一门实践性和应用性很强的课程,因此这门课程在教学方法上必然要不同于其他各种理论性课程。它不是以概念的学习为中心,而是以概念运用能力的培养为中心。对于概念和基本知识的掌握,更多地不是通过理论分析,而是通过对实例的分析和在实践中的运用。对练习题的分析、讲解、讨论以及在练习现场的答疑都是教学中的要点。对一些复杂概念的引入和探讨只有在学生具有了相当的实践经验时进行,才能使学生真正地接受。
第三,在教学安排方面要充分考虑C语言的基础性、应用性、专业性的特点,以及该课程与其他课程的关联和配合。复杂的程序设计知识需要有“数据结构”等先修课程作为基础,同时,基本的C语言知识和程序阅读和理解能力,也是其他一些专业课程,包括“数据结构”等课程在内的基础。为了适应学生知识水平和学习能力的现状,并考虑与其他课程的衔接和协调,我们把“C语言程序设计”课程的内容分为两个部分,分两个阶段讲授。第一个阶段主要针对没有程序设计经验的初学者讲授程序设计的基本方法和C语言的入门知识,第二阶段主要是在第一阶段的基础上进一步提高学生的程序设计能力,培养学生专业化程序设计能力的基础,以及对C语言的深入理解和把握。
第一阶段课程教学的重点内容是程序设计的基本思路、步骤和方法,以及简单的程序设计技术和C语言的运用,目的是培养学生程序设计的基本能力和初步培养学生良好的程序设计习惯,使他们知道如何着手分析一个问题,如何把解决问题的过程分解成一个个紧密衔接的步骤,如何用C语言准确地描述这些步骤,以及当程序出现错误时如何迅速准确地发现问题的原因,找到解决的方法。在这一阶段的教学中,在讲授方法上应以例题分析和讨论为主,避免从概念到概念的论述,特别注意避免过于深奥的概念的引入和讨论,以免学生在未掌握程序设计基本方法和思考习惯的情况下把注意力不适当地投入对概念理解的过分追求。对于概念和理论,应该只对必要的内容做适当的介绍,更多地把学生的注意力引入到对这些概念的运用中。应该更多地讲授使用C语言进行程序设计的实例,通过实例讲授分析问题的方法以及程序设计的基本思路、过程和步骤。对于C语言本身,主要应介绍各种基本语言要素和使用方法,介绍简单程序的编写、调试和运行过程和操作步骤,讲授一些基本的算法、数据结构的C语言实现方法和特点。对于C语言的语法和语义,应尽量通过例题的示范进行概括性的介绍。对于其中的细节,则应留给学生通过上机实习,自己逐步深入了解和掌握。这一阶段的教学目标是使学生能阅读和理解一些较为复杂的程序,并能在较短的时间内独立完成具有初等难度、长度约几十行的程序的设计、实现和调试。
第二阶段的教学主要集中在对程序设计能力、特别是专业程序设计能力基础的培养上。在学生学习了“数据结构”及其他相关的课程之后,可以进一步引入专业化的程序设计思想,介绍专业化的程序设计应当考虑的一些问题,对比不同的解题思路实现的难易程度,对比不同的算法和实现方法在时空效率方面的优劣,对比不同的程序设计风格对程序的可读性、可维护性、可扩展性、可移植性等方面的影响,讲授程序质量的判断标准等。在这一阶段也可以引导学生进一步深入理解C语言中的一些重要概念和C语言的特点,使学生在C语言运用的技巧方面得到锻炼,在程序设计的水平方面得到提高。这一阶段的教学内容包括对C语言属性、特点和重要概念的深入讲解、对C语言中难点的深入分析,对程序设计思路、过程和步骤的进一步系统化,以及信息领域常用算法的实现,程序和软硬件系统的关系,程序的调试和测试,程序的时空效率和优化,程序设计的风格,中型程序的结构和组织等。在掌握了这部分内容之后,学生应该能够独立完成较为复杂的,长度在百行以上的程序的设计、实现和调试,知道如何充分测试一个程序,以保证其运行的可靠,知道如何正确地组织一个较大的程序,以保证其可维护性和可扩展性,知道如何优化一个程序,以满足对时空效率的要求。在这一阶段的教学过程中,在教学方法上可以更多地采用启发式的方法,可以拿出一定的时间展开课堂讨论和习题分析,引导学生主动地学习。同时,在练习题方面也可以适当提供一些难题,以便为学有余力的学生提供更大的学习空间。
4练习和考试
程序设计课程是一门实践性很强的专业技术课程。只有加强实践环节,让学生在失败的和成功的实践中通过自己的经验积累才能切实掌握实际知识的运用能力。在课程教学的过程中不仅要重视理论教学,重视教学内容的设置,也要重视实践环节的设置,重视为学生提供具有及时监控和反馈环节的实践环境。在课程的考核环节,应该以检验学生的实际程序设计能力为主,关键概念为辅。对于语言的语法细节和使用方式,则不应单独作为考核的题目,而应该与对程序设计能力的考核有机地融和在一起,以改变学生读书、背概念、应付考试的学习模式。
程序设计题目和源程序答案具有高度的灵活性和差异性,难以进行常规的标准化评测。受评测方式的制约,传统程序设计语言的练习及考试一般以标准化的笔试题为主,偏重于考察程序设计语言的基本概念和语法细节,而程序设计题目所占比重较小。这种练习及考试方式易于导致学生忽视编程实践能力和理论联系实际能力的培养。为此,需要在练习和考试中改变传统的方法,要求学生以实际程序设计为主进行练习,通过实际程序设计对学生的学习效果进行考核。这种练习和考试的方式改变了练习的目的,使练习由过去简单地复习课堂的讲授内容改变为由学生通过实践环节进行自学。这样,课堂讲授就可以集中对关键内容上,而不必在语言本身的细节上花费过多的时间。
5技术支持手段
为采用“以实际程序设计为主进行练习,通过实际程序设计进行考核”的实践及考试方式,需要为学生在编程实践中提供具有及时监控和反馈功能的实践环境,并在课程作业方面增加程序设计题目的比例。这样,不但可以提高练习和考试的强度,使得习题更加接近实际程序设计的要求,而且也更能检验教学效果和学生的实际程序设计能力。学生的答题工作全部在计算机上进行,提交的答案必须是不存在任何语法和逻辑错误、能解决一个完整问题的源程序。学生在学习阶段必须重视实际编程能力,提高对代码质量和编程风格的要求,养成良好的编程习惯。同时,这也可以改变以往基于经验和直观感觉的人工阅卷方式,提高阅卷的效率,减轻教师的阅卷负担,保证成绩评定的准确和公正。而且,在C语言这样一门具有很强实践性的信息技术专业基础课程的实践环节采用基于信息技术的自动化支持手段,其本身也是对学生的一种示范和启发。
在自动化的评测系统中,最重要的问题是对程序设计题目的评测方式和标准。对程序的评价既有内在属性的指标,如功能、性能、正确性、可靠性等,也有外在属性的指标,如程序的结构、可读性、风格等。根据本课程的教学要求,程序评测系统主要采用内在属性指标,学生所完成的程序必须通过编译,产生可执行代码文件,在计算机上运行,根据题目的要求读入输入数据,进行正确的运算,产生正确的输出数据,才能得分。这种方式可以检查学生程序语法和基本功能的正确性。对程序的功能完整性和性能的评测通过设计具有不同难度的输入数据来完成。这样,就可以对学生的程序在问题分析、数据结构和算法的选择、实现的正确性和效率等多个方面产生适当的区分度。同时,为了全面提高学生专业化程序设计的能力,也可适当引入一些外在属性的指标以及相应的评测手段,以检验学生程序在程序的结构、可读性、风格等方面的水平。
根据这些原则,我们设计和实现了一个基于Web的程序设计语言练习及考试评测系统,并开通了C语言课程教学网站。该练习及考试评测系统由配置工具、命题及题库管理工具、Web应用服务器、程序题评测服务器、考试控制工具、成绩统计工具等组成,具有很强的可配置性和可扩展性,能够适应不同的练习和考试要求。为防范考试中可能的作弊行为,系统提供了实时网络监测工具和程序源文件及可执行码的查重功能;在一场考试中可以使用具有相同难度的多份试卷,以避免相邻座位学生之间的交流和抄袭。练习及考试评测系统既支持程序设计类型的试题,又支持单选、多选、填空等标准化试题。为适应练习和考试的不同要求,对所提交的答案可以分别设置为立即评测和定时评测。这样,在练习过程中学生就可以及时得知自己的答案是否正确,并及时改正错误。练习及考试评测系统可以自动完成对学生成绩的评测和统计,并根据需要生成成绩表。这样,不仅可以使教师及时准确地掌握学生的成绩,发现存在的问题,而且可以大大减轻教师的工作负担。
6结语
“C语言程序设计”课是计算机专业学生的一门重要的专业基础课。学生们通过这门课程的学习,应该不仅学会C语言,而且更要学会程序设计、学会分析问题和解决问题的方法,学会自学的方法,养成理论联系实际、注重实践的习惯,而这一切对于培养具有发展潜力的工科学生具有重要的意义。我们近几年的课程改革正在朝着这一方向努力。经过实践,已经取得了初步的成效。学生学习的积极性和主动性比以前有较大的提高,学生的实际能力比以前有较大的增强。一些后继课程的教师反映,学生程序设计能力的提高有助于相关课程的学习和课程作业的完成。已经毕业的学生也反映,无论是在工作岗位上还是在国内外高校的研究生学习中,程序设计的能力都成为了他们重要的基础能力,并增强了他们在工作和学习上取得进展的信心。同时,根据这几年的教学经验,我们将教案整理成为正式的教材《C程序设计思想与方法》,于2009年由机械工业出版社出版。