C语言程序设计
上QQ阅读APP看书,第一时间看更新

1.2 计算思维

1.2.1 问题的提出

2005年6月,美国总统信息技术咨询委员会(PITAC)给美国总统提交了名为《计算科学:确保美国竞争力》的报告,报告建议将计算科学长期置于国家科学与技术领域中心的领导地位。美国NSF的CPATH(CISE Pathways to Revitalized Undergraduate Computing Education)计划的目标之一是将计算思维学习机会融入计算机、信息科学、工程技术和其他领域的本科教育中,以增强开发具有计算思维能力的学生的人数。2011年,NSF启动了CE21计划,此计划建立在CPATH计划成功的基础上,其目的是提高K-14(中小学和大学一、二年级)老师与学生的计算思维能力。

美国为什么会关注计算思维的问题呢?

美国卡内基·梅隆大学周以真(Jeannette M.Wing)教授认为,计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为;计算思维最根本的内容,即其本质(Essence)是抽象(Abstraction)和自动化(Automation)。计算思维(Computational Thinking,CT)是运用计算的基础概念(Fundamental Concept)去求解问题、设计系统和理解人类行为的一种方法。计算思维的本质是抽象(Abstract)和自动化(Automation)。它是如同所有人都具备“读、写、算”(简称3R)能力一样,都可以具备的思维能力。计算思维不是程序化、流程化的,它是以计算机科学为代表的、以设计和构造为特征的一种抽象化、概念化的能力表现形式,与理论思维能力、实证思维能力一样,是人类用来问题求解、日常生活的管理,以及与他人进行交流和互动的必须要具有的思维能力。

计算思维并不是非要使人类像计算机那样思考问题,而是解决社会复杂问题的有效途径,是技能、方法的升华,它始终贯穿于科学研究和技术发展的全过程,是创新的灵魂。它是观念化的,通过分析、抽象、综合、概括等方法对计算科学的概括、加工是其本质特征表现。计算思维是思维过程或功能的计算模拟方法,其研究的目的是提供适当的方法,使人们能借助现代和将来的计算机逐步实现人工智能的较高目标。

在我国,关于计算思维的问题也引起了学者的关注,关于计算思维本质、定义和应用的大量讨论推动了计算思维在社会的普及和发展,但到目前为止,还没有一个统一的、获得广泛认可的关于计算思维的定义。“大学计算机基础教育改革理论研究与课程方案项目课题组”在著名的计算机教育专家吴文虎教授和高林教授领导的专家团队经历两年多的研究,对计算机思维给出了一个完整定义,从理论层面和操作性层面上对计算思维的本质、内涵及能力培养提出了一个新的定义,并结合大学计算机基础教育的改革,设计了基于计算思维的大学课程方案,本书就是课题的研究成果之一。

1.2.2 计算思维能力培养

人都是有思维的,但对一个问题的思维能力是不同的,因而解决问题的方法也会不同,自然会产生不同的后果。计算思维作为抽象的思维形式,不能像知识一样通过教学进行传递。而计算思维的操作性定义,正是对计算思维在解决问题的过程中的分析和阐释,将“计算思维”分解为易于理解的过程、方法、行动、品质等,从而使学习者将计算思维与自身能力、生活、学习有所联系,建立直观的参考,并且方便教育者据此建立评价标准,使抽象的计算思维概念可视化、可量化。操作性能够实际指导并提升学习者计算思维能力,对学习者计算思维能力的培养、提升思考和行动能力都具有现实意义。思维能力虽然属于程序性知识,不容易描述,但容易呈现并被识别,并且可以通过示范、练习和辅导的方式得到强化和修正。根据国内外专家学者的研究结果,思维是可以教的,是可以训练的。计算思维能力的培养,需要在掌握陈述性知识的基础上,有一个科学的训练方法,一个可行的训练载体,一个循环的训练过程。

1.要有一个科学的训练方法

思维训练是一项帮助人们形成高效思维模式,并在必要的时候打破已有模式形成新的思维模式的技术。要培养学生按计算思维模式来思考问题,就需要进行科学的思维训练。

程序设计课程的特点决定了其在学生计算思维能力培养中的重要地位。问题尽管千差万别,但是可以采用一种方法引导学生解决不同的问题,大家可以通过不同的求解过程,深入思考理解计算思维的内涵和特征。所以,应用“目的—输入—解答—决定—实施”这一教学过程进行问题求解和计算思维能力训练。

(1)目标:思考要解决的问题。把注意力集中在一件事上,它将作为思考的主题。尽可能明确地选择“思考目标”的重要性。

(2)扩展:对问题在深度、广度和多样性方面进行扩展。这是开放性思考,可以有不同的解决方案。

(3)浓缩:指把扩展思考浓缩成更切实、有用的东西,包括要点、摘要、结论、选择。

(4)TEC(Target-Expand-Contract,目标—扩展—浓缩):按次序使用上面3个工具。训练确定目标,思考主题并提取出可行的结论。

