《C++程序设计》的计算思维教学实践初探
2017-06-05李利明
李利明
摘要;把计算思维贯穿到《C++程序设计》课程的教学中,让计算思维和实证思维、逻辑思维一样,成为学生的基本科学思维能力。对基于计算思维的《C++程序设计》课程教学实践及强化计算思维能力培养的教学方法进行了有益的探索。介绍了基于计算思维教育的《C++程序设计》课程设计。
关键词:计算思维;程序设计;教学实践;算法
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2017)07-0143-03
《程序设计基础》是大多数理工科学生及部分文科学生的选修课甚至必修课,而C++语言又是大多数学校教授这门课程的首选语言。开设这门课程的意义,很多学生甚至部分老师认为就只是为了掌握一门编程语言,为语言而学习语言,为编程而学习编程。事实上,大多数学生没有认识到的是,通过学习一门编程语言,进而学会编程,可以让他们拥有与听说读写同等重要的认知能力——计算思维。可以说计算思维是我们和计算机对话的接口,通过学习这门课程,让学生具备初步的计算思维能力也是开设《程序设计基础》这门课程的一个重要目的。
什么是计算思维,卡内基梅隆大学的周以真教授对其进行了系统阐述和推广。周以真教授认为,计算思维代表着一种普遍的认识和一类普适的技能,每一个人,都应热心于它的学习和运用。如果一个人具备计算思维能力,则能让他“像计算机科学家一样思考”。对于计算思维,她是这样定义的:“计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为。计算思维包括了涵盖计算机科学之广度的一系列思维活动”。那么,什么是像计算机科学家一样的思考呢?因为计算机科学家具备了丰富的计算机科学理论和知识,总是以自己扎实的学科知识从事计算机相关的研究工作,同时,在日常的生活中,也会自觉或者不自觉地运用计算机学科知识解释身边的现象、解决身边的问题。
计算思维描述的不仅是计算,能计算不等于有计算思维;计算思维是人的思维,不是程序,也不是计算机的思维,大学生学习《C++程序设计》这门课,应该从单纯的语言、编程的学习,转变到计算思维的培养学习上来,使计算思维如同实证思维、逻辑思维一样,成为每个学生应该具备的基本科学思维能力。
如何把计算思维引入到《C++程序设计》这门课程中来,本人在教学过程中开展了有益的实践和探索,得到了学生的认可。
1基于经典算法的计算思维教学实践
将《C++程序设计》课程的重点转到程序设计的思想和方法上来,而不是仅仅教授一门程序设计语言及其应用。课程以“发现问题——分析问题一寻求不同解决方法—对比选优—解决问题”的“问题求解驱动式”的讲授方法,通过实际的案例中的一些经典算法,尽可能地讲授清楚计算思维在解决实际问题中的作用。
比如在讲授完排序算法后,给出一个背包问题的案例;出去远足,允许你带一个规定大小的背包,装尽可能多能量(卡路里)的食品。这是经典的背包问题。你可以预先将所有食品的能量按大小排序,然后按顺序从高到低装包。但你的背包是限重的,能量高的食品可能很重,导致你装的食品很少,从而总能量并不高。一种方法是以卡路里/重量的比率排序,按比率從高到低的顺序将食品装入背包,从而希望装入背包的食品总能量最高。这种以每次价值最大为依据解决问题的思想就是贪心策略。
贪心策略的基本思想是把求解问题的任务分解为若干个步骤,但算法在每一步骤的决定可能是短视的,即该步骤所采取的方法是局部最优而非全局最优解。尽管并不是所有问题的局部最优解就是全局最优解,但在实际问题求解过程中,仍然可以用贪心策略得到可以接受的问题解。
从计算思维的角度看,贪心策略为我们提供了解决问题的一个方法:以当前和局部最优化为出发点去求解问题简单易行,具有一定的适用性。
在讲授函数的递归调用这个知识点时,通过介绍归并排序这个实例提出分治策略的思想,即把一个较复杂的问题分解为若干个与原问题同结构但规模较小的子问题,然后以递归的方式求解这些子问题,并通过合并子问题的解得到原问题的解。
分治策略也体现了一种计算思维在里面,它是解决工作和生活中很多问题的一种常用方法。分治策略为我们提供了这样一种思路,当面对复杂问题时,可以把问题转化为相互之间具有一定联系的、规模较小的、解决方法类似的子问题,最后通过合并子问题的解得到原问题的解。
通过这样的案例,讲解若干典型算法在问题求解中的应用,揭示其所体现的计算思维,让学生在学习算法思想的过程中逐步培养他们的计算思维能力。同时感受具备一定的计算思维能力所带来的好处。
2强化计算思维能力培养的教学方法
《C++程序设计》作为非计算机专业的学生的计算机语言的入门课程,要学好它是有难度的,C++的语法规则繁琐、枯燥、抽象,对具体语法规则的学习和记忆会影响学生对语言本身内涵的理解和计算思维的体验。本人在教学过程中,从训练学生的计算思维为出发点,将计算思维的本质——抽象和自动化作为主线,贯穿于整个教学过程中。从问题出发,通过抽象、约简,转化成解决问题的算法描述,最后得到算法的C++语言实现。将《C++程序设计》课程从以往偏重讲授一个个孤立的语法知识点转变为以计算思维为出发点,把重点放在问题求解和算法的实现上,这样的教学方法,可以达到对学生的计算思维进行更好的训练的目的。
在教学过程中,多用生活中的例子解释计算机课程中的概念,是让学生尽早建立起计算思维的好方法。比如在讲解算法的概念时,从生活中的问题求解(比如做菜)出发,讲解其与计算机求解问题的异同点,进而引出算法的概念、特点和描述方法。在讲解递归这个在计算思维中非常重要的概念时,从生活中的现象出发,比如两块面对面放着的镜子中的影像,去引导学生理解递归的概念。通过讲解数学中的阶乘的递归定义,让学生理解递归算法中的两个重要条件:求解问题的自相似性和递归出口。
在教学过程中,多用一题多解来引导学生深入思考,也是培养学生计算思维能力的一个好方法。教学中,一些问题往往不止一种解决方案,通过一题多解让学生去发现、寻求更好的解决方法。比如找假币问题,9个铜币,其中有一枚假币比其余的真币轻,现在有一个天平,请设计一个算法,找出其中的假币。方法一,每两个铜币一组,分为4组,分别放到天平上称,前面4组任一组有假币都可以通过天平称出来,如果4组都一样,则假币是没有被分组的那个铜币,所以最多称4次可以找到假币;方法二,先将其中的8个平分为两组,如果相等,则剩下的是假币,否则,假币一定在较轻的一组里,把这一组的4个平分成两组,假币一定在较轻的一组里,再把较轻一组的两放到天平上称重找到假币。这种方法最多需要称3次可以找到假币。方法三,将9个铜币每三个分为一组,将其中的两组放到天平上称一次,可以确定假币在哪一组,再将有假币的一组分为3组,每组一个币,将其中的两组放到天平上称一次,即可确定假币。这种方法最多称两次即可找到假币。可以看到,三种方法虽然都能找到假币,但显然第三种方法效率最高。在教学中经常采用这样的一题多解的方式可以更好地提高学生分析问题、解决问题的能力。
在教学过程中,多安排学生上机实践,它也是培养学生计算思维能力的重要方法之一。在实践环节,教师应该尽量设计难度适中、趣味性比较强的实验题目,提高学生的学习兴趣。比如在讲授C++的循环结构时,要求学生上机完成打印输出一个由“*”构成的菱形图案,在完成题目的过程中理解循环嵌套的机制,分析内循环和外循环在输出图形中所起的作用,总结发现规律,最后得出打印输出一般二维图形的方法。
3基于计算思维教育的《c++程序设计》课程设计
计算思维不仅仅是编写程序,而是运用计算机的相关概念、技术去求解問题、设计系统和理解人类与自然界的行为和现象。大学应该以培养学生的计算思维能力为核心,使它成为每个学生都具备的基本科学思维能力。
如何在程序设计课程中引入计算思维,是很多高校正在开展的实践和探索_8_。下面介绍针对全校非计算机专业学生开设“计算机程序设计基础(C++)”课程的具体实施方法。
“计算机程序设计基础(C++)”这门课程的目标是:学生学过这门功课后,能够系统掌握结构化程序设计和面向对象程序设计的理论、方法与技术,增强学生的动手能力,培养学生的计算思维能力和创新能力,提高学生学习计算机知识的兴趣。
表1是这门课的教学安排。除了课程内容的讲授,实验和实践环节也是非常重要的,我们精心准备了与课程内容同步的实验,并且在理论课程结束后还安排了16学时的实践环节,学生集中在一到两周内完成一个大的完整的课程设计作业,通过这种形式来帮助学生综合运用课程中所学的知识来解决实际问题,从而达到提高学生分析问题、提高计算思维能力的目的。
在这门课程的教学中,教师时刻注意以讲授程序设计的基本思想和方法为纲,在这个过程中潜移默化地将计算思维融入到学生的思维体系中。
4结束语
计算思维能力的培养还处于小规模的、探索性的阶段,本文的很多想法和做法都还不成熟,如何将原来以面向语法为中心的程序设计教学转变为以面向问题求解为主的教学,让培养学生的计算思维能力成为这门课程的核心目标,仍然有许多需要亟待解决的问题,需要我们共同努力。