電腦與問題解決 5-1 電腦解題概論 5-2 電腦解題程序 5-3 演算法概論.

Slides:



Advertisements
Similar presentations
迪士尼公主裙衫变化记. 《白雪公主和七个小孩人》 《白雪公主和七个小矮人》,是世界电影史上第一部长动 画片,也是迪士尼的第一部。《白雪公主》不仅为迪斯尼 带来了第一尊奥斯卡小人,更是拯救迪斯尼于水火的贵 人 —— 在经济大萧条的 1937 年的美国,《白雪公主》为迪 斯尼赚到了 850 万美元,这约等于现在的数亿美元!
Advertisements

index 目次 ( 請按一下滑鼠,解答就會出現喔 !) 接續下頁解答 3-1 極限的概念.
[ Java 程序设计 教程 ] 阎菲 陈利 向郑涛 陈宇峰 中国水利水电出版社.  Java 语言是对软件开发技术有深 远影响、应用前景广泛、具有丰富 的类库、继承了 C++ 传统(摈弃了 某些不足)广泛使用的网络编程语 言。 Java 语言的特性使它可以最大 限度地利用网络。  本章介绍面向对象的基本概念:对.
案例 某日,小强的妈妈带着 7 岁的小强去医院。妈妈说老 师多次反映小强容易发脾气,注意力难以集中、学习 成绩不好。妈妈说他从小就好动,容易分神。她同时 说最近小强经常感到肚子痛和便秘。她曾经买药给他 吃,但没有效果。 小强和姐姐、妈妈住在郊区外公外婆家。他爸爸是公 司司机。妈妈和外公都在一家蓄电池厂工作,小强和.
基本概論 Basic concepts.
軟體工程 -物件導向程式設計與UML系統分析實作
第一章 認識程式語言.
Introduction 基本概念 授課老師:蕭志明
第一章 資料結構導論 1-1 資料結構簡介 1-2 認識程式設計 1-3 演算法效能分析 1-4 物件導向程式設計與Java.
第7章 樹與二元樹 (Trees and Binary Trees)
動畫與遊戲設計 Data structure and artificial intelligent
中央预算单位公务卡 产品介绍.
班級:行流四甲 組員:497D0004何筱瑩 497D0016鄧宜欣 497D0044呂亭儀 497D0056黃 琪 497D0063賴依淩
課程名稱:程式設計 授課老師:________
第6章 软件编码 6.1 程序设计语言 6.2 编码风格及软件效率 6.3 程序复杂度的概念及度量方法 6.4 小结.
网络信息资源的开发与设计 主讲教师 罗双兰 广西师范大学教育科学学院.
1.1 数据库技术概述 1.2 三种主要的数据模型 1.3 SQL 语言简介 1.4 SQL Server 2000 基础
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
第一章 軟體工程 (Software Engineering Introduction)
珍惜时间 提高效率 初二1班
计算机导论 ——软件部分 巢爱棠 办公室:1208.
猜 谜 说个宝,道个宝,说它宝贵到处有, 看不见,摸不着,不香不臭没味道,   万物生存离不了,在你身边看不见, 越往高处它越少。(打一自然物)
第1章 程式語言與Visual Basic的基礎
Chap4 Tree.
安裝JDK 安裝Eclipse Eclipse 中文化
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
計算方法設計與分析 Design and Analysis of Algorithms 唐傳義
1-1 電腦的起源 1-2 電腦的演進 1-3 電腦的種類 1-4 電腦與生活
佇列與推疊 (Queue and Stack)
資料結構簡介.
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
Chap 3 堆疊與佇列 Stack and Queue.
指令集架構 計算機也跟人類一樣,需要提供一套完整的語言讓人們跟它充分溝通,以完成正確的計算工作。
CHAPTER 6 認識MapReduce.
第十五章 Linked List, Stack and Queue
第一章 C語言概論 本章投影片僅供本書上課教師使用,非經同意請勿拷貝或轉載.
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
第十一章 Heap 結構.
演算法與資料結構 製作單位: 高雄市立高雄中學.
CHAP13 演算法概論 高中資訊科技概論 松崗圖書公司.
資料庫管理(Access 2003) 第五章 利用查詢來 統計與分析資料 許欽嘉 老師.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
邏輯設計 Logic Design 顧叔財, Room 9703, (037)381864,
Data Structure.
電腦及網路概論 電腦功能 資訊系統 資料通信 電腦網路 硬體設備 系統軟體.
資料結構 第4章 堆疊.
樹 2 Michael Tsai 2013/3/26.
第 1 章 Java 簡介.
感謝同學們在加分題建議. 我會好好研讀+反省~
B+ Tree.
資料結構 Data Structures Fall 2006, 95學年第一學期 Instructor : 陳宗正.
Answering aggregation question over knowledge base
程序基础 2019/4/25.
Linked Lists Prof. Michael Tsai 2013/3/12.
第7章 樹與二元樹(Trees and Binary Trees)
本讲内容 SQL 概述 SQL 的查询功能 SQL 的操作功能 SQL 的定义功能.
Chap2 Stack & Queue.
程式語言 程式語言發展史 資料型態 程式指令 程序定義和使用.
資料結構使用Java 第9章 樹(Tree).
計算機概論 跨越講義 第4章 基本視窗程式應用 4-1 程式語言簡介 4-2 結構化VS物件導向程式設計
導 論 教學投影片.
資料結構簡介 綠園.
编译原理实践 1.课程说明及引论.
编译原理 第一章 引 论 南京大学计算机科学与技术系 戴新宇.
程式語言簡介 2019/7/17 明乘中學編製.
计算机问题求解 – 论题 基本的数据结构 2018年05月09日.
面向对象程序设计 C++教程 西安工业大学 于帆.
Data Structure.
JAVA 程式設計與資料結構 第十七章 Tree.
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

