《程序设计》课程培养学生思维的实践探索

时间:2022-08-07 02:11:53

《程序设计》课程培养学生思维的实践探索

摘要:《程序设计》是高等学校理工科专业普遍开设的系列必修课程,对计算机专业具有非常重要的地位。探讨如何通过《程序设计》教学培养本科生,特别是新生的计算思维,提出了五种以计算为训练方式培养计算思维的教学方法,以计算思维为导向的教学改革已经在上海电机学院计算机基础教学部进行了小范围应用并取得一定成果,初步说明通过计算培养计算思维是一种行之有效的教学模式。

关键词:计算思维;程序设计;语言;计算;新生

中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2015)49-0276-03

一、《程序设计》课程简介

《程序设计》是高等学校理工科专业普遍开设的系列必修课程。这门课主要讲授用高级语言如C/C++及Java等开发计算机程序的基本知识,培养学生用计算机分析并解决问题的能力,使学生掌握软件设计的基本方法,为后续课程奠定基础。

国内高校普遍将《程序设计》课程按照语言的不同分为多个系列:C语言、C++语言及Java语言等。不同学校及专业根据各自的培养方案为学生开设其中几种,至少有一种语言(一般是C语言)为必修,开设于大一及大二学年,理论课与实验课共60~100课时,持续1~2个学期。各高校也普遍为计算机相关专业高年级学生开设其他流行编程语言如Visual Basic以及更专业化编程语言如Matlab、SQL及HTML等等。这些语言的基本语法与C语言相似甚至是高度相似,程序设计思想相通,因而其教学也高度依赖于低年级程序设计课程的教学效果。

二、面向新生的《程序设计》课程

对计算机及软件等专业的学生而言,《程序设计》是一门专业基础课,这门课程一般开设于本科一年级,因而授课对象主要是本科新生。一方面,大多数计算机相关课程如《数据结构》、《操作系统》及《数据库》等都需要编程语言的基础知识,学生在这门课收获的学习成果对高层次的学习乃至工作都具有非常重要的意义;另一方面,编程语言课程的教学能够直接训练学生的计算思维[1],计算思维的形成和培养,是目前高等院校计算机教学,甚至包括非计算机专业的计算机基础教学所追求的一个重要目标。在学生刚刚升入本科阶段,而几乎不曾开始学习专业课,专业思维模式尚未形成之前,就逐渐培养其计算思维,又显然是这项任务的重中之重。

高中信息技术课程一般包括Visual Basic等编程语言的知识,但长期以来,受高考指挥棒的影响,全国各省市的小学、初中与高中教育普遍对计算机(信息技术)课程的重视程度不够。在程序设计不作为会考要求内容的省份,一些学校甚至没有开设编程语言课程,或者要不做任何要求,导致在高中阶段,教师与学生的教学兴趣度极低。一个最直接的后果是,即使是计算机相关专业的学生,刚进入大学时,也普遍对程序设计这类课程既陌生又恐惧。

由于这类课程本身的深度与难度,本科新生,特别是在高中阶段没有学过程序设计,甚至几乎不曾接触过计算机的新生,往往承受较大的学习压力,如果不能很好地掌握程序设计的思维与方法,学生很容易丧失学习计算机相关课程的兴趣与信心,从而影响整个大学阶段的专业学习,因而承担大一新生程序设计课程的教师也同样承受较大的教学压力。如前所述,这个问题产生的直接原因固然是高中信息科学知识储备的不足,但根本原因还是学生在从多年来已经习惯的数理化式的定义与公式学习模式转变为以计算机学科为代表的设计与实验的学习模式时产生了障碍,或者说学生没有能够形成学习计算科学应具有的思维模式。因而解决这个问题的关键即是,要通过程序设计课程的教学使学生形成并逐渐强化计算思维。

三、计算思维的内涵及重要性

按照卡内基・梅隆大学Jeannette M. Wing教授提出的广义概念[1],计算思维是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。而具体到程序设计这门课,计算思维可以理解为编写高级语言程序的方式解决问题的思维活动。由此可以看出,程序设计课程是培养学生的计算思维最重要的方式之一,而培养学生的计算思维也是程序设计课程最重要的目的之一。

计算思维这一重要概念被提出后,引起高等教育界的广泛注意。关于如何在程序设计课中培养本科生的计算思维能力这一问题也成为高校计算机教学中普遍关注的问题。文献[2-4]讨论了如何通过计算机基础教学培养计算思维,文献[5-7]讨论了通过程序设计课程培养计算思维,文献[8]讨论了如何通过程序设计培养学生的多种思维能力,文献[9;10]提出以计算思维为导向开展程序设计教学,文献[11-13]提出了基于计算思维的程序设计教学改革方式,文献[14;15]讨论了通过程序设计课程培养计算思维的具体实践方式,文献[16]探讨了如何以计算思维为训练目标设计程序设计案例,文献[17]讨论了如何通过非计算机专业的程序设计课程培养计算思维。但围绕如何针对新生开展高效程序设计课程教学[18],以及如何培养新生的计算思维这些方面的研究却还很少。

