39
第第第 第第第第 4-1 if 4-2 if..else 4-3 case 4-4 綜綜綜綜

第四章 決策敘述

Embed Size (px)

DESCRIPTION

第四章 決策敘述. 4-1 if 4-2 if..else 4-3 case 4-4 綜合範例. 人類的生活必須不斷的面臨選擇、決策問題,連我家一個不到三歲的小孩,也常要思考他手裡的十元是要坐電動車還是買棒棒糖。程式語言是協助人類解決問題的工具,當然也包含決 策敘述, Delphi 依決策點的多寡,分為以下三種決策敘述: 第一是單一分岐決策的 if, 例如肚子餓了就吃飯 第二是雙向分岐決策 if else ,例如肚子餓了就吃飯,否則繼續前進; - PowerPoint PPT Presentation

Citation preview

第四章 決策敘述 4-1 if 4-2 if..else 4-3 case 4-4 綜合範例

人類的生活必須不斷的面臨選擇、決策問題,連我家一個不到三歲的小孩,也常要思考他手裡的十元是要坐電動車還是買棒棒糖。程式語言是協助人類解決問題的工具,當然也包含決策敘述, Delphi 依決策點的多寡,分為以下三種決策敘述:

第一是單一分岐決策的 if, 例如肚子餓了就吃飯 第二是雙向分岐決策 if else ,例如肚子餓了就吃飯,否則繼續前進;

第三是多向分岐決策的 case ,例如你身上有 5000 元,走進一家五星級的大飯店用餐,你的分岐點就很多,可選擇自助餐、中式套餐、日本料理、泰國餐點等等分岐點。本章的重點即是探討 Delphi 的決策敘述。

4-1 ifif 通常用於單一分岐的決策,它的使用時機為“假如~則~”,也就是條件成立時,則執行某項工作,若條件不成立時,將不予理會。

其語法如下:if 運算式 then begin 敘述區塊 ; end;

以上語法說明如下: 1. 若所要執行的敘述區塊只有一個,則可以省略上下

的 begin 與 end ,只寫為: if 運算式 then 單一敘述 ;

2. 若運算式的值為 True (條件成立),則執行敘述區塊;運算式的值若為 False (條件不成立),該敘述則不會被執行,其流程圖如下:例如,以下敘述,當 a 的值大於 60 分時,可設定 b

為及格。if a>=60 then begin b:=" 及格 " ; end;

其次,因為條件成立時,只有執行一個敘述,所以 begin...end 可省略,如以下述。

if a>=60 then b:=' 及格 ';

範例 4-1a請輸入一個成績,若此成績大於等於 60分,則輸出“及格”。

本例即是單一分岐決策的典型範例,當條件成立時則執行某個敘述。

本例的 if 敘述區塊,僅有一個敘述,所以上下的 begin 與 end 讀者可自行省略。

範例 4-1b 同上範例,但及格時背景以黃色呈現。

範例 4-1c 請輸入兩數,並求其較大值 [ 演算法則 ] 1. 輸入第一數,本例以實數 a 儲存。 2. 輸入第二數,本例以實數 b 儲存。 3. 設定極大值 (max) 為第一數。

max=a 4. 當第二數 (b) 大於極大值時,極大值即以 b 取代。

if b > max then max:=b;

5. 輸出極大值 (max) 即為所求。

自我練習請輸入兩個數,並求其最小值。

範例 4-1d 請輸入三個數,並求其最大值

[ 演算法則 ] 1. 輸入第一個數,本例以實數 a 儲存。 2. 輸入第二個數,本例以實數 b 儲存。 3. 輸入第三個數,本例以實數 c 儲存。 4. 設定極大值 (max) 為第一數。

max:=a; 5. 當第二數 (b) 大於極大值時,極大值即以 b 取代。

if b> max then max:=b;

6. 當第三數 (c) 大於極大值時,極大值即以 c 取代。 if c> max then max:=c;

7. 輸出極大值 max 。

自我練習 1. 請輸入四個數,並求其最小值。 2. 請輸入五個數,並求偶數的個數。

範例 4-1e請輸入兩個數,並將此二數交換後輸出

