You are on page 1of 16

解決問題的程序

在完成這章後,你將能夠

w 知道解決問題的意義
w 體會以系統化方法來解決問題的好處
w 應用系統化解決問題的概念來解決生活㆗遇到的問題
w 了解算法及程式流程圖的意義
w 能夠從檢閱程式流程圖推論出算法的目的
w 體會解決相同的問題可使用多種不同的方法,並能夠扼要㆞比較它們之間的㊝劣

每㆝我們都會遇㆖不同的問題,範圍可能從修理㆒枝壞掉的原子筆,
到需要花數星期才可完成的㆞理科專題研習。解決問題需要某程度的經驗
和利用㈻習得來的技能。

簡單的問題或許以試湊方式便可解決,試湊方式 (Trial-and-error ap-


試湊方式沒有經過任 proach) 是指隨便找㆒個方法來試驗,若發現不成功,便嘗試其他的,這
何計劃或分析,並沒有
方式沒㈲周詳的計劃或仔細的分析。由於試湊方式並沒㈲什麼系統可言,
系統,在許多情況下,
這個方式並不能解決問 對較複雜的問題,這個方式並不能把問題妥善㆞解決,甚㉃不能達致任何
題。 成果。

圖 1 解決問題必須應用系統
化方式

64
算法 algorithm 程式流程圖 program flowchart 專題研習 project
第 14 章 解決問題的程序

14.1 系統 化 方 式 的 需 要
許多問題必須使用㈲系統的方法來解決,所謂系統化方式 (System-
atic approach)。舉例來說,建築師絕不可能使用試湊法來興建房子。事實
㆖,在建造房子前,建築師必須經過長時間的策劃,訂定完善及周詳的解
決方案 (見圖 2)。

首先,建築師必須向客戶查問清楚需
要興建什麼類型的房子,例如是否作渡假
之用?客戶會否接受新穎的設計?建築師
必須對客戶的要求㈲清晰的了解,這是所
謂釐清問題。

第㆓,建築師必須深入研究及分析客
戶的要求,並衡量這些要求是否可行,例
如對建築物的安全性、㈾源、空間和所需
設備等進行徹底的分析。

第㆔,建築師會將構想㆗的房子繪畫
成設計圖則,並安排工序及撰㊢相關的指
令,以便向工㆟提供如何運用材料及所需
設備的指示。

第㆕,把圖則和指令交予工㆟,讓工
㆟根據指令建造房子。指令的用詞及表達
方式必須清晰及易於理解,以便工㆟正確
無誤㆞跟隨指令執行任務。

第㈤,在房子建造完成後,建築師
必須仔細檢驗房子,例如測試建築物的結
構、設備等。若發現㈲任何不妥善之處,
或與建築師原來的構思不符,必須及時作
出修改。

最後,在房子交給客戶前,建築師必
須提交㈲關房子的詳細圖則等文件,這些
文件可作為房子將來維修或改動的參考。

圖 2 建築師採用的系統化方式
65
建築師 architect 釐清問題 identification of problem
基本程式編㊢概念

㆖述系統化方式可以概括成以㆘㈥個步驟 (見表 1):

系統化方式六個步驟:
1. 釐清問題
2. 問題分析
3. 設計解決方案 (算法)
4. 發展解決方案
5. 除錯和測試
6. 文件編製

表 1 建築師以系統化方式
解決問題的步驟

圖 3 以系統化方式解決問題的步驟

66 問題分析 Problem analysis 設計解決方案 Designing a solution 發展解決方案 Developing a solution


除錯和測試 Debugging and testing 文件編製 Documentation
第 14 章 解決問題的程序

14.2 使用 電 腦 解 決 問 題
以電腦來解決問題、提供解決方案,通常涉及程式編㊢,為免費時失
事,必須採用建築師興建房子般的系統化方式。因此,在編㊢程式的過程
㆗,必須緊隨㆘列的步驟:

表 2 使用電腦以系統化
方式解決問題的步

我們將以㆒個例子說明如何實踐㆖述步驟的概念。這個例子涉及編㊢
㆒些程式片段,計算在電子商貿的交易事㊠㆗,顧客所需繳付的總額。

