Transcript 第四章程式語言
第四章
程式語言
課程名稱:計算機概論
授課老師:李春雄 博士
本章學習目標
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.低階語言:機械語言與組合語言。
2.高階語言:程序導向語言、非程序導向語言及自然語言。
【程式語言分類架構圖】
自然語言(第5代)
非程序
導向語言(第4代)
LISP,PROLOG
物件導向語言
VB.NET, VC
結構化查詢語言
SQL,Oracle
人
高階語言
程式語言
程序
導向語言(第3代)
BASIC, C, PASCAL
組合語言(第2代)
Assembly
機械語言(第1代)
電腦內部0或1所組成
低階語言
電腦
【高階語言與機械語言之間的關係】
由於「電腦」只看懂「機械語言」,因此,我們利用「高階語言」在撰
寫程式之後,電腦並無法直接的執行,必須要透過「語言翻譯程式」來
轉換成電腦可以接受的「機械語言」。
【圖解】
翻譯程式
撰寫「高階語言」
「電腦」只看懂「機械語言」
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
1.
結構化查詢語言:SQL
2.
物件導向語言:VB.NET,VC#,JAVA...
應用在人工智慧AI與所衍生的專家系統ES等特殊領域
4-1.5 高階語言的種類
【引言】
由於「低階語言」在學習上較為困難,因此,一般的學習者都是利用「高階語言」來開發
系統。
【種類】依發展的年代說明:
1.FORTRAN 語言(科學與工程應用)
2.COBOL 語言(商業語言)
3.BASIC 語言(初學者)
4.PASCAL 語言(最具結構化)
5.C 語言(兼具結構化、執行速度快、可攜性高)
6.C++(物件導向)
7.JAVA(物件導向+跨平台)
……
4.1.6 為什麼要學程式語言呢?
【目的】可以快速解決「複雜的問題」。
【概念圖】
計算1加到50000的總和
結果
甲同學
電腦
【例子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