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
統計: A(5), B(57), C(25), D(6), E(0) #3099745
詳解 (共 2 筆)
#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 迴圈的末尾,每次迭代都會執行
}
關鍵點:
- A[j-1] 在 j=0 時會導致陣列越界。在這種虛擬碼問題中,通常會假設 A[-1] 為 0,或者 j=0 的情況有特殊處理。我將假設 A[-1] 在計算時被視為 0。
- 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