现在您应当很清楚地了解如何使用变量了,并且迄今为止您仍对编程感到有趣,对吗?
让我们花一点儿时间来重温一下我们使用变量编写的第一个程序。
TextWindow.Write("Enter your Name: ")
name = TextWindow.Read()
TextWindow.WriteLine("Hello " + name)
在这个程序中,我们把接收并存储用户名的变量起名为name 。然后我对这个用户说“你好”。现在,让我们假定有多于一位的用户,比方说,有五位用户。我们该如何存储所有的名字呢?有一个办法是这样的:
TextWindow.Write("User1, enter name: ")
name1 = TextWindow.Read()
TextWindow.Write("User2, enter name: ")
name2 = TextWindow.Read()
TextWindow.Write("User3, enter name: ")
name3 = TextWindow.Read()
TextWindow.Write("User4, enter name: ")
name4 = TextWindow.Read()
TextWindow.Write("User5, enter name: ")
name5 = TextWindow.Read()
TextWindow.Write("Hello ")
TextWindow.Write(name1 + ", ")
TextWindow.Write(name2 + ", ")
TextWindow.Write(name3 + ", ")
TextWindow.Write(name4 + ", ")
TextWindow.WriteLine(name5)
运行上面的程序时您将看到以下结果:
图 49 – 未使用数组
很明显我们肯定会有一种更好的办法来写这样一个简单的程序,对吗?尤其是计算机非常擅长做重复性的任务,我们为什么很麻烦地要为每一位新用户重新写一段相同的代码呢?这里的技巧就是把多个用户的名字保存在同一个变量中。如果我们可以做到这一点,我们就可以使用前边章节中学过的 For 循环了。这里我们就要引入数组了。
一个数组是一种特殊类型的变量,它可以同时保存多于一个的值。也就是说,如果要保存五个用户的名字,我们不必创建 name1,name2,name3,name4 和name5 的五个变量,我们可以仅仅使用name 来存储全部五个用户名字。这种同时存储多个值的方法叫做“索引”(index)。例如, name[1],name[2],name[3],name[4] 和 name[5] 可以分别保存一个值。数字 1,2,3,4 和 5 被称为数组的索引(indices)。
尽管name[1],name[2],name[3],name[4] 和 name[5] 看上去像不同的变量,但它们实际上是一个变量。您也许会问它的好处是什么。使用数组存储值的最大好处就是您可以使用另一个变量来指定索引,这样您可以很容易地在循环中访问数组。
现在,让我们来看看如何使用我们新学的数组知识来重写刚才的程序。
For i = 1 To 5
TextWindow.Write("User" + i + ", enter name: ")
name[i] = TextWindow.Read()
EndFor
TextWindow.Write("Hello ")
For i = 1 To 5
TextWindow.Write(name[i] + ", ")
EndFor
TextWindow.WriteLine("")
程序的易读性大大提高了,不是吗?请注意两行加粗的行。第一行把值存入数组而第二行把值由数组读出来。name[1] 中存储的值不会被 name[2] 中存储的值影响。因此很大程度上您可以把 name[1] 和 name[2] 当做具有相同身份的两个不同变量。
图 50 – 使用数组
上面的程序与没有使用数组的程序运行结果几乎相同,除了在Mantis 后的逗号。我们可以通过重写输出循环来修正它:
TextWindow.Write("Hello ")
For i = 1 To 5
TextWindow.Write(name[i])
If i < 5 Then
TextWindow.Write(", ")
EndIf
EndFor
TextWindow.WriteLine("")
在前边的程序中您看到了我们使用数字作为索引从数组中存取数值。实际上索引不仅仅限于数字,我们也可以使用文字索引。例如,下面的程序中,我们询问并保存一个用户的信息然后将信息输出。
TextWindow.Write("Enter name: ")
user["name"] = TextWindow.Read()
TextWindow.Write("Enter age: ")
user["age"] = TextWindow.Read()
TextWindow.Write("Enter city: ")
user["city"] = TextWindow.Read()
TextWindow.Write("Enter zip: ")
user["zip"] = TextWindow.Read()
TextWindow.Write("What info do you want? ")
index = TextWindow.Read()
TextWindow.WriteLine(index + " = " + user[index])
图 51 – 使用非数字索引
比方说您想把您所有朋友的名字和电话号码保存起来并能查询他们的电话号码,就像电话簿一样。您应该如何编写这样一个程序呢?
这个例子涉及两套索引(也被认为是数组的维度,即二维数组)。假设我们用朋友的“小名”来辨识每一位朋友。这就是我们的数组的第一套索引。一旦我们得到了朋友的变量,第二套索引,name 和 phone number 就可以帮助我们得到朋友的全名和电话号码。
我们可以像这样来存储数据:
friends["Rob"]["Name"] = "Robert"
friends["Rob"]["Phone"] = "555-6789"
friends["VJ"]["Name"] = "Vijaye"
friends["VJ"]["Phone"] = "555-4567"
friends["Ash"]["Name"] = "Ashley"
friends["Ash"]["Phone"] = "555-2345"
由于我们的数组friends 有两套索引,该数组被称为二维数组。
这时我们就可以使用朋友的小名作为输入值然后输出朋友的全名及电话号码信息了。下面是完整的程序代码:
friends["Rob"]["Name"] = "Robert"
friends["Rob"]["Phone"] = "555-6789"
friends["VJ"]["Name"] = "Vijaye"
friends["VJ"]["Phone"] = "555-4567"
friends["Ash"]["Name"] = "Ashley"
friends["Ash"]["Phone"] = "555-2345"
TextWindow.Write("Enter the nickname: ")
nickname = TextWindow.Read()
TextWindow.WriteLine("Name: " + friends[nickname]["Name"])
TextWindow.WriteLine("Phone: " + friends[nickname]["Phone"])
图 52 – 一个简单的电话簿
多维数组一个通常的用法是表示网格和表格。网格有行和列,他们恰好可以放入一个二维数组。下面是一个简单的将箱子放入网格的示例:
rows = 8
columns = 8
size = 40
For r = 1 To rows
For c = 1 To columns
GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor()
boxes[r][c] = Shapes.AddRectangle(size, size)
Shapes.Move(boxes[r][c], c * size, r * size)
EndFor
EndFor
这个程序把小矩形加入并调整位置以组成一个8x8 的网格。除了放置这些小矩形,该程序也把它们存入一个数组。这样做使得我们可以容易地追踪这些小矩形并在需要的时候再次使用它们。
图 53 – 在网格中放置小矩形
例如,把下面的代码附加到前面的程序最后就可以把小矩形以动画的形式移动到窗口的左上角。
For r = 1 To rows
For c = 1 To columns
Shapes.Animate(boxes[r][c], 0, 0, 1000)
Program.Delay(300)
EndFor
EndFor
图 54 – 在网格中追踪小矩形
麦克纳姆轮的移动方式是基于一个有许多位于机轮周边的轮轴的中心轮的原理上,这些成角度的周边轮轴把一部分的机轮转向力转化到一个机轮法向力上面。
事件就像被触发的信号,例如,为了应对类似移动或点击鼠标的用户操作。某种程度上说,事件同操作是相对的。对于操作,您作为一个程序员调用操作让计算机做一些事情;然后对于事件,计算机通知您一些有意思的事情发生了。
在编程时我们经常遇到需要重复执行相同一组步骤的情况。这种情况下,多次重写相同的语句是不合理的。这时我们需要借助子例程。
Small Basic 语言中也引入了 Turtle (龟标)对象,编程人员可以通过Small Basic 自带的很多命令调用这个对象。
在这一章节中,我们将运用前面学到的知识来做一些有趣的事。
Small Basic 还有一组强大的图形功能。