電腦與問題解決 5-1 電腦解題概論 5-2 電腦解題程序 5-3 演算法概論

5-1 電腦解題概論 雖然電腦不像人類一樣聰明,不會自主思考解決問 題,但如果我們能以電腦處理問題的方式給予正確 的指令,那電腦就能按照我們的指示處理問題。

5-1.1 問題解決的概念 垂直與水平的邏輯思考 人類思考問題的方式可分為垂直 思考(vertical thinking)與水平思 考(lateral thinking) 兩種。 垂直思考又稱為邏輯思考 (logical thinking),強調按部 就班、循序漸進的流程,則思 考流圖5-1.1。

5-1.1 問題解決的概念 水平思考又稱為發散式思考 (divergent thinking),水平思考 屬於跳躍性思考,思考方向會從 問題的本身四處發散,想法間不 一定會彼此相關聯,也不會有所 謂對與錯的答案。以圖5-1.2。 對電腦而言,垂直式的思考方 式比較容易直接轉化成實際的 解題程式。 水平思考有突破僵直有限的思考模式,找到新解題 方向的特性。

5-1.1 問題解決的概念 垂直思考會依循著上一步的結論繼續延伸,步驟與 步驟間也都有邏輯的相關,但假如其中有任何一個 環節錯誤,就可能導向錯誤的結果,甚至是無法繼 續運作的狀況。 水平思考則是不遵循按部就班的思考規則,跳脫出 原有的思考角度來解決問題,甚至是重新組合問題 ,因此通常會出現較新穎的觀點。

5-1.1 問題解決的概念

5-1.1 問題解決的概念 循序漸進的流程 首先會先思考該以什麼樣的方式解決問題,並規劃 問題解決的流程,但要一邊設計解決步驟還要一邊 考慮各種可能性實在很困難。 因此我們可以先將大項目的動作按步驟列出,有了 雛形之後,接著可以再逐步分解成細項。

5-1.1 問題解決的概念 以「計算全班期中考的數學平均分數」範例作說明 5-1.1 問題解決的概念 以「計算全班期中考的數學平均分數」範例作說明 初步提出問題的解決流程後,接著可以嘗試將流程 再細分,例如圖5-1.3 的「計算全班的數學平均分數 」步驟,我們還可以再分解成幾個動作執行,如圖 5-1.4 所示。

5-1.1 問題解決的概念 舉一個生活中的解題範例做說明,當我們操作自動 櫃員機進行提款時,自動櫃員機系統會以什麼樣的 步驟處理提款要求?依照循序漸進的概念,我們可 以先初步地將處理步驟規劃成圖5-1.5 狀況。

5-1.1 問題解決的概念 圖5-1.6 是理想的提款處理步驟,但實際電腦處理的 流程沒有那麼簡單,並不是使用者輸入任何數字及 金額就可以順利領到錢,對自動櫃員機來說,它必 須確定 輸入的密碼是否正確? 提款的金額是否有超過當日提取上限? 或者提款金額是否比戶頭內的存款金額高? 因此我們可以再延續著圖5-1.5 的規劃,再細分成圖5- 1.6 的狀況。

5-1.1 問題解決的概念

5-1.2 電腦解決問題 電腦解題的限制 純機率問題 經濟與投資問題 5-1.2 電腦解決問題 電腦解題的限制 純機率問題 電腦可以做到設計亂數選號,或是從過去開獎紀錄統 計出各個號碼出現的次數,讓投注者做為選號的參考 ,但無法保證電腦所選擇的號碼就一定會中樂透。 經濟與投資問題 在投資理財方面,電腦可以根據來自各方的大量數據 如利率、匯率、匯兌、稅賦等數據,從過去的模式推 演未來的趨勢,讓投資人可以做為「參考」。