[ 演算法則 ] 1. 輸入第一個數,本例以實數 a 儲存。 2. 輸入第二個數,本例以實數 b 儲存。 3. 設定暫存的實數 t 。 4. 將實數 a 指定由實數 t 儲存。

t:=a 5. 將實數 b 指定由實數 a 儲存。

a:=b 6. 將實數 t 指定由實數 b 儲存。

b:=t 7. 輸出 a,b 兩數,即為交換後的結果。

範例 4-1f 請寫一個程式, 可以輸入三個數,並由小而大輸出

〔演算法則〕 1. 分別以 a、 b及 c表示欲

排序的資料。 2. 假如 a大於 b,則 a與 b

交換 3. 假如 b大於 c,則 b與 c

交換 4. 假如 a大於 b,則 a與 b

交換,排序完成 並需進行 3次的比較與交換

〔補充說明〕 1. 以下是將資料交換寫成程序,關於

程序的用法請看 8-1 節 2. 若有 4筆資料要排序,則共需進行

6次比較與交換 3. 若有 5筆資料要排序,則共需進行

10次比較與交換 4. 以上為 3,4 或 5筆資料的比

較與排序,其比較與交換的次數尚可克服,但若欲排序的資料超過 5個,例如 20筆資料欲排序,則應待迴圈與陣列敘述介紹之後,才有較快速的解法。

自我練習 1. 請寫一個程式,可以輸入 4 個數,並

由小而大排序。 2. 請寫一個程式,可以輸入 5 個數,並

由大而小排序。

4-2  if..else 上一節的 if 僅適合單一分岐的決策,當條件成立時執行某一敘述,當條件未成立時,則未做任何處理。但在日常生活領域,常出現“假如~則~,否則~”,此種決策模式有兩種解決問題的方案,故稱為雙向分岐決策,此時可使用 if..else 敘述,其敘述語法如下:

if 運算式 then begin 敘述區塊 1 ; end;else begin 敘述區塊 2 ; end;

以上語法說明如下: 1. 若敘述區塊內只有單一敘述,則 begin 與 end 可以予以省略,如下所示。請

留意敘述 1 之後不用加分號( ; ),因為整個 if 敘述尚未結束。if 運算式 then 敘述 1

else 敘述 2 ;

2. 運算式的值若為 True ,則執行敘述區塊 1 ;運算式的值若為 False ,則執行敘述區塊2

3. 以下程式片段可依 a 的大小評量其及格與否。if a>=60 b=" 及格 "else b=“ 不及格”;

4. 敘述區塊內可以放置任何合法敘述,當然也可以再放置 if 。 if 中有 if ,稱為巢狀 if 。例如,以下敘述除可判斷 a 是否及格,更可判斷其是否優等。

if a>=60 then begin b=' 及格 "; if a>=90 then c:=' 優等 '; end;

範例 4-2a同上範例,加上當成績小於 60 時,也要印出 " 不及格 " 。

本例是典型的雙向分岐決策,此時可用 if…else 實現程式的要求。

本例的 if 及 else 敘述區塊均只有一個敘述,所以 begin 與 end 可自行省略。

範例 4-2b 請寫一個程式,完成以下要求:

輸入一個 0 ~ 100 的分數。當分數大於 90 分時,輸出 A 。當分數介於 80 ~ 89 分時,輸出 B 。當分數介於 70 ~ 79 分時,輸出 C 。當分數介於 0 ~ 69 分時,輸出 D 。

以上每一個決策點,都有兩個分岐點,所以適用 if...else ,每一個 else 後面均需再放置 if 作進一步決策。

範例 4-2c同上範例,但 90 分以上時,背景以黃色顯示;分數低於 70 分時,背景以紅色顯示

補充說明 :Delphi 的語法是承繼Pascal ,其是否加分號的規則表面上看起來比較亂,此點在後續的程式語言如 C/C++ 、 Java 均已有改進。

自我練習請寫一個程式,可以輸入 (x,y)座標而得其所在象限。例如,輸入 (3,4) 輸出 "Ⅰ" ;輸入 (-5,2) 輸出 "Ⅱ" 。

4-3case

一個決策點若同時擁有三個或三個以上的解決方案,此稱為多向分岐決策。多向分岐決策雖也可使用範例 4-2b 的巢狀 if ...else 解決,但卻增加程式的複雜度、及降低程式可讀性。

