28. 以下為一段程式語言的虛擬碼,若陣列 A 的初始值 A[ j ] = j, j = 0, 1, …, 10。在初始 時 k = 0 且 j = 0 的假設下,當程式片段執行完後,請問 A[9]=?

(A) 60
(B) 63
(C) 66
(D) 69

答案:登入後查看
統計: A(5), B(57), C(25), D(6), E(0) #3099745

詳解 (共 2 筆)

#6454849
初始:A = [0,1,2,3,4,5,...
(共 424 字,隱藏中)
前往觀看
1
0
#6429815

這是一個關於虛擬碼執行的問題,需要仔細追蹤變數 A 和 k 的值。由於圖片中存在劃掉的行和「新」的標記,這增加了判讀的複雜性。我將採用最直接、最符合程式語言語義的解釋來追蹤執行流程。

初始狀態:

  • 陣列 A 的初始值 A[j] = j,所以 A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  • k = 0
  • j = 0

虛擬碼結構分析:

while (j < 11) do { if (j < 3) { A[j] = A[j] + 1; // 這行沒有被劃掉,會執行 // A[j] = A[j] + A[j-1]; // 這行被劃掉,不執行 A[j] = A[j-1] + k; // 這行是「新」的,會執行,並覆蓋上一行的 A[j] 結果 k = k + 3; } else if (j > 6) { k = k + 1; } else { // 3 <= j <= 6 的情況 // 沒有對 A[j] 或 k 的操作 } j = j + 1; // 這行在 while 迴圈的末尾,每次迭代都會執行 }

關鍵點:

  1. A[j-1] 在 j=0 時會導致陣列越界。在這種虛擬碼問題中,通常會假設 A[-1] 為 0,或者 j=0 的情況有特殊處理。我將假設 A[-1] 在計算時被視為 0。
  2. A[j] = A[j] + 1; 和 A[j] = A[j-1] + k; 兩行都在 if (j < 3) 區塊內。後一行會覆蓋前一行的結果。

逐步追蹤:

  • j = 0: (j < 3 為真)

    • A[0] = A[0] + 1 => A[0] = 0 + 1 = 1
    • A[0] = A[-1] + k => A[0] = 0 + 0 = 0 (假設 A[-1] 為 0,k 為當前值 0)
    • k = k + 3 => k = 0 + 3 = 3
    • j = j + 1 => j = 1
    • A 陣列目前狀態:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    • k 目前狀態:3
  • j = 1: (j < 3 為真)

    • A[1] = A[1] + 1 => A[1] = 1 + 1 = 2
    • A[1] = A[0] + k => A[1] = 0 + 3 = 3 (使用當前 A[0]=0,當前 k=3)
    • k = k + 3 => k = 3 + 3 = 6
    • j = j + 1 => j = 2
    • A 陣列目前狀態:[0, 3, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    • k 目前狀態:6
  • j = 2: (j < 3 為真)

    • A[2] = A[2] + 1 => A[2] = 2 + 1 = 3
    • A[2] = A[1] + k => A[2] = 3 + 6 = 9 (使用當前 A[1]=3,當前 k=6)
    • k = k + 3 => k = 6 + 3 = 9
    • j = j + 1 => j = 3
    • A 陣列目前狀態:[0, 3, 9, 3, 4, 5, 6, 7, 8, 9, 10]
    • k 目前狀態:9
  • j = 3 到 j = 6: (else 區塊)

    • 此區塊沒有對 A[j] 或 k 的操作。
    • j 會從 3 依序遞增到 7。
    • 在 j 變成 7 之前,A 陣列和 k 的值保持不變。
    • 當 j = 7 時,k 仍然是 9。
  • j = 7: (j > 6 為真)

    • k = k + 1 => k = 9 + 1 = 10
    • j = j + 1 => j = 8
    • A 陣列保持不變:[0, 3, 9, 3, 4, 5, 6, 7, 8, 9, 10]
    • k 目前狀態:10
  • j = 8: (j > 6 為真)

    • k = k + 1 => k = 10 + 1 = 11
    • j = j + 1 => j = 9
    • A 陣列保持不變:[0, 3, 9, 3, 4, 5, 6, 7, 8, 9, 10]
    • k 目前狀態:11
  • j = 9: (j > 6 為真)

    • k = k + 1 => k = 11 + 1 = 12
    • j = j + 1 => j = 10
    • A 陣列保持不變:[0, 3, 9, 3, 4, 5, 6, 7, 8, 9, 10]
    • k 目前狀態:12
  • j = 10: (j > 6 為真)

    • k = k + 1 => k = 12 + 1 = 13
    • j = j + 1 => j = 11
    • A 陣列保持不變:[0, 3, 9, 3, 4, 5, 6, 7, 8, 9, 10]
    • k 目前狀態:13
  • j = 11: (j < 11 為假)

    • 迴圈終止。

執行完畢後,A[9] 的值是其初始值 9

結果分析與選項: 根據上述最直接的追蹤結果,A[9] 的最終值為 9。然而,題目提供的選項是 (A) 60, (B) 63, (C) 66, (D) 69。這表明我的解釋可能與出題者的意圖存在差異,或者題目本身存在歧義或錯誤。

在考試情境中,當遇到這種歧義時,通常會假設存在某種未明確說明的規則或隱含的邏輯。但基於嚴格的程式碼語義分析,無法得出選項中的任何一個答案。

如果必須從選項中選擇一個答案,這通常意味著需要對某些語句進行非標準的解釋。然而,在沒有更多上下文的情況下,我無法確定哪種非標準解釋會導致 63。

因此,根據對虛擬碼的嚴格分析,A[9] 的值為 9。由於此結果不在選項中,這表示問題可能存在錯誤。

0
0