从 Zip/数组学习 Gambas 编程
有时您需要的不只是像速度、距离、时间这样有单独名称的独立内存,而是一个内存列表,一个变量集合,可以进行编号。所以你可能有 Speed[0],Speed[1],Speed[2] 等等,它们都存储不同的速度,或者一个有像 Time[0],Time[1],Time[2] 等等名称的几个时间的列表。这被称为数组。
数组中的元素(项目)从零开始编号,使用方括号。老师可能有一个学生名字的数组,Student[0],Student[1] … Student[Student.Max]。数组有一个计数(例如 Student.Count)和一个最大值 (Student.Max)。不要超过 Max,否则你会越界。这肯定意味着放学后留堂。
您可以拥有几乎任何类型的数组。但是,当您需要它们时,您需要使用 NEW 运算符来创建它们。
一个字符串数组
Dim Names As New String[]
Names = ["John", "Mary", "Lucy", "Owen", "Peter", "Clare", "Thomas"]
一个整数数组,使用数组的 Add 方法
Dim Numbers As New Integer[]
'put the numbers 8 to 28 into an array; Numbers[0] is 8; Numbers[20] is 28
For i as integer = 8 to 28
Numbers.add(i)
Next
数组有 Sort 和 Shuffle 方法。您可以编写这些方法中的任何一个。gb.descent 及其配对项是 gb 组件中的常量。
Names.sort
Numbers.sort
Names.sort(gb.descent)
Numbers.sort(gb.descent)
Names.shuffle
Numbers.shuffle
要查看您的数组,在您的表单上放置一个列表框,然后将您的数组放入其列表中。右侧的数组将进入左侧列表框的列表中。代码看起来像这样。更详细的说明如下。
Listbox1.List = Names
Listbox1.List = Numbers
按钮分别称为 bShuffle 和 bSort。
Public s As New String[]
Public Sub Form_Open()
s = ["Apple", "Banana", "Carrot", "Dragonfruit", "Elderberry", "Fig", "Grape", "Honeydew", "Imbe", "Jackfruit", "Kiwi", "Lime"]
ListBox1.List = s
End
Public Sub bSort_Click()
s = ListBox1.List 'copy the list into array s[]
ListBox1.List = s.Sort() 'put the sorted s[] into the listbox's list
End
Public Sub bShuffle_Click()
s = ListBox1.List 'copy the list into array s[]
s.Shuffle 'shuffle the array s[]
ListBox1.List = s 'put s into the listbox's list
End
请注意,即使 ListBox1 的 List 属性像数组一样工作,您也不能说 ListBox1.List.Shuffle。是的,它是一个数组。不,它没有 Shuffle 方法。
与排序按钮相比,洗牌按钮的 Click 处理程序中多了一行。s.Sort() 是一个事物,一个函数。s.Shuffle 是一个方法。它不是一个事物,而是一个过程,一个过程。它是一个当完成时不返回任何值的子程序。你不能把它放到任何东西中。如果您尝试 ListBox1.List = s.shuffle(),您将收到错误消息。Gambas 帮助显示了它们的不同之处
带数字的列表框需要按数字排序。按字母顺序对 1 到 12 的数字进行排序将得到 1、10、11、12、2、3、4、5、6、7、8、9,因为按字母顺序“10”在“2”之前。将列表复制到一个整数数组中并对其进行排序
Public Sub bSort_Click()
Dim x As New Integer[]
x = ListBox1.List
x.Sort
ListBox1.List = x
End
您可以看到它在实际中的运行效果
Public z As New Integer[]
Public s As New String[]
Public Sub Form_Open()
For i As Integer = 1 To 12
z.Add(i)
Next
z.Shuffle
ListBox1.List = z
End
Public Sub Button1_Click()
s = ListBox1.List
ListBox1.List = s.Sort()
End
Public Sub Button2_Click()
z = ListBox1.List
ListBox1.List = z.Sort()
End
字符串可以被视为字符数组。因此,如果 Nm = "Gerard" 那么 Nm[0] 是 G,Nm[1] 是 e,Nm[2] 是 r 等等。
但是,您不能更改像 Nm[2]="x" 这样的字母来使 Gerard 变成 Gexard。您可以 获取 字母,但您不能 放入 任何东西。您必须使用字符串具有的某些精彩函数。您可以使用这些函数中的任何一个来处理字符串。您可以使用这些函数中的任何一个
Nm = Left(Nm,1) & “x” & Mid(Nm,3)
Nm = Left(Nm,1) & “x” & Right(Nm,4)
Nm = Replace(Nm, “e”, “x”)
Public FirstName As String = "Gerard"
Public Sub b1_Click()
Label1.Text = Left(FirstName, 1) & "x" & Mid(FirstName, 3)
End
Public Sub b2_Click()
Label1.Text = Left(FirstName, 1) & "y" & Right(FirstName, 4)
End
Public Sub b3_Click()
Label1.Text = Replace(FirstName, "e", "z")
End
您可以拥有一个列表排列的内存。它们将具有相同的名称,但将像 X[0]、X[1]、X[2] 等等一样编号
您可以将内存排列在一个网格(正方形或矩形)中,并通过行和列来引用它们。这也是 GridView 或 TableView 中单元格的编号方式
您可以将它们排列在一个立方体或棱柱体中,这样就会有类似于矩形的层。方括号中的第三个数字表示哪一层。[行,列,层]
您也可以拥有它们的数组,但即使您可以拥有多维数组,最常使用的是简单的列表数组。
该程序用 1 到 10 的数字的计算填充网格。它还展示了如何调整 GridView 的属性——它的列、行和单元格。
Public Sub Form_Open()
Me.Show
With gv1
.Header = GridView.Horizontal
.Columns.Count = 4
.Columns[0].Width = 50
.Columns[1].Width = 60
.Columns[2].Width = 60
.Columns[3].Width = 50
.Columns[0].Text = ("Number")
.Columns[1].Text = ("Square")
.Columns[2].Text = ("Root")
.Columns[3].Text = ("*3+5")
For i As Integer = 0 To 3
.Columns[i].Alignment = Align.Right
Next
.Padding = 5
End With
End
Public Sub b1_Click()
gv1.Rows.Count = 10
End
Public Sub bQuit_Click()
Quit
End
Public Sub gv1_Data(Row As Integer, Column As Integer)
Dim x As Integer = Row + 1
Select Case Column
Case 0
gv1.Data.Text = x
Case 1
gv1.Data.Text = x ^ 2
Case 2
gv1.Data.Text = Format(Sqr(x), "##.000")
Case 3
gv1.Data.Text = x * 3 + 5
End Select
If Row Mod 2 = 0 Then gv1.Data.Background = &HBFFFBF
End
需要注意的是 With … End With 行,在表单打开时设置 GridView,以及 _Data() 事件来填充每个单元格。gv1.Rows.Count = 10 足以触发这十行的每个单元格的 Data() 事件。
当单元格需要绘制时,_Data() 事件就会发生。可以在单击 Fill 按钮时完成单元格的填充,但这样我们就必须使用嵌套的 For 语句来对行进行向下计数,对列进行横向计数。Gambas 已经必须这样做,因为它必须绘制每个单元格。_Data() 事件发生在每行的每个单元格,所以为什么不把文本放到单元格中呢?
如果 Row Mod 2 = 0 Then gv1.Data.Background = &HBFFFBF 将单元格的背景设置为薄荷绿,如果行号在除以 2 时余数为零。Mod 表示“除以……时的余数”。例如 3 Mod 2 是 1,所以第 3 行的背景是白色。4 Mod 2 是 0,因为 4 除以 2 等于 2 余 0,所以第 4 行的背景是绿色。
我们可以使用两种颜色交替,粉红色和绿色
gv1.Data.Background = If(Row Mod 2 = 0, &HBFFFBF, &HFFCFCF)
要对列进行着色,请在 tv1_Data() 事件中尝试以下操作
gv1.Data.Background = Choose(Column + 1, &FFAAFF, &FFFFAA, &AAFFFF, &AAAAFF)
Format(Sqr(x), "##.000") 是一个有趣的表达式。Format 函数接受一个浮点数,例如 1.41421356237,并根据提供的模式对其进行格式化。"##.000" 表示 如果需要则使用两位数字,一个点,以及使用零的三位小数。要格式化的数字是什么?Sqr(x)。这是数字 x 的平方根。2 的平方根显示为 1.414。
+ | 打印数字的符号。 |
- | 仅当数字为负时才打印数字的符号。 |
# | 仅在必要时打印一个数字。 |
0 | 始终打印一个数字,并在必要时用零填充。 |
. | 打印小数点。 |
, | 打印千位分隔符。 |
% | 将数字乘以 100 并打印一个百分号。 |
E | 介绍 Float 数的指数部分。指数的符号始终会被打印。 |
还有更多用于格式化日期和货币的符号。
为了玩“哞”游戏,也称为“牛和奶牛”,一个人(电脑!)选择一个神秘数字。它有 4 位数字,所有数字都不相同。维基百科说,“带钉子的现代游戏由以色列邮政局长和电信专家 Mordecai Meirowitz 于 1970 年发明。它类似于一个更早的用铅笔和纸玩的游戏,称为牛和奶牛,这个游戏可能可以追溯到一个世纪甚至更久以前。”“哞”由麻省理工学院的 J. M. Grochow 于 1970 年使用 PL/I 计算机语言编写。
每次猜测后,电脑会告诉你猜中了多少个“牛”和多少个“母牛”。“牛”是指你在数字中猜到的数字,并且在神秘数字中的位置是正确的。“母牛”是指你在数字中猜到的数字,但位置不对。因此,你的目标是BBBB,所有四个数字都在正确的位置。CCCC意味着你猜到了正确的数字,但它们不在正确的位置。BBC意味着两个数字的位置正确,另一个数字在数字中但位置错误,而另一个数字则不在数字中。有些人按照规则玩,如果你在十回合或更少的回合内猜到,你就赢了。牛的数字先列出,然后是母牛的数字。你不会被告知哪些数字是牛,哪些是母牛。
你需要两个文本框、一个名为gvHistory的网格视图,以及一个名为bNewGame的按钮,其文本属性为“新游戏”。
“新游戏”按钮最初是不可见的。
Public MyNumber As String
Public Count As Integer
Public Sub Form_Open()
gvHistory.Columns.Count = 2
ChooseNumber
End
Public Sub ChooseNumber()
Dim Digits As New String[]
Dim i, p1, p2 As Integer
Dim d As String
For i = 0 To 9
Digits.Add(Str(i))
Next
Digits.Shuffle
MyNumber = Digits[0] & Digits[1] & Digits[2] & Digits[3]
End
Public Sub EvaluateGuess()
Dim s As String
Dim i, j As Integer
Dim YourGuess As String = tbGuess.text
Count += 1
For i = 0 To 3 'look for bulls
If YourGuess[i] = MyNumber[i] Then s &= "B"
Next
For i = 0 To 3 'look for cows
For j = 0 To 3
If i <> j And YourGuess[i] = MyNumber[j] Then s &= "C"
Next
Next
tbReply.Text = s
gvHistory.Rows.Count += 1
gvHistory[gvHistory.Rows.max, 0].text = YourGuess
gvHistory[gvHistory.Rows.max, 1].text = s
If s = "BBBB" Then Congratulate
tbGuess.SelectAll
End
Public Sub Congratulate()
Message("<b>Congratulations!</b><br><br>Got it in " & count)
FMain.Background = Color.Yellow '&FFFF00
bNewGame.Visible = True
End
Public Sub bNewGame_Click()
FMain.Background = Color.Default
bNewGame.Visible = False
gvHistory.Rows.Count = 0
Count = 0
ChooseNumber
tbReply.text = ""
tbGuess.text = ""
tbGuess.SetFocus
End
Public Sub tbGuess_Change()
If Len(tbGuess.text) = 4 Then EvaluateGuess
End
现在开始回顾
有两个公共变量。MyNumber 是电脑的秘密数字。Count 统计了猜测次数。
Form_Open() 启动时,将网格视图设置为 2 列,并选择秘密数字。
Public Sub ChooseNumber() 将数字 0 到 9 放入一个名为 Digits 的 10 个元素的数组中,并将其随机排序。秘密数字是前四个数字。它们将是随机的,并且不会重复。
Public Sub EvaluateGuess() 当你评估一个猜测时,它会多出一个猜测,所以将 Count 加 1。寻找牛:你的猜测中的第一个字符是否与数字中的第一个字符相同?检查第二个、第三个和第四个字符也是一样。每次两个字符匹配时,就将 what s 是的内容添加到其末尾,并在其末尾添加一个 B,使用 s &= "B"。
在寻找母牛时,i 会遍历 0、1、2、3,每次都遍历你的数字。对于你的数字中的每一个数字,检查秘密数字中的所有数字,看看是否有匹配的,但不要考虑位置数字相同的情况(比如秘密数字中的第三个数字和我的猜测中的第三个数字),因为这是牛,并且已经找到了。
S 是一个变量,它包含 BBBB 或 BBCC 或 B 或其他内容。
在历史网格视图中添加一行,并将猜测放在第一列,将其评估放在第二列。
Public Sub Congratulate() 显示一条消息,说“恭喜你!你在 8 次尝试内猜对了”或其他内容。将窗体的颜色更改为黄色。使“新游戏”按钮可见。
Public Sub bNewGame_Click() 要开始新游戏,请删除黄色,隐藏“新游戏”按钮,从历史网格视图中删除所有内容,将猜测次数重置为零,选择另一个数字,清空两个文本框,并将焦点设置为用于输入猜测的文本框,这样你就可以开始输入了。
Public Sub tbGuess_Change() 当“猜测”文本框中的文本因为你输入了另一个数字而发生变化时,检查输入的内容的长度,如果它是 4 个字符长,就评估猜测。
添加“我放弃”功能
[edit | edit source]让我们将其设置为输入问号意味着“我放弃——告诉我答案”。我们需要一个新的事件,tbGuess_KeyPress()。只要输入了问号,这个处理程序就会检查静态类 Key,看看是否输入了“?”字符。如果是,就向我们显示正确的答案,并开始新游戏。
开始新游戏正是我们在“新游戏”按钮的 _Click 处理程序中所做的。这段代码需要从 _Click 处理程序中移出来,放到它自己的子程序中。当按钮被点击或用户通过输入“?”放弃时,我们可以调用这个 NewGame 子程序。以下是重新排列的代码和额外的代码
Public Sub bNewGame_Click()
NewGame
End
Public Sub NewGame()
FMain.Background = Color.Default
bNewGame.Visible = False
gvHistory.Rows.Count = 0
Count = 0
ChooseNumber
tbReply.text = ""
tbGuess.text = ""
tbGuess.SetFocus
End
Public Sub tbGuess_KeyPress()
If Key.Text = "?" Then
Message("My number was " & MyNumber)
NewGame
Stop Event
Endif
End
Stop Event 用于防止问号出现在 tbGuess 文本框中。这不是必须的。
重要的原则是(你可以记住它,或者把它当作金科玉律),如果你想在两个或多个地方引用相同的代码行,请将它们放在自己的子程序中,并通过名称调用它们。
赋值运算符
[edit | edit source]x = x+2 | 将 2 加到 x 的原来值上,然后将答案放回 x 中。 |
x += 2 | 同样的事情:x 变成原来值 (=),加上 (+) 2。 |
x = x * 4 | 将 x 乘以 4,并将答案放回 x 中。 |
x *= 4 | 同样的事情:x 变成原来值 (=),乘以 (*) 4。 |
s = s & "abc" | s 变成原来值 (&),在末尾附加 “abc”。 |
s &= "abc" | 同样的事情:s 变成原来值 (=),在末尾附加 (&) “abc”。 |
还有数值运算符,包括 ^ 表示“乘方”。布尔运算符是 AND、OR 和 NOT。还有其他运算符,但这些是最常用的和最实用的。