2024年5月15日 星期三

2.VB.NET 基礎篇 筆記 - 陣列 (Array)

VB.NET 陣列 (Array) 筆記 (基礎篇)

VB.NET 陣列 (Array) 筆記 (基礎篇)

陣列就像是程式設計中的火車車廂火車車廂按照順序排列,每個車廂都有自己的編號。陣列也按照順序存放多個元素,每個元素都有自己的索引。,它可以存放多個相同資料類型的元素,每個元素都有自己的座位號碼座位號碼是指元素在陣列中的位置,從 0 開始編號。。透過理解陣列的特性和使用方式,就能夠靈活運用它來處理大量的資料,建構出程式的核心邏輯。

認識陣列

陣列 (Array): 陣列是一種資料結構,用於存放多個相同資料類型的元素。每個元素都有一個唯一的索引,可以透過索引來存取和操作元素。

VB.NET 中的陣列有以下幾個重要特性:

  1. 固定大小陣列一旦宣告,其大小就固定了,不能在程式執行期間改變。:陣列的大小在宣告時就確定了,不能在程式執行期間改變。
  2. 零基索引陣列的第一個元素的索引為 0,第二個元素的索引為 1,以此類推。:陣列的索引從 0 開始,第一個元素的索引為 0,最後一個元素的索引為陣列大小減 1。
  3. 連續儲存陣列的元素在記憶體中是連續儲存的,就像火車車廂一節接一節,這樣可以透過索引快速存取元素。:陣列的元素在記憶體中是連續儲存的,這樣可以透過索引快速存取元素。
  4. 型別安全陣列只能存放宣告時指定的資料類型的元素,不能存放其他類型的元素。:陣列只能存放宣告時指定的資料類型的元素,不能存放其他類型的元素。

VB.NET 中有兩種類型的陣列:一維陣列一維陣列就像是一列火車,每個元素都有一個唯一的座位號碼。多維陣列多維陣列就像是多列火車,每個元素都有多個座位號碼。。一維陣列只有一個維度,而多維陣列有多個維度。例如,二維陣列就像是一個表格,有行和列兩個維度。

選擇適當的陣列類型和大小可以幫助優化記憶體的使用,並提高程式的效能。例如,如果一個陣列只需要儲存小範圍的整數,使用 ByteShort 類型就足夠了,而不需要使用佔用更多記憶體的 IntegerLong 類型。

宣告陣列

在 VB.NET 中,陣列必須在使用前先宣告。宣告陣列需要指定陣列的名稱、資料類型和大小。以下是宣告陣列的基本語法:

Dim 陣列名稱(大小) As 資料類型

其中,Dim 是宣告陣列的關鍵字,陣列名稱 是陣列的名稱,大小 是陣列的大小,用逗號分隔每個維度的大小,As 是關鍵字,用於指定陣列的資料類型。以下是一些宣告陣列的範例:

Dim numbers(9) As Integer ' 宣告一個大小為 10 的整數陣列
Dim names(4) As String ' 宣告一個大小為 5 的字串陣列   
Dim matrix(2, 3) As Double ' 宣告一個 3x4 的雙精度浮點數二維陣列

宣告陣列時,也可以使用初始化器初始化器是在宣告陣列時,同時為陣列的元素賦予初始值。來為陣列的元素賦予初始值。初始化器使用大括號 {} 將元素值括起來,多個元素值之間用逗號分隔。例如:

Dim numbers() As Integer = {1, 2, 3, 4, 5} ' 宣告並初始化一個整數陣列
Dim names() As String = {"Alice", "Bob", "Carol"} ' 宣告並初始化一個字串陣列

使用初始化器時,不需要指定陣列的大小,編譯器會根據初始值的數量自動推斷陣列的大小。

陣列宣告後,就可以透過索引來存取和修改陣列的元素。陣列的索引從 0 開始,最後一個元素的索引為陣列大小減 1。以下是一個透過索引存取和修改陣列元素的範例:

使用的控制項:
  • TextBox1 到 TextBox5:用於輸入五個整數。
  • Label1:用於顯示第一個元素的值。
  • Label2:用於顯示最後一個元素的值。