若決策點能找到適當的運算式,能使問題同時找到分岐點,則可使用 case 敘述,其語法如下:

case 運算式 of 結果 1 : begin 敘述區塊 1 ;

end; [ 結果 2 : begin 敘述區塊 2 ; end;] .  .  .[else: begin 敘述區塊 n ; end;]end ; //此處的分號代表一個 case 敘述的結束。

語法說明 : 1. case 的運算式必須可以得到一個序數( Ordinal )的型態,

例如 整數 3或字元 'B' 。 2. 每一個結果也必須是序數型態(整數或字元),但可以是連續 的序數,例如 3、 3..6、 'B'或 'B'..'E' 等。

3. 程式將依運算式的結果,尋找適當的敘述區塊。 4. 以下敘述,可將所輸入的 a 值,轉為對應的星期幾。

case a of0:

b:= '星期一 ';1:

b:= '星期二 ';2:

b:= '星期三 ';3:

b:= '星期四 ';end;

5. 若沒有適當的“結果”可以執行,程式將會自動離開 case 敘述。為了避免發生這種情況,可以在程式的最後面加上 else ,使得即使沒有任何結果符合時,也可以執行 else 後面的敘述。例如,以下敘述,若使用者輸入的值不在 0 與 6 之間,則會顯示“ 輸入錯誤”。

case a of0:

b:= ' 星期一 ';1:

b:= ' 星期二 ';

6: b:= ' 星期日 ';

else b:= ' 輸入錯誤 ';end;

6. 敘述區塊內可放置任何合法的敘述,當然也可放置 switch或 if

範例 4-3a試以 case重作範例 4-2b 。 補充說明 :

case 敘述內的每一個結果,若要執行兩個以上的敘述時,則要使用 begin 與 end圍起來、且要以分號( ; )結束。

範例 4-3b 請寫一個紅綠燈的模擬程式,其要求如下:(1) 當輸入是 0,1,2,3,4 時,輸出 "綠燈 " 。(2) 當輸入是 5,6,7,8,9,10 時,輸出 "綠閃 "(3) 當輸入是 11,12 時,輸出 " 黃燈 " 。(4) 當輸入是 13,14,15,16,17 時,輸出 " 紅燈 "

範例 4-3c同上範例,但改為每按一次按鈕,輸入值自動遞增,並輸出相對的燈號。〔操作步驟〕

1. 本例為使 a 值流通於各事件副程式,所以宣告於表單的變數宣告區,如以下敘述。

Var Form1:TForm1; a:integer;

2. 交通號誌的三個燈號,本例使用三個 shape (位於 Additional標籤)元件。其 name屬性分別設為 sppgreen,shpyellow及 shpred ,其 shape屬性均點選 stCircle ,其 Brush.color 則分別點選 clGreen,clYellow及 clRed 。

3. 本例將 "綠閃 " 再分為 "綠減 " 與 "燈燈 " ,待下一範例即有綠閃的效果

範例 4-3d同上範例,但改為自動遞增輸入值。〔操作步驟〕

1. 本例新增一個 Timer元件(位於 System標籤),其 Name屬性預設值為 Timer1 ,並設定其 interval屬性為 1000 (表示每 1000ms 自動產生一個 OnTimer事件。)

2. 將上例 TForm1.btn startClick 副程式的內容剪下,並貼至 TForm1.Timer1副程式,如以下的程式列印。

3.關於 Timer元件的詳細用法,請看 12-12 節。

4-4綜合範例 一元二次方程式

解一元二次方程式的演算法如下: 1. 設有一元二次方程式如下:

ax2 + bx + c = 0 2. 若 a = 0 則應輸出“輸入錯誤” 3. 令 d=b2- 4ac 4. 若 d = 0 ,則方程式有唯一解 ;

若 d > 0 ,則方程式有二解: , ,否則無實數解。

a2

bx

a2

dbx1

a2

dbx2

範例 4-4a 請設計一個程式,

可以解一元二次方程式 1. 使用 edia、 edib 及 edic 分別輸入方程式的三個係數 a、 b 及 c 。

2. 使用 lblOut 輸出結果。程式說明 :