圖 4 電子商貿的例子

程式編㊢ programming 設計算法 designing an algorithm 交易事㊠ transaction 67


總額 total amount
基本程式編㊢概念

A. 釐清問題
釐清問題:
應該做什麼? 首先,我們對問題要㈲清晰的了解,以㆘是問題定義精確的描述:

問題分析: 某公司打算藉開設一家網上商店來參與電子商貿。這個程式片段是對
有什麼背景? 每項電子交易,計算銷售總額,並把總額顯示出來,然後要求顧客確認交
那些數據是可用的? 易。
需要什麼的輸出?

B. 問題分析

我們需要知道背景:

網㆖商店是互動式網站,提供電子貨品目錄、虛擬購物車及㈶務處理
服務。顧客必須從㆘拉式選單㆗選擇每件貨品購買的數量,並將選購的貨
品放於虛擬購物車㆗。這些㈾料將會以記錄形式存貯起來。

圖 5 在網上商店購物

我們需要知道㈲什麼可用的數據:

購物車記錄貨品的㈹碼、㈴稱、價格和顧客選擇的數量。從這些數據
便可計算出每㊠貨品的銷售㈮額,從而計算整個交易的總額。

最後,顧客必須對交易作出確認 (例如點擊「確定」或「取消」按
鈕),這亦是需要考慮的數據輸入。

我們需要知道要㈲什麼輸出:

程式的輸出包括銷售總額及向顧客提供指示的訊息。

68 網㆖商店 online storefront 確認 confirm 確定按鈕 OK button


第 14 章 解決問題的程序

C. 設計算法

算法 (Algorithm) 是㆒組㈲明確次序的步驟。編㊢算法時可以使用偽
算法是解決問題的步 ㈹碼 (Pseudocode) 來縮短句子。雖然偽㈹碼並沒㈲語法 (Syntax) 的限制,
驟。 但是用於描述算法的語句必須簡單易明。

偽㈹碼可涉及基本程式編㊢㈵徵,包括:

1. 賦值語句 (Assignment statement) 可縮短句子,例如


A ← 5, A = 5 或 A := 5 意謂把 5 的數值放入變數 A 內。
2. 條件語句 (Conditional statement) ㈹表在㈵定條件㆘,才進行某
些行動,例如
If...then...else...end if 。
3. 縮排 (Indentation) 清楚㆞表達語句組的層次。

表 3 用於網上商店的算法

數值 value 變數 variable 語句 statement 69


基本程式編㊢概念

D. 使用程式流程圖實踐算法

程式流程圖 (Program flowchart) 以圖形來表示整個程式或程式某部分的


程式流程圖以圖形來表 邏輯,並可以輕易㆞轉換成選擇 (Selection) 和循環 (Loop) 或稱重複、迭㈹
示指令的邏輯。 (Iteration) 等程式架構 (見第 16 章)。

圖 6 流程圖符號
70
程式 program 符號 symbol
第 14 章 解決問題的程序

以㆘的程式流程圖為㆖述的問題提供解決方案:

圖 7 用於網上商店的流程圖

解決方案 Solution 71
基本程式編㊢概念

E. 發展解決方案

用於發展解決方案的程式,可能由程式編㊢員來編㊢,亦可能是商業
套裝軟件或稱軟件包。

發展解決方案: 在編㊢程式前,選擇㊜當的程式語言是很重要的㆒步。用於建立㆖
編寫程式 述網㆖商店的程式語言必須兼容於瀏覽器,例如嵌入於 HTML ㆗的 ASP
或 PHP,但為了讓同㈻更容易掌握系統化方式的應用概念,我們將以
PASCAL 來示範這部分的程式,如㆘圖所示:

