摘 要:文章源于教育教学实践,通过对计算思维起源做了简要阐述,并选择了计算思维的核心要素:抽象和自动化;从洞察思维过程层层细化、问题需求层层拓展、解决问题算法层层深入等三个方面着手,通过线下课程细节,如数值的比较、数组的引入、素数算法等展现在C语言程序设计课堂中如何将计算思维有效融入,如何开展计算思维融入程序设计课堂教学的实践研究。
关键词:计算思维;程序设计;算法
中图分类号:TP312;G642 文献标识码:A 文章编号:2096-4706(2020)04-0105-03
Abstract:Based on the practice of education and teaching,this paper briefly expounds the origin of computational thinking,and selects the core elements of computational thinking:abstraction and automation;from three aspects of insight into the process of thinking layer by layer refinement,problem demand layer by layer expansion,problem-solving algorithm layer by layer in-depth,through offline course details,through the comparison of numerical value,the introduction of array,the prime number algorithm and so on,it shows how to effectively integrate the calculation thinking into the C language programming classroom,and how to carry out the practical research on how to integrate the calculation thinking into the programming classroom teaching
Keywords:computational thinking;programming;algorithm
0 引 言
自周以真提出计算思维后,以计算思维为导向的教学改革在国际上悄然兴起,我国2017年推出的《普通高中信息技术课程标准(2017年版)》已将计算思维作为信息技术学科的核心素养之一。目前,学术界尚未在计算思维的内涵、教学内容、教学工具、测评工具等方面达成相对统一的共识,但多数学者认为计算思维的本质核心是抽象和自动化。抽象是把现实问题的核心抽离出来的过程,关注现实对象的本质特征;自动化是指计算过程在现实系统运作中的所采取的表现形式,如何有效地高效地自动化是计算思维的重要问题。
自上世纪80年代,全国各院校相继开设了计算机相关课程。C语言程序设计作为一门必修的入门课程,被广泛采用。基于“计算思维”的C语言课程教学模式,将不再偏重语法,而是将重点放在思维训练上,课堂上以问题求解为核心。教师的授课重点放在问题求解思路、算法和程序实现上。以计算思维为导向的教学改革,根据汪红兵等的提法,分析和梳理了C语言程序设计各章节知识点及其对应的计算思维培养点,“程序是对实际系统的抽象,C语言程序开发过程是对系统建模的过程,算法过程体现了计算思维的自动化”,比如说,数据类型是实现抽象的载体,C语句是自动化实现的基本单位,函数体现了模块功能的抽象,控制结构是对问题求解步骤的抽象和自动执行单位。
笔者根据C语言教学经验总结,尝试基于“洞察思维、问题需求、解决算法”三部曲,将计算思维融入程序设计课堂,进行计算思维融入C程序设计课堂的初探。
1 洞察思维层层细化
在C语言教学的第一节课,笔者提问了学生们两个问题:“你们知道计算机是如何思维的吗”“你们知道自己是如何思维的吗”,面对着两个问题,同学鸦雀无声。一方面可能还不理解思维是什么,另一方面思维的确难以言表。
笔者在课堂上做了个实验,在屏幕同时展示随机10个自然数(比如3、7、12、24、8、21、20、5、16、13)后,然后请同学们迅速说出最大值和最小值,同学们立刻异口同声说出了最大值24,最小值3。这时继续提问上面的问题,换了方式,“你们怎么得出最大值24,最小值3”,同学们依然欲言又止,对于在10个数字中找出最大值和最小值,对于他们来说是显而易见的事;然后在屏幕上继续同时展示了100个随机自然数,请他们说出最大值和最小值,此时同学们有点困惑,随着时间慢慢过去,报出来的答案参差不齐;接下来又给同学们依次展示100随机整数,展示完就要求得出最大值和最小值,这次同学们在最后一个数字出现之后,便再一次异口同声地报出了正确结果。
通过上面的例子,说明在一些简单问题上,很容易忽略具体的思维过程。然而让计算机通过程序设计来解决的实际问题,往往是简单问题的巨型化。上述案例说明了计算机如何比较多个数中的最大值和最小值,其本质就是数值的两两比较,对于微小数据量的比较,人类往往忽视过程,当出现较大数量级的时候却有时手足无措。正如周以真指出:计算思维是运用计算机科学的基础概念进行问题求解、系统设计和理解人类行为,是通过约简、嵌入、转化和仿真等方法,将一个看来困难的问题重新阐述成一个我们知道怎么解决的问题。为此在C语言程序教学中,对于经典的程序算法等,需要引导同学剖析思维过程,比如质数的算法、水仙花数的算法等。
2 问题需求层层拓展
通过对问题需求层层拓展,帮助学生建立已有概念的知识链,达到巩固已有知识和引入新知识的目的,实现优化抽象建模和自动化水平,发展计算思维水平的目的。例如在数组的教学引入中:设计一个程序,输入要求某班10位同学某门课程的分数,最后打印出总分。根据学生们已有的知识和编程技能,很容易建立抽象模型int score=0; //存储分数的变量,long sum = 0L; //总分数,float average = 0.0f; //平均分;以及实现自动换解决方案:
for(int i=0;i<10;i++)
{ printf("Enter score:");
scanf("%d",&score);//从键盘读入一个分数
sum += score;}//将读入的分数加到总分数里面
此时教师对实际需求进行第一次拓展,形成与已有解决方案的冲突,要求同时输出10位同学的最高分和最低分,引导学生深入思考,发现该方法只保留了最后一个学生的分数。因此,如果在此程序的基础上继续求最高分和最低分是行不通的。此时,同学们重新建立抽象模型和优化自动化过程,应用到了数值比较大小的算法思路,int max = 0; //存最大值int min = 100; //存储最小值,程序做了如下调整:
for(int i=0;i<10;i++)
{ printf("Enter score:");
scanf("%d",&score);//从键盘读入一个分数
sum += score;//将读入的分数加到总分数里面
if(score>max)max= score;//保证max中存储分数最大值
if(score
此方法虽然能解决最高分和最低分的问题,但除了最高分、最低分以及最后一位同学的分数,其他学生的分数全丢失了,这与现实不符,也不利于后续的排序计算等,接着教师对现实需求进行第二次拓展,要求保留所有学生信息,并为后续计算做好准备,有学生可能会使用多个变量存储分数:int score0=0,score1=0,score2=0,score3=0,score4=0,int score5=0,score6=0,score7=0,score8=0,score9=0;但随着学生数量的增加,此种抽象显然欠妥,再者也不便于for循环自动化的进行,教师继续制造已有方案与需求之间的冲突,引导学生计算思维发展,改进抽象模型和自动化过程,从而引入新的抽象模型——数组。
3 解决问题算法层层递进
讲解编程例题时,解决同一问题的方法要层层递进,通过不断优化算法,引导学生不断思考,帮助学生不断扩展认知水平,实现优化抽象建模和自动化水平,发展计算思维水平的目的。例如:在讲解判断并输出100以内所有素数例题。根据素数的定义,因为素数除了1和本身之外没有其他约数,所以判断n是否为素数,最直观的方法:根据定义直接判断从2到n-1是否存在n的约数即可。
for(int i=3;i<100;i++)
for(int j=2;j<99;j++)
if (i % j == 0)
break;//遇到可以整除的数,即跳出内层循环,说明此i不是素数
else
return true;//自然结束内层循环,说明此i是素数
上述自动化方法存在算法时间效率低下的问题。对于每个正整数n,其实并不需要从2判断到n-1,根据数学经验可知,一个数若能进行因数分解,那么分解时得到的两个因数一定一个小于等于sqrt(n)(其算术平方根),一个大于等于sqrt(n),据此,上述方法中并不需要遍历到n-1,只需遍历到sqrt(n),因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。以此引导学生进行算法优化;优化算法如下:
for(int i=3;i<100;i++)
for(int j=2;j<=sqrt(i);j++)
if (i % j == 0)
break;//遇到可以整除,即跳出内层循环,说明此i不是素数
else return true;//自然结束内层循环,说明此i是素数
此时的算法时间复杂度已经有所降低,同时学生理解起来难度也不大。到这一步已经适合大多数学生对素数求解的算法优化需求。但此时仍需要给学生一个认知的拓展空间,引导学生认识到在算法优化的道路上永无止境,随着认知水平的提升,可能会设计出更巧妙的算法过程。通过观察素数分布的规律发现,超过5的素数有这样的规律:与6的倍数相邻。例如5和7,11和13,17和19,23等;此时若能给出学生能够容易理解的证明最好,例如:令x≥1,将大于等于5的自然数表示如下:…6x,6x+1,6x+2,6x+3,6x+4,6x+5…可得,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2)它们不可能是素数,再除去6x本身,素数显然只可能出现在6x的相邻两侧。注意,在6的倍数相邻两侧并不一定就是素数。
根据以上素数的分布规律,判断素数可以6个单位步长,即将优化算法循环中i++步长设置为6,代码如下:
if (num == 2 or num == 3)// 两个较小的数进行处理
return True;
if (num % 6 != 1 and num % 6 != 5)// 不在6的倍数的两侧的一定不是素数
return False;
temp = int(sqrt(num));
for(int i=2;i
if (num % i == 0 or num % (i+2) == 0)
return False
return True // 剩下的全是素数
通过不同难度算法的层层递进,使得不同层次的同学都能找到适合自己的建模需求和自动化过程,这样既满足了不同学生的需求,也在各层次学生中融入了计算思维。
4 结 论
文章从思维过程、问题需求、问题算法等三个方面着手,通过课程细节,展现在C语言程序设计课堂中如何将计算思维有效融入,如何开展计算思维融入程序设计课堂教学的实践研究。此外,注重采用多种方法来解决同一问题;在教学过程中通过逐步改变条件或增加条件的途径来拓展案例;在教学过程中注重从问题分析开始到算法流程图设计,再到程序设计完整地讲解一些典型的C程序设计例题等等也是很多研究者尝试的途径。
参考文献:
[1] 王立翔.基于计算思维的python语言课程教学改革刍议 [J].教育现代化,2017,4(15):12-13.
[2] 余先荣.基于计算思维的C语言课程教学研究 [J].科技资讯,2018,16(26):161-162.
[3] 陈国良,董荣胜.计算思维的表述体系 [J].中国大学教学,2013(12):22-26.
[4] 胡晓辉,吴嘉昕,陈永,等.C语言程序设计课程中计算思维能力的培养 [J].教育现代化,2019,6(10):38-40+52.
[5] 汪红兵,姚琳,武航星,等.C语言程序设计课程中的计算思维探析 [J].中国大学教学,2014(9):59-62.
作者简介:周龙(1989-),男,汉族,江苏镇江人,教师,讲师,硕士研究生,研究方向:计算机编程、计算机网络。