计算思维,顾名思义,即“一切皆为计算的思维”,可以把它理解为一种将复杂的实际问题都转换为可以用计算机解决的思维模式,而计算机解决任何问题的本质,显然都是通过各种计算来完成的。掌握用计算机解决问题的方法,是当今社会中最重要也是最基本的技能之一。要实现这一目标,就要靠计算思维的长期渐进式培养与发展,这主要涉及两个方面的任务:(1)需要了解计算机求解问题所使用的计算方式。只有了解计算机计算的方式,才能判断一个问题是否可以直接被计算机求解,也才能将待求解的问题转换为计算机可以求解的形式;(2)需要掌握用计算机求解问题的设计方法。只有能够设计出让计算机求解问题的计算方法,即算法,才算真正掌握了计算机科学。在众多计算机相关课程中,程序设计是能够实现以上两个任务的重要载体课程,而计算,作为计算机解决问题的终极形式,又显然应该是实现培养计算思维这一目标的核心训练手段。

四、以《程序设计》培养计算思维的实践策略

本人所在基础教学部承担上海电机学院全校非计算机专业及计算机专业本科一年级学生的程序设计课程教学任务,包括C/C++语言及Java语言,分两个学期授课,理论课共64学时,实验课共32学时。从字面意义就不难看出,“计算思维”的核心思想是计算的能力和技巧。在教学中,我们以计算作为最重要的训练方式,贯穿于整个教学环境中,尝试以计算促进计算思维的形成。具体地,我们主要采取以下方法:

1.用计算问题让学生快速开始程序设计。学生都经过从小学到高中的数学训练,普遍对各种基本数学问题非常熟悉。用一些最简单的计算问题例如“从键盘输入数值,计算其和差积商”可以使学生迅速上手,开始学习编写程序。一方面,这样可以避免在学习初就因受困于复杂的问题本身而影响编程语言语法规则的学习;另外一方面,也使学生通过解决简单的计算问题获得学习新课的成功感和自信心,提高对后续课程学习的兴趣。

2.用计算问题使学生了解程序设计实现计算的规则。在讲授选择结构程序设计时,我们使用了“数学年份,输出各月天数”的例子。一年中的各个月份天数不同,仅需分为三种情况;二月份的天数需要根据该年是否是闰年来判断,而闰年的判断是小学生都非常熟悉的:即年份能被400整除;或能被4整除但不能被100整除。为了用编程语言描述这种判定规则,就需要引入逻辑运算符表示“与”和“或”的关系并且要准确理解运算符的优先级。这样就可以通过一个例子充分了解分支结构程序的设计规则和逻辑计算的规则。

3.用计算问题使学生了解用计算机解决问题所需要考虑的额外因素。在进行一般的数学计算时,除了有些情况要求数值只能是整数,我们一般不必考虑一个数是整数还是小数。但是用高级语言处理数据,除了比较特殊的Python等语言不区分数据类型,一般的高级语言如C和Java都是严格区分数据类型的。在数学上,我们可以很自然地书写x=1,y=0.5,但是在编程语言中,如果x被定义为浮点型,那么整数转换为浮点数,涉及表示方式的转换,可能会丢失精度;如果y是整数,将浮点数转换为整数会丢失小数部分。而后者,在类型严格的语言如Java语言中甚至是不允许的。虽然单纯的数学计算几乎不涉及整数和浮点数类型转换的问题,但数据的类型转换却是程序设计中最容易出错的。通过编写测试性程序验证0.1+0.2不等于0.3,学生的印象会非常深刻,并且能够更直观地了解在用计算机计算时,数据类型精度是一个必须要考虑的因素,从而形成一种思维模式,在设计计算方法时能够处处考虑类型与精度的相关问题。

4.通过计算加深对计算殊规则的理解,强化计算思维。在教学中,我们会让学生编程练习求“3斤2元的蔬菜,6斤多少钱”这样看似极其容易的问题。大多数学生会因为按照数学的习惯书写2/3*6这样的表达式而得到看似荒谬的答案0,这样的错误在程序设计中非常普遍地存在,并且在调试代码时这类错误隐蔽性极大,不容易被发现。只有通过大量这类的计算练习,才能让学生充分理解程高级语言(C/C++/Java等)中/的特殊运算规则,即整数除法的结果还是整数,如果要得到比较准确的结果,至少要把被除数和除数中的一个转换为浮点数,对于变量需要使用强制类型转换,对于常量,除了强制类型转换,还可以在后边添加.0,及2和2.0在计算中是截然不同的两个数,产生的计算结果也是全然不同的。由此可以进一步强化对数据类型转换的理解。