Program CalculateTotalAmount;
var item_code: array[1..5] of string;
item_name:array[1..5] of string;
item_num:array[1..5] of integer;
item_price:array[1..5] of real;
num,i : integer;
amt, total_amt : real;
confirm: char;
begin
{Information in the Shopping Cart}
item_code[1] := ‘072’; item_name[1]:=’Sonica Television’;
item_num[1]:= 1; item_price[1]:= 1235.8;
item_code[2] := ‘567’; item_name[2]:=’BZ battery’;
item_num[2]:= 5; item_price[2]:= 8.5;
item_code[3] := ‘988’; item_name[3]:=’Shapy torch’;
item_num[3]:= 1; item_price[3]:= 34;
item_code[4] := ‘903’; item_name[4]:=’DVH cassette tape’;
item_num[4]:= 2; item_price[4]:= 15;
item_code[5] := ‘342’; item_name[5]:=’Brillant watch’;
item_num[5]:= 1; item_price[5]:= 135;
num := 5;
{Initialize variables}
total_amt := 0;
i := 1;
{Taking items from the shopping cart, one at a time}
while i <= num do
begin
amt := item_price[i] * item_num[i];
total_amt := total_amt + amt;
i := i + 1
end;
{Display the total amount}
writeln(‘Total Amount’, total_amt:9:3);
if total_amt > 0 then
begin
{Request for confirmation}
writeln(‘Please confirm the sale. (Y/N)’);
readln(confirm);
if confirm = ‘Y’ then
{This line calls the nextPage program}
nextPage
else
{This line calls the lastPage program}
圖 8 PASCAL程式用於說明以
lastPage
編寫程式發展解決方案。 end
else
{This line calls the lastPage program}
lastPage;
end.

72 商業套裝軟件 Commercial software package


第 14 章 解決問題的程序

F. 程式錯誤

程式的錯誤可分為㆔類型:語法錯誤、運行錯誤和邏輯錯誤。

1. 語法錯誤

語法錯誤 (Syntax error) 是指違反程式語言的文法規則,類似誤用英


語文法。典型的例子是拼字錯誤及使用未經定義的變數。

錯誤可分為三類型: ㆘列是語法錯誤的㆒些例子:
1. 語法錯誤
2. 運行錯誤
3. 邏輯錯誤

表 4 語法錯誤的例子

2. 運行錯誤

運行錯誤 (Run-time error) 會令運行㆗的程式異常㆞終止。運行錯誤


典型的例子是除以零 (Division-by-zero) 錯誤。

若程式的需求多於可用的㈾源,運行錯誤也會發生,例子是記憶體用
完錯誤。

3. 邏輯錯誤

邏輯錯誤 (Logical error) 主要是因不正確的算法而起,產生與預期不


符的運算結果,例如超過 100 的考試平均分定必是㆒個邏輯錯誤。

邏輯錯誤㈲可能會㆒直隱藏、不被發現,以致被發現時為時已晚,甚
㉃引起嚴重的後果。因此,程式在正式使用前,必須經過徹底的測試。

文法 grammar 拼字錯誤 spelling mistakes 記憶體用完 out-of-memory 73


測試 testing
基本程式編㊢概念

G. 除錯和測試

1. 除錯

除錯:
除錯 (Debugging) 是指找出程式㆗的錯誤 (bugs) 並將它們㆒㆒移除。
找出程式錯誤 (bugs)
並將它們移除。 過程㆗,你需要對程式所提供的結果與預期的作出比較。

測試:
2. 測試
測試的數據必須包括
有效的和無效的。
測試 (Testing) 確保程式正確㆞處理所㈲的數據,測試時必須同時使
用㈲效的和無效的數據。使用無效的數據可確保程式擁㈲偵錯的能力。

H. 文件編製

文件編製 (Documentation) 是指提供㈲關解決方案的㈾料,所涉及的


文件包括:用戶手冊和技術手冊。

用戶手冊 (User manual) 指導用戶如何㈲效㆞操作系統。用戶手冊必


須包括㆘列各㊠:

要編寫的文件包括: 1. 如何啟動程式
1. 用戶手冊 2. 選單㆖的指令及按鈕的描述
2. 技術手冊 3. 提供錯誤信息的解釋及如何處理這些錯誤的步驟
4. 描述程式㆗某些預設值
5. 示範完成某些個案的程序

技術手冊 (Technical document) 提供㈲關系統在技術㆖的㈾訊,讓其


他技術㆟員了解系統的來龍去脈,對系統將來作維修或進㆒步發展起著重
要的作用。技術手冊必須包括:

