谈科学思维方法在“C 程序设计”教学中的运用

2024-01-21 18:52李晓会
关键词:程序设计科学算法

崔 杰,赵 颖,李晓会

(辽宁工业大学 电子与信息工程学院,辽宁 锦州 121001)

二十一世纪是一个信息技术高速发展的时代,以计算机技术为代表的信息技术已经逐步渗透到社会的各个领域,计算机已经成为学习、生产、生活必备的工具,并发挥着重大的作用。作为新一代的大学生,对计算机技术的掌握尤为重要,不仅要掌握计算机的应用,还要提高自己的思维能力以及遇到问题能够进行分析应变的能力。能够恰当地运用科学的思维方法借助计算机高效地解决生活和工作中遇到的问题,是当代大学生需要逐步培养并具备的能力[1]。在大学阶段,程序设计课程无疑是培养大学生计算机能力及科学思维最有效的课程。程序设计课程是每个大学的计算机基础必修课程,对提升大学生程序设计能力和科学思维能力起着不可或缺的作用。有效地训练和培养学生的科学思维能力,成为大学教师不可忽视的教学目标。在传统的“C 程序设计”教学过程中,教师只注重程序设计本身涉及的数据结构和算法的讲解,对程序设计中应用到的多种思维方法很少提及,学生也只是机械地学习编写程序。程序设计中涉及很多的科学思维方法,常见的思维方法比如穷举思维、发散思维、递归思维等。在教学过程中要有意识地将程序设计教学与科学思维方法联系起来[2],并要贯穿课程始终。

一、科学思维方法的重要性

大学阶段是学生自主学习及培养思维能力的黄金阶段,要培养一个合格的大学生,首先要从培养他的思维能力开始,使其逐步养成用科学的思维方法思考问题、解决问题的习惯。如果教师只教给学生现象背后的原理或操作流程,学生的收益是很有限的。科学思维方法能让学生用敏锐、有创造性的眼光去看待事物,沉稳面对挑战,用正确高效的方式去处理问题。养成这样一种做事的习惯,将来无论到什么领域,学生们总是能依赖成功的思维方式解决问题,若把这种思维应用到工作、生活的方方面面,那它就能发挥更大的作用。

二、科学思维方法在“C 程序设计”教学中的运用

传统的“C 程序设计”课堂不会刻意讲授科学的思维方法,但是科学思维方法在“C 程序设计”中却实实在在地被应用到。在传统的教学模式下,科学思维方法的传授并没有得到教师的足够重视。笔者依据多年积累的C 程序设计课程教学经验,对程序设计中涉及的科学思维方法进行归纳总结。在课程讲授的过程中,选取恰当的案例进行分析,使学生逐步养成用科学的思维方法来分析、解决问题的习惯,使学生学习程序设计的兴趣也得到很大的激发,学习质量得以提升。本文主要讲解穷举思维、发散思维、递归思维在“C 程序设计”教学中的运用。

(一)穷举思维

穷举思维是一种最简单、最直接且有效的解决问题的思维方法。虽然简单直接,却可以解决很多计算机领域中的计算问题。它的思想是根据问题的描述来确定数据个数及大致范围,根据要求设置判断的条件,对范围内的数据逐一去检查核对,直到找出全部的结果为止。如果排查完所有情况后都没有符合要求的条件,则本题无解。穷举思维在整个计算机领域的应用非常广泛,看似简单的穷举思维方法,却能够利用计算机解决很多的问题。在程序设计中经常遇到的密码破译问题、素数问题、完数问题、水仙花数问题、逻辑判断问题、鸡兔共笼问题、硬币问题等很多问题都是可以通过穷举思维来解决的。穷举的应用领域也非常广阔,在理论上,由于计算机计算速度很快,采用穷举法可使计算领域中的多种问题得到解决。在现实应用中,如果要解决的问题需要的数据量不是很大,那么就没有必要花很大的代价去设计一种更高效的算法,用穷举算法实现其运算速度一般情况下都是可以接受的。

穷举法也称为列举法,最终要列举出全部需要的结果。根据穷举法获得结果数据类型的不同,可以分成简单数据、数据的排列、数据的组合,分别对应下面3 种列举方法,分别为顺序列举、排列列举和组合列举。

用穷举法解决计算问题,大致可以分以下3 个步骤:

1.确定范围:分析问题涉及哪些情况,设置穷举的循环范围。应用穷举法解决时,对涉及的每种情况必须一一列举,既不要遗漏,也不要重复,否则可能会导致解的遗漏或增加。

2.设计条件:首先将满足问题的条件描述出来,然后利用选择结构进行条件判定的实施,最后得到问题所有需要的解。

3.运行及结果分析:

以排列列举为例:排列列举每一个要求的结果都是一些数据的排列。以幼儿园老师分玩具为例:有5 个不同的玩具,要分给甲、乙、丙3 位同学,分配原则就是每个同学只能分到1 个玩具,请问老师有多少种不同的分玩具的方案?

(1)分析

本题是一个典型的排列穷举实例,答案是一个排列问题,即从5 个玩具中取3 个进行排列的方法的总数。为了区分不同的玩具,需要将5 个玩具进行从1 到5 编号。最终的结果是3 个同学每人分到1 个玩具,必须满足3 个人所得到的玩具的编号都不相同,这就是满足题目要求的1 种分玩具方案。列出所有的分配方案就是最终的解。

(2)实现代码如下:

(3)运行程序

程序运行后最终会有60 种分配方案,如果不列举,学生也不会想到会有如此多的分配方案,通过本题目的学习,会使学生深刻体会到计算机与穷举法结合的魅力。

(二)发散思维

