APP下载

C++课程融入计算思维的教学方法研究

2021-03-08李琥赵厚宝曾井泉

大学教育 2021年2期
关键词:面向对象计算思维程序设计

李琥 赵厚宝 曾井泉

[摘 要]在C++课程传统教学中,初次接触编程语言的学生普遍反映难于理解面向对象的基本概念,文章以“把程序语言用于解决现实问题”的教学理念为主线,把面向对象的概念落实到具体的应用开发中。授课时,教师有意识地引导学生从计算机的视角分解、抽象和表示现实问题,着重训练学生在用计算机解决现实问题时如何以计算思维的方式来思考。学生的反馈表明,此教学方法能有效地把面向对象的概念与现实问题结合起来,把空洞的概念转化成具体的现,帮助学生把课堂所学转化为解决现实问题的能力。

[关键词]面向对象;计算思维;程序语言;程序设计;在线评测系统

[中图分类号] G642 [文献标识码] A [文章编号] 2095-3437(2021)02-0111-04

引言

人工智能技术快速推进,以5G为代表的信息技术快速发展,与计算机有关的软件工程技术在整个经济社会生活中承担着极其重要的作用。C++课程是计算机相关专业的一门重要基础课,初次接触面向对象程序设计语言的学生普遍觉得这门课程难学,需要花大量的时间学习晦涩难懂的语法语义。因此,有必要找到一种有效方法,来引导学生把课程空洞的概念转化成具体的现实,进而把所学应用于解决实际问题。这是当今很多高校计算机专业课程“以工程教育为导向”的改革和探索方向[1]。笔者在教学实践中把计算思维[2]的方式融入教学,目的正是引导学生转变传统思维方式,逐步养成以计算机的思维方式来思考分析问题。计算思维是从计算机的算法视角来思考问题,计算思维方式的训練是激发学生编程热情并帮助其形成“问题即算法”的思维模式的一种有效方法。

2006年,周以真教授首次提出了计算思维的概念:计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为,其本质是抽象和自动化[3]。她认为,计算思维核心的元素包含分解、模式识别、抽象和算法四个部分,人们具备了这四个能力就能为问题找到解决方案。

从本质上说,计算思维是从计算机算法的视角来求解问题的思维方式,以求解问题的途径为主要诉求[4],解决问题的方案(或算法)以程序的形式表现出来并能在计算机上执行。具体在教学实践中,培养学生的计算思维必须有一个依托工具或抓手,在C++课程中融入计算思维的教学方法不失为一种好途径。本文论述的正是在程序设计课程教学中如何引导学生在解决现实问题时像计算机科学家那样去思考分析问题,并逐步养成计算思维的思考习惯。

文章提出了程序设计课程必须融入计算思维教学,并把在线评测系统(OJ系统)引入实践教学环节的方法。OJ系统验证程序源代码的正确性,使编程人员能有效地发现程序设计的问题与不足,促进代码优化。另外,在质量高的OJ系统,容易找到高质量题解或便于与同人交流,可以在增加趣味性的同时有效提高学生的编程水平。

一、当前存在的问题

C++程序设计课程的教学目前主要存在以下几方面的问题:其一,C++是面向对象设计语言,语法语义繁多,教学时教师容易陷入烦琐的语法语义教学当中,花大量时间给学生灌输语法语义知识,而学生也容易陷入琐碎的语法语义学习当中,最终导致教师为教学生学语法语义而教语法语义,而忽略了引导学生学习程序设计的思维方式。其二,按照传统的教学方法,教师一般是先介绍语法的形式和语义,之后通过示例程序巩固语法知识。学习之后学生们并不理解示例程序为什么要这样编写,而且在面对实际问题时,大部分学生不知道如何将问题分解、抽象,并最终找到解决问题的算法。其三,在实训环节,学生上机编写能运行的程序,但对测试数据考虑不全面,容易导致程序写完之后难于有效发现隐藏的bug。其四,学生难于从计算机角度对实际问题进行抽象,得出算法。其五,课堂应该增加程序的演示和运行环节,以通过编程思维训练、获得成就感来提高学生对程序设计学习的兴趣。

