丁 岩,张宇昕
(长春理工大学计算机科学技术学院,长春 130022)
目前,在国内高校中程序设计类课程教学模式基本上是以高级语言自身的体系为脉络展开的,没有把逻辑与编程解题思路放在主体地位上。教学中过于注重语句、语法和一些细节。由于课时的限制,分析问题和解决问题的方法涉及较少,对程序设计思路的交代也过于简单。在教学中,教师在限定的课堂时间内将理论知识灌输给学生,学生处于被动接收的状态。学生对教师所讲内容没有感性认识,难以引起学习兴趣,没有学习积极性。由于学生的学习热情不高,所以即便掌握了这些基本的内容,也很难灵活创新地运用所学的知识来分析和解决问题。这导致学生综合分析能力、创新能力和实践能力都有所欠缺,无法满足社会的需要。程序设计课程,是训练学生思维能力的一个最直接最重要的平台,如何在程序设计语言教学的同时教会学生运用计算思维去思考问题和解决问题成为今后教学的重要课题。
在2006年,美国卡内基·梅隆大学的周以真(Jeannette M.Wing)教授,在美国计算机权威期刊《Communications of the ACM》杂志上给出并定义了计算思维。周教授认为:计算思维是运用计算机科学的基础概念进行问题求解、系统设计,以及人类行为理解等涵盖计算机科学之广度的一系列思维活动[1]。在周教授的观点中,计算思维是人的思维,而不是机器的思维;是概念化的思维,而不是程序化思维;是数学和工程互不融合的思维,而不是数学性思维;是每个人的基本技能,而不是仅属于计算机科学家。
这里计算思维强调的是如何求解问题及其操作过程和机器实现方法。计算思维吸取了解决问题常常采用的数学思维方法,然后运用计算机的基础知识去求解问题、设计系统[2]。这里,计算机科学不仅仅是将软硬件等人造物呈现在我们生活中,更主要的是,人们使用计算机来求解问题、管理日常生活,以及和他人交流。计算思维是利用启发式推理来寻求解答[3]。
目前在长春理工大学,《C语言程序设计》是面向全校非计算机专业的理工科生开设的一门计算机基础必修课。因此,基础课的教学要求应该与计算机专业课教学有所区别。基础课的教学不需要涉及计算思维的方方面面,而应该面向各专业计算机应用需求,以培养学生基本的计算思维能力为目标。目前,对大多数非计算机专业的学生来说,学习程序设计的目的并不是要成为程序员,而是学习计算机分析、解决问题的思路和方法。因此,在《C语言程序设计》课程教学过程中,一定不能陷入注重语言表达形式的误区。在将计算思维的培养作为教学核心任务的教学过程中要重视程序设计方法,而不是语言本身。不仅仅要求学生用机器“读得懂”的语言写程序、调代码,更重要的是要学会如何设计算法。算法设计得如何正是计算思维的体现。
在第一堂课中,可以展示经典案例及上届学生的优秀作品,使学生对本课程产生浓厚的兴趣。在课堂上还可提出贯穿C语言始终的“交换问题”,结合实际生活中的“一瓶酱油与一瓶醋交换”的过程,形象直观地加以表示,使学生对三条交换语句不再混淆。在基本语句层面采用这种“案例驱动”教学模式可以激发学生的学习兴趣。这样,从应用实例入手,从问题引入知识点,由知识点带动语法规则的掌握,使学生加深了对计算思维的理解。
在理论教学中,应突出重点,淡化繁琐的语法规则,增加学科前沿知识。除此之外,还要精心设计一些有趣味性、有吸引力的例子来提高学生的学习兴趣。例如,在引入指针概念这节中,可以先给学生讲述大侦探福尔摩斯派华生到威尔爵士房间取指令的故事,让学生从中明白,指针是指向变量的地址的概念。
从计算思维的角度出发,重组经典案例,将问题求解提升到计算思维的高度。程序“猜数游戏”[4]大家都不陌生,简单的“猜数游戏”可以把分散的语法结构关联起来。例如:
(1)使用if单分支选择结构设计输出结果“您猜对!”
(2)使用if双分支选择结构设计输出结果“您猜对!”还是“您猜错!”
(3)使用if嵌套设计输出结果并判断“猜大了!”还是“猜小了!”
(4)使用循环结构结合break和continue语句设计,直到猜数猜对,限制猜测次数。
(5)假设通过多次,把猜对5个数字组成一个数组。
(6)利用指针实现猜对5个数值的“猜数游戏”中的相关函数。
(7)使用结构体对猜对者的班号姓名以及自然信息进行存储。
(8)利用文件保存“猜数游戏”的排行榜。
这样,由浅入深,循序渐进地把枯燥的知识点融入到了有趣的算法设计中。学生面对感兴趣的问题,就会积极地思考并讨论各种解决问题的方法,既掌握了基本的语法结构,又学会了用计算机程序设计解决问题的方法。
例如,C语言中的“猴子吃桃问题”。可以借助利用计算思维的特征,引导学生使用递归方法来解决。在教师的引导下,学生逆向思维,从后往前推断。N-S流程如图1所示。在这个实例中,学生可以全面了解到递归算法的递推过程和回归过程。递推中,需要把规模为n的复杂问题推到较简单一些、规模小于n的问题的求解中来。问题中第n天的桃子数是第n+1天桃子数加1个后的两倍。同时,在递推中,必须要考虑递归何时终止。这里,就是到第10天时,桃子数为1个的情况。在回归过程中,获得最简单的解后,逐层返回,逐渐得到稍复杂问题的解。由于第10天的桃子数是1,即是后一天的桃子数加上1后的2倍,就是前一天的桃子数,那么t1=(t2+1)×2。
在这个例中,教师引导学生使用递归的方法,逆向思维求解问题[5]。学生既掌握了递归方法,又锻炼了思维。类似的汉诺塔问题、求阶乘问题,学生都能想到用递归方法去解决。
图1 “猴子吃桃”流程
《C语言程序设计》这门课的实践性很强,以往教师在布置实验任务时,容易统一安排任务,如按部就班地做实验教材上的练习等,没有针对性。这样的方式,既使得能力较差的同学总是无法完成任务,失去学习热情和信心,也使基础好的同学能力得不到体现,无法进一步提高。
在实验内容设计上,除要求学生完成一般基本的题目外,还要适当给出一些综合性的题目,要求基础好的学生完成,并给予适当的指导。在实验教学中,可以采用统一实验和自选实验相结合的原则,统一实验就是以实验教材为依据,完成规定的实验题目。而自选实验指的是,学生在课下组成小组,以组为单位,讨论设计创新型实验题目。为了培养学生独立分析问题、解决问题的能力,首先要鼓励学生在实验过程中自主解决所遇到的问题;其次要让学生通过与同学、老师的交流或者在网上查阅相关资料来解决问题。例如,在循环这章中,集中实验题目要求学生求1~100这100个自然数之和。在做此题目之前可以先让学生分析s=1+2+3这3个自然数之和的求解过程,然后,求s=1+2+3+…+100。再启发学生如何求s=100!,并进一步提出问题s=1!+2!+…+100!要求学生讨论设计算法,然后完成编码和程序调试。
在程序设计过程中,教师在尊重每位学生的个体差异的前提下,对于不同的学生要鼓励其从不同角度认识问题,使用不同的方式描述算法,用不同方法求解问题,同时给予适当的、科学的评价[3]。在实验内容的设计上,针对同一个实验任务,要鼓励学生使用不同的算法来实现,从而培养学生计算思维的多样性和创新性。除了正常的实验教学,还可以通过认识实习、课程训练两个环节来完成实践,认识实习偏重于对课程内容的理解,课程训练则强调软件设计的综合训练,两者的有机结合可以促进学生逻辑抽象能力和创新能力的培养。
学生通过上机实践可以体会到计算思维的精髓。“程序设计不是听会和看会的,而是自己通过上机实践会的。”实验课的目的就是训练学生:(1)将题目问题抽象为数学模型;(2)算法设计;(3)编写代码;(4)调试程序;(5)运行和分析实验结果。
《C语言程序设计》课程与计算思维培养的有机结合,一方面,教师从计算思维的角度,重新设计和组织程序设计基础课程的理论教学,可以提高教学质量,取得良好的教学效果;另一方面,也可以提高学生计算思维能力,使学生能够更好地应用计算思维来解决问题。新的教学思路和方法的探索是无止境的,因而今后还要在实践教学中不断探索和实践,同时提高自身素质,不断更新教学方法,把《C语言程序设计》课程的教学质量提高到一个新的水平。
[1]陈国良,董荣胜.计算思维与大学计算机基础教育[J].中国大学教学,2011(1):7-12.
[2]董荣胜,古天龙.计算思维与计算机方法论[J].计算机科学,2009,36(1):1-4.
[3]何钦铭,陆汉权,冯博琴.计算机基础教学的核心任务是计算思维能力的培养[J].中国大学教学,2010(9):5-9.
[4]谭浩强.程序设计教程[M].北京:清华大学出版社,2011.
[5]臧劲松.培养学生计算思维的程序设计课程教学[J].计算机教育,2012(2):78-80.