二維陣列的索引可以表示成列與行,現以列主序(Row-major)的方式將陣列 ABC[-5:10,3:8]排列在記憶體中,且設定此陣列的初始記憶體位置為1200。假設此陣列的每個元素皆需要 8 個位元組(Bytes)的儲存空間。試算陣列元素 ABC[1, 4]的儲存,應始於那個記憶體位置?
-
A. 136821.7% (5)
-
B. 137613% (3)
-
C. 14884.3% (1)
-
D. 149652.2% (12)
-
未填寫8.7% (2)
解說:
要計算在列主序(row-major)存儲方式下,二維陣列 ABC 中元素的記憶體位置,我們需要進行以下步驟:
1.確定陣列的維度和每個元素的大小:
陣列 ABC 的範圍是 [-5:10, 3:8],因此:
第一維的範圍是 -5 到 10,包含 10 - (-5) + 1 = 16 個元素。
第二維的範圍是 3 到 8,包含 8 - 3 + 1 = 6 個元素。
每個元素需要 8 個位元組(Bytes)。
2.計算元素 ABC[i, j] 在列主序下的記憶體偏移量:
第一維的範圍是 -5 到 10,包含 10 - (-5) + 1 = 16 個元素。
第二維的範圍是 3 到 8,包含 8 - 3 + 1 = 6 個元素。
每個元素需要 8 個位元組(Bytes)。
2.計算元素 ABC[i, j] 在列主序下的記憶體偏移量:
在列主序中,元素的排列順序是:先填滿一列的所有元素,然後再移至下一列。
假設陣列的記憶體位置是從 1200 開始的。
假設陣列的記憶體位置是從 1200 開始的。
計算 ABC[1, 4] 的位址:對於 i = 1 和 j = 4:
Memory_Address(ABC[1,4])=1200+[(1−(−5))×6+(4−3)]×8
=1200+[(1+5)×6+1]×8
=1200+[6×6+1]×8
=1200+[36+1]×8
=1200+37×8
=1200+296
=1496
因此,ABC[1, 4] 的儲存位置應始於記憶體位置 1496。
Memory_Address(ABC[1,4])=1200+[(1−(−5))×6+(4−3)]×8
=1200+[(1+5)×6+1]×8
=1200+[6×6+1]×8
=1200+[36+1]×8
=1200+37×8
=1200+296
=1496
因此,ABC[1, 4] 的儲存位置應始於記憶體位置 1496。
答對率 : 52.2 %
有關 C 語言程式的陣列資料型態(array data type),下列敘述何者錯誤?
-
A. 宣告陣列變數時需設定陣列長度26.1% (6)
-
B. 陣列內的每個元素都必須具有相同的型態0% (0)
-
C. 我們可以利用註標(index)取出陣列內的特定元素8.7% (2)
-
D. 因為利用循序的方式讀取資料,所以取得陣列的最後一個元素,會比取得陣列的第一個元素還慢56.5% (13)
-
未填寫8.7% (2)
解說:
關於 C 語言中的陣列資料型態,以下是每個選項的詳細說明:
(A) 宣告陣列變數時需設定陣列長度:
這是正確的。在 C 語言中,當你宣告一個陣列時,你需要指定它的長度(即元素的數量)。例如,int arr[10]; 表示一個包含 10 個整數的陣列。
(B) 陣列內的每個元素都必須具有相同的型態:
(B) 陣列內的每個元素都必須具有相同的型態:
這是正確的。在 C 語言中,陣列的所有元素必須是相同型態。例如,int arr[5]; 創建了一個只包含整數的陣列。
(C) 我們可以利用註標(index)取出陣列內的特定元素:
(C) 我們可以利用註標(index)取出陣列內的特定元素:
這是正確的。在 C 語言中,可以使用索引(下標)來存取和操作陣列中的特定元素。例如,arr[2] 取出 arr 陣列中的第三個元素(索引從 0 開始)。
(D) 因為利用循序的方式讀取資料,所以取得陣列的最後一個元素,會比取得陣列的第一個元素還慢:
(D) 因為利用循序的方式讀取資料,所以取得陣列的最後一個元素,會比取得陣列的第一個元素還慢:
這是錯誤的。由於 C 語言中的陣列在內存中是連續存儲的,任何元素的存取時間通常是常數時間(O(1)),無論是第一個還是最後一個元素。取出陣列的最後一個元素並不會比取出第一個元素更慢,因為索引的計算是基於常數時間的運算。
因此,正確的回答是 (D) 因為利用循序的方式讀取資料,所以取得陣列的最後一個元素,會比取得陣列的第一個元素還慢。
因此,正確的回答是 (D) 因為利用循序的方式讀取資料,所以取得陣列的最後一個元素,會比取得陣列的第一個元素還慢。
答對率 : 56.5 %
下列那一種資料型態可處理一序列具有相同型態的資料?
-
A. 陣列78.3% (18)
-
B. 浮點數4.3% (1)
-
C. 結構4.3% (1)
-
D. 整數4.3% (1)
-
未填寫8.7% (2)
解說:
在處理一序列具有相同型態的資料時,正確的資料型態是 陣列(Array)。
以下是對各選項的詳細解釋:
(A) 陣列 (Array):
陣列是一種資料結構,可以用來儲存一系列具有相同型態的元素。陣列中的每個元素都是相同型態的,可以通過索引來存取。
(B) 浮點數 (Floating-point number):
(B) 浮點數 (Floating-point number):
浮點數是一種單一的數值型態,用來表示實數,不是用來儲存一系列的資料。浮點數無法處理多個相同型態的資料。
(C) 結構 (Structure):
(C) 結構 (Structure):
結構是一種用來儲存不同型態資料的資料結構。結構的每個成員可以有不同的型態,因此不適合用來處理一系列具有相同型態的資料。
(D) 整數 (Integer):
(D) 整數 (Integer):
整數是一種單一的數值型態,用來表示整數值,不是用來儲存一系列的資料。整數無法處理多個相同型態的資料。
因此,正確的答案是 (A) 陣列(Array)。
因此,正確的答案是 (A) 陣列(Array)。
答對率 : 78.3 %
一個「以列為主序」(row major order )的二維整數陣列k[10][10],若一個整數占用4 個位元組(byte),k[0][5] 的位址是5,則k[1][5] 的位址是多少?
-
A. 94.3% (1)
-
B. 1517.4% (4)
-
C. 258.7% (2)
-
D. 4560.9% (14)
-
未填寫8.7% (2)
解說:
要計算二維整數陣列在「列為主序」(row-major order)下某個元素的位址,我們需要使用以下步驟:
1.理解列為主序(row-major order)存儲方式:
2.在列為主序中,陣列的元素是按照行的順序存儲的。即,先儲存一行的所有元素,然後再儲存下一行的所有元素。
確定每個元素的大小和陣列的列數:
(1)每個整數元素占用 4 個位元組(bytes)。
(2)陣列 k 的大小是 10x10,所以每行有 10 個整數。
3.計算位址:
(1)已知 k[0][5] 的位址是 5。
(2)要計算 k[1][5] 的位址,我們需要知道 k[1][5] 距離 k[0][5] 的偏移量。
在列為主序中,k[1][5] 比 k[0][5] 的位址多出一整行的位址。每行包含 10 個整數,每個整數占用 4 個位元組,因此每行的大小是:
確定每個元素的大小和陣列的列數:
(1)每個整數元素占用 4 個位元組(bytes)。
(2)陣列 k 的大小是 10x10,所以每行有 10 個整數。
3.計算位址:
(1)已知 k[0][5] 的位址是 5。
(2)要計算 k[1][5] 的位址,我們需要知道 k[1][5] 距離 k[0][5] 的偏移量。
在列為主序中,k[1][5] 比 k[0][5] 的位址多出一整行的位址。每行包含 10 個整數,每個整數占用 4 個位元組,因此每行的大小是:
Row_Size=10×4=40 bytes
因此,k[1][5] 的位址是 k[0][5] 的位址加上整行的大小:
因此,k[1][5] 的位址是 k[0][5] 的位址加上整行的大小:
Address(k[1][5])=Address(k[0][5])+Row_Size
Address(k[1][5])=5+40=45
所以,k[1][5] 的位址是 45。
Address(k[1][5])=5+40=45
所以,k[1][5] 的位址是 45。
答對率 : 60.9 %
考慮下列用一維陣列儲存的完整二元樹:{A, B,C, D, E, F, G, H, I, J, K...},請問I 的兄弟(Sibling)節點為何?
-
A. G8.7% (2)
-
B. H30.4% (7)
-
C. J34.8% (8)
-
D. K13% (3)
-
未填寫13% (3)
解說:
要找出完整二元樹中節點的兄弟節點,首先我們需要了解完整二元樹的結構以及如何在一維陣列中表示它。
在一維陣列中,完整二元樹的節點是按照層次順序存儲的。對於節點 i 在索引 i 的一維陣列中,其子節點的索引分別為 2*i + 1 和 2*i + 2。同樣,其父節點的索引為 (i - 1) // 2。根據這些索引關係,可以找出每個節點的兄弟節點。
假設我們的樹的節點按照層次順序排列如下:
{A, B, C, D, E, F, G, H, I, J, K}
我們可以分層查看:
{A, B, C, D, E, F, G, H, I, J, K}
我們可以分層查看:
層 0: A
層 1: B, C
層 2: D, E, F, G
層 3: H, I, J, K
要找出 I 的兄弟節點,我們首先找出 I 的索引。I 是層 3 的第三個節點,因此其索引是 8。對於索引 8 的節點 I:
層 1: B, C
層 2: D, E, F, G
層 3: H, I, J, K
要找出 I 的兄弟節點,我們首先找出 I 的索引。I 是層 3 的第三個節點,因此其索引是 8。對於索引 8 的節點 I:
它的父節點的索引是 (8 - 1) / 2 = 3
I 的父節點是索引 3 的節點,即 D
D 的兩個子節點是索引 7 和 8 的節點,即 H 和 I。所以 I 的兄弟節點是 H。
I 的父節點是索引 3 的節點,即 D
D 的兩個子節點是索引 7 和 8 的節點,即 H 和 I。所以 I 的兄弟節點是 H。
因此,I 的兄弟節點是 H。
答對率 : 30.4 %