1. Delphi 並無次方與根號運算子,若欲使用次方或根號運算,則應使用 intpower、power或 sgrt 等數學函式,且應於 uses連結檔宣告區中,引用數學函式如下:

uses Math;

2. intpower、power或 sgrt 等數學函式,計算結果均傳回實數的 Extended 型態,請特別留意資料型態的一致。

二元一次方程式 解二元一次方程式的演算法如下: 1. 設二元一次方程式如下:

12

2. 令 (表示 d = a1b2 - a2b1 )

3. 假如 則方程式無限多解 ,且程式結束

111 cybxa

222 cybxa

22

11

ba

bad

2

1

2

1

2

1

c

c

b

b

a

a

4. 假如 d = 0 ,則程式無解,且程式結束

5.

6.

d/)bcbc(d

bc

bc

x 122122

11

d/)caca(d

ca

ca

y 122122

11

範例 4-4b 請設計一個程式,可以解二元一次方

程式。

三角形面積 若已知三角形三邊長,計算三角形三邊長的演算法下: 1. 輸入三角形三邊長 a、 b、 c 。 2. 將三邊長由小而大重新排列,最小的放入 a ,

其次 放入 b ,最大的放入 c 。 3. 最小的兩邊之和若小於等於第三邊,則此三邊

未 能構成三角形,程式提早離開。 4. 假如則為銳角三角形,否則,假如則為直角三角 形,否則此三角形為鈍角三角形。

5. 令

6. 三角形面積 )cd)(bd)(ad(d

)cba(2

1d

範例 4-4c請輸入三角形三邊長,首先判斷是否構成三角形。其次,判別三角形的種類,最後計算其面積。 程式說明 :

1. 設有 a , b , c 三數,欲由小而大排列,則其演算法如下:a , b比較,若 a>b ,則兩者交換。b , c比較,若 b>c ,則兩者交換,此時 c 一定最大。a , b 再比較,若 a>b ,則兩者交換,此時 a 一定最小。共比較三次,即可由小而大排列。

2. 假如有兩杯水 a , b 要交換,則其交換演算法如下:先找一個空杯子 t 。將 a 的水暫時倒入空杯子 t ( t := a )。將 b 的水倒入 a杯子( a := b )。將 t 的水倒入 b杯子( b := t ),而完成兩杯水的交換。如果未找來空杯子 t ,而直接將 a倒入 b ,則原來 b杯子的水就不見了。

3. 本例使用 power函式,要記得引用數學函式( uses Math )。

閏年 閏年的判斷 1. 西元的閏年為每 400 年必須有 97次閏年 ,其規劃方式如下:

(1) 4 的倍數。依此條件共有 100 次。(2) 於 (1) 的條件 ,扣掉 100 的倍數。依此條件 ,共有 96次。(3) 於 (2) 的條件 ,再加回 400 的倍數。所以共有 97次。

2. 測試資料如下:西元年分 性質 流程路線

3 平年 (1)

4 閏年 (2)

100 平年 (3)

200 平年 (3)

300 平年 (3)

400 閏年 (4)

600 平年 (3)

1200 閏年 (4)

2000 閏年 (4)

範例 4-4d 閏年的判斷。

習題 1.試寫一程式由使用者輸入一數值,並由電腦判斷其

為奇數或偶數 2. 假設所得稅稅率法則如下:

1. 淨所得 30萬以下 6%。2. 淨所得 30 ~ 80萬之間 13%。(前面的 30萬仍扣

6%,超過 30萬的部分稅率為 13%,不是全部都扣 13%)

3. 淨所得 80 ~ 200萬之間 21%。4. 淨所得超過 200萬 30%。試寫一程式可以輸入淨所得,並計算應繳稅額。例如淨所得若為 40萬,則其納稅金額計算如下:

30×6% + 10×13% = 21000(超過 30萬的部份稅率為 13%,不是全部 40萬都是 13%)

3. 寫一程式輸入 x 值,並印出其所對應的值,其函數對應如下: x+3 x>3 x2 1<=x<=3

y=f(x)= x 0<x<1 0 x<=0

4. 某一貨品定價 100元,若購買 500 件(含)以上打7折,若購買 499 ~ 300 件則打 8折,若購買 299 ~100 件則打 9 件,購買 100 件以下則不打折,試寫一程式可以輸入購買件數而得總價。