在类似GESP的较高等级的Scratch算法考试中,经常会在输入输出中用到列表,而在GESP中对于列表输入经常采用的是一种比较奇怪的方式:限制了列表变量名称,但不要求有输入(类似Python中的input()或者C++中的cin),在Scratch中我们用:
来接收输入。这种方式对于接收字符串或者数字输入是合适的,但对于列表输入,我们需要对它进行一些变通,下面我们解释一下如何在Scratch中输入和输出列表数据。
对于输入列表数据,可以参考其他编程语言中的输入方法:第一行要求输入一个整数,用于指定需要赋值给列表的元素个数,第二行输入以空格隔开的字符串,在程序中通过将字符串按照空格分割后的子字符串将它们分别逐个赋予到列表中,示例如下:
注意这里接收第二行以空格隔开的数据的时候,询问的内容必须为inputs,这样我们的判题程序会自动将它以空格分割开,然后可以通过循环将它逐个放入到列表中。
对于列表的输出,我们也是用Scratch中的:
或者
来显示。但这里有一些特别需要注意的问题,在这里提示如下:
如果列表元素都是单个的字符,那么,说(list)会显示为不带空格的字符串,这里需要注意的是,直接使用列表的操作方法如:
或者
或者
则无论是不是数字字符,都会被当作字符。但是,如果放入列表中的内容是数学运算(+-*/)的结果,无论是不是单个数字,都会被当作数字,例如:
此时运算结果3会被当作数字而不是字符。
如果列表元素都为单个的数字,那么将会显示带空格的字符串
所以对于列表的输出,如果列表元素是经过数学运算后的,那么它一定会在各个元素之间加空格,如果不是,则需要小心设置,比较保险的方式是避免列表元素全部为单个字符(或单个数字)。
至于为什么这里的处理方式会有点复杂,有兴趣的老师可以参考开发团队的讨论:
Scratch Github Issue
和:
https://scratch.mit.edu/discuss/topic/53/
简单说,就是为了兼容Scratch 2.0和更早的1.4, 不管这个是不是个bug,现在就是这么处理的。