5-1.2 電腦解決問題 法律問題 法官在審判案件時,不會完全依照法條照本宣科地審 理案件,而是依據實際狀況及情節決定結果。 因為法律過程牽涉到邏輯與思辯,若是利用電腦來協 助審理,頂多只是查詢過去的判例,列出觸犯的法條 ,但無法代替法官進行判決。 從以上例子可以總結,只要牽涉到人心理層面,或 是不曉得影響的變數有那些,電腦無法掌握的問題 ,電腦只能提供參考,對解決問題不一定有幫助。

5-1.2 電腦解決問題 電腦解題在各領域的應用 日常生活中常能看見電腦代替人類處理各式各樣的 問題,例如: 高鐵購票系統 員工排班規劃 5-1.2 電腦解決問題 電腦解題在各領域的應用 日常生活中常能看見電腦代替人類處理各式各樣的 問題,例如: 高鐵購票系統 員工排班規劃 升學志願分發 ATM 自動櫃員機 投幣式販賣機 網路搜尋引擎

5-1.2 電腦解決問題 雖然電腦本身不具有思考能力,卻因為人類依據電 腦能懂的邏輯給予指令,讓電腦依照程式忠實地執 行,進而解決問題。 5-1.2 電腦解決問題 雖然電腦本身不具有思考能力,卻因為人類依據電 腦能懂的邏輯給予指令,讓電腦依照程式忠實地執 行,進而解決問題。 在網路上的應用-搜尋引擎 現今網路資訊發達,找尋資料是不容易的,在這些網 頁中聯繫的橋樑是一個連結一個的超連結,而搜尋引 擎就是利用這個機制而發展出來的。 搜尋引擎利用特殊程式來蒐集資料,這些特殊程式有 多種稱呼,例如爬行器(crawler)、蜘蛛(spider)、機器 人(robot) 等,

5-1.2 電腦解決問題 搜尋網頁間的關鍵字,自動地蒐集相關的網頁並紀錄 下來,因為網頁數量龐大,通常機器人全數瀏覽一次 需要約一個月的時間。 有規則次序的排列整理並建立索引(index),當使用者 鍵入關鍵字後, 搜尋引擎會先檢查索引資料庫並一一 比對在極短的速度裡列出有關聯性(relevance) 的網頁 連結。

5-1.2 電腦解決問題 在氣象上的應用-颱風路徑預報 為了有效掌握颱風動態,氣象人員會利用電腦來預測 颱風未來的路徑。 5-1.2 電腦解決問題 在氣象上的應用-颱風路徑預報 為了有效掌握颱風動態,氣象人員會利用電腦來預測 颱風未來的路徑。 電腦可以用來模擬複雜的天氣系統,只要輸入利用儀 器觀測到的各種資料,像是氣溫、濕度、風向和風速 、氣壓等等數據,經過電腦進行複雜的運算,模擬颱 風未來一週可能的路徑。

5-1.2 電腦解決問題 在醫學上的應用-醫療診斷專家系統 5-1.2 電腦解決問題 在醫學上的應用-醫療診斷專家系統 在醫學領域裏,電腦也扮演了重要的角色,不僅僅是 門診預約掛號系統,電腦也開始能「看病」。 「電腦醫生」是依靠著一個大型資料庫來運作,當醫 師在看診時,會依照一固定格式將病例輸入至電腦裡 儲存(包含有診斷方式、治療方式、治療結果等), 資料庫會累積龐大的診斷參考資料。

5-1.2 電腦解決問題 當下次醫生在診斷新病人時,將病例資料輸入資料庫 內,並藉著電腦程式的分析比對,就能找出所有相似 的病歷及病徵以作為治療的參考(圖5-1.9)。

5-1.2 電腦解決問題 在交通上的應用-火車訂票系統 5-1.2 電腦解決問題 在交通上的應用-火車訂票系統 透過資訊系統管理火車訂票作業(圖5-1.10),利用 資料庫記錄各種會影響火車剩餘座位的資訊(例如列 車車次、預約訂票人數)。 更新資料庫中的各個列車的 剩餘座位資料,如此就能減 少車票超賣,或是造成過多 座位閒置的問題發生。

5-2 電腦解題程序 電腦沒辦法像人類一樣自主思考,而無法理解語意 模糊、沒有明確指示的命令。 5-2 電腦解題程序 電腦沒辦法像人類一樣自主思考,而無法理解語意 模糊、沒有明確指示的命令。 若能依照電腦的運作方式循序思考, 先確立問題解決的目標,依照問題分 析→解題方法設計→測試與修正的流 程(如圖5-2.1),以電腦可以處理 的程序來設計解決方法。

