Scratch3.0 实现阶乘计算

很多时候,我们编写程序是为了让计算机帮助我们解决繁琐的问题,当我们使用计算器时,塑料壳内部已编程好的数字电路通过获得在按键上输入的操作符和数字就能按预先设定好的程序计算出结果并将结果输出到显示屏幕上。

这回我们就来设计一只会计算阶乘的小猫,考考它的计算能力。

首先,什么是阶乘计算呢?一般来说的阶乘,指的是正整数阶乘,数字n的阶乘表示为“n!”,它的值是所有小于及等于n的正整数的乘积,另外还规定:0!=1。

以5的阶乘为例:5!=5x4x3x2x1。分解来看,第一次5×4,第二次用得来的结果20×3,第三次用上一次得来的结果60×2,第四次用120×1

Scratch3.0  实现阶乘计算

这样有规律的运算共执行4次,即(5-1)次,第一次,5来乘以(5-1),第二次用第一次得来的值乘以(5-1)-1的值,第三次用第二次得来的值乘以((5-1)-1)-1的值,以此类推。可以看出在每次的乘法运算中,乘法符号的左边总是上一次乘法的结果,乘法符号的右边,则依次是(n-1)递减1的结果。

根据上面以n=5时为例,我们可以推断出做阶乘时,可以执行n-1次类似的乘法运算,因此在编程时重复执行的次数就限制在了(n-1)次。

在本例中,我们希望实现的效果是在小猫询问要计算的数值是多少之后,我们通过键盘输入一个数值,提交后小猫说出对应数值的阶乘结果。在“侦测”中,可以找到“询问…并等待”这个功能块,它的功能就是在当前角色说出询问中的内容后屏幕出现对话框给坐在电脑前的人类,等待,直到人类输入内容并提交。而被提交的内容,就放入了“回答”功能块中。

为了接收“回答”里的值,可在“变量”中创建一个名为x的变量,再使用”变量“中的“将…设为…”功能块,下拉菜单中选中变量x,将值设为”侦测“里的“回答”。另外,设定y作为存储每次乘法运算后的值,x的初始值为接收到的“回答”,y的初始值同样也设为接收到的值,因此这时也可设为x。

Scratch3.0 实现阶乘计算_第1张图片

进入到重复执行当中后,每次的乘法运算都是用当前y的值乘以比当前x值小1的数值,再用变量y来接收每次乘法运算的结果,即y=y*(x-1);乘法运算之后,将当前x的值减1并重新赋给x,即x=x-1;

Scratch3.0 实现阶乘计算_第2张图片

这样在重复执行结束之后得到的y值就是阶乘的计算结果了,使用“外观”中的功能块“说… …秒”,让小猫说出答案后显示4秒,用停止功能块结束程序。

Scratch3.0 实现阶乘计算_第3张图片

但是,这是在人类输入了一个有效的正整数时(而且这个正整数不能太大哟)的理想状态。

接下来,我们来考虑一些可能的意外,首先,淘气的人类可能输入的是个字母这样的非数字,其次,让人类输入时也没有阻止人家输入小数、负数这类数值,另外,对于规定的0!=1这个设定,上面的程序也没有实现。

在Scratch中如何判断一个值是否为整数呢,如果是在java或者C这样的编程语言,有现成的方法可以解决,Scratch都3.0了可还没提供能检查数据类型的方法,因此这里只能走迂回路线来巧妙地实现。

在运算中可以找到一个对某个值进行多种数学运算的功能块,在下拉菜单中可以找到“向下取整”和“向上取整”这样的方法

Scratch3.0 实现阶乘计算_第4张图片

如果当一个数取整之后还是等于这个数本身,不就可以说明它是整数吗?因此,我们在程序刚刚接到“回答”并已将这个“回答”赋给x之后就要立刻用条件语句判断x的值是否为整数。

Scratch3.0  实现阶乘计算

如果这个数是小数,它取整之后就会去掉了小数部分,等式就无法成立了(当然,5.0还是等于5,这时等式还是成立,并且可以用本文的方法计算出阶乘的值)。如果这个值是非数字时,这个判断返回的布尔值一样会是false。

同时,我们在判断“回答”接收的值是否为整数后,还应保证该值大于0时才运行输入有效正整数时对应的程序。因此我们需要在这里使用“与运算”,设定条件为:x在向下取整后要仍然等于x,并且x大于0

 

Scratch3.0  实现阶乘计算

加入上述判断条件的如果…否则的功能块后,当”与运算“的结果为真时,可以执行我们最初实现的功能块组合。

Scratch3.0 实现阶乘计算_第5张图片

当”与运算“的结果为假时,就要执行“否则”中的内容。在否则中,我们要判断,如果x=0,则直接让小猫说出规定的答案:1,如果不等于0,则是在”回答“中接收到了其他无效数据,所以可以说“输入无效”。

 

Scratch3.0 实现阶乘计算_第6张图片

好了,运行这段代码去考考小猫吧!有空还可以想想改进方案,例如这个例子只运行了1次,如何让它重复执行呢,即小猫说出答案后可否接着让我们说出下一个数呢?还有是否该控制可接受的“回答”的最大值呢,如果是个很大的整数,它的阶乘值会不会溢出系统可允许的范围呢?

你可能感兴趣的:(scratch)