非计算机工科专业的C语言本科教学探讨
袁丽华 朱笑
摘 ?要:文章首先介绍了C语言课程的地位和作用,并分析了C语言教学存在的问题。结合多年一线教学经验,提出了多点适合C语言教学并满足于人才培养的教学方法。第一,采用承上启下的教学模式帮助学生接受新知识,同时兼顾应用和巩固已有的知识。第二,采用任务驱动的教学方法,激发学生的学习兴趣,培养学生创新能力。第三,注重实践环节教学,引导学生建立算法思想和编程思维方法,训练提高学生的计算思维能力。第四,建立自主学习模式,培养学生自学能力。
关键词:计算思维;任务驱动;实践教学;自主学习
中图分类号:G642 ? ? ?文献标志码:A ? ? ? ? 文章编号:2096-000X(2021)13-0104-04
Abstract: Firstly, this paper introduces the status and function of C Language course, and analyzes the problems existing in C Language teaching. Combined with many years of teaching experience, this paper puts forward teaching methods suitable for C Language teaching and satisfied with talent training. First, the teaching mode of connecting the preceding and the following is adopted to help students accept new knowledge while simultaneously applying and consolidating existing knowledge. Second, the task-driven teaching method is adopted to stimulate students' interest in learning and cultivate students' innovation ability. Thirdly, paying attention to practical teaching will guide students to establish algorithm thinking and programming thinking methods, train and improve students' computational thinking ability. Fourth, the establishment of independent learning mode can train students' self-study ability.
Keywords: computational thinking; task-driven; practical teaching; autonomous learning
一、課程地位和作用
计算机与原子能、半导体、激光器合称为20世纪的四大发明,计算机的应用早已渗透到了各个领域和各门学科之中。面向非计算机专业学生的计算机方面的教育,涉及的专业面广,人数众多,影响深远,意义重大,它将直接影响我国各行各业的计算机应用的发展水平。自20世纪90年代以来,C语言迅速在全球普及和推广,无论是国内还是国外,无论是计算机专业还是非计算机专业,不仅是本科教育甚至职高教育,C语言程序设计被定位为基本的计算机课程,C语言程序设计在计算机教育和计算机应用中发挥着重要作用。C语言具有许多优点,可以高度归纳为四点:1. 同时具有高级语言和低级语言的优点,属于一种中间语言;2. 是一种函数化的程序设计语言,非常适合结构化程序设计;3. 提供了丰富的数据类型、运算符以及库函数;4. 直接与内存打交道,使修改、编辑其他程序与文档变得简单轻松。因此,C语言既适用于编写系统软件,又适合编写应用软件。
现在许多高校把C语言作为第一门计算机语言进行程序设计教学,其目的是培养学生具备初步的高级语言程序设计技能,为学生掌握编程技术和计算机思维能力打下坚实的基础,并为今后学习其他计算机软件编程奠定知识基础。例如,南昌航空大学测控技术与仪器专业C语言课程的教学大纲指出,“《C语言》是测控技术与仪器专业的一门专业核心课,也是一门理论性、技术性很强的主干课程。本课程的主要任务是引导学生初步接触算法、软件编程等学科知识,学习C语言语法。通过本课程的学习可以使学生掌握结构化程序设计的方法,确立程序设计的思维方式,培养和提高学生的应用程序开发能力,并为数据结构、C++、单片机原理等后续课程的学习打下基础。”
二、教学存在的问题
(一)思维方式的挑战
人类在认识世界和改造世界的科学活动过程中离不开思维活动。科学思维是指在人类科学活动中所使用的思维方式[1]。科学的思维方式分为三种,即逻辑思维、实证思维和计算思维。欧美国家很重视对国民的计算思维能力的培养,将其融入到从育儿教育、中小学教育到大学教育中。Angeli等人发现利用教育机器人可以发展幼儿的计算思维[2]。Heintz等人于2016年发现,小学教育中引入计算思维、编程和数字素养课程已成趋势[3]。Henderson等认为,计算思维作为现代科学、技术、工程和数学(即STEM)学科的核心,在K-12中开展计算思维培养的时代已然到来[4]。Francisco等指出通过编程方法或计算思维来培养学生的逻辑思维能力和解决问题的能力,以使学生参与有意义的学习,从而发展有用的思维技能和数字能力[5]。
在我国,通过高考选拔的学生,逻辑思维得到了充分训练和加强,习惯数理化学科中以推理和演绎为特征的逻辑思维方式。另一方面,加强了理化生的实验培养和锻炼了学生的实证思维能力。然而,计算思维方面就显得非常薄弱,虽然中学开设了信息技术课程,但课时少,同时又有高考的压力,信息技术往往被当做一门副课,得不到学校和学生重视。对于刚入校的大一新生而言,C语言是一门全新的课程,缺乏相关的计算机基础知识,算法思想和编程的思维方式都有待建立。
(二)学生缺乏学习兴趣
不少学生学习C语言困难大,缺乏学习兴趣。大一新生在没有开设计算机文化基础课程的前提下,直接学习C语言,对学生而言是一个全新的挑战。C语言教学课时少、进度快,学生无法及时消化所学内容。以南昌航空大学测控技术与仪器专业为例,C语言理论教学为48学时,每周4学时,所选用的教材是清华大学谭浩强著的《C程序设计(第四版)》[6],要求12周的时间要讲授十章教学内容。上课节奏快、强度大,不少学生跟不上老师的教学进度,容易出现畏难、退缩、厌学的情况。王东旭指出,在实际学习过程中,由于C语言语法要求严谨,学生无法灵活运用,同时学生往往对于编程中出现的错误无法理解,造成了学生的困惑[7]。学生学习的兴趣不高,最终导致学习效果不好,教学质量不理想。
(三)传统讲授方法单一
高江勇考察当前大学课堂教学实践时发现,从表面上来看,教师似乎在费劲地教,学生似乎也在无声地学,但实际上教师的教并不能真正地吸引和引导学生的学,学生的学也无法反馈和激励教师的教,可以说学生的学几乎与教师的教无关,这种沉默式的教学已经成为当下大学课堂的普遍现象[8]。C语言的教学也存在类似问题,大多数教师采用传统单一的讲授方式授课,师生之间缺乏沟通与交流。由于学时紧,教学任务重,教师基本上采用满堂灌的方式上课,参照着授课计划,忙着赶教学进度,没能顾及学生在教学中的反馈,忽略了学生是学习的主体。被动听课的学生缺乏主动性和能动性,在沉闷的课堂中学习,感觉非常的枯燥乏味,无法激发应有的学习兴趣。
三、教学方法的探讨
(一)承上启下的教学模式
C语言知识点和语法不像数学物理这类学科的逻辑性强,初学时会感觉知识点繁多零散,不好记忆。听课的时候,似乎不难懂,但在实践编程时,就很难正确灵活应用。采用承上启下的教学模式,可以帮助学生学习和理解新知识,同时兼顾应用和巩固已有的知识。搭建合理的知识点构架,帮助学生融会贯通所学知识。
例如,在C语言第一节新课介绍C程序时,指出C语言的最大特点就是函数化的语言,至少包含一个主函数。函数是由函数首部和函数体构成的,函数首部介绍函数名、函数类型、是否有参数,如果有参数的话,就介绍参数类型以及参数个数。函数体完成函数功能的定义,包括声明部分和语句部分。在后续的程序实例中,多次重复,让学生熟悉和建立函数的基本知识,到系统学习函数时,就不会陌生,为进一步学习奠定基础。
所有的变量要“先定义,后使用”。定义包括给变量取名和指定变量的类型。变量有四种基本类型,整型、字符型、单精度浮点型和双精度浮点型。要求学生熟练掌握四种基本类型的定义方法、输入输出使用的格式,以及所占的字节数,参见表1所罗列的信息。能够依据求解的任务要求定义合理的数据类型变量,通过scanf函数给变量赋值,应用printf函数输出结果。后续所学的数组变量、指针变量以及结构体类型的定义仍然是以这四种基本类型为基础进行定义。
表1 数据的基本类型
学习数组时提醒学生要结合循环结构来编程,用循环语句可以将一维数组元素遍历一遍,用循环嵌套则可将二维数组元素遍历一遍。这样,在学习新章节数组内容时,复习了循环结构,加深了解循环结构的应用。
(二)任务驱动的教学方法
任务驱动教学法是一种建立在建构主义教学理论基础上的探究式教学方法,旨在培养学生的创新意识、创新精神、研究性学习能力和实践动手能力[9-10]。任务驱动教学法通过任务的牵引,激发学生的学习兴趣,充分调动学生的自觉能动性,从而促进知识原理、细节的理解与掌握,进而提高学生分析问题、解决问题的能力和实践创新能力[10-11]。任务驱动的教学方法能为学生提供实践体验和感悟问题的情境,围绕任务展开活动,以任务的完成状况验证学习活动的效果。在教学任务设计上必须贴近学习和生活,从身边的事情入手,任务必须具有较强的实用性、新颖性和吸引力。只有这样,才能将复杂、难以理解的知识概念变为学生感兴趣的东西,并构建轻松愉快的学习环境,从而激发学生学习热情,提高学生与教师的互动性,让每名学生主动、充分参与教与学的过程,取得事半功倍的教学效果[10]。例如,第七章数组的学习,设计的任务如下:
电视台举办配音大赛,以10位选手,3位评委为例介绍相关任务,每位评委将对10个作品进行打分。打分的形式不限,可以让1位评委一次性打完10位选手的分数然后轮到下一位评委打分直到结束,也可以让3位评委轮流给作品打分,打完第一位选手的分再轮流给第二位選手打分,以此类推直到结束(打分方式参见表2的示例)。表3罗列了任务的具体要求。
任务可分为三阶段来实施完成:第一阶段为独立思考阶段。赵勤认为思考在学习中具有至高无上的地位,学习如果处于被动,不独立思考,必致心中无所得[12]。独立思考是指学生通过个人的努力去完成任务,最大限度调动自身能动性和创造力。独立思考并非要求学生所做的都是原创性,当今信息时代,学生要善于通过检索获取信息、整合信息、分析信息、过滤信息、精炼信息、利用信息来独立解决所下达的任务。另外,要照顾到不同层次的学生,让每位同学都能参与到任务之中,不会因为任务难而放弃,在这一阶段中允许学生依据自己的能力自降难度,完成任务中的部分要求。这样,能保证人人都参与任务,每位同学都能积极思考,动手编程解决力所能及的问题。第二阶段为团结协作阶段。在第一阶段的基础上,分小组协作继续完成全部任务要求,每个小组4到5人。小组成员聚在一起讨论交流,各自介绍自己完成的情况,存在的问题,互相取长补短,共同完成任务。第三阶段是任务评价阶段。在第二阶段结束后,教师要把控好学生的合作完成过程,不能单一地用最终的结果来评价任务完成的效果。另外,任务评价不只是教师对学生做出的评价,也包括了学生之间的相互评价,以及学生的自我评价等[13]。最后,对整体情况做个总结分析,有助于培养学生分析问题和解决问题的能力。表3中的任务要求5最能反映学生的编程能力,各小组使用了不同的算法完成任务,例如,有的小组采用降序排序,取前三名完成要求;有的小组则连续采用三次打擂法,求第二名和第三名时结合continue语句完成;有的小组求算每位选手赢对手的次数,取前三位来完成任务。引导学生通过计算耗时分析算法的优劣,培养学生的分析能力。
(三)注重实践环节教学
C语言是实践性很强的一门课程,实践环节教学并非仅仅是指导学生的上机操作实验,而且还应当贯穿于整个理论教学之中。上课的例题除了用PPT讲解外,还需要演示程序生成的整个过程,包括编写源程序文件(.c)、翻译成目标文件(.obj)、连接成可执行文件(.exe)、运行可执行文件,以及验证结果判断程序是否正确合理。因此,在课堂上不主张演示一个已经编写好的源程序,不仅让学生观看程序运行结果,而是应该现场带着学生一块编程,一起调试,引导学生建立算法思想和编程思维方法,训练提高学生的计算思维能力。
如果程序有语法错误,编译时系统会用英文在调试信息窗口中给出相应错误的信息,很多学生初学时不习惯英文的表述,甚至有些学生看不懂英文,需要帮助学生理解英文表述的错误提示信息,指导学生依据提示信息修改程序,提高学生调试程序的能力。
引导学生采用不同的算法编程,提高学生分析问题和解决问题的能力,例如,阶乘问题可以用不同方法编程,比如累乘方法、递归调用、静态存储。组织学生分析比较不同算法的特点,提高学生编程思维能力。另一方面,引导学生活学活用,举一反三,掌握规律,将编程思想融会贯通,解决类似问题。例如,排序是很常见的一类问题,教材给出了数值型数据的排序,有冒泡法和选择法。可以引导学生应用排序的思想解决字符串的排序问题,同时提醒学生要注意字符串处理有别于数值型数据,要求学生思考如何解决字符串之间的比较,以及两个字符数组之间的存储交换问题。
(四)建立自主学习模式
C语言学时少,教学内容被压缩,光靠课堂教学,学生是无法全面系统掌握C语言程序设计的知识。退一步讲,就教师所教授的内容,除了课堂教学外,学生还需要进行大量的实践训练,包括编程训练和上机训练,才能真正领悟和掌握所学知识,才能灵活运用所学知识解决实际问题,结合相关专业知识,解决专业领域中的问题。
因为C语言是实践性很强的一门课程,所以C程序设计是非常适合自学的一门课程。学生可以通过编程来巩固和加深对知识点的理解,可以通过上机操作来检验判断的正误。教师应当倡议和引导学生建立自主学习模式,培养学生自学能力,锻炼和提升学生的计算思维能力。在上第一堂C语言课时,教师可以推荐学生安装手机版的C语言编程软件c4droid,能够方便学生上机而不受时空的限制,可以充分利用碎片时间学习。同时利用互联网的便利,建立自学QQ群或微信群,为学生释疑,及时解决学生自主学习时遇到的问题。
培养学生自学能力,可以方便学生在需要时自学另一种语言。大四做毕业设计时,很有可能不采用C语言编程,而是使用其他语言或软件编程,比如MATLAB、ImageJ、有限元分析等等,在今后工作时,可能要使用专用的分析软件,有了C语言设计的基础,以及自主学习的能力,可以很快上手掌握其他语言或软件。
四、结束语
国家建设需要大力发展信息产业,需要大批能将信息技术应用于本领域的新型专门人才,而高校教育担负着培养计算机应用人才的重任。C语言课程主要是学习程序设计的方法,为将来程序设计进一步的学习和应用打下基础。教师通过教学改革帮助学生建立C语言语法知识体系,培养学生分析问题和解决问题的能力,建立起自主的学习模式,达到持续学习乃至终身学习的最高境界,为国家培养创新综合型人才奠定基础。
参考文献:
[1]李廉.计算思维——概念与挑战[J].中国大学教学,2012(1):7-12.
[2]Angeli C., Valanides N. Developing young children's computational thinking with educational robotics: An interaction effect between gender and scaffolding strategy[J]. Computers in Human Behavior, 2020,105(Apr.):105954.1-105954.13.
[3]Heintz F, Mannila L., Frnqvist T. A Review of Models for Introducing Computational Thinking, Computer Science and Computing in K-12 Education[C]//2016 IEEE Frontiers in Education Conference (FIE). IEEE, 2016.
[4]Henderson P B, Cortina T J, Hazzan O, et al. Computational Thinking[C]// The 38th ACM SIGCSE Technical Symposium on Computer Science Education. New York, NY: ACM Press, 2007:195-196.
[5]Francisco José García-Pealvo, Antònio José Mendes.Exploring the computational thinking effects in pre-university education[J]. Computers in Human Behavior, 2018,80(3):407-411.
[6]譚浩强.C程序设计(第四版)[M].北京:清华大学出版社,2010.
[7]王东旭.C语言程序设计课程教学探索[J].湖北农机化,2019(14):46.
[8]高江勇.高质量本科教学的发生——为何需要及何以实现互动式教学[J].高等教育研究,2020,41(1):84-90.
[9]汪永伟,苏会芳,刘育楠.基于任务驱动的信息安全技术课程教学研究[J].教学管理与教育研究,2016(5):35-36.
[10]苏会芳,汪永伟,张玉臣,等.任务驱动教学法在应用型计算机课程教学中的应用——以Visual Basic程序设计课程为例[J].中国教育技术装备,2019(10):69-71.
[11]刘红梅.任务驱动式案例教学法的构建与应用[J].江苏高教,2016(4):71-73.
[12]赵勤.学生独立思考能力培养的探讨[J].教学与管理,2013(27):69-71.
[13]柳玉英,王平,刘青,等.环境分析化学教学中研究生自主学习能力培养的探索与实践[J].大学教育,2019(12):41-44.
基金项目:国家自然科学基金委员会“CFRP层压板脉冲红外热波检测的缺陷特征提取及其检测概率研究”(编号:51865038);江西省自然科学基金委员会“混合激励检测复合材料缺陷的红外热波方法研究”(编号:20151BAB207058);江西省教育厅科学技术项目“先进复合材料层压板冲击损伤的红外热波检测研究”(编号:GJJ150730)
作者简介:袁丽华(1970-),女,汉族,江西南康人,博士,副教授,研究方向:激光与红外检测技术。