5-2.1 問題分析 在進行問題分析的過程中,可先從以下重點著手: 了解問題 第一步要做的是要讓問題明確化,了解 問題要達成的目標是什麼? 5-2.1 問題分析 在進行問題分析的過程中,可先從以下重點著手: 了解問題 第一步要做的是要讓問題明確化,了解 問題要達成的目標是什麼? 已知的資料、狀況和條件是什麼? 有哪些資源可以使用? 問題的限制範圍為何? 將問題描述清楚,才不會搞錯問題的方向,得到錯誤的結果。

5-2.1 問題分析 例如我們遇到一個問題:「從學生的期中考的成績 ,比較各科加總的分數,計算班上第一名的各科成 績總平均」,像這樣的問題,可以用以下的條列式 做法,將問題的條件一一釐清: 問 題 目 標: 班上第一名的各科成績總平均。 問 題 範 圍: 班上的期中考成績。 已 知 條 件: 計算學生的各科總平均,是將該名學生各科的分數加 總,除以科目數。

5-2.1 問題分析 輸入內容 不明確條件: 各科包含哪些科目? 在輸入資料時,我們必須注意以下幾個問題: 5-2.1 問題分析 第一名是班上期中考各科分數加總最高分的同學。 不明確條件: 各科包含哪些科目? 輸入內容 在輸入資料時,我們必須注意以下幾個問題: 輸入的方式 例如用鍵盤輸入用滑鼠點取選單項目或條碼掃描等 方式 輸入資料的型態 決定輸入的資料必須以什麼樣的型態儲存

5-2.1 問題分析 輸入資料的長度 限制資料長度的目的,可避免使用者輸入過長的資 料,否則使用者沒有節制輸入超過原本規定的資料 量,會造成資料處理或儲存上的負擔。 輸入不合法資料的處理方式 如果使用者輸入了不合法的資料(例如要求輸入數 字,使用者卻輸入英文),電腦就必須針對這樣的 情況進行處理(例如顯示提示訊息,請使用者重新 輸入)。

5-2.1 問題分析 輸出結果 輸出結果指的是「問題要求產生什麼樣的結果」。 5-2.1 問題分析 輸出結果 輸出結果指的是「問題要求產生什麼樣的結果」。 在設計問題的解決程序,除了找出問題要求的輸出結 果,還要考慮以下事項: 輸出的方式 決定輸出的結果要用什麼樣的方式呈現,呈現的方 式可以選擇以螢幕畫面顯示、聲音播放、紙張列印 等,只要符合問題的要求即可。

5-2.1 問題分析 輸出的格式 輸出格式可以幫助人們在閱讀資訊時,能夠以有條 理、有效率的方式順利解讀資訊。 5-2.1 問題分析 輸出的格式 輸出格式可以幫助人們在閱讀資訊時,能夠以有條 理、有效率的方式順利解讀資訊。 例如圖5-2.3 列印學生的成績單

5-2.1 問題分析 輸入與輸出的對應關係 邊界條件 在進行問題分析時,要特別注意輸入的內容與最後的 輸出結果是否存在對應關係? 5-2.1 問題分析 輸入與輸出的對應關係 在進行問題分析時,要特別注意輸入的內容與最後的 輸出結果是否存在對應關係? 輸入與輸出的對應關係,關係到我們設計的解決方法 是否值得讓人信賴。 邊界條件 確定邊界條件的目的是為了定義解決問題的「範圍」 ,像是問題有那些限制條件、輸入/輸出的範圍、可 以使用哪些資源等條件。

5-2.1 問題分析 例如有個問題要求「找出所有的質數」,如圖5-2.4 如果沒有明確界定質數的範圍,質數可以是1到無窮 大的天文數字,即使電腦試圖找出所有質數的可能數 值,也不知要運算到何時才能結束問題? 如果把問題改成「找出1 到100所有的質數」,在解答 問題時就有個明確的範圍。

5-2.2 解題方法與設計 搜尋解決方法的相關資源 頭苦思如何去設計方法,而是先去搜尋解決方法的 相關資源。 5-2.2 解題方法與設計 搜尋解決方法的相關資源 頭苦思如何去設計方法,而是先去搜尋解決方法的 相關資源。 想一想是否以前曾經遇過類似的問題,有現成的做法 可拿來套用? 或是其他人有提出可靠的方法,是否能夠將他人的構 想運用在目前的問題上?

5-2.2 解題方法與設計 將問題分解成可解決的小問題 5-2.2 解題方法與設計 將問題分解成可解決的小問題 當我們搜集了解決問題的相關資源, 就可以開始著 手設計問題的解決方法,如果不曉得該從何處著手 ,可以採用分割擊破法(divide and conquer)。 將問題分解成多個能被我們處理的子問題,之後每 個子問題再列出可行的解決方案(見圖5-2.5)。

5-2.2 解題方法與設計