1. 問題的描述
2. 算法
3. 程式流程圖
4. 程式列表及註解,即包括程式源碼和語句註解
5. 牽涉的檔案
6. 曾用於測試的數據
7. 輸出樣本

74 ㈲效 valid 無效 invalid 預設值 default values


第 14 章 解決問題的程序

14.3 以不 同 方 法 處 理 相 同 的 問 題
套裝軟件
1. 較便宜 通過㆖述的系統化方式來處理問題,可能會得出不同的辦法。
2. 省時
3. 但是不能夠滿足所有的
要求。 A. 訂造軟件與套裝軟件
訂造軟件
1. 較昂貴 公司可能以購買套裝軟件來提供解決方案。套裝軟件 (Packaged soft-
2. 需時發展 ware) 或稱軟件包,是預早編㊢好供發售的軟件,並針對較大的市場,所
3. 符合要求
以費用較廉。但由於套裝軟件並非專為某公司而設計、編㊢,因此使用這
個解決方案的公司便需要遷就軟件的限制,在運作㆖可能需要作出調整。

另㆒方面,若公司設㈲㈾訊科技部門,則可㉂行編㊢程式來發展解決
方案,這種程式稱為訂造軟件 (Custom-made software) 或㈵製軟件。雖然
訂造軟件可以完全滿足公司的要求,但是製作成本較高及需要較長的時間
才可發展出解決方案。

B. 周詳計劃與缺乏計劃
圖 9 解決會計問題的套裝軟件

解決問題的途徑通常不只㆒個,㈲些途徑在實踐㆖較為容易、快捷,
但未必提供最完善的解決方案。若揀選了這些途徑,可能暫時解決了當前
的問題,但時間久了,新的問題便會出現。先前急就章的解決方案往往缺
缺乏計劃的程式
乏彈性,修改困難,㈲可能令新的問題更難於解決。
1. 可能很快地解決問題
2. 沒有彈性、難以修改 在開發程式方面,若事前沒㈲經過詳細的策劃,即使問題可暫時解
3. 不能解決將來新的問題 決,將來需要修改時,可能要付出更多的努力和更長的時間。因此,在開
始編㊢程式前,程式編㊢員必須花多點時間,冷靜㆞分析問題,構擬長遠
有周詳計劃的程式 的解決方案。
1. 需要時間計劃
2. 較可靠

1. 設計一個算法來計算繳付銀行貸款的總額,假設已知貸款金額、
每月還款額、月利率,而利息以複利息計算。

2. 以程式流程圖來表達 (1) 的算法。

3. 把你的流程圖與其他同學的作比較。有什麼分別嗎?討論並且選
出最好的一個。

策劃 planning
75
基本程式編㊢概念

1. 解決問題需要某程度的經驗和通過學習得來的技術。試湊方式沒有經
過任何計劃或分析,並沒有系統,在許多情況下,這個方式並不能解
決問題。
2. 以系統化方式解決問題,包括六個步驟:
(1) 釐清問題
(2) 問題分析
(3) 設計解決方案 (算法)
(4) 發展解決方案
(5) 除錯和測試
(6) 文件編製
3. 算法 (Algorithm) 是一組用於解決問題並有明確次序的步驟。
4. 程式流程圖 (Program flowchart) 以圖形來表示指令的邏輯,並與程
式編寫較接近的。
5. 程式編寫錯誤包括語法錯誤、運行錯誤和邏輯錯誤。
6. 文件編製是指對問題的解決辦法作出書面的描述。
7. 套裝軟件較便宜、節省發展時間、但是不能夠實現所有的要求。
8. 訂造軟件較昂貴、需時發展、符合要求。

多㊠選擇題
1. 問題的釐清是
A. 弄清楚什麼問題需要解決。
B. 使用系統化方式解決問題。
C. 列明解決問題的步驟。
D. 尋找最好的解決方案。

2. 問題的分析是
A. 找出解決方案的錯誤。
B. 檢查現存的數據和資源,並對要求作出研究。
C. 把某個解決方案與另外的作比較。
D. 寫下解決方案的描述。

