一道程序猿笔试面试必会题怎样用scratch做出来?

网友投稿 2019-11-17 14:13

点击上方“启迪少儿”即可关注订阅
很多家长觉得scratch太简单了,只需要拖拽封装好的积木块就可以了。而我们scratch老师则会回应,scratch是低门槛高上限的,是没有天花板的……为什么这么说,我们今天就看一看用scratch怎么来做一道程序猿笔试面试必须要会的一道题——排序

题目的任务叙述很简单:对一个已知数组,按照从小到大(或大到小)排序

 用scratch我们可以很快让计算机给出任意数组,比如,可以有10个任意数字

https://cdn.china-scratch.com/timg/191119/1413541I8-0.jpg

工作:(1)建一个列表【L】;          (2)列表通常的初始化工作——删除全部项目;  (3)重复10次插入1-100的任意自然数

 这样我们就有了10个任意数

https://cdn.china-scratch.com/timg/191119/141354M15-1.jpg

接下来,就是排序了。程序猿考试考的是算法,什么冒泡排序、选择排序、插入排序等等。一个优秀的算法能使程序的性质带来质的飞跃,在scratch里面同样可以用这些算法来解决问题(谢声涛《scratch趣味编程进阶——妙趣横生的数学和算法》书中第12章“扑克学算法”就将这些算法描述得非常透彻)。

在这里我们就用“选择排序”的思路带着大家用scratch实现从小到大排序

思路是这样的:

第一轮:我们用第一个数字跟剩余的9个数比较大小,如果第一个数字比其他数字大,就交换这两个数字的位置(因为我们的排序是从小到大,就让小的数字在前面)。

具体:

1、第一个数字和第二个数字比较后,第一个数字89比第二个数字62大,就让两个数字换顺序;2、再让新的第一位置数字62和第三个数字45比较,比较之后45排到第一位置;3、新的第一位置数字45再跟第四个数字比较……

以此类推,最终排在第一位置的数字是整个数组【L】中最小的数字

https://cdn.china-scratch.com/timg/191119/14135415N-2.jpg

程序脚本体现如下

https://cdn.china-scratch.com/timg/191119/1413555205-3.jpg

我们新设一个变量【i】代表除了第1项以外的其他项,先将i设为2,通过让i每次增加1,实现第一个数字(L的第一项)与其他各个数字比较。

在替换之前,需要设一个变量【temp】,作为数字交换过程中一个承接数字的临时空间(我们通常称为“罐子”,交换数据的原理可以用两个杯子中的水交换来理解)。

 第二轮:用与第一轮同样的方法,让第二个数字40跟剩余的8个数比较大小(第一个数字一旦排好了就不需要再动),也就是让数组【L】的第2项,分别与从第3项、第4项、第5项……第10项逐一比较。

https://cdn.china-scratch.com/timg/191119/1413553131-4.jpg

本次需要将i设为3,让第2项与从第3项开始的其余8个数比较

 得到如下顺序的数组:

https://cdn.china-scratch.com/timg/191119/1413555937-5.jpg

第三轮:用同样的方法,让第三个数字53跟剩余的7个数比较大小

https://cdn.china-scratch.com/timg/191119/1413553Y9-6.jpg

第四轮:用同样的方法,让第四个数字跟剩余的6个数比较大小

……

最终得出排序结果

https://cdn.china-scratch.com/timg/191119/141355J52-7.jpg

看到这里,您对这个排序程序的算法步骤应该是很明白了,但如果按照这样下来这个脚本也太长了(即把以上所有脚本都要拼接起来),用scratch做反而很麻烦。那么有什么办法可以简化呢?

我们看到,在每一轮的第一个数字与其他几个数字比较,可以用重复执行数字顺序i+1就可以完成。而第二轮、第三轮……第十轮都是重复与第一轮一样的方法,是不是也可以嵌套一个重复执行的顺序呢

答案当然是可以的

 为了使我们两个数的比较更加清楚,我们可以设两个变量作为数组【L】的项目顺序,一个设为【n】,一个设为【i】,以 来控制轮数,以 i 来实现每一轮里已确定一个比较数后另一个比较数的变更。脚本程序可以缩减如下:

https://cdn.china-scratch.com/timg/191119/1413553014-8.jpg

当n=1时,i=n+1=2,i重复增加1,直到执行到10
当n=2时,i=n+1=3,i重复增加1,直到执行到10当n=3时,i=n+1=4,i重复增加1,直到执行到10……直到n执行到10(全部比较完毕)

这个用scratch排列数字的程序就基本完成了!

当然还可以用“制作新的积木”的方式将交换顺序的脚本封装,这就大大简化了接着用冒泡排序插入排序希尔排序等等方式再来玩一遍数字排序!

https://cdn.china-scratch.com/timg/191119/14135B3b-9.jpg

制作新积木块“交换数字”

所以说,用scratch一样能玩C、C++、python中的算法!在很多竞赛中就体现了排序这种算法的题。

到这里,你可能会松了一口气,还好,这是竞赛。我们成年人做这种题可能都有点绕晕啊!那么告诉你,软件编程预备级(scratch等级考试)4级中可能就会有类似难度的题!

https://cdn.china-scratch.com/timg/191119/14135C219-10.jpg

知识点讲完了,下面就给大家出一道scratch初级组(1-3年级)的一道编程题:

 任务:小明和几名同学在周末一起参加了一场苹果采摘活动,他们每个人摘到的苹果的数量已经存到了【苹果数量】列表里面,请你编写代码自动计算出摘的最多的比摘的最少的多摘了几个,把结果保存到变量【结果】中。

举例:摘的最多的摘了30 个,最少的摘了12 个,【结果】应该为18。

转载自“启迪少儿”公众号的原创文章

原文作者:北京通州的迪迪妈
























--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com