Imports System ' 導入 System 命名空間

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 宣告一個大小為 5 的整數陣列
        Dim numbers(4) As Integer
        
        ' 透過索引設置陣列元素的值
        numbers(0) = Integer.Parse(TextBox1.Text)
        numbers(1) = Integer.Parse(TextBox2.Text)
        numbers(2) = Integer.Parse(TextBox3.Text)
        numbers(3) = Integer.Parse(TextBox4.Text)
        numbers(4) = Integer.Parse(TextBox5.Text)
        
        ' 透過索引存取陣列元素的值
        Label1.Text = numbers(0).ToString() ' 將第一個元素的值顯示在 Label1 中
        Label2.Text = numbers(4).ToString() ' 將最後一個元素的值顯示在 Label2 中
    End Sub
End Class

陣列宣告時需要注意以下幾點:

  • 陣列的大小必須是非負整數,不能是負數或浮點數。
  • 陣列的大小必須在宣告時確定,不能在程式執行期間改變。
  • 陣列的元素必須是相同的資料類型,不能混合不同的資料類型。
  • 存取陣列元素時,索引不能超出陣列的範圍,否則會引發 IndexOutOfRangeException 異常。

除了固定大小的陣列外,VB.NET 還支援動態陣列動態陣列的大小可以在程式執行期間改變,更加靈活。。動態陣列可以使用 ReDim 關鍵字來重新調整大小。以下是一個動態調整陣列大小的範例:

使用的控制項:
  • TextBox1:用於輸入初始陣列大小。
  • TextBox2:用於輸入調整後的陣列大小。
  • Label1:用於顯示初始陣列的元素。
  • Label2:用於顯示調整大小後的陣列元素。
Imports System ' 導入 System 命名空間

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 宣告一個動態陣列
        Dim numbers() As Integer
        
        ' 使用 ReDim 調整陣列大小
        ReDim numbers(Integer.Parse(TextBox1.Text) - 1)
        
        ' 為陣列元素賦值
        For i As Integer = 0 To numbers.Length - 1
            numbers(i) = (i + 1) * 10
        Next
        
        ' 顯示陣列元素
        Label1.Text = String.Join(", ", numbers) ' 將陣列元素連接成一個字串,並顯示在 Label1 中
        
        ' 使用 ReDim Preserve 調整陣列大小,並保留原有元素
        ReDim Preserve numbers(Integer.Parse(TextBox2.Text) - 1)
        
        ' 為新增的元素賦值
        For i As Integer = numbers.Length / 2 To numbers.Length - 1
            numbers(i) = (i + 1) * 10
        Next
        
        ' 顯示調整大小後的陣列元素
        Label2.Text = String.Join(", ", numbers) ' 將調整大小後的陣列元素連接成一個字串,並顯示在 Label2 中
    End Sub
End Class

使用 ReDim 關鍵字時,如果不使用 Preserve 修飾符,陣列中原有的元素將被清除。使用 Preserve 修飾符可以保留原有元素。

動態陣列的使用場景包括:

  • 不確定大小當陣列的大小在宣告時無法確定,需要在程式執行期間動態調整時,可以使用動態陣列。:當陣列的大小在宣告時無法確定,需要在程式執行期間動態調整時,可以使用動態陣列。例如,根據使用者的輸入來決定陣列的大小。
  • 避免浪費當陣列的實際元素數量遠小於宣告的大小時,使用動態陣列可以避免浪費記憶體空間。:當陣列的實際元素數量遠小於宣告的大小時,使用動態陣列可以避免浪費記憶體空間。例如,宣告了一個大小為 1000 的陣列,但實際只使用了前 100 個元素,可以使用動態陣列來調整大小。
  • 動態增刪當需要在陣列中動態地增加或刪除元素時,可以使用動態陣列。例如,在列表中插入或移除項目。:當需要在陣列中動態地增加或刪除元素時,可以使用動態陣列。例如,在列表中插入或移除項目。

動態陣列提供了更大的靈活性,但也需要更多的記憶體管理和效能開銷。在實際使用時,需要根據具體的需求和場景來選擇固定大小的陣列還是動態陣列。

透過適當地宣告和使用陣列,可以在程式中儲存和操作各種類型的資料,建構出程式的核心邏輯。

陣列的屬性和方法

VB.NET 中的陣列提供了一些有用的屬性和方法,可以用來獲取陣列的相關資訊和執行常見的操作。以下是一些常用的陣列屬性和方法:

屬性

屬性 說明
Length 獲取陣列的長度,即元素的數量。
Rank 獲取陣列的維度數。

方法