5-2.2 解題方法與設計 以規劃線上考試系統為例,將問題分成幾個層面來 討論,並列出相關的解決方案。 5-2.2 解題方法與設計 以規劃線上考試系統為例,將問題分成幾個層面來 討論,並列出相關的解決方案。 以樹狀圖的方式進行整理,如圖5-2.6 所示,就可以 將複雜的問題進行分解,變成簡單、容易處理的項 目。

5-2.2 解題方法與設計 設計執行流程 設計執行流程的目的,就是規劃要達成一項功能, 需要執行哪些步驟,將這些步驟按照順序組合起來 ,就可以形成流程。 例如以前面的線上考試系統為例,我們想要實作列 印成績單的功能,如圖5-2.7。 我們可以利用一些工具,例如虛擬碼、流程圖 ,清楚的表達執行流程。

5-2.2 解題方法與設計

5-2.3 測試與修正 設計好的解題方法必須進行測試,找出是否有潛在 的問題,再針對有問題的地方進行修正,使解題方 法能變得更加完善。 5-2.3 測試與修正 設計好的解題方法必須進行測試,找出是否有潛在 的問題,再針對有問題的地方進行修正,使解題方 法能變得更加完善。 測試資料的設計 測試程式是否運作正常,你可以設計兩種類型的資料 來測試程式,一種是正常值的測試資料,目的是測試 程式是否能處理符合原本功能要求的資料。

5-2.3 測試與修正 例如有一個程式只要輸入的數值是質數,就會顯示「 是質數」的訊息,如圖5-2.8 輸入正常值(也就是2、 3、5、7 等質數)進行測試程式是否能正常且正確地 運作。

5-2.3 測試與修正 除了正常值以外,另一種是異常值的測試資料,目的 是測試程式是否會因為異常的輸入資料,導致程式出 現錯誤的結果或程式執行失敗。 以前面測試質數程式的例子來說,用異常值資料測試 就是輸入偶數、中英文、空白⋯之類的資料(如圖5- 2.9),測試程式是否會出現問題。

5-2.3 測試與修正 錯誤的偵測方式 程式在執行時,若無法依照我們預計的要求產生正確 的執行結果,這樣的情況便稱為程式錯誤(bug),表5- 2.1 列出一般常見程式錯誤的類型。

5-2.3 測試與修正 在程式的執行過程中難免會出現錯誤,如果想要找出 程式出錯的地方加以修正,好讓程式執行可以產生正 確的結果,通常可以利用下列幾種方式偵錯: 逐行偵錯 分段偵錯 監看特定內容 如果知道程式執行時,某些內容(例如計算找零金 額,)會影響最後的輸出結果,只要監控特定內容 的變化(監看購買數量的數值),就可以找出程式 出錯的地方。

5-3 演算法概論 要電腦執行一項特定的工作,也要告訴它「該如何 去做」! 5-3 演算法概論 要電腦執行一項特定的工作,也要告訴它「該如何 去做」! 演算法的功用,就是告訴電腦完成這項工作要執行 哪些步驟,當電腦遇到同樣的工作,就可以照這些 步驟就可以將工作做好。

5-3.1 演算法的特性 由於電腦只能依照「程式」指示逐步完成指定的工 作,因此在設計程式時,必須先將問題分解成許多 小步驟,然後再依一定的次序逐步執行,而這個描 述問題解決程序的方法便稱做演算法(algorithm)。 在此引用Horowitz、Sahni 和Dinesh 在《 Fundamental of Data Structures in C++ 》一書 對「演算法」的定義:為解決某一問題或完成特定 工作,一系列有次序且明確的指令集合。

5-3.1 演算法的特性 所有演算法都會包含以下特性: 輸入(input) 輸出(output) 明確性(definiteness) 5-3.1 演算法的特性 所有演算法都會包含以下特性: 輸入(input) 演算法在運算前通常會有一些事先給定的輸入資料。 輸出(output) 演算法的目的就是產生結果,至少要有一項的輸出結果。 明確性(definiteness) 每個執行步驟都必須明確而清楚,不可存在模稜兩可的情 況。

5-3.1 演算法的特性 有限性(finiteness) 有效性(effectiveness) 5-3.1 演算法的特性 有限性(finiteness) 在任何情況下演算法一定要在有限的步驟內完成,不 能無限期執行。 有效性(effectiveness) 演算法所描述的執行過程可以用人工的方式(例如用 紙、筆),在一定時間內推算出相同的結果。

5-3.2 演算法的表示方法 演算法的基本元件 輸入 輸出 演算法可以允許輸入多個資料, 甚至也可以不用輸入 資料就能進行運算。 5-3.2 演算法的表示方法 演算法的基本元件 輸入 演算法可以允許輸入多個資料, 甚至也可以不用輸入 資料就能進行運算。 輸出 演算法的目的是為了解決問題,因此最少要產生一個 輸出結果(例如數值、文字、聲音、影像⋯)