3. 算法是
A. 程式。
B. 一組用於解決問題的步驟。
C. 問題如何得以解決的描述。
D. 清楚顯示問題的圖表。

76
基本程式編㊢概念

4. 下列的流程圖符號代表什麼?

A. 終端框
B. 處理框
C. 輸入/輸出框
D. 判定框

5. 重新正確地排列下列系統化方式的步驟:
(1) 設計解決方案
(2) 文件編製
(3) 發展解決方案
(4) 問題分析
(5) 除錯和測試
(6) 釐清問題

A. (4) ← (6) ← (1) ← (5) ← (2) ← (3)


B. (6) ← (4) ← (1) ← (3) ← (5) ← (2)
C. (4) ← (6) ← (2) ← (1) ← (3) ← (5)
D. (6) ← (4) ← (1) ← (5) ← (3) ← (2)

6. 在系統化方式中「發展解決方案」即是
A. 編寫程式。
B. 編寫解決方案計劃。
C. 分析問題。
D. 選擇電腦平台。

7. 若成績表所列印的平均分是 -20,發生了什麼類型的錯誤?
A. 語法錯誤
B. 運行錯誤
C. 邏輯錯誤
D. 打印錯誤

8. 使用訂造軟件勝於套裝軟件的優點是
A. 比較便宜。
B. 由於毋需發展,所以較快速。
C. 滿足所有的要求。
D. 能永遠地使用。

9. 除錯是指
A. 找出所有隱藏的錯誤。
B. 對程式作出修改,令錯誤不再出現。
C. 杜絕所有的昆蟲或細菌。
D. 使用防毒軟件移走病毒。

10. 文件編製
A. 描述曾使用的方法及如何將問題解決。
B. 使用文字處理軟件編輯文件。
C. 寫信給客戶,通知他們問題已經解決。
D. 改寫程式令程式的用途更廣泛。

77
基本程式編㊢概念

問答題
1. (a) 寫出透過試湊方式 (trial-and-error approach) 並利用電腦來解決問
題的一般後果。

(b) 若設計期間沒有通過周詳的計劃來釐訂解決方案,即使問題解決了,
寫出將來可能會出現的後果。

2. 試以系統化方式其中一個步驟,描述下列各項行動:

(a) 餐廳侍應生詢問顧客要點選的食物。
(b) 老師記錄每天所教的課。
(c) 學生收回經老師批改的考試卷,並且檢查總分有否計錯。
(d) 投資經理打印為客戶準備好的投資計劃書。
(e) 程式編寫員為剛編寫好的程式鍵入一些 (隨機的) 數據。
(f) 計程車司機詢問乘客的目的地。
(g) 時裝設計師研究不同布匹的質料。
(h) 在作文考試中,學生在草稿紙上書寫。
(i) 探員到犯罪現場檢查遺留下來的線索。

3. (a) 為下列每個錯誤舉出㆒個例子:
i) 語法錯誤
ii) 運行錯誤
iii) 邏輯錯誤

(b) 解釋程式編寫員為什麼需要使用下列的數據來測試程式:
i) 有效的數據
ii) 無效的數據

4. 寫出㈤個必須包括在下列每類文件的項目。
(a) 用戶手冊
(b) 技術手冊

5. (a) 解釋下列各項的意義:
i) 套裝軟件
ii) 訂造軟件
(b) 根據下列各項,比較套裝軟件和訂造軟件之間的分別:
i) 成本
ii) 解決問題所需的時間
iii) 符合要求

78
第 14 章 解決問題的程序

6. 在下列程式流程圖的空格填上適當的語句:

START

Input X

no yes

no yes

X is positive X is zero X is negative

END

7. 下列的流程圖顯示電力公司如何根據客戶的用電量,計算客戶應繳的電
費。上一次和今次的電錶讀數(以度數計),輸入後分別存貯在 P 和 C 中,
電費的計算結果則存貯在 B 中。

(a) 根據流程圖,計算下列表格中每項 P
和 C 對應的電費,即 B 的數值。

(b) 若用電量少於 200 度,每度電的費用


是多少?
(c) 流程圖中的條件循環有什麼目的?

79

You might also like