把计算机当成狭义的工具[5],只教学生如何使用计算机,已经成为大学计算机课程教学的普遍现象。显然,大学教育如果只关注计算机操作层面的教学,就难以满足各学科学生在未来的知识创新和发展中的需求,也难以跨越通用计算手段的学习与专业计算手段的学习之间的鸿沟。培养学生计算思维的能力是克服把计算机当成狭义工具的弊端的有效途径,可以帮助学生在学习计算机课程时转变固有的思维模式[6]。计算思维具有普适性,能够自然地融入除了计算机相关工作之外的其他创新工作中。

二、改进和完善教学方法

为了解决当前存在的问题,我们需要对程序设计课程的传统教学方法进行改进和完善。

(一)上好第一堂课

对大部分学生而言,学习编程课程的主要目的是学习计算机的计算思维方式,即学习用计算机分析和解决问题的基本方法和思路。因此,在课程开篇教学上,教师首先必须想办法让学生理解透彻“如何分解问题,将问题对象化”这个问题。问题被分解之后,接下来就是问题如何表示。面向对象程序设计采用的是其三大特征之一——高度抽象的方法,这就是计算思维的本质之一。程序设计课程是从算法的角度给出问题的计算机实现方法,即程序实现方法,它是计算思维能力培养的重要内容。C++是使用最广泛的编程语言之一,它是设计工具,也是实现工具,具有层次分明的抽象编程能力,是培养学生计算思维能力的好载体。

传统教学中,程序设计课程一般将语法入门作为课程开篇。然而,对程序设计领域完全陌生的学生难于理解和接受程序为什么要这样写。学生如果不能消除内心的这个纠结,就会给其后续学习设置障碍。因此,教师在实际教学中应该选择学生最为困惑的基本概念的解读作为课程开篇,这些概念包括计算、计算思维、问题分解、抽象和类。

(二)计算和计算机科学

针对一个问题设计出解决问题的指令序列(程序),并由计算机来执行这个指令序列,这就是计算。通过计算,计算机可以快速完成从简单到复杂的任务。

计算机科学家为了更好地利用计算机解决各种问题,深入研究了关于计算的理论、方法和技术,形成了专门研究计算的学问,即计算机科学。

计算是利用计算机解决问题的过程,计算机科学是关于计算的学问。计算机科学家长期用计算机解决问题过程中形成的思维模式和思考方法,即计算思维。

(三)计算的不同阶段

综前所述,计算是利用计算机流程化执行指令来解决问题的过程。从问题的计算机表示、算法设计到编程实现,计算思维贯穿于计算的全过程。学习计算思维,就是学会像计算机科学家一样思考和解决问题。

1.问题表示

用计算机解决问题,首先要建立问题的计算机表示。抽象是用于问题表示的重要思維工具。一般意义上的抽象就是对研究对象的具体的或无关的特征进行一种忽略或抛弃,抽取其一般的或相关的特性。抽象是计算机科学中广泛使用的思维方式,是程序员解决问题时必须具备的技能之一。抽象实例如图1所示。

教师在课程开篇除了要着重讲解计算、抽象的概念,还要讲解另外一个重要的概念即类,引导学生学习按照类的方式认识世界。教学中要着重引导学生学习将具体问题抽象化,描述客观存在的实体,树立万事万物皆对象(类)的概念,刻意弱化C++的语法细节,以简单的话题如描述自己的喝水杯子作为课程开篇内容,即对抽象概念进行实践性的理解。教师根据学生对简单事物的描述,逐步展开C++中类的属性和行为概念的解释。通过这种常识性话题的讨论,引导学生主动从思考事物的表示方法逐步过渡到抽象的概念即类的本质。这种铺垫式的教学方法可以使学生对新概念从一开始就有个良好的接受度,形成良性的心理优势。