方法 說明
GetLength 獲取指定維度的長度。
GetLowerBound 獲取指定維度的起始索引。
GetUpperBound 獲取指定維度的結束索引。
Clone 創建陣列的副本。
CopyTo 將陣列的元素複製到另一個陣列中。

Length 屬性

獲取陣列的長度,即元素的數量。

語法: 陣列名稱.Length

使用的控制項:
  • TextBox1:用於輸入陣列元素的數量。
  • Button1:用於觸發陣列的建立和長度的顯示。
  • Label1:用於顯示陣列的長度。
Imports System

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim numbers() As Integer
        Dim size As Integer = Integer.Parse(TextBox1.Text)
        ReDim numbers(size - 1)
        For i As Integer = 0 To numbers.Length - 1
            numbers(i) = i + 1
        Next
        Label1.Text = "陣列長度:" & numbers.Length.ToString()
    End Sub
End Class

Rank 屬性

獲取陣列的維度數。

語法: 陣列名稱.Rank

使用的控制項:
  • TextBox1:用於輸入陣列的行數。
  • TextBox2:用於輸入陣列的列數。
  • Button1:用於觸發陣列的建立和維度數的顯示。
  • Label1:用於顯示陣列的維度數。
Imports System

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim matrix(,) As Integer
        Dim rows As Integer = Integer.Parse(TextBox1.Text)
        Dim columns As Integer = Integer.Parse(TextBox2.Text)
        ReDim matrix(rows - 1, columns - 1)
        Label1.Text = "陣列維度數:" & matrix.Rank.ToString()
    End Sub
End Class

GetLength 方法

獲取指定維度的長度。

語法: 陣列名稱.GetLength(dimension)

使用的控制項:
  • TextBox1:用於輸入要查詢長度的維度。
  • Button1:用於觸發指定維度長度的顯示。
  • Label1:用於顯示指定維度的長度。
Imports System

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim matrix(,) As Integer = {{1, 2, 3}, {4, 5, 6}}
        Dim dimension As Integer = Integer.Parse(TextBox1.Text)
        Label1.Text = "第 " & dimension.ToString() & " 維長度:" & matrix.GetLength(dimension).ToString()
    End Sub
End Class

GetLowerBound 方法

獲取指定維度的起始索引。

語法: 陣列名稱.GetLowerBound(dimension)

使用的控制項:
  • TextBox1:用於輸入要查詢起始索引的維度。
  • Button1:用於觸發指定維度起始索引的顯示。
  • Label1:用於顯示指定維度的起始索引。
Imports System

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim matrix(,) As Integer = {{1, 2, 3}, {4, 5, 6}}
        Dim dimension As Integer = Integer.Parse(TextBox1.Text)
        Label1.Text = "第 " & dimension.ToString() & " 維起始索引:" & matrix.GetLowerBound(dimension).ToString()
    End Sub
End Class

GetUpperBound 方法

獲取指定維度的結束索引。

語法: 陣列名稱.GetUpperBound(dimension)

使用的控制項:
  • TextBox1:用於輸入要查詢結束索引的維度。
  • Button1:用於觸發指定維度結束索引的顯示。
  • Label1:用於顯示指定維度的結束索引。
Imports System

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim matrix(,) As Integer = {{1, 2, 3}, {4, 5, 6}}
        Dim dimension As Integer = Integer.Parse(TextBox1.Text)
        Label1.Text = "第 " & dimension.ToString() & " 維結束索引:" & matrix.GetUpperBound(dimension).ToString()
    End Sub
End Class

Clone 方法

創建陣列的副本。

語法: 陣列名稱.Clone()

使用的控制項:
  • Button1:用於觸發陣列的複製和顯示。
  • Label1:用於顯示原始陣列的元素。
  • Label2:用於顯示複製後的陣列的元素。
Imports System

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim numbers() As Integer = {1, 2, 3, 4, 5}
        Dim clonedNumbers() As Integer = CType(numbers.Clone(), Integer())
        Label1.Text = "原始陣列:" & String.Join(", ", numbers)
        Label2.Text = "複製後的陣列:" & String.Join(", ", clonedNumbers)
    End Sub
End Class

CopyTo 方法

將陣列的元素複製到另一個陣列中。

語法: sourceArray.CopyTo(destinationArray, index)

使用的控制項:
  • Button1:用於觸發陣列的複製和顯示。
  • Label1:用於顯示原始陣列的元素。
  • Label2:用於顯示複製後的陣列的元素。