发散思维是创新型人才应具备的最主要的特点,是评价人才创新能力的重要标志之一。发散思维是从待解决的问题出发,以不同的途径和方法寻求多种解决问题的答案,最终比较方法之间的优劣以获得最终解决问题的思维方法。在心理学领域,发散思维是大脑在思维时不按照一贯的想法去思考,通常呈现一种发散状态的思维模式。发散思维能够使人产生奇思妙想、拓展思路、开阔视野、转换看待问题的角度,从而实现人才培养的全面发展。在C 程序设计课程的教学中,教师可以设计一些可以多路解决的程序设计题目,通过该类题目的训练来逐步培养和训练学生的发散思维能力。不同的学生看待问题的角度不同,做题的方法也就不同。首先,教师应积极鼓励学生勤于思考,拓宽思路,对学生的思维给予鼓励和肯定。其次,教师汇总学生的不同解决方法,引导学生分析不同方法的优缺点及适应情况,达到举一反三的效果。以此教会学生发散性思维,使学生后续的程序设计的学习效果更为显著。

在“C 程序设计”教学之初,发散思维就给学生留下了深刻的印象。例如求3 个数的最小值问题,是非常简单的一道题,通过该题,却让学生实实在在体会到从不同角度、不拘一格的发散思维方法。求3 个数的最小值,首先,教师提出问题,学生分组讨论采用怎样的方法来解决,每组学生都可以列出几种方法,虽然方法不够完善,但已经足够让学生了解到发散思维的魅力。其次,由教师进行总结,该问题基本上可以从3 个方向来分析解决,即1 个1 个数比较;2 个2 个数比较;3 个数一起比较。最后,教师与学生一起讨论每种方法的优劣及适用情况,哪种方法适合数据量比较大的情况,最终得出结论是前两种方法更加适合推广,为后续的选择排序和冒泡排序埋下伏笔。解决求3 个数的最小值问题不但能开阔思路,同时也用到了if 选择结构的3种形式及if 的嵌套,使学生把所学的知识融会贯通,对发散思维也有了更深的理解,为后续的“C 程序设计”学习奠定了良好的基础。

(三)递归思维

递归思维方法比较难于理解,本文利用浅显易懂的实例来讲解递归思维方法。递归思维分为两部分,递推与回归。递推从问题向后推,一直推到能得到结果之后向前回归,一直回归到欲求问题的本身,使问题最终得以解决。同时,递归也存在不足之处,在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等,所以在递归次数过多的情况下不提倡用该方法。

但如果算法很复杂,却具有递推和回归的特性,利用递归算法编写程序,可以使程序变得简洁和清晰。递归算法在程序设计中应用广泛,“汉诺塔”[3]问题就是典型的代表,该算法非常具有递归的代表性,但对初学者来说不容易理解。因此,作为递归算法的入门,笔者选取一个非常简单的游戏来进行算法的入门讲解,然后再让学生去解决“汉诺塔”问题,学生有了兴趣,解决问题的积极性也就提高了,问题也就变得没那么难了。

递归思维举例:猜一猜学生年龄问题游戏

让班级中的5 个同学到前面站成一排,大家来猜一猜第1 个同学的年龄。第1 个同学说我比第2个同学大2 岁;第2 个同学说他比第3 个同学大2岁;第3 个同学说他比第4 个同学大2 岁;第4 个同学说他比第5 个同学大2 岁。最后第5 个同学说他的年龄是3 岁。请问谁能知道第一个同学的年龄是多大?

学生开始猜,如果想知道第1 个同学的年龄,要向后推问第2 个同学的年龄,想知道第2 个同学的年龄,要向后推问第3 个同学的年龄,以此类推一直推到第5 个同学的年龄。已知第5 个同学的年龄是3 岁,通过回归就可以知道第4 个同学的年龄是5 岁,再回归就可以知道第3 个同学的年龄是7岁,一直回归就可以知道第1 个同学的年龄是11岁,这就是典型的递归算法的应用。

递归算法代码实现如下:

递归算法分析:

1.在调用函数的过程中又直接或间接调用了该函数本身,进行层层调用,一直调用到递推结束的条件,然后层层返回,一直到最初的调用位置。

2.必须有递推结束的条件

通过这个猜年龄的小游戏让学生深刻体会到递归算法的神奇,充分调动了学生的学习兴趣,加深了学生对递归思维的理解,逐步掌握了递归思维解决问题的方法[4]。课后让学生自己玩“汉诺塔”游戏,亲身体验游戏的过程,进行小组讨论如何利用递归算法来解决“汉诺塔”问题。教材中有“汉诺塔”的范例,如果学生理解得不够透彻,可以借助教材,最终也能够顺利解决。通过让学生自己分析,写出递推函数,达到了举一反三、对所学知识能够灵活应用的目的。

三、总结

科学思维方法有很多,在教学中需要不断积累,找到合适的案例,恰到好处地将科学思维加以运用,才能使教学达到预期的效果。科学思维的引入使学生对编程的兴趣明显增强,无论是在期末考试还是在程序设计大赛中都有不错的表现。在C程序设计课程教学中,教师通过有意识地培养学生的科学思维方式,使他们在遇到问题时能够勤于思考、善于变通,根据不同问题的特点,选择不同的方法来解决,把所学的知识与技术能够灵活地运用到生产生活中,从而提高了分析问题和解决问题的能力。

猜你喜欢
程序设计科学算法
基于Visual Studio Code的C语言程序设计实践教学探索
基于MapReduce的改进Eclat算法
点击科学
Travellng thg World Full—time for Rree
科学大爆炸
从细节入手,谈PLC程序设计技巧
进位加法的两种算法
高职高专院校C语言程序设计教学改革探索
一种改进的整周模糊度去相关算法
科学拔牙