5.用计算问题使学生了解纯粹的数学思维和计算思维的差别。在讲解循环结构时,我们让学生编程计算两个数的最大公约数和最小公倍数。大多数学生会受困于小学数学中学过的短除法方法:用一个一个公因子依次去除两个数,直到商是互质的。对于手工计算,这种方法当两个数都不太大,公因子比较容易找且不都太大的情况是非常容易且直观的。但是用计算机套用这种思路编程时就会遇到麻烦:手工计算式公因子是直观“看”出来的,而计算机是没有办法一下子猜到一个公因子的。但是利用循环,这个问题就迎刃而解。按照定义,最大公约数,就是最大的可以整除两个数的数,最大不会超过两个数中较小的一个,只要用循环,从两个数的最小值开始,一个一个尝试,每次减1,找到一个能够同时整除两个数的数,就是答案而不必继续找,而各种高级语言普遍都提供了求余的运算符。当两个数变得很大时,这种方法的效率很低,于是可以利用循环实现更快寻找最大公约数的辗转相除法;对最小公倍数的练习,也同样可以强化循环的学习效果。通过这些例子可以使学生清楚地意识到,数学中的计算方式转换为计算机的求解过程需要一定的转换,而这种转换正是计算思维的关键所在。

对以上几种计算训练模式,一个重要的环节是让学生在实验时犯错误,通过在计算中发生看似怪异的错误,而运算过程在数学上看来又无懈可击,才能通过仔细的错误分析与代码调试,发现按照一般思维无法发现的,由于计算机编程语言处理问题的特殊性而导致的错误,这样才能使学生对这类错误的印象更深刻,从而尽可能减少今后出现同类错误的可能。

五、结语

在程序设计的教学中,我们利用学生普遍具有长期打下的良好的数学基础这一特点,通过采取以上几种方法,让学生在解决计算问题时学会设计计算方法,逐步形成计算思维模式、加强计算思维方法,最终培养其计算思维能力。目前,课程教学改革正在持续进行阶段,已初步取得一定成果,但还缺乏更久更大范围的理论研究和实践论证。我们希望能够以这些改革措施改进理工科《程序设计》课程的教学效果,为大一学生学习后续课程打下良好的基础,使他们受到全面的计算思维训练,具有良好的信息素养,最终提升他们在走出校园进入当今信息社会时的核心竞争力。

参考文献:

[1]Wing J M. Computational thinking[J].Commun. ACM,2006,49(3):33-35.

[2]朱鸣华,赵铭伟,赵晶,et al.计算机基础教学中计算思维能力培养的探讨[J].中国大学教学,2012,(03):33-35.

[3]陆汉权,何钦铭,徐镜春.基于计算思维的“大学计算机基础”课程教学内容设计[J].中国大学教学,2012,(09):55-58.

[4]李波.计算思维与大学计算机基础[J].中国大学教学,2012,(07):43-45.

[5]冯惠妍,陈争光,邰建华,et al.程序设计中“计算思维”的教学研究[J].农业网络信息,2013,(04):120-122.

[6]王卫华.在程序设计类课程中培养学生计算思维能力的思考[J].武警学院学报,2013,(07):51-53.

[7]王先超,王春生,胡业刚,et al.以培养计算思维为核心的C程序设计探讨[J].计算机教育,2013,(13):44-47.

[8]卜晨月.程序设计与学生思维能力培养的探讨[J].林区教学,2013,(03):72-73.

[9]董卫军,邢为民,索琦.以计算思维为导向的程序设计课程改革与实践[J].工业和信息化教育,2013,(06):60-64.

[10]刘光蓉.以计算思维能力培养为导向的C程序设计实验教学[J].实验技术与管理,2013,(01):154-156+191.

[11]刘晓璐.基于计算思维的Java程序设计教学改革[J].广东技术师范学院学报,2013,(05):108-110.

[12]孙丽君,杨志强,高枚.围绕计算思维培养的程序设计课程改革[J].计算机教育,2013,(05):29-31+38.

[13]徐燕,潘亚平.计算思维与计算思维能力培养――谈大学计算机基础教学改革[J].江苏技术师范学院学报,2013,(02):92-95.

[14]商书元.计算思维培养在程序设计课程中的实践[J].教育教学论坛,2013,(39):203-205.

[15]张雪伍,常晋义.计算思维在C++程序设计教学中的应用[J].计算机教育,2013,(13):52-56.

[16]杨俊生,张润.基于计算思维的“C程序设计”案例设计初探[J].工业和信息化教育,2013,(06):65-69+64.

[17]商艳丽,许美玲.基于计算思维的非计算机专业VB程序设计课程教学研究[J].河南科技,2013,(16):262.

[18]赵飞,荆光辉,张润泽.如何培养大学新生计算机语言编程能力[J].计算机教育,2007,(10):13-15.

上一篇:4.5G“参上”,除了提速还有别的吗? 下一篇:基于SWOT模型的我国陶瓷产业发展分析