1.
This presentation is the property of its rightful owner.
Sponsored Links
1 / 13

1. 小麗是某 主題公園 的經理, 她希望分析 N 日內 每天 遊客數目 ( 以 1000 作單位 ) ,並將數據儲存在 陣列 NA 中。 PowerPoint PPT Presentation


  • 69 Views
  • Uploaded on
  • Presentation posted in: General

1. 小麗是某 主題公園 的經理, 她希望分析 N 日內 每天 遊客數目 ( 以 1000 作單位 ) ,並將數據儲存在 陣列 NA 中。 她設計子程式 FindMAX 的算法,找出 NA 內的 最大值 ,如下所示。. int N=5; int FindMAX(){ m =  1 ;// max i = 1; while(i<=N){ if(NA[i]>m) swap (&m,&NA[i]); i++; } return m; }. FindMAX m   1 i  1 當 i <= N 若 NA[i] > m

Download Presentation

1. 小麗是某 主題公園 的經理, 她希望分析 N 日內 每天 遊客數目 ( 以 1000 作單位 ) ,並將數據儲存在 陣列 NA 中。

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


1 n 1000 na

1. 小麗是某主題公園的經理,

她希望分析N日內每天遊客數目(以1000作單位),並將數據儲存在陣列NA中。

她設計子程式FindMAX的算法,找出NA 內的最大值,如下所示。

int N=5;

int FindMAX(){

m = 1;// max

i = 1;

while(i<=N){

if(NA[i]>m)swap(&m,&NA[i]);

i++;

}

return m;

}

FindMAX

m 1

i  1

當i <= N

若NA[i] > m

則交換m 及NA[i] 的內容

i  i+1

返回 m

假設N=5 及NA 的初始內容是:

遊客數目

m = 1

(ii) 根據NA的初始內容,空運行FindMAX 兩次後,寫出NA 的內容。

(a) (i) 空運行FindMAX 一次後,寫出NA的內容及交換m及NA[i]的內容總次數。

-1

20

25

30

35

m = 25

m = 30

m = 40

m = 35


1 n 1000 na

小麗編寫子程式 mySORT 的算法,

以遞降序排列NA的內容,並將結果儲存在陣列NB內。

NA[] NB[]

m = FindMAX

NB[j] = m

m = FindMAX

NB[N-j+1] = m

(d) 主題公園必須每月繳交電費,小麗希望利用FindMAX,來找出過去五個月內,最大一筆的電費支出。起始時,五筆電費支出是以負整數儲存在NA內。

例如 int NA[5]={25,20,30,40,35};

m=1

(i) 空運行FindMAX一次。m 的最終數值是什麼?

哪種類別的錯誤會因FindMAX的算法而產生?

邏輯錯誤 (∵max並非1)

(ii) 應如何修改FindMAX的算法,才可找出最大一筆的電費?

把 if(NA[i]>m)改為 if(NA[i]<m)


1 n 1000 na

2. 志明在一所學校的保健中心工作,他編寫了一個程式,包括下列子程式的,

分析學生的體重。N 是全程(global)整數常數,而A 是全程整數陣列。

5/2

1

5

2

4

(a) (i) 在for 循環中,temp 的用途是什麼? 它在互換進程中作為暫存器。

(ii) 假設N=5 及A 的初始內容是

寫出剛執行 RV 後A 的內容。

// reverse


1 n 1000 na

假設有100 名學生,即N=100。

(b) 子程式initA 將A 內每個元素賦予0值。試在下方完成initA。

for (i=1;i<=N;i++) A[i]=0;

子程式ADDW 將一個整數儲存在A 內。

// insert w into A[] (由大至小)

// 找尋插入點

// 向右移 shift right

// 插入insert w into A[]


1 n 1000 na

(c) 順序執行以下子程式:

initA();

ADDW(36);

ADDW(30);

ADDW(40);

// {36,0,0,0}

// {36,30,0,0}

// {40,36,30,0}

A 的內容是什麼? 填寫以下A 的首尾各四個元素的內容。

(d) 假設有另一個包含元素B[1]至B[100]的全程整數陣列B,儲存了學生的體重。

志明希望編寫子程式ASORT,將B內的數值以遞升序排列,並儲存在A內。

試利用RV、initA及ADDW,為志明完成以下的ASORT。

B[i]A[i]

initA();

for (i=1; i<=100; i++)

ADDW(B[i]);

RV();

// A[]={0,0,0,0,…}

// 插入insert B[i] into A[]

// 反序reverse A[]


1 n 1000 na

3. 李先生建立一個鏈表來表示社交網絡的群組成員。此鏈表儲存在下列表格中。

假設鏈表(linked list)以PETER 開始。

(a) 追蹤「下一ID的指示標」(NEXT ID pointer),並填上以下鏈表中的下兩個節點。

(head)首標 PETER MARY

GIGI JANE …


1 n 1000 na

(b) 試為以下操作填寫「下一ID的指示標」的內容。

(i) JANE 已經不再屬於此社交網絡,將它從鏈表中刪除。

03

01

04

(ii) AMY 加入群組中,其ID=03,並置於鏈表中PETER及MARY之間。

i.e. 首標PETERAMYMARY

(c) 李先生認為,一個人可在此社交網絡,加入多於一個群組。

現有的鏈表,能否實現這樣安排嗎? 試簡略說明。

否。每一項只有一個連結,代表一個關係


1 n 1000 na

(d) 李先生使用堆疊stack,在下列表格入群組成員。

他重覆地從以下的堆疊中輸出元素,

並透過建構「下一ID的指示標」,將元素順序地附加在鏈表Linked list中。

[順序:按堆疊內POP次序,並非以姓名排序]

(ii) 假設鏈表的最後一個指示標儲存1。

填寫以上表格內「下一ID的指示標」的內容

堆疊頂部top

(i) 鏈表中的首標head指向哪一ID?

02

(e)李先生依照以下算法建構(d)的鏈表

(ii) 試相應地重寫一句語句,

以改善這個算法

設 i 由1至4

從堆疊中輸出元素 (POP)

將這個元素附加在鏈表中

當(while)堆疊不是空的,

從堆疊中輸出元素 (POP)

將這個元素附加在鏈表中

(i) 這個算法的潛在問題是什麼?

堆疊內只可儲存四個元素

for(i=1;i<=4;i++)…


1 n 1000 na

4. 志偉設計個電腦程式,處理某中學120名中三學生的(選科)科目組別的意願。

有120行展示學生意願的數據(下列表格內灰色部分),儲存在數據檔df.txt內,

每行數據必須包含1、2 和 3

P[1][2]

data file df.txt內容

3 1 2

1 3 2

...

2 1 3

P[2][3]

志偉編寫下列子程式sub1,讀取df.txt內學生的意願

P 是二維的全程整數陣列,儲存科目組別的意願。SN是全程整數變量


1 n 1000 na

fscanf (inf, "%d%d%d",

&P[SN+1][1], &P[SN+1][2], &P[SN+1][3]);


1 n 1000 na

(a)假設全部120名學生的意願,均正確無誤地儲存在P[][]內。

志偉在下列子程式sub2中,採用了三個全程整數變量 N1、N2、N3

void sub2(void){

int i;

N1 = N2 = N3 = 0;

for(i=1; i<=120; i++){

if(P[i][1]==1) N1++;

if(P[i][2]==1) N2++;

if(P[i][3]==1) N3++;

}

}

(i) 若P[i][1]儲存了1。

這代表什麼?

第i個學生選擇A為第一意願。

選擇A

選擇B

選擇C

(ii) N3的最終值代表什麼?

選擇C為第一意願

的學生總人數。

(iii) 志偉編寫子程式sub3,

根據sub2 所計算的N1、N2及N3,

顯示最受歡迎的科目組別,

試為志偉完成以下的sub3

void sub3(void){

if(________&&________)

printf("A");

else if(________&&________)

printf("B");

else

printf("C");

}

N1>=N2 && N1>=N3

N2>=N1 && N2>=N3

(iv) sub3 曾因某些N1, N2, N3 的值而產生不完整的結果。試描述這個問題

同分/雙冠軍,

sub3的只能顯示其中一個。


1 n 1000 na

(b) 科目組別的數量每年均有所變更,例如在來年提供多於三項科目組別。

試描述兩項應為sub2 作出的修訂,讓學校可靈活地處理學生的意願。

1.以常數變量儲存科目組別的總數。 #define MAX 10

2.使用陣列代替N1、N2和N3。 int count[MAX]={0};

3.利用循環語句代替for 循環內三句語句 if(P[i][1]==1)…。

for(i=0;i<120;i++)

for(j=0;j<MAX;j++)

if(P[i][j]==1) count[j]++;

(c) 假設儲存在df.txt 內的所有數據均是1、2和3。

試描述數據中一個可能的錯誤。

相同數字 1 1 1

轉錄錯誤

SN=0;

while (SN<120){

fscanf…

SN++;

}

(d) 假設儲存在df.txt 內的數據總行數是未知的。

(i) 執行子程式sub1 將出現運行run-time錯誤,

這個錯誤將如何發生?

如果只有少於120 筆記錄,

子程式會繼續讀取數據檔案,

並產生錯誤。


1 n 1000 na

(ii) 修改行號80 的語句以解決(d)(i) 的問題。

&& !feof(inf)

(iii) 若以dowhile 作比較,在行號80上使用while循環(較dowhile)為佳。

為什麼?

若數據庫是空的,這種做法並不適當。


  • Login