剥开编程教学中“结构”的坚硬果壳

2023-01-30 05:11梁见斌浙江省余姚二中
中国信息技术教育 2023年1期
关键词:嵌套流程图语句

梁见斌 浙江省余姚二中

曹伟 江苏省盐城市盐都区龙冈小学

信息科技中的算法与程序设计教学越来越来重视计算思维,而计算思维的形成也要基于程序结构进行算法表达,对顺序、分支、循环三种基本程序结构的学习是对算法认知的基础。那么,应如何深度学习程序结构也即影响算法思维形成深度呢?笔者认为,教师需要在教学中尽最大可能去剥开这些“结构”的坚硬果壳,学生才能够吃到里面的果肉,吸收其营养,发展其思维。

● 对比分析:for循环和while循环是等效的吗?

在相同程序结构的不同代码对比中,可以体会到循环中各种变量的变化,从而洞察循环的特征与意义。

1.案例:for循环和while循环对比

在讲解算法的循环结构时,我常用的方法是先根据算法设计绘制出流程图,然后把流程图“翻译”成源代码。今天,举的例子是最常见的计算累加值,如s=1+2+3+…+10。教师先绘制出流程图(如上页图1)。

图1

接下来,学生们自行选择使用for循环语句或者while循环语句来实现程序功能。学生们都低头写代码,我在巡视。突然,小A同学发问:“老师,这个流程图描述的算法不严谨!”我一愣:“为什么?”小A:“因为它没有输出。算法的特征之一是必须有一个或多个输出,程序结束之前应该输出s的值。”我为他竖起了大拇指:“小A同学很认真!程序中有两个变量,大家索性在循环体外把它们的值都输出来吧。”很快,大部分学生的代码都写好了,我请小A来展示他的代码(如上页图2)。

图2

小A骄傲地说:“老师,我是严格地按照流程图编写代码。程序输出结果为s=55,i=11。”我再次为小A竖起了大拇指:“不错!算法逻辑清晰,代码简明规范。还有别的不同做法吗?”这时响起一个声音:“我的结果怎么和他不一样!”说话的是小B,“我用的是for循环,算法逻辑和流程图相同,但输出结果中i的值为10(如图3)。”

图3

我顺势引导:“算法逻辑确实是一样的,为什么循环结束后变量i的值不同呢?”在Python中for循环的运行机制确实与while循环不一样,它的循环次数在一开始就确定了,即使中途修改循环变量的值,也不影响循环的次数。大家可以看看这段代码(如图4),猜猜程序输出的结果是什么?

图4

这段代码会正常结束吗?好像出现死循环了!事实上并没有出现死循环,程序输出结果为:s=55,i=9。这说明什么问题?循环次数在一开始就确定了,与i的值无关。再看一个例子(如图5),大家猜猜程序能否正常结束?若能正常结束,则程序输出的结果是什么?

图5

每执行一次循环就把s的值插入到a的尾部,这样列表a会越来越长,循环永远也不会结束了吧?但是,事实上也没有出现死循环,程序输出结果为:s=55,i=9。聪明的你知道原因所在了吗?循环结束后,a的值为多少呢?

2.反思与总结

不同的循环构成的原理与使用的方式是不同的,在观察中对比分析是一种很好的探索学习。while循环和for循环的运行机制不一样。while循环利用循环条件判断是否执行循环体,当循环条件为假时循环结束;而for循环是使用迭代器协议访问对象,循环结束时i指向序列最后一个元素。平时,可能并不一定遇见或发现一些奇怪的问题,因此制造问题也是重要的策略之一,如流程图缺少了输出语句,是让学生学会分析问题的一个契机。在调试程序4时,也会发现len的计算值已然容易理解。如果不是len(),直接用a呢?这属于迭代探索,不妨运行观察,会有更大困惑。教学虽不宜继续挖掘,但的确也很有意思,能够启发探索。

● 思辨:循环嵌套的迭代效应

