107年地方特考四等程式設計概要
三、請用下列程式回答下列問題。(每小題5分,共25分) (一)num[ ] 一維陣列最多可儲存幾個正整數? (二)若依序輸入1, 2, 3, …, 99, 0,請說明 num[0] 值為何。 (三)若依序輸入99, 98, …, 2, 1, 0,請說明 num[0] 值為何。 (四)輸入99個亂數產生的正整數後再輸入0,請說明 num[0] 值為何。 (五)請說明 reorder( ) 遞迴函數的功用為何。 int num[100] = {0}; int n = 0; void reorder(int k) { int temp; if((k != 0) && (books[k] > books[k/2])) { temp = books[k]; books[k] = books[k/2]; books[k/2] = temp; reorder(k/2); } } int main( ) { int i = 0; scanf (“%d”, &num[i]); while (i != 0) { reorder(i); i = i+1; scanf (“%d”, &num[i]); } } |
答:
題目有誤,reorder( ) 函式中 books 陣列應該改為 num 陣列。
#include <stdio.h> int num[100] = {0}; int count = 0; // 用來記錄已輸入的數量 void printData( ) { for (int i = 0; i <= count; i++) { printf("%d, ", num[i]); } printf("\n"); } void reorder(int k) { int temp; printData( ); if ((k != 0) && (num[k] > num[k / 2])) { temp = num[k]; num[k] = num[k / 2]; num[k / 2] = temp; reorder(k / 2); } } int main() { int i = 0; scanf_s("%d", &num[i]); while (num[i] != 0) { reorder(i); i = i + 1; count = i; scanf_s("%d", &num[i]); } return 0; } |
執行結果:
5
5,
12
5, 12,
12, 5,
3
12, 5, 3,
15
12, 5, 3, 15,
12, 15, 3, 5,
15, 12, 3, 5,
7
15, 12, 3, 5, 7,
15, 12, 7, 5, 3,
8
15, 12, 7, 5, 3, 8,
15, 12, 8, 5, 3, 7,
0
(一)num[ ]一維陣列最多可儲存幾個正整數?
num 陣列是定義為 int num[100]。因此,最多可以儲存100個正整數。
(二)若依序輸入1, 2, 3, …, 99, 0,請說明num[0]值為何。
每當輸入一個新的數字時,reorder 函數會被呼叫以確保陣列保持在一種特定的順序。從程式的邏輯來看,reorder 函數的作用是確保陣列成為一個最大堆積,也就是每個元素都比其子節點大。因此,每當輸入一個新的數字,如果它比它的父節點大,它就會向上移動。給定輸入1, 2, 3, …, 99, 0,num[0] 會是最大的數字,即99。
(三)若依序輸入99, 98, …, 2, 1, 0,請說明num[0]值為何。
因為第一個輸入值是 99,它將被放在 num[0]。但後續的數字都比99小,所以 num[0] 不會改變。因此,給定輸入99, 98, …, 2, 1, 0,num[0] 的值會是99。
(四)輸入99個亂數產生的正整數後再輸入0,請說明 num[0] 值為何。
reorder( ) 函數確保 num[ ] 陣列維持為最大堆積的結構,這意味著 num[0] 始終儲存當前輸入的最大數字。
(五)請說明 reorder( ) 遞迴函數的功用為何。
reorder( ) 函數的主要目的是保持陣列的結構為最大堆積。當一個新的數字被加入到陣列時,這個函數確保該數字在陣列中的正確位置,使得父節點的值始終大於或等於子節點的值。如果當前節點的值大於其父節點的值,它們會交換,然後函數遞迴地檢查新的父節點,直到整個陣列成為一個最大堆積或直到當前節點不再大於其父節點。