5-3.2 演算法的表示方法 處理程序 處理程序是產生輸出結果的一連串動作流程。 5-3.2 演算法的表示方法 處理程序 處理程序是產生輸出結果的一連串動作流程。 例如我們要完成「購物」這個動作,就要如圖5-3.1 所示,執行一連串的動作才能完成。

5-3.2 演算法的表示方法 條件判斷 例如以前面的購物動作為例,我們可以在第二步加入 條件判斷的動作(如圖5-3.2)。

5-3.2 演算法的表示方法 演算法基本元件組合 演算法是由輸入、輸出、處理程序與條件判斷這幾 個基元件所組成的,因此只要將這些元件組合起來 ,就可以利用來解決問題。 例如我們設計一個計算學生英文成績總平均的演算 法(如圖5-3.3)

5-3.2 演算法的表示方法 當我們想將演算法的運作流程傳達給其他人了解, 可透過虛擬碼( pseudocode ) 或流程圖(flowchart) 來描述演算法的運作。 虛擬碼 虛擬碼(pseudocode) 是一種介於一般語言與程式語言 之間的語言碼, 用一種類似程式碼的文字敘述方式( 中文、英文不拘) 表達程式的邏輯架構與執行程序。

5-3.2 演算法的表示方法 流程圖 隨著問題的複雜性逐漸增加,若用文字方式來說明會變 得冗長,這時便可利用流程圖(flowchart) 增加演算法 的說明性。 流程圖是由美國國家標準協會(American National Standards Institute,ANSI) 所制定,藉由各種特定圖 形符號來表示的演算法。

5-3.2 演算法的表示方法 下表5-3.1 是流程圖的常用符號。

5-3.2 演算法的表示方法

5-3.2 演算法的表示方法 比起文字敘述,使用流程圖描述演算法有以下的好處: 5-3.2 演算法的表示方法 比起文字敘述,使用流程圖描述演算法有以下的好處: 對於複雜的演算法結構, 流程圖比虛擬碼更能瞭解整個 流程,方便進行除錯。 修改方便, 可隨時加入或刪減流程圖的圖形符號。 可增加演算法的可讀性。 移交程式給他人進行維護, 附上流程圖可幫助對方暸解 整個程式的處理流程和細部結構。

5-3.3 結構化程式設計 如果程式沒有一定架構, 完全隨著自己的喜好撰寫 程式, 當程式碼變得很龐大時,就會看起來雜亂無 章,讓維護程式碼的人很難進行維護。 荷蘭的數學家戴克斯特拉(Edsger W. Dijkstra) 提出 結構化程式設計(structured programming) 的概念 ,強調程式要簡單明瞭,我們必須遵循以下原則: 採用由上而下的方式將程式分解成多個模組,每個 模組分別負責一件獨立的工作。 每個模組只能有一個入口以及一個出口。 每個模組可以由循序、選擇、重複結構構成。

5-3.3 結構化程式設計 由上至下的設計方式 由上而下的設計方式是一種將問題分解成多個能被 處理的子問題,並透過解決這些子問題來解決整個 問題的方法。 例如圖5-3.6 設計文書編輯軟體:

5-3.3 結構化程式設計 模組 模組是一個日常生活中常見的概念,舉例來說,電 腦就是模組的實例,它是由主機、鍵盤、滑鼠、螢 幕、喇叭所組成。 在開發程式時,使用模組的方式就是將程式分成多 個模組。

5-3.3 結構化程式設計 像圖5-3.8 組合模型機器人一樣,每個模組只負責一 件工作,一旦某個模組出現問題,我們可以停止這 個模式的運作,或是換成其他程式模組來取代,就 不會因某個小問題出現,使整個系統無法運作。

5-3.3 結構化程式設計 循序、選擇與重複結構 戴克斯特拉(Edsger W. Dijkstra) 認為, 每個程式都可應用循序結構、選擇結構 與重複結構組合而成。 這三種結構又稱為程式的基本結構: 循序結構 是指從上而下, 依序執行的結構。 舉例來說,將領取消費券的流程 以循序結構來表示,做成循序結構 的模組如圖5-3.9 所示。

5-3.3 結構化程式設計 選擇結構 測試某一條件並按其結果來改變執行路徑的結構,例如 以選擇結構表示外面是否下雨,再決定接下來要做什麼 事?(如圖5-3.10所示)。

5-3.3 結構化程式設計 重複結構 測試某一條件是否成立以決定是否重複執行某一段程式 ,以數學考試為例(如圖5-3.11 所示)。