循环语句的嵌套很多学生都似懂非懂,不得要领。在一次课堂的意外发现中,让循环嵌套有了更好的诠释,原来循环嵌套与迭代思维还存在着很大的关联效应。

1.案例

(1)观察循环次数与旋转角度的关系。在讲授Python程序设计turtle画图模块时,我让学生用for循环语句绘画常见的几何图形,学生很快就绘画出各种常见的几何图形,有长方形、正方形、正六边形等(如下页图6)。而原本,只是想让学生探究出重复执行的次数和旋转角度之间的关系,即两者相乘的积为360。

图6

(2)从循环次数扩增到循环嵌套的迭代。在课堂巡视的过程中,我有了意外的发现,有个别调皮的学生将循环计数次数改得比较大,如50,100等,同样也画出了圆形(如图7)。

图7

看到这,我心生一计,何不以此让学生探究循环语句的嵌套?这是非常好的课堂教学机智,何乐而不为呢?于是,我让学生在刚才绘画的图形中选择一种图形,将脚本代码进行一次复制并修改,看看会产生什么样的新图形(如图8)。

图8

我正准备用软件选择一个学生的作品进行针对性讲解与评价,但无意中选择了平时特别调皮的一位学生,心想他肯定不会做,正准备重新选择,可选择的电脑界面引起了我的注意,于是我立马放大了界面进行广播:“同学们,这个图案是不是特别美(如图9),像极了一个圆形。告诉老师,这是谁画的?”

图9

“老师,是张小明。”我接着问道:“哪位同学来解释一下这个程序(如图10)?最里面的循环语句结构是一个正方形的程序,而外面循环语句结构是控制正方形旋转的程序。那外部循环的次数多少才合适呢?你能用一句话描述什么是循环嵌套吗?”学生回答:“周而复始就是循环中的循环,也就是将多个循环语句嵌套在一起使用。”

图10

我接着说道:“同学们,看看这个图形(如图11),你能看出这个图形的基础图形是什么吗?又是如何控制这个图形的旋转来绘画出这个组合图形的呢?”“老师,我发现基础图形是一个小正方形,是用两个计数循环语句来控制的,是通过旋转小正方形形成的新图形。”有的学生发现了秘密。为了让学生能够更好地理解两层循环的嵌套,我让学生修改外层循环的计数参数,试试会产生哪些漂亮的图案。

图11

(3)多层循环嵌套产生循环嵌套迭代效应。在课堂巡视的过程中,我发现有学生将刚才的循环语句多复制了一次,出现了三个循环语句嵌套在一起的现象(如图12),产生了如图13所示的图案。有了内循环产生基础图形,二层循环控制基础图形的旋转的基本概念模型,我于是趁热打铁,借着这位学生的图案,让学生来研究三层循环嵌套中最外层循环的作用又是什么。

图12

图13

在学生自主探究三层循环过程中,有学生将最外层计数循环参数改得较大,发现产生了各式各样的图形图案。为了更方便观察循环的过程,我让学生降低海龟画图的速度,仔细观察发现,原来循环是一个整体,可以将每个循环部分分开来看,只需要把握每一个循环部分的功能就可以很好地理解循环嵌套。

2.反思与总结

借助学生课堂的教学生成,有利于因势利导组织探究活动。将循环嵌套与迭代思维相结合的方式,能帮助学生理解什么是循环嵌套,从两层循环到三层循环的过渡恰到好处。这样的教学体验与探究过程可以有效帮助学生理解循环嵌套语句,初步认知迭代思维,从逆向思维的视角来看,学生经历了抽象、建模、表征等过程,这些过程是发展学生计算思维的重要方法。

猜你喜欢
嵌套流程图语句
兼具高自由度低互耦的间距约束稀疏阵列设计
重点:语句衔接
一种程序源代码的标准化流程图转化方法∗
论电影嵌套式结构的内涵与类型
嵌套交易如何实现逆市盈利
巧用嵌套交易实现逆市盈利
宁海县村级权力清单36条
我喜欢
作文语句实录