課程名稱:計算機概論 授課老師:李春雄 博士 第 四 章 程式語言 課程名稱:計算機概論 授課老師:李春雄 博士
本章學習目標 1.讓讀者了解程式語言及程式設計的流程。 2.讓讀者了解一個好程式需要滿足條件、結構化 程式設計的技巧及副程式的撰寫方法。
本章內容 4-1 認識程式語言 4-2 程式設計的流程 4-3 一個好程式需要滿足條件 4-4 結構化程式設計 4-5 副程式
4-1 認識程式語言 【引言】 我們都知道,人與人之間的溝通必須要使用共通的語言(例如:國語、閩南語、英語…等),而人想要與電腦溝通,也一樣要使用電腦看得懂的語言。 【定義】是指電腦看得懂的語言就稱為「程式語言」。 【例如】VB,C語言,Java等。 【程式語言與軟體之間的關係】「程式語言」只是「軟體」的子集合。 【示意圖】
【實例一】 假設現在有兩位同學,分別是「張三」與「李四」要溝通時,則必須要使用共通的語言(例如:國語、閩南語、英語…等)。 【圖解】
【實例二】 假設「張三」同學想要與「電腦」溝通時,則必須要使用電腦看得懂的語言,即所謂的電腦程式語言(例如:VB,C語言,Java等)。 【圖解】
4-1.1 何謂軟體(software) 【定義】軟體就是程式,它是由一連串的指令所組成。 【功能】達成某一特定的目的。 【例如】「成績處理軟體」就是為了達成「處理成績」的目的。 【重要性】 在電腦系統中,如果只有硬體而沒有軟體,則電腦被視為一堆廢鐵。因此,軟體與硬體缺一不可。 【示意圖】
【分類】 一、系統軟體:是指用來控制電腦系統以及維持電腦正常運作的軟體等。 二、應用軟體:是指專門處理使用者的資料及工作需求的軟體。
4-1.2 程式語言的分類 【分類】一般而言,程式語言可分為兩大類: 1.低階語言:機械語言與組合語言。 4-1.2 程式語言的分類 【分類】一般而言,程式語言可分為兩大類: 1.低階語言:機械語言與組合語言。 2.高階語言:程序導向語言、非程序導向語言及自然語言。 【程式語言分類架構圖】
【高階語言與機械語言之間的關係】 由於「電腦」只看懂「機械語言」,因此,我們利用「高階語言」在撰寫程式之後,電腦並無法直接的執行,必須要透過「語言翻譯程式」來轉換成電腦可以接受的「機械語言」。 【圖解】 翻譯程式 撰寫「高階語言」 「電腦」只看懂「機械語言」
4-1.3 程式的編譯過程 【引言】 由於,我們利用「高階語言」所撰寫的「原始程式」電腦無法直接執行,因此,必須要經過一連串的編譯過程,並且不同的「程式語言」有不同的「翻譯程式」。 【情況一】 假設有某一「程式設計師」,使用「高階語言BASIC」來撰寫程式時,則只要再透過「直譯程式」的編譯之後,就可以馬上被電腦來執行。 【圖解說明】
【情況二】 假設有某一「程式設計師」,使用「高階語言C語言」來撰寫程式時,則必須先透過「編譯程式」的編譯來產生「目的程式」,接下來,透過「連結程式」將「目的程式」、「副程式」及「函式庫」連結起來,再透過「可執行模組」之後,最後,再經過「載入程式」一次載入到電腦的主記憶體中執行。 【圖解說明】
【情況三】 假設有某一「程式設計師」,使用「組合語言Assembler」來撰寫程式時,則必須先透過「組譯程式」的編譯來產生「目的程式」,接下來,透過「連結程式」將「目的程式」、「副程式」及「函式庫」連結起來,再透過「可執行模組」之後,最後,再經過「載入程式」一次載入到電腦的主記憶體中執行。 【圖解說明】
【重要觀念】 一、直譯程式又稱為直譯法,也就是「直譯程式」的翻譯方式。 【作法】 類似演講者每講完一句話之後,翻譯員「立即」翻譯給聽眾瞭解。 二、編譯程式 又稱為全譯法,也就是「編譯程式」的翻譯方式。 類似演講者將全部演講稿講完之後,翻譯員「事後一次」翻譯全部的內容給聽眾瞭解。
4-1.4 程式語言的演進 基本上,程式語言的演進過程,可分為五個階段: 第一代語言---機器語言 第二代語言---組合語言 第三代語言---程序導向語言 第四代語言---非程序導向語言 第五代語言---自然語言 【示意圖】
一、第一代語言---機器語言(Machine languages) 【定義】可以直接被電腦執行的機器碼,稱為「機器語言」。 【組成】電腦內部是由 0與1資料所組成。 【圖解說明】 【優點】1. 不需翻譯就可以直接執行。 2. 執行速度最快。 【缺點】 1.不同的處理機(CPU),使用不同的機器語言,所以可攜性較差。 2.只有兩種狀態0與1。因此,不僅難學、難懂、也不容易維護。
二、第二代語言---組合語言(Assembly languages) 【定義】是指一種介於「高階語言」與「機器語言」之間的語言。 【組譯器】 組合語言程式碼必須要透過「組譯程式」翻譯成「機器語言」才能夠被執行,因此,該「組譯程式」稱之「組譯器」(Assembler)。 【圖解說明】 【優點】比「機器語言」更容易學習。 【缺點】1.可攜性較差。 2.撰寫及維護較難。
三、 第三代語言---程序導向語言 (Procedure-Oriented Language) 【定義】類似自然語言,可以方便讓使用者撰寫程式。 【編譯程式】 1.C語言的編譯器 2. BASIC的直譯器 【圖解說明】 【優點】 1.較「組合語言」更容易閱讀與學習。 2.較具有結構性。 【缺點】執行效率較「組合語言」差。
四、第四代語言---非程序導向語言 (NonProcedure-Oriented Language ) 【定義】 只要告訴電腦”要做什麼(What to do)”,不必告訴它”如何做(How to do)”。 【圖解說明】 【優點】 1.部份的程式碼會自動產生。 2.可以大大的縮減專案開發的時間。 3.程式在維護上也更有效率。 【種類】 1.結構化查詢語言(SQL):Access與SQL Server等資料庫管理系統。 2.物件導向語言(OOP):VB.NET,C#,ASP.NET等程式語言。
五、第五代語言---自然語言(Natural languages) 【定義】是指利用最接近人類所使用的語言來指揮電腦完成工作。 【優點】任何人都可以輕鬆指揮電腦。 【缺點】在研發過程中,文法和語意上較為複雜。 【應用領域】目前只用在人工智慧研究之一。
程式語言的演進過程 第一代 機器語言 由0與1所構成,電腦能直接執行的程式語言 第二代 組合語言 利用助憶碼取代數字碼,亦稱符號語言 第三代 組合語言 利用助憶碼取代數字碼,亦稱符號語言 第三代 中階語言 即C語言,具有高階語言的可攜性與低階語言的執行效率。 程序導向語言 高階語言以1954年IBM的FORTRAN語言開始,其後有COBOL,BASIC,RPG等皆是。例如:BASIC、Pascal 第四代 非程序導向語言 結構化查詢語言:SQL 物件導向語言:VB.NET,VC#,JAVA... 第五代 自然語言 應用在人工智慧AI與所衍生的專家系統ES等特殊領域
4-1.5 高階語言的種類 【引言】 由於「低階語言」在學習上較為困難,因此,一般的學習者都是利用「高階語言」來開發系統。 4-1.5 高階語言的種類 【引言】 由於「低階語言」在學習上較為困難,因此,一般的學習者都是利用「高階語言」來開發系統。 【種類】依發展的年代說明: 1.FORTRAN 語言(科學與工程應用) 2.COBOL 語言(商業語言) 3.BASIC 語言(初學者) 4.PASCAL 語言(最具結構化) 5.C 語言(兼具結構化、執行速度快、可攜性高) 6.C++(物件導向) 7.JAVA(物件導向+跨平台) ……
4.1.6 為什麼要學程式語言呢? 【目的】可以快速解決「複雜的問題」。 【概念圖】
【例子1】 小華說:嗨!小明,請你幫我計算1加到10的總和。 小明說:1加到10,太簡單了,大家都會! 在這個例子中,或許你會認為這簡單的問題,你我都會算,何必寫程式呢? 【示意圖】
【例子2】 小華又說:那小明請你再幫我計算1加到50000。 此時小明說:這太困難了,我無法馬上計算出結果。 【示意圖】 【解決方法】「撰寫程式」來計算。 因此,我們可以從以上兩個例子中,清楚得知,「程式語言」是用來幫忙人類「解決複雜的問題」。
4-2 程式設計的流程 【引言】 基本上,我們在開發一個「資訊系統」時,並非直接撰寫程式,而是必須要先經過一連串的步驟,而「撰寫程式」其實只是其中一個步驟。因此,我們要開始程式設計時,一定要進行下面五個步驟。 【圖解】
4-3 一個好程式需要滿足條件 基本上,一個好程式需要滿足的條件有以下三點: 1.正確性 2.效率性 3.可維護性 【示意圖】
4-3.1 正確性(Correctness) 【定義】正確性是一個好程式最基本的要求。 【示意圖】
【例如】 設計一個判斷某一數值是否為「偶數」的程式 說明:上面的程式處理過程中,由於程式不正確,所以產生錯誤的結果。
4-3.2 效率性(Performance) 【引言】 當我們撰寫一個可以正確地執行程式之後,接下來,就是要再考慮到 程式的執行效率,也就是程式真正執行時所必須要花費的時間。 【定義】是指程式真正執行時所必須要花費的時間。 【示意圖】
【一般評估執行時間的方法】 是依程式碼所被執行的「總次數」來計算。亦即所謂的「頻率次數」,當「頻率次數愈高」時,代表所需的「執行時間愈長」。 【例如】請計算下列程式中變數Count被執行的次數為何? 說明: (1)在上圖Ⅰ中,Count=Count+1;敘述被執行1次。 (2)在上圖Ⅱ中,Count=Count+1;敘述被執行n次。 (3)在上圖Ⅲ中,Count=Count+1;敘述被執行n2次。 若n=10時,則敘述Count=Count+1;之執行次數分別是: 1,10,100之級數增加。
4-3.3 可維護性(Maintainable) 【引言】 一個好的程式,除了要具有「正確性」及「效率性」之外,也必須要考慮程式的「可維護性」,也就是程式的可讀性及擴充性。 【定義】 是指在撰寫完成一套程式之後,它是可以很容易的讓自己或他人修改。 【示意圖】
【三種技巧】 要如何讓程式具有可維護性呢?那就必須在撰寫程式時,使用以下三種: 第一種技巧:縮排 第二種技巧:加入「註解」 第三種技巧: 有意義的變數命名
一、縮排技巧 【定義】是指依照不同的程式區塊或功能來排版。 【目的】1.了解整個程式碼的邏輯性 2.了解區塊群組的概念 【優點】易於閱讀及除錯。 【示意圖】
【比較「縮排」與「未縮排」的情況】 說明:有縮排的程式碼,易於閱讀及除錯。
二、註解技巧 【定義】 它是一種「非執行的敘述」亦即是給人看的,而電腦不會去執行它。 【功能】是用來說明某一段程式碼的作用與目的。 【示意圖】
【註解的方式】 基本上,註解的方式有二種: 1. 使用單引號「 ' 」的使用時機:可以寫在程式碼的後面或單獨一行註解。 2. 使用REM的使用時機:只能寫成單獨一行註解。 例如:設計一個求圓面積與圓周長的程式。
三、有意義的變數命名 【目的】提高程式的可讀性,以利爾後的除錯。 【示意圖】 【方法】 1.變數名稱的命名最好具有意義的,並且與該程式有關係的。 例如:Stu_Name(代表學生姓名),Stu_No(代表學生學號) 2.如果想不出變數名稱的英文字母時,最好在命名時,適時的在變數之後 加以註解。 例如:Dim Start_X AS Integer ' 宣告X的開始座標
4-4 結構化程式設計 【定義】 是指將一個「大系統」分解成許多個具有「獨立功能」的「小模組」,再利用「循序、選擇及迴圈」三種結構來完成每一個模組功能。 【三種結構】
【三種結構之流程圖】 【說明】 1.循序結構(Sequential) 是指程式由上而下,依序逐一執行。例如:X=X+1。 2.選擇結構(Selection) 是指根據「條件式」來選擇不同的執行路徑,例如:IF-THEN-ELSE 指令。 3.重複結構(Repetition) 是指某一段程式反覆執行多次。例如:FOR/NEXT與 DO-WHILE 指令。
【實例】 某一所大專院校的計算機中心,欲開發一套「網路教學」系統,以提供學生加值的服務。其計算機中心首先必須要將該系統細分為:學生介面、老師介面及管理者介面等功能,並且再依照不同的介面細分各種不同的子系統。
4-4.1 流程圖的介紹 【引言】 雖然程式設計時,不一定要畫流程圖,但是當我們遇到比較「複雜的問題」時,如果沒有事先規劃出「解決問題的步驟」,很容易產生錯誤。 【定義】是指利用「圖形化」方式來表示解決問題的步驟。 【示意圖】 【目的】 1.讓程式設計師了解整個程式的流程。 2.有助於程式的撰寫、除錯及維護。
【繪製工具】 1. Microsoft Word文書軟體 2. Microsoft Visio繪圖軟體(最常被使用)
【流程圖常用的符號表】
【流程圖常用的符號表】續…
4-4.2 循序結構(Sequential) 【定義】是指程式由上而下,依序逐一執行。 【示意圖】
【舉例】 假設我們想要撰寫一個程式來計算「國文與英文」兩科的平均成績時,則我們就必須要使用到「循序結構」。 【解答】
4-4.3 選擇結構(Selection) 【引言】 在學會「循序結構」之後,您是否發現程式都是由上而下,逐一執行,但是,如果只希望在某種條件成立時才執行某些敘述。因此,就必須要使用「選擇結構」。 【定義】是指根據「條件式」成立與否,來選擇不同的執行路徑。 【示意圖】
【適用時機】 兩種情況 1. 判斷及格與不及格 2. 判斷奇數與偶數 3. 判斷男生與女生
【流程圖】
【範例】 假設老師想要了解那些同學及格與不及格時,如果只利用循序結構時,則只能顯示全班的平均成績,但無法顯示那些同學及格與不及格。那我們就必須要使用「選擇結構」的方式了。
4-4.4 迴圈結構(Loop) 【引言】 電腦是人類發明的,其目的就是用來協助人類處理重複性的問題,其作法就是使用「迴圈結構」。 【定義】是指讓某一段程式反覆執行多次的敘述。 【分類】計數迴圈與條件式迴圈 【示意圖】
一、計數迴圈 【定義】是指依照某一個固定次數來反覆執行。 【使用時機】事先得知重覆執行次數。 【典型例子1】1+2+3+…+10 【典型例子2】九九乘法表 【示意圖】
【語法】
二、條件式迴圈 【定義】是指符合某一條件式之後才會被反覆執行。 【適用時機】不能預先知道迴圈的次數。 【例如】 王爸爸第一天給小明10元,第二天給20元,第三天給30元,請問小明要儲存到5000元需要多少天?諸如此類的題目,最好使用條件式迴圈來處理比較容易。 【示意圖】
【分類】 1.前測試迴圈(先判斷條件式,再執行迴圈) 2.後測試迴圈(先執行迴圈,再判斷條件式) 【圖解說明】
4-5 副程式 【引言】 當我們在撰寫程式時,都不希望重複撰寫類似的程式。因此,最簡單的作法,就是把某些會「重複的程式」獨立出來,這個獨立出來的程式就稱做副程式(Subroutine)或函數(Function)。 【定義】是指具有獨立功能的程式區塊。 【作法】把一些常用且重複撰寫的程式碼,集中在一個獨立程式中。 【示意圖】
【呼叫過程】 一般而言,「原呼叫的程式」稱之為「主程式」,而「被呼叫的程式」稱之為「副程式」。當主程式在呼叫副程式的時候,會把「實際參數」傳遞給副程式的「形式參數」,而當副程式執行完成之後,又會回到主程式呼叫副程式的「下一行程式」開始執行下去。 【圖解說明】
【優點與缺點】 【優點】 1. 可以使程式更簡化,因為把重覆的程式模組化。 2. 增加程式可讀性。 3. 提高程式維護性。 4. 節省程式所佔用的記憶體空間。 5. 節省重覆撰寫程式的時間。 【缺點】 降低執行效率,因為程式會Call來Call去。
4-5.1 傳值呼叫(Call By Value) 【定義】 是指「主程式」呼叫「副程式」時,「主程式」會將實際參數的「值」傳給「副程式」的形式參數,而不是傳送位址。 【運作原理】 【說明】在副程式中改變了形式參數的值(內容)時,也不會影響到 主程式的實際參數 值(內容)。
【範例】 【執行結果】5 10
4-5.2 傳址呼叫(Call By Address) 【定義】 是指主程式呼叫副程式時,主程式會將實際參數的「位址」傳給副程式的形式參數,使得主程式與副程式共用相同的記憶體位址。 【運作原理】 【說明】 一旦副程式中改變了形式參數的值(內容)時,也將隨之影響到主程式的實際參數值(內容)。因此,在使用傳址呼叫時不能使用常數做為參數。
【語法】 【範例】 【執行結果】15 30