(5)目的:搞清楚思考的确切目的。到什么时候为止:做出决定,得到行动计划或者观点;明确思考的一般目标和特定目的。

(6)输入:要考虑的情况、情景、框架、可用信息、因素和人,所有应该考虑的因素。

(7)解答:各种备选的解决方案,包括最明显的、传统的和最新的,产生解决方案和补救缺陷的方法。

(8)决定:指决定的过程,从备选方案中选择最好的,包括选择的优先权和标准,决定的结果和评价等。

(9)实施:就是执行,即得出思考的最后结果,制定实现最后选择的步骤,把思考付诸实际行动。

(10)应用整个PISCO过程:目的—输入—解答—决定—实施(Purpose-Input-Solutions-Choice-Operation)。

2.要有一个可行的训练载体

在程序设计课程中要应用TEC-PISCO教学法进行思维训练,需要有可行的训练载体进行落实。本书的导例均分为“问题描述、问题分析、算法描述、程序实现、运行结果、程序分析”六部分,可以与PISCO的“目的、输入、解答、决定、实施”进行对应。

3.要有一个循环的训练过程

爱德华·德·博诺提出,人类大脑中的神经、神经元的突触和反馈系统是一个能让输入的信息自己组织成模式的系统。换句话说,有一个自我教育系统,它是创造模式、运用模式的系统,模式产生于输入信息的序列。思维如同运动,是一项可以通过不断的学习而逐渐被掌握的技能。学生按照教材导例中的六部分学习,进行循环训练,培养学生分析问题解决问题的方法,逐渐培养计算思维的能力。

1.2.3 程序设计能力与计算思维能力

程序设计能力和计算思维能力是什么关系?一个是计算机程序设计的能力,代表一个人的水平;一个是思维的能力,是处理问题的能力,是一个人的素养,这两种能力既有联系又有区别。程序设计能力属于实践能力,是可以体现、展示的;计算思维能力是解决问题的综合素质,属于内涵与素养。但是,程序设计能力可以逐步提升为计算思维的一个重要因素。程序设计能力的培养过程,也应该成为计算机思维形成的一个环节,在这一点两者是完全相同的。程序设计的过程也是运用思维解决问题的过程,思维在程序设计的过程中是非常重要的。因此,计算机思维的研究要从实际出发,面向应用,在深入学习C语言程序设计的过程中,注重计算思维能力的培养,更加注重程序设计的总体设计能力,注重算法、数据结构在程序中的使用,把利用计算机解决问题的过程“公式化”,如此反复,程序设计的过程即程序设计的能力就会逐步升华为计算思维能力。

1.程序设计中的思维训练过程

按照解决问题的过程进行思维训练:

(1)提出问题:描述待解决的问题;对应PISCO过程的“目的”。

(2)问题分析:对具体问题进行分析,按照一定的算法找到解决问题的方法;对应PISCO过程的“输入”,即包括需要考虑的所有因素和信息。

(3)算法描述:用流程图将算法抽象出来进行表示;对应PISCO过程的“解答”,得出各种解决方案。

(4)算法分析:对算法进行分析,找到最佳解决方法;对应PISCO过程的“决定”,从备选方案中选择最好的一种。

(5)程序实现和运行:将解决问题的方法用程序设计语言进行表示;对应PISCO过程的“实施”,即执行过程,把思考付诸实际行动。

2.具体实例

(1)提出问题:某广告公司制作广告板,现有长度为10m的边框材料,希望制作一个面积为6m2的广告板,请问该广告板的长和宽分别为多少米?

(2)问题分析:广告板需要满足的条件为长度为10m,面积为6m2,确定长和宽时需要满足这两个条件。可以通过将长和宽每次取不同的值,判断是否满足这两个条件,若满足则为合适的长、宽。

算法1:对该问题假设长为length、宽为width,最简单算法为length和width分别从1m开始,每次增长1m,判断长度2*length+2*width是否等于10,面积length*width是否等于6,如果都满足,则length和width的值为可以采用的长度。

算法2:根据length与width的关系:length+width=10,假设length从1m开始,那么width=(10-2*length)/2,再判断length*width是否等于6。

对于这2种算法,分析其数据与控制结构。显然,这2种算法都为循环结构,只是循环体和循环条件不完全相同。根据相应的算法,可以确定对应的循环条件和循环体。这个过程用二重循环来完成,length和width从1m变化到5m,最多需要比较10次。

(3)算法描述:将上述算法用流程图表示。

(4)算法分析:分析以下2种算法的效率,即循环体执行的次数。判断哪种方法最优。

算法1在这个过程用二重循环来完成,length和width从1m变化到5m,最多需要比较10次。

算法2在这个过程用单次循环来完成,其循环次数最多为5次。

由此可见算法2的方法较优。

(5)程序实现和运行:通过算法分析采用最优的算法2。用C语言实现,length数据运算范围从1到5,用整型变量表示;循环则可以用for语句来实现:

上述算法其实就是穷举法的思想,体现了计算思维中“穷举”的思维要素。通过上述过程,进行了计算思维的训练。