跳轉到內容

資料結構基礎:陣列

來自華夏公益教科書

試卷 1 - ⇑ 資料結構基礎 ⇑

← 資料結構 陣列 欄位記錄和檔案 →


陣列是索引相關的元素集。當我們想儲存多個相同型別的資料時,我們可以使用陣列而不是使用多個變數。您可以將陣列視為資料項或元素列表,每個元素都有一個數字或索引,以便您可以引用每個專案。注意,陣列的索引0開始

許多類似的變數 一個數組

name0=Alice
name1=Bob
name2=Claire
name3=Dan
name4=Eve

姓名
0 Alice
1 Bob
2 Claire
3 Dan
4 Eve

在大多數語言中,必須宣告陣列。這會設定陣列中元素的數量以及元素的資料型別。這將為陣列保留記憶體空間,然後再填充資料。Python 使用列表代替陣列。列表更靈活,不需要初始化,但仍然可以執行此步驟,以使您的意圖和程式碼更容易理解。

VB.NET Python
Dim names(0 To 4) As String
names(0) = "Alice"
names(1) = "Bob"
names(2) = "Claire"
names(3) = "Dan"
names(4) = "Eve"
names = ["" for x in range(5)]
names[0] = "Alice"
names[1] = "Bob"
names[2] = "Claire"
names[3] = "Dan"
names[4] = "Eve"

這也可以在一行程式碼中完成,在一步驟中初始化和填充陣列。

VB.NET Python
Dim names() As String = {"Alice","Bob","Claire","Dan","Eve"}
names = ["Alice","Bob","Claire","Dan","Eve"]

陣列索引

[編輯 | 編輯原始碼]

我們可以使用索引訪問陣列中的單個元素。這在陣列名稱後用括號或方括號寫出。要從我們的姓名陣列中訪問 Eve,我們將使用:

VB.NET Python
console.WriteLine(names(4))
print(names[4])

一些程式語言從 1 開始對陣列編號,另一些從 0 開始。在我們上面的示例中,哪個數字與哪個人無關,因此使用 0 作為起點,但如果我們儲存月份,許多人可能更喜歡將 1 月儲存在 months[1] 而不是 months[0] 中。 XKCD 關於陣列索引

練習:一維陣列

宣告一個數組,列出動物園中的 5 只動物(土豚、熊、杜鵑、鹿、大象),按字母順序排列。

答案

VB.NET Python
dim zooanimals() as string = {"aardvark","bear","cow","deer","elephant"}
zooanimals = ["aardvark","bear","cow","deer","elephant"]

編寫程式碼以輸出第一隻和最後一隻動物。

答案