具体到教学内容,教师可以先利用生活素材丰富教学内容。在一般的传统教材中,大部分示例程序都是为讲述概念而设计的,因此着重强调概念的程序表示方法,对解决现实问题起不到好的借鉴作用。大部分学生虽然能按部就班地理解程序编码,但依然无法着手解决遇到的现实问题。例如,在实际编码教学环节,传统教材都有把数值进行排序或找出最大值的例子,学生参照例子也能写出类似的小程序,但如果问题换成“找出10只羊中最大的那只羊”,很多学生就不知道如何处理,这时教师可以结合此实际案例讲解抽象的概念,将空洞抽象的“大小”转变为具体的“数值”,问题被抽象之后学生们通常可以写出对应的程序。教学时教师可以借助教室中的各种实体,让学生主动对问题进行分解和抽象并以类的形式表示出来,让计算思维模式真正成为学生解决实际问题的一种思考习惯。

2.算法设计

计算思维的思考模式是一种从计算机算法视角分析解决现实问题的一种最有效思考方式,即从计算机的视角来分析和解决问题,课程教学的全过程都应该以此为主线。

问题得到表示之后,接下来是找到问题的解法即算法。算法设计是计算思维大显身手的领域,我们解决现实问题就是要从计算机的角度找到最优化的算法。在算法设计阶段,教师要引导学生如何把自然语言描述的问题解决方法转换成计算机能识别的语言,即程序语言。教师逐步引导学生将问题进行分解,抽象,并用类的形式表示出来,在算法设计中将面向对象程序设计理论映射到实践中。这种着手解决实际问题的启发式教学,可以促使学生主动思考,让学生在轻松的气氛中,以项目驱动的方式掌握知识的要点。

3.代码实现

找到了解决问题的算法,接下来就要用编程语言来实现算法。编程实践教学环节是计算思维最终落实到代码实现的环节,是对学生基础理论、专业知识与实践经验的全面总结。完成代码后,代码能跑起来并不代表你的代码是很好的C++代码。好代码的衡量标准至少应该考虑以下几个方面:其一,可运行,能够完成既定的任务。这是最基本的要求。如果编写的程序不能工作,写得再多也没用。其二,代码稳定,没有“内存泄漏”“误差累积”等隐患。其三,具有可读性。一份好代码一定是逻辑清晰、结构分明、注释合理,便于他人维护的。其四,具有不错的执行效率。程序员可以通过优化数据结构、算法和代码来提高程序的性能即执行效率。其五,便于移植。即软件具有能运行于不同软硬环境的能力。

三、利用在线评测系统

在线评测系统(Online Judge,简称OJ)是用来在线检测程序源代码的正确性,通过OJ系统对程序源代码进行编译和执行。使用时,用户通过浏览器登录系统,在线提交自己的源代码。代码提交成功后,后台系统自动对源代码进行编译和执行,然后把输入和预期的输出进行比对并以此来判断程序的正确性,其原理是软件黑盒测试法。

现在国内外有很多可以免费使用的优秀OJ系统,用户只需在平台上完成注册即可自由使用。学习程序设计的学生,既可以在平台上提交代码测试程序,也可以与其他编程能力强的用户进行线上交流。与编程高手互动是提高编程能力的有效途径之一。

以下是几个比较优秀的OJ平台:

·杭州电子科技大学OJ平台:http://acm.hdu.edu.cn/

·北京大学POJ:http://poj.org/

·UVA:https://uva.onlinejudge.org/

四、课程考核

在传统教学中,衡量学生对一门课程的掌握情况的主要方式依然是考试,但对于程序设计类的课程,只通过考试去评价学生的程序设计能力是片面的。程序设计类课程的考核方式应该将学生的日常学习表现情况和项目完成情况纳入考核体系,还可以将比如参加创新创业大赛、挑战杯等课外的实践纳入考核范围,使整个考核多元化。对于学有余力的学生,教师也可以采用小规模限制性在线课程(Small Private Online Course,简称SPOC)的教学模式[7],分阶段晋级性地提高这部分学生的项目工程实践能力,并计入考核成绩。

