跳转到内容

从 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

数组有 SortShuffle 方法。您可以编写这些方法中的任何一个。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

Gambas form with listbox and two buttons Shuffle and Sort, running


按钮分别称为 bShufflebSort

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 帮助显示了它们的不同之处

Sort function defined in Gambas Help


Shuffle method defined in Gambas Help


按字母顺序排序和按数字排序

[编辑 | 编辑源代码]

带数字的列表框需要按数字排序。按字母顺序对 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

您可以看到它在实际中的运行效果


Form to show alphabetic and numeric sorting Program running to demonstrate alphabetic and numeric shuffling

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]GNm[1]eNm[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”)

Form with three buttons to demonstrate string functions Three buttons to demonstrate string functions, running

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] 等等一样编号

Numbering the elements of a 1-dimensional array

您可以将内存排列在一个网格(正方形或矩形)中,并通过行和列来引用它们。这也是 GridView 或 TableView 中单元格的编号方式

Numbering of elements in a 2-dimensional array

您可以将它们排列在一个立方体或棱柱体中,这样就会有类似于矩形的层。方括号中的第三个数字表示哪一层。[行,列,层]

You can have them arranged in a cube or prism, so that there are like layers of rectangles. The third number in brackets tells which layer. [Row, Column, Layer]

您也可以拥有它们的数组,但即使您可以拥有多维数组,最常使用的是简单的列表数组。

平方表、平方根和计算

[编辑 | 编辑源代码]

Gambas form with gridview and two buttons Table of Doubles, Squares and Square Roots

该程序用 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() 事件中尝试以下操作


Gridview with coloured columns in Gambas


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 数的指数部分。指数的符号始终会被打印。

还有更多用于格式化日期和货币的符号。

“哞”游戏

[编辑 | 编辑源代码]
Mastermind board game
妙探游戏

为了玩“哞”游戏,也称为“牛和奶牛”,一个人(电脑!)选择一个神秘数字。它有 4 位数字,所有数字都不相同。维基百科说,“带钉子的现代游戏由以色列邮政局长和电信专家 Mordecai Meirowitz 于 1970 年发明。它类似于一个更早的用铅笔和纸玩的游戏,称为牛和奶牛,这个游戏可能可以追溯到一个世纪甚至更久以前。”“哞”由麻省理工学院的 J. M. Grochow 于 1970 年使用 PL/I 计算机语言编写。

每次猜测后,电脑会告诉你猜中了多少个“牛”和多少个“母牛”。“牛”是指你在数字中猜到的数字,并且在神秘数字中的位置是正确的。“母牛”是指你在数字中猜到的数字,但位置不对。因此,你的目标是BBBB,所有四个数字都在正确的位置。CCCC意味着你猜到了正确的数字,但它们不在正确的位置。BBC意味着两个数字的位置正确,另一个数字在数字中但位置错误,而另一个数字则不在数字中。有些人按照规则玩,如果你在十回合或更少的回合内猜到,你就赢了。牛的数字先列出,然后是母牛的数字。你不会被告知哪些数字是牛,哪些是母牛。

你需要两个文本框、一个名为gvHistory的网格视图,以及一个名为bNewGame的按钮,其文本属性为“新游戏”。

Gambas form for the game of Moo Gambas program for the game of Moo, running Congratulations message after the game of Moo in Gambas

“新游戏”按钮最初是不可见的。

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。还有其他运算符,但这些是最常用的和最实用的。

从 Zip 文件中编程 Gambas
 ← ThreeThings 数组 TextFiles → 
华夏公益教科书