VB.NET Python
console.writeline(zooanimals(0))
console.writeline(zooanimals(4))
print(zooanimals[0]
print(zooanimals[4]

有人不小心吃掉了杜鵑,讓使用者新增一個新的第三隻動物並將其全部打印出來。

   程式碼輸出

插入新的第三隻動物:鱷魚
1: 土豚
2: 熊
3: 鱷魚
4: 鹿
5: 大象

答案

VB.NET Python
console.write("Insert new third animal:")
zooanimals(2) = console.readline()
console.writeline("1: " & zooanimals(0))
console.writeline("2: " & zooanimals(1))
console.writeline("3: " & zooanimals(2))
console.writeline("4: " & zooanimals(3))
console.writeline("5: " & zooanimals(4))
''Alternatively an A-grade student might write:
for x = 0 to 4
  console.writeline(x + 1 & ": " & zooanimals(x))
next
zooanimals[2] = input("Insert new third animal: ")
print("1:",zooanimals[0])
print("2:",zooanimals[1])
print("3:",zooanimals[2])
print("4:",zooanimals[3])
print("5:",zooanimals[4])

#Alternatively an A-grade student might write:
for x in range(5):
 print(x,": ",zooanimals[x],sep="")

二維陣列

[編輯 | 編輯原始碼]

陣列是索引相關的元素集。如果每個元素本身都是一個數組,那麼我們就有一個二維 (2d) 陣列。
如果我們將陣列視為列表,我們可以將 2d 陣列視為網格或矩陣。
大多數主要的程式語言允許您使用二維陣列。它們的工作方式與一維陣列非常相似,但允許您指定一個列索引一個行索引。

將 2D 陣列視為網格,單元格的位置如上所示

我們可以建立上面所示的二維陣列並透過執行以下操作分配值

VB.NET Python
Dim grid(4,4) As String
grid(0,3) = "A"
grid(3,2) = "B"
grid(1,4) = "C"
Console.Writeline("The content of 3,2 is:" & grid(3,2))
grid = [["" for x in range(4)] for x in range(4)] 
grid[0][3] = "A"
grid[3][2] = "B"
grid[1][4] = "C"
print("The content of 3,2 is:",grid[3][2])
程式碼也會輸出值 B
示例:二維陣列

二維陣列非常有用,一個好的起點是建立您自己的《戰艦》遊戲版本,帶有 4 個單元格乘 4 個單元格的網格。看看您是否能贏、打破它,或者更好的是,改進它!
我們使用二維 board 變數對以下棋盤進行建模

0 1 2 3
0 x o o o
1 o o x o
2 o o o o
3 o o o o
VB.NET Python
Dim x, y As Integer
Dim board(3, 3) As Char
board(0, 0) = "x"
board(0, 1) = "o"
board(0, 2) = "o"
board(1, 0) = "o"
board(1, 1) = "o"
board(1, 2) = "x"
board(2, 0) = "o"
board(2, 1) = "o"
board(2, 2) = "o"
board(2, 0) = "o"
board(2, 1) = "o"
board(2, 2) = "o"
For z = 1 To 3
Console.WriteLine("This is guess number " & z)
Console.Write("please insert your x location:")
x = Console.ReadLine()
Console.Write("please insert your y location:")
y = Console.ReadLine()
If board(x, y) = "x" Then
Console.WriteLine("you win!")
End If
Next
board = [["" for x in range(3)] for x in range(3)] 
board[0][0] = "x"
board[0][1] = "o"
board[0][2] = "o"
board[1][0] = "o"
board[1][1] = "o"
board[1][2] = "x"
board[2][0] = "o"
board[2][1] = "o"
board[2][2] = "o"
board[2][0] = "o"
board[2][1] = "o"
board[2][2] = "o"
for z in range(1,4):
    print("This is guess number", z)
    x = int(input("please insert your x location: "))
    y = int(input("please insert your y location: "))
    if board[x][y] == "x":
        print("you win!")
練習:二維陣列
宣告一個數組,用 char 型別建立一個 3 平方乘 3 平方的小型跳棋棋盤

答案

VB.NET Python
dim checkBoard(3,3) as char 'also checkBoard(2,2)
checkBoard = [["" for x in range(3)] for x in range(3)]
使用 b 表示黑色,w 表示白色,建立一個棋盤格圖案。

答案

VB.NET Python
 checkBoard(1, 1) = "b"
 checkBoard(1, 2) = "w"
 checkBoard(1, 3) = "b"
 checkBoard(2, 1) = "w"
 checkBoard(2, 2) = "b"
 checkBoard(2, 3) = "w"
 checkBoard(3, 1) = "b"
 checkBoard(3, 2) = "w"
 checkBoard(3, 3) = "b"
 checkBoard[0][0] = "b"
 checkBoard[0][1] = "w"
 checkBoard[0][2] = "b"
 checkBoard[1][0] = "w"
 checkBoard[1][1] = "b"
 checkBoard[1][2] = "w"
 checkBoard[2][0] = "b"
 checkBoard[2][1] = "w"
 checkBoard[2][2] = "b"

一種更智慧的方法是使用迴圈,這將允許您快速建立任何大小的棋盤。有一個問題將要求您構建它!請注意,在 python 中,我們被迫從 0 開始索引。此外,python 對字元和字串使用相同的資料型別。

編寫一個子例程來顯示此棋盤(提示:您需要迴圈),該子例程將 checkBoard 作為引數。

答案

VB.NET Python
sub display(checkBoard())
for x = 1 to 3
   for y = 1 to 3
      console.write(checkBoard(x,y))
   Next
   console.writeline()
Next
def display(checkBoard):
    for x in range(3):
        for y in range(3):
            print(checkBoard[x][y],end="")
        print()

宣告一個 chessBoard(8*8 個方格),用 b 表示黑色,w 表示白色,以程式設計方式對其進行著色。您可能想在上面的棋盤格顏色分配中尋找一個模式,並與MOD 函式交朋友。

您也可能想在嘗試回答這個問題時變得有點迴圈

答案

VB.NET Python
dim chessBoard(8,8) as char 'also chessBoard(7,7)
for x = 1 to 8
   for y = 1 to 8
      if (x + y) MOD 2 = 1 then
         chessBoard(x,y) = "w"
      else
         chessBoard(x,y) = "b"
      end if
   next
next
display(chessBoard()) ' using a slightly updated version of the subroutine display()
chessBoard = [["" for x in range(8)] for x in range(8)]
for x in range(8):
   for y in range(8):
      if (x + y) % 2 == 1:
         chessBoard[x][y] = "w"
      else:
         chessBoard[x][y] = "b"
display(chessBoard) # using a slightly updated version of the subroutine display()

如果您完成了這項工作,您可能想讓程式列印一些巨大的棋盤,無論什麼能使您興奮。

使用以下二維陣列,grid(4,4)

  • 編寫程式碼以輸出名稱 CRAIG
  • 在第 2 行(第三行)插入 MARY
  • SAM 覆蓋 STEVE

答案

VB.NET Python
Console.Writeline(grid(3,0) & grid(3,1) & grid(3,2) & grid(3,3) & grid(3,4))
grid(2,0) = "M"
grid(2,1) = "A"
grid(2,2) = "R"
grid(2,3) = "Y"
grid(1,0) = "S" ' you could skip this
grid(1,1) = "A" 
grid(1,2) = "M"
grid(1,3) = ""
grid(1,4) = ""
print(grid[3][0] + grid[3][1] + grid[3][2] + grid[3][3] + grid[3][4])
grid[2][0] = "M"
grid[2][1] = "A"
grid[2][2] = "R"
grid[2][3] = "Y"
grid[1][0] = "S" # you could skip this
grid[1][1] = "A" 
grid[1][2] = "M"
grid[1][3] = ""
grid[1][4] = ""
華夏公益教科書