获得平时成绩有很多方式,比如教师可以提出一个需要简单的计算机算法才能解决的现实问题,学生分小组给出问题的解决算法。小组算法正式提交之前,小组之间可以互动,指出对方方案的优点和不足,促使学生主动思考找出问题的最优算法。整个任务以考核学生的计算思维能力为目标,任务最后由教师做出点评,选出最优算法的小组。

把程序设计类课程的日常成绩计入考核,可以有效调动学生参加平时训练的积极性。整个课程的教学以解决实际问题为导向,有效解决了理论难于联系实际的问题,使教学效果事半功倍。

五、结语

从计算机算法的视角来分析和解決问题就是计算思维,它的提出获得了全球教育界的认可。本文以C++程序设计课程为抓手,在整个教学过程中,以解决现实问题为主线,有意识地引导学生逐步养成计算思维的思考习惯,避免了程序设计课程传统教学方法容易陷入纯粹语法语义教学的窘境;在课程实践环节,指导学生充分利用第三方国内外优秀的在线检测系统,以提高其实际编程能力。从学生端的反映来看,本方法取得了良好的教学效果,相对于传统的教学方式,学生对课程的学习热情有了明显提高,知道了如何才能最有效地学好计算机课程。

根据我们多年的C++程序设计课程教学经验以及对计算思维的理解,本文总结出以下教学经验:其一,以解决实际问题为教学主线,融入计算思维来分析和解决问题,跳出语法语义细节,从计算机的角度思考问题。其二,从程序设计的角度引入面向对象的核心概念,并着重讲述引入此概念的目的和解决什么问题。其三,鼓励以探索为本的学习,课堂上鼓励学生开阔思路,各抒己见。其四,强化实践环节,引入高质量的OJ平台,鼓励学生在与平台编程高手交流中获得进步。

总之,本文探讨根据面向对象程序设计课程的特点,以现实问题为驱动来开展教学,着重培养学生从算法角度去分解问题和解决问题的能力。同时我们也应该看到,培养学生的计算思维不可能一蹴而就,也不可能靠一两门课程就能完成,它涉及解决实际问题时思维方式的转变,是一个系统工程,我们只有不断努力实践才能掌握其精髓。

[ 参 考 文 献 ]

[1] 孙胜涛,张世辉. 面向工程教育的计算机专业课程体系改革和探索[J]. 大学教育, 2018(10):14-16.

[2] 周以真.计算思维[J].中国计算机学会通讯,2007(11):83-85.

[3] 陆朝俊.计算思维导论:程序设计思想和方法[M].北京:高等教育出版社,2013.

[4] 黄丽达,陈湘涛.将计算思维融入程序设计课程教学方法的研究[J]. 计算机教育, 2014(3):70-74.

[5] 白霞,高飞,赵娟. 基于计算思维的C++面向对象程序设计教学改革[J]. 计算机教育, 2014(11):7-9.

[6] 许四平.基于计算思维的面向对象程序设计教学策略探析[J]. 无线互联科技, 2015(21):100-101.

[7] 方向.新工科背景下的大学计算机教学改革研究和实践:以山东工商学院为例[J]. 大学教育,2019(6):88-90.

[责任编辑:庞丹丹]

猜你喜欢

面向对象计算思维程序设计
基于OBE的Java程序设计个性化教学研究
项目化教学在Python程序设计课程中的应用
C++程序设计课程教学改革研究
医学专业“Python程序设计”课程教学改革总结与思考
面向对象的计算机导论课程教学
基于Web的科研项目管理系统的设计与实现
应力波反射法测锚索长度的数据处理软件设计与实现
程序设计课程中计算思维和应用能力培养问题研究
民族高校C语言程序设计课程教学改革的研究
算法的案例教学探析