5-3.4 資料結構與演算法 PASCAL語言之父威爾斯教授(Prof. Niklaus. Wirth) ,在它的著作《Algorithms+Data Structures= Programs》提到「程式=演算法+資料結構」的概 念。 什麼是變數 在介紹資料結構之前,首先介紹什麼是變數(variable) ?變數是構成程式的重要元素之一。

5-3.4 資料結構與演算法 它可以暫存我們輸入的資料,還可以隨時修改內容。 為什麼要有「變數」這樣的設計?我們可以把變數想 像成用來放置各種物品的「箱子」,如圖5-3.12 所示

5-3.4 資料結構與演算法 變數的資料型態 我們可以把變數想像成搬家時用來裝東西的「箱子」, 如果都使用同一種尺寸的箱子,就會發生下列狀況: 一旦箱子太大,東西會裝不滿,箱子一多就容易佔空間 如果箱子太小,會有很多東西放不進箱子(圖5-3.13)

5-3.4 資料結構與演算法 因此,並不是每一種類型的資料,都可用同一種「箱 子」來存放,必須根據資料類型的不同而有所變化。 5-3.4 資料結構與演算法 因此,並不是每一種類型的資料,都可用同一種「箱 子」來存放,必須根據資料類型的不同而有所變化。 程式語言常用的資料型態有整數(包含長整數)、浮 點數(可分為單精度和倍精度浮點數)、字串、布林 、日期等型態,下表5-3.2 以 Visual Basic 為例介紹變 數的資料型態。

5-3.4 資料結構與演算法

5-3.4 資料結構與演算法 資料結構的類型 資料結構是讓資料存取更有效率的方法。 在程式中適當應用資料結構,會有以下好處: 5-3.4 資料結構與演算法 資料結構的類型 資料結構是讓資料存取更有效率的方法。 在程式中適當應用資料結構,會有以下好處: 可讓演算法的設計變得簡單易懂,使程式更容易維護。 可減少大量程式碼的撰寫,提升程式的執行效率。 可減少記憶體空間的浪費,讓電腦不會耗用太多的系統 資源。

5-3.4 資料結構與演算法 以下列舉幾種常見的資料結構類型, 例如陣列、堆疊 、佇列、樹狀結構等,相關的說明如下: 陣列 5-3.4 資料結構與演算法 以下列舉幾種常見的資料結構類型, 例如陣列、堆疊 、佇列、樹狀結構等,相關的說明如下: 陣列 陣列(array) 是最常見、使用率最高的資料結構,它 是由多個元素組成的集合,要存取陣列中的每個元 素要指定該元素的索引值(index value) 來存取。 我們可以把陣列想像成一個放很多張學生成績單大 抽屜,例如 圖5-3.14。

5-3.4 資料結構與演算法 一般常用的陣列有一維陣列(one -dimension array) 和二維陣列( two dimension array) 兩種類 型,如圖5-3.15

5-3.4 資料結構與演算法 堆疊 堆疊(stack) 是一個串列,它的兩端分別稱為頂端 (top) 和底端(bottom),資料的推入(push) 和彈出 (pop) 都在頂端(top) 執行,採用後進先出(last in/ first out,LIFO) 的處理方式。 就是最後進來的資料優先處理。(如圖5-3.16)。

5-3.4 資料結構與演算法 由於堆疊的特性是後進先出,因此電腦上的副程式 呼叫(subroutine call)就利用這個特性管理副程式 的執行。 佇列 佇列 (queue) 和堆疊的性質相近,只是佇列加入資 料的方式,就像排隊一樣。 佇列資料是固定由尾端(tail,或稱末端rear)加入 ,讀取資料時則固定由頭端(head,或稱前端 front)開始,最先進來的資料優先處理,屬於先進 先出 ( first in /first out,FIFO ) 的處理方式。

5-3.4 資料結構與演算法 樹狀結構 樹狀結構( tree ) 是一種階層式的資料表示方式, 是指一個元素可以像樹枝般分成多個元素的結構。 樹狀結構如圖5 - 3 . 1 8。

5-3.4 資料結構與演算法 最上層是由根( root ) 為起點, 向下可分成數個節點(node), 5-3.4 資料結構與演算法 最上層是由根( root ) 為起點, 向下可分成數個節點(node), 節點和節點之間連起來的線條稱為分支(branch)。 若以節點的上下關係來看,位於上層的結點稱為父 節點(parent),位於下層節點稱為子節點(child), 位於最下層沒有分支出子節點的節點稱為葉節點 (leaf)。

5-3.4 資料結構與演算法 樹狀結構適合用來表現具有次序性、階層性、從屬 性的資料,因此像是族譜、組織圖、電腦的檔案目 錄結構,都很適合用樹狀結構來表示(如圖5-3.19 所示)。

5-3.4 資料結構與演算法 資料結構與演算法結合 在演算法中使用資料結構,究竟有什麼好處?