Imports System

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim numbers() As Integer = {1, 2, 3, 4, 5}
        Dim copiedNumbers(numbers.Length - 1) As Integer
        numbers.CopyTo(copiedNumbers, 0)
        Label1.Text = "原始陣列:" & String.Join(", ", numbers)
        Label2.Text = "複製後的陣列:" & String.Join(", ", copiedNumbers)
    End Sub
End Class

這些範例展示了如何透過使用者輸入的資料動態調整陣列的大小和獲取相關資訊,並即時更新到其他視窗元件上。使用者可以在 TextBox 中輸入所需的數值,然後點擊按鈕觸發相應的操作,結果會顯示在 Label 控制項中。

在實際應用中,您可以根據具體的需求和場景,使用不同的視窗元件來接收使用者輸入和顯示結果,例如 ComboBox、ListBox、DataGridView 等。透過適當地組合和使用這些元件,可以創建出功能豐富、互動性強的使用者介面。

合理地使用陣列的屬性和方法,結合使用者輸入和視窗元件,可以方便地獲取陣列的相關資訊,並提供即時的回饋給使用者,提高程式的互動性和可用性。

陣列應用範例

範例:學生成績管理系統

這個範例允許使用者輸入學生姓名和成績,並將其儲存在陣列中。使用者可以查看學生列表、計算班級的最高分、最低分和平均分,以及搜索特定學生的成績。

使用的控制項:
  • TextBox1:用於輸入學生姓名。
  • TextBox2:用於輸入學生成績。
  • Button1:用於添加學生資料。
  • Button2:用於計算班級統計資料。
  • Button3:用於搜索學生成績。
  • ListBox1:用於顯示學生列表。
  • Label1:用於顯示最高分。
  • Label2:用於顯示最低分。
  • Label3:用於顯示平均分。
  • Label4:用於顯示搜索結果。
Imports System

Public Class Form1
    Private names() As String
    Private scores() As Double
    Private count As Integer = 0
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim name As String = TextBox1.Text
        Dim score As Double = Double.Parse(TextBox2.Text)
        
        ReDim Preserve names(count)
        ReDim Preserve scores(count)
        
        names(count) = name
        scores(count) = score
        
        count += 1
        
        TextBox1.Clear()
        TextBox2.Clear()
        
        UpdateStudentList()
    End Sub
    
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim maxScore As Double = scores.Max()
        Dim minScore As Double = scores.Min()
        Dim avgScore As Double = scores.Average()
        
        Label1.Text = "最高分:" & maxScore.ToString("F2")
        Label2.Text = "最低分:" & minScore.ToString("F2")
        Label3.Text = "平均分:" & avgScore.ToString("F2")
    End Sub
    
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim searchName As String = TextBox1.Text
        Dim index As Integer = Array.IndexOf(names, searchName)
        
        If index >= 0 Then
            Label4.Text = "學生 " & searchName & " 的成績為:" & scores(index).ToString("F2")
        Else
            Label4.Text = "未找到學生 " & searchName & " 的成績。"
        End If
    End Sub
    
    Private Sub UpdateStudentList()
        ListBox1.Items.Clear()
        
        For i As Integer = 0 To count - 1
            ListBox1.Items.Add(names(i))
        Next
    End Sub
End Class

在這個範例中,使用了兩個陣列 namesscores 分別儲存學生的姓名和成績。透過 Button1 的點擊事件,我們獲取使用者在 TextBox1TextBox2 中輸入的學生姓名和成績,並將其儲存到對應的陣列中。同時,我們使用 ReDim Preserve 關鍵字動態調整陣列的大小,以容納新添加的學生資料。

Button2 的點擊事件用於計算班級的最高分、最低分和平均分,並將結果顯示在相應的 Label 控制項中。這裡我們使用了陣列的 Max()Min()Average() 方法來進行計算。

Button3 的點擊事件用於搜索指定學生的成績。我們從 TextBox1 獲取使用者輸入的學生姓名,然後使用 Array.IndexOf() 方法在 names 陣列中查找匹配的索引。如果找到匹配的學生,就顯示其對應的成績;否則顯示未找到的提示。

最後,定義了一個 UpdateStudentList() 方法,用於將學生姓名添加到 ListBox1 控制項中,以顯示當前的學生列表。每次添加新的學生資料後,都會調用這個方法來更新列表。