C语言程序设计实验教学探索
2017-11-18彭旭东王成霞王海燕
彭旭东 王成霞 万 红 王海燕 李 可
(天津理工大学,天津 300384)
C语言程序设计实验教学探索
彭旭东 王成霞 万 红 王海燕 李 可
(天津理工大学,天津 300384)
C语言程序设计是目前高校很多非计算机专业开设的必修课。学习该课程,目的是培养学生使用和操作计算机的综合能力,进而培养计算思维。为此,针对多数学生的学习现状,从参与者的态度、实验辅助系统和实验题目三个方面探讨了对实验教学环节的改革,取得了比较好的效果。
实践能力;C程序设计;实验教学
目前,我国高校面向非计算机专业学生开设的程序设计类课程主要是C语言程序设计。该课程既适合培养学生的实践动手能力,也适合培养计算思维。
一、计算思维与研究现状
计算思维的概念由美国周以真教授于2006年提出:“计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为。……其本质是抽象和自动化。抽象是通过简化、转换、递归、嵌入等方法,将一个复杂问题转换成许多简单的子问题并进行求解的过程,……自动化是充分利用计算机运算能力来实现问题求解,……因此计算思维是一种形式规整、问题求解和人机共存的思维[1]。”2010年在西安交通大学举办了首届“九校联盟(C9)计算机基础教学课程研讨会”,会上提出,计算机基础教学的核心任务是计算思维能力的培养[2]。
为了更好地培养学生的实践动手能力和计算思维,许多教师从多个方面对程序设计课程进行了改革。黄静等借鉴任务驱动教学法来构建程序设计的教学模式[3]。乔淑云等提出在教学中采用大班授课小班实验的方式,制订低起点、小坡度、快节奏、高标准的教学策略,灵活运用多种教学方法进行授课[4]。刘光蓉提出把实验分为验证型实验、设计型实验和综合型实验,规范了预习、教师辅导、学生思考、总结、考核评价机制等各个实验环节[5]。陈杰华等强调了实验对于程序设计的重要性,提出把实验分为验证类、应用类和创新类[6]。蔡洁等规范了程序设计与开发方法、程序调试技术,提供辅助实验教学的网络资源,安排小班讨论课和综合实训课,鼓励学生展示和讲解自己的程序[7]。此外,陈杰华、蔡洁等都建议实验题目增加趣味性和综合性,并鼓励学生采用多种方法解决问题[6-7]。
二、教学现状
由于本校C语言程序设计采用大班教学,再加上原教学大纲中没有明确提出培养计算思维的要求,所以课程结束后,多数学生不但缺乏计算思维,实践动手能力不理想,成绩也普遍比较低。即使少数学生能够建立起计算思维,也会因为缺少系统训练而无法保证其实际水平。经验表明,学生在学习过程中表现出来的典型问题包括如下四种。
1.注重机械记忆程序,忽略实际应用
此类学生能够记忆并简单模仿教师的程序,能够比较顺利地完成与例题相似的题目,取得比较理想的成绩,但不能快速解决与例题差别比较大的题目。
2.注重知识的学习,忽略动手能力的培养
此类学生主要通过阅读、书写等方式来学习,很少编写程序和调试程序。所以,他们能够读懂部分相对简单的程序,但程序设计能力和程序调试能力相对比较差。
3.注重学习概念,忽略设计与开发能力的培养
由于课程的总评成绩中,基本概念部分的分值比例比较高,程序设计部分的分值比例比较低,所以整个教学的重点往往会侧重于学习和掌握基本概念。受此影响,部分学生会减少设计程序、调试程序方面的训练。这些学生的程序设计能力比较差。
4.产生畏难情绪,放弃学习机会
C语言及其开发工具都是针对具有一定基础的用户而设计的,所以学生在学习的初期都会遇到很多困难。这些困难会让许多学生产生畏难情绪。畏难情绪会从老生传递给新生,也会在同学之间传递。在传递的过程中,学生还会根据自己在学习和调试程序时遇到的困难来证明和放大这种感受。受此影响,最终将有部分学生丧失学习兴趣,甚至对C语言产生排斥和反感情绪。
鉴于这种情况,项目组教师从2013年开始探讨有关教学改革的方案,从2015年开始选择本校部分非计算机专业C语言程序设计的教学班进行教学改革试验,试图从教学的角度缓解上述问题,同时摸索训练学生计算思维、提高学生实践动手能力的教学方法。
三、改革实验教学
通过研究各个教学环节的作用以及学生的实际情况,项目组老师认为:为了达到训练目的,需要全面改革每个教学环节。限于篇幅,本文仅从参与者及其态度、实验辅助系统和实验题目等方面介绍与实验教学相关的改革措施。
1.参与者及其态度
教师和学生是教学活动的主要参与者。两者参与教学的态度能够相互促进、相互影响。教师的热情往往能够带动学生参与学习的积极性;反之,学生的学习热情也是教师认真教学的源动力。沉浸理论认为,当人们在进行某些日常活动时,能够完全投入情境当中,集中注意力,并且过滤掉所有不相关的知觉,进入一种沉浸的状态[8-9]。因此,在实验中,教师需要随时关注并调动学生的参与积极性,尽量让更多的学生在更长的时间里处于沉浸状态。
学习C语言程序设计的学生主要是大学一年级的学生。该年龄段学生的自我体验具有丰富性、波动性、敏感性、情境性等特点,容易受到外界因素影响。例如学习方面的挫折、其他同学(包括往届学生)的感受等都会影响学生的心理[10]。学生一旦产生了负面情绪,在得不到及时调整的情况下,就会很容易出现消极、否定的情感体验,进而影响学习。因此,教师要在教学过程中注意观察学生的态度、学习方法、知识的掌握情况、学习能力等各个方面的表现,及时表扬学生的优点与进步;针对多数学生在学习方面的共性问题,调整教学方式、教学进度;对于个性化的问题,根据不同的情况进行及时提醒和指导。经过师生的共同努力,学生的学习态度和积极性普遍好于同专业的往届生。
2.实验辅助系统
传统教学过程中使用的开发工具往往是Visual C++等专业开发工具。经验表明,学生使用专业开发工具进行学习会遇到许多困难,其中主要包括如下几类。
第一,不能理解开发工具的提示信息。专业开发工具的界面、程序的各种错误信息和警告信息等通常都是英文的,而且其中还会使用很多术语和缩写。由于存在语言障碍,多数学生都看不明白错误信息和警告信息。
第二,遇到了开发工具漏检的错误。为了提高效率,专业开发工具会假设用户具有一定的基础,所以它不会全面检测程序中的所有错误,例如不检查printf函数中输出项的个数。而学生恰恰缺少开发经验,他们录入的程序中往往会包含漏检的错误。对很多学生来说,发现和修改程序中被漏检的错误,尤其是不影响运行结果的错误,是件比较困难的事情。
第三,遇到了死循环等运行时错误。除数为0、指针访问错误、死循环等很多问题都属于运行时错误。运行时错误具有缺乏提示信息、错误表现形式多样等特点。学生在经验不足、知识掌握得也不够牢固的情况下,很难独立解决此类问题。
在大班实验中,受到师生比例的影响,只有少量的问题由教师指导解决,大部分问题由同学间讨论解决,或者利用教材、笔记、互联网等自行解决。客观地讲,利用讨论或者互联网解决问题不能保证学习效率和解答的质量。
针对这种情况,项目组在设计本课程实验辅助系统CAES时,设计并开发了C语言小程序解释器CI。CI针对学生在实验过程中遇到的问题进行了如下设计。
第一,错误和警告的提示信息用英文、中文和中文解释等三种形式给出。英文提示信息直接取自传统编译系统的提示信息,或者参考传统编译系统提示信息的形式撰写。中文提示信息是英文提示信息的中文翻译。中文解释是错误信息的解释说明。三种形式的提示信息既照顾到了培养目标,又兼顾了学生的实际水平和学习习惯。学生在调试程序时,可以自行选择查看哪种提示信息。为了督促学生掌握英文信息,系统对中文提示信息和中文解释信息设置了延时显示功能。各种提示信息以及信息的显示方式的示例如表1所示。
表1 提示信息及信息显示方式示例
第二,重新定义了“错误”与“警告”。新的检测项目以教学大纲和C标准99为基础,增加了对教学重难点的检测、学生易错知识点的检测、部分可移植性的检测。例如,新增加的警告包括“将整数赋值给浮点型变量”、“使用空语句作为循环体”、“使用赋值表达式作为测试表达式”等;新增加的错误包括“需要使用存储空间的地址作为scanf函数的参数”、“printf函数输出项过少”等。
第三,补充了对常见运行时错误的监控与处理。监控的运行时错误包括:死循环、无法结束的递归、对内存的错误访问、输入内容与scanf函数的格式字符串不匹配等。理论上讲,死循环是不可判定的[11],但教学程序具有形式简单、规律性强、循环次数少等特点,因此CI根据循环次数是否超过阈值以及内存的使用情况来判定程序是否进入死循环状态[12],并用类似的方法,监控递归是否结束。通过对内存和运算符的监控,CI能够发现各种常见的运算时错误。一旦检测出运行时错误,CI将终止程序的运行、清理内存、给出错误提示信息以及程序中出现错误的大致位置。
由于CAES针对初学者而设计,所以在应用过程中降低了对用户的要求、提高了学生的实验效率,为学生掌握基本概念、培养计算思维提供了必要的保证。
3.实验题目
实验题目方面的改革主要包括如下三个方面。
(1)强调预习
实验题目包括预习部分和实验部分。预习部分包括概念填空、程序填空、程序改错等题型,题目围绕实验涉及到的知识点设计。实验部分主要是编程题,重点训练学生的程序设计能力。
(2)提高要求,降低难度
心理学上把一个问题分为三部分:给定(givens)、目标(goals)和障碍(obstacles)[10]。对于特定的题目,给定是学生已经掌握的知识点,目标是题目的最终要求,而障碍则是如何利用给定来实现目标。题目的障碍越多,难度就越大,学生在完成题目之后的成就感也越大。为了达到训练目的,适当增加了每次实验中编程题的数量和难度,同时为每道题都设计了一组要求,每个要求近似对应一个障碍。依次完成所有的要求,也就完成了最终的题目。这样设计,降低了题目完成难度,减缓了学生的畏难心理,增强了自信心和成就感,同时也训练了学生解决复杂问题的能力。
(3)密切联系实际
由于人们存在习惯定势和功能固着的心理特点[10],所以在实验题目中补充了一些实际问题。例如计算积分、矩阵求和、身份确认等。这样设计有助于学生提高学习兴趣,从实际应用的层面理解概念,开阔思路,提高解决实际问题的能力。
四、结束语
由于本校是按专业划分的教学班,而不同专业的学生之间往往存在很大的差异,因此最好比较同一个专业的成绩,或者具有比较价值的不同专业。笔者在2015年至今的2个学年里进行了教学试验。统计的数据来自从2013年至今的4个学年共11个专业的期末考试成绩。成绩统计情况如表2所示。
表2 成绩统计表
总之,为了培养非计算机专业学生的实践能力以及计算思维,需要在教育学、教育心理学等理论的指导下,改革课程的每个教学环节。本文围绕实验教学,以“高效率掌握基础,高质量训练思维”为宗旨,介绍了调整师生心态、实验辅助系统、实验内容等方面的改革方案。经过近几年项目组老师的研究与探索、师生的共同努力,学生分析问题、解决问题的能力普遍得到了提高,好于往届同专业的学生。
[1]Jeannette M Wing.Computational Thinking[J].Communications of ACM,2006,49(3):33-35.
[2]何钦铭,陆汉权,冯博琴.计算机基础教学的核心任务是计算思维能力的培养[J].中国大学教学,2010(9):5-9.
[3]黄静,高延英,杨宇姝.基于计算思维的程序设计课程教学模式研究[J].计算机教育,2013(5):51-54.
[4]乔淑云,黄刚.程序设计类课程教学改革与计算思维之培养[J].计算机教育,2012(19):17-19.
[5]刘光蓉.以计算思维能力培养为导向的C程序设计实验教学[J].实验技术与管理,2013,30(1):154-156.
[6]陈杰华,戴丽娟.以培养计算思维为核心的程序设计实验教学[J].实验技术与管理,2011,28(1):125-127.
[7]蔡洁,杨胜,刘智明.促进计算思维的程序设计实验教学研究[J].计算机教育,2014(3):79-82.
[8]百度百科.沉浸理论[EB/OL].http://baike.baidu.com/view/2489206.htm.
[9]余璐,周超飞.论我国高等教育中的沉浸教学模式与实践[J].河南社会科学,2012,20(6):78-80.
[10]教育部人事司.高等教育心理学[M].北京:高等教育出版社,2000.
[11]Michael Sipser.Introduction to the Theory of Computation(Second Edition)[M].北京:机械工业出版社,2006.
[12]张健.精确的程序静态分析[J].计算机学报,2008,31(9):1549-1553.
(责任编辑:张华凡)
Experimental Teaching of C Programming Language
PENG Xudong,WANG Chengxia,WAN Hong,WANG Haiyan,LI Ke
(Tianjin University of Technology,Tianjin 300384,China)
The C Programming Language is a compulsory course for many non-computer majors in colleges and universities.By studying this course,students’comprehensive abilities of using the computer can be improved,and then their ability of computational thinking can be cultivated.In the light of the present situation of most students’learning of the language,how to reform the experimental teaching is discussed from three aspects:the attitude of the participants,the computer assisted experimental system,and the experimental contents.
practice ability;C programming;experimental teaching
G642.0
彭旭东(1971—),男,副教授,研究方向:计算机辅助教育、计算机应用。
天津理工大学教学基金项目(YB14-09)。