5-3.5 演算法與程式語言 程式語言(programming language) 是指使用者用 來與電腦溝通之文字記號所形成的集合,也就是電 腦能夠接受的語言。 程式語言的種類繁多,且各有其特定的文法(或稱 語法)結構與適用範圍。透過各種程式翻譯器,不 同的程式語言最終都會被翻譯為相同形式。

5-3.5 演算法與程式語言 程式語言可分為低階語言、高階語言兩種,以下將 分別簡單介紹。 低階語言 5-3.5 演算法與程式語言 程式語言可分為低階語言、高階語言兩種,以下將 分別簡單介紹。 低階語言 低階語言(low-level language) 指的是會隨著使用的 CPU 架構不同而有顯著的差異的語言,包括機器語言 與組合語言。 優點是執行速度快,不過編寫程式較困難且程式碼不 易理解。

5-3.5 演算法與程式語言 第一代語言:機器語言 第二代語言:組合語言 5-3.5 演算法與程式語言 第一代語言:機器語言 機器語言(machine language) 以二進位代碼表示指令 (例如「0000」表示載入,「0001」表示儲存)。 對人類而言不易閱讀及使用,但卻是電腦所能處理最直 接的語言。 第二代語言:組合語言 第二代語言:組合語言由於機器語言對程式設計師來說 並不方便,因此後來設計出一種使用英文簡寫來代表各 種基本運算的語言。

5-3.5 演算法與程式語言 這些以英文簡寫所構成的語言叫做組合語言(assembly language)。組合語言必須先被翻譯成機器語言後才能 被電腦接受,擔任這個翻譯工作的程式叫做組譯器 (assembler),如圖5-3.20。

5-3.5 演算法與程式語言 高階語言 高階語言(high-level language) 的語法已經接近人類 日常生活用語,簡單易懂,在高階語言中,一個命令 就可以代表數個組合語言中的命令。 第三代語言:程序式語言和物件導向語言 程序式語言(procedural language) 將重心放在解決問 題的程序,設計師必須仔細思考各步驟的細節並進行控 制, 例如FORTRAN、COBOL、BASIC、C、Pascal 等 都是程序式語言的代表例子。

5-3.5 演算法與程式語言 為了讓程式碼可再度使用,不用再重複撰寫同樣的程式 碼,而導致程式開發的效率下降。 5-3.5 演算法與程式語言 為了讓程式碼可再度使用,不用再重複撰寫同樣的程式 碼,而導致程式開發的效率下降。 用物件導向語言開發程式,可以將相關程式碼結合成物 件,要開發程式只要將相關的物件組合起來,可以提升 程式開發的效率,例如C++、Java 等都是物件導向語 言的代表。

常見的第三代語言 雖然程式語言已經發展到第五代,但是第三代語言 (高階語言)的嚴謹架構及富有彈性的設計能力仍使它極 受歡迎與重視,簡單介紹常見者如下表5-a。

常見的第三代語言

常見的第三代語言 另外,隨著時空背景不同,許多人開始學習運用簡 單的語法與邏輯概念來控制或增強應用軟體的功能,網際 網路的風行也帶動標記和文稿語言的發展,如表5-b。

5-3.5 演算法與程式語言 第四代語言:目的導向語言 5-3.5 演算法與程式語言 第四代語言:目的導向語言 第四代語言(fourth generation language,簡稱 4GL )是使用者導向的語言。 它和程序式程式語言最大的不同,在於它是以程式的 「目的」為設計重心而非如第三代語言以「過程」為 法則。 因此「要做什麼?」比「如何做?」更重要,程式設 計師只需寫出「要做什麼?」,無需瞭解電腦是如何 去執行的,例如:

5-3.5 演算法與程式語言 4GL 比第三代語言缺少了控制性及設計彈性,執行速 度也比較慢,然而其易學易用的特性畢竟非第三代語 言所能比擬,因此至今在資料庫處理的領域裡,4GL 仍然保有一片天空。 例如結構化查詢語言(structured query language, SQL) 就是典型的代表實例。

5-3.5 演算法與程式語言 第五代語言:人工智慧語言 5-3.5 演算法與程式語言 第五代語言:人工智慧語言 第五代程式語言的發展目標為利用人工智慧技術,使 其接近人類使用的自然語言(如英語),在撰寫程式 控制電腦處理工作,就有如我們在和電腦對談一般, 例如: 現今開發的產品則多是以LISP或Prolog 語言為基礎, 專為特定領域設計的知識庫系統(如醫療、財經),或 是智慧型的資料庫存取工具。

高階語言的翻譯程式 電腦不能直接接受以高階語言所寫成的程式,必須 先轉換成機器語言後才能執行,而依轉換工具不同可分為 直譯器及編譯器二種,如下表5-c。

高階語言的翻譯程式