資電學院 計算機概論 f7810

79
1 資資資資 資資資資資 F7810 資資資 程程程程 資資資資資 資資資資資

Upload: leslie-trevino

Post on 04-Jan-2016

114 views

Category:

Documents


1 download

DESCRIPTION

資電學院 計算機概論 F7810. 第三章 程式語言. 陳邦治編著 旗標出版社. 本章重點. 程式語言是由一組系統化的符號所構成之集合 使用程式語言的目的則是利用這些符號來表達某種機器解決特定問題的步驟 程式語言設計的目標則是為了達到簡潔 (simplicity) 的要求 學習程式語言的主要目的 可增進對程式語言的瞭解 可改進設計程式之架構 增進程式執行之效率 可選擇適用的語言 較易學習與設計新的語言. 程式語言的分類 近代常見程式語言簡介 物件導向程式語言 高階語言處理器 程式語言的資料型態 變數的定義. 繫結 完全計算與捷徑計算 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 資電學院 計算機概論 F7810

1

資電學院計算機概論

F7810

第三章程式語言

陳邦治編著旗標出版社

Page 2: 資電學院 計算機概論 F7810

2

本章重點

程式語言是由一組系統化的符號所構成之集合 使用程式語言的目的則是利用這些符號來表達某種機

器解決特定問題的步驟 程式語言設計的目標則是為了達到簡潔 (simplicity) 的

要求 學習程式語言的主要目的

– 可增進對程式語言的瞭解– 可改進設計程式之架構– 增進程式執行之效率– 可選擇適用的語言– 較易學習與設計新的語言

Page 3: 資電學院 計算機概論 F7810

3

大綱 程式語言的分類 近代常見程式語言簡介

物件導向程式語言 高階語言處理器 程式語言的資料型態 變數的定義

繫結 完全計算與捷徑計算 變數引用規則 程式設計基本觀念 程式設計基本結構 副程式與參數傳遞的處理方式

33

Page 4: 資電學院 計算機概論 F7810

4

程式語言的分類

程式語言依照出現的先後次序共可分成五代– 機器語言 (machine language) – 組合語言 (assembly language) – 高階語言 (high level language) – 極高階語言– 自然語言 (nature language)

Page 5: 資電學院 計算機概論 F7810

5

機器語言

機器語言的指令與資料均由二進碼所組成,因此利用機器語言所寫成的程式段不需經由語言處理器的處理便可直接在機器上執行

機器語言最難學習,不易使用 機器相關性 (machine dependence) 高

Page 6: 資電學院 計算機概論 F7810

6

組合語言

組合語言的指令稱為助憶碼 (mnemonic code) – 機器指令 (machine operation)– 虛擬指令 (pseudo operation)

利用組合語言所寫成的程式段必需經由組譯程式(assembler) 的處理才可在機器上執行

機器語言與組合語言合稱為低階語言 若將組合語言與機器語言做一比較,組合語言的可讀

性較佳,較容易學習,但是程式執行的效率則較差

Page 7: 資電學院 計算機概論 F7810

7

高階語言

高階語言又稱為程序導向語言 (procedure oriented language)

利用高階語言寫成的程式碼必須經過編譯程式(compiler) 或直譯程式 (interpreter) 處理過後方可執行

如 Pascal 、 C 、 C++ 、 Basic , Fortran 與Cobol

Page 8: 資電學院 計算機概論 F7810

8

極高階語言

極高階語言又稱為問題導向語言 (problem oriented language)

如 SQL (structured query language)

Page 9: 資電學院 計算機概論 F7810

9

自然語言

自然語言又稱為知識庫語言 (knowledge based language)

語法十分接近人類日常生活所用的語言,如英文、日文或中文

Page 10: 資電學院 計算機概論 F7810

10

近代程式語言簡介

Fortran Cobol Basic Pascal C/C++ Java Lisp 及 Prolog

Page 11: 資電學院 計算機概論 F7810

11

Fortran

Fortran (FORmula TRANslator language) 是 IBM 的John Backus 在 1950 年代中期所開發

第一個高階語言 主要是針對科學計算而設計 具固定格式 ( 當時 Fortran 規定程式必須從第七行開始

寫起 ) 首創了輸出入格式化 (I/O format) 的觀念 允許「隱含性變數」 (implicit variable) ,如變數的第

一個字元為 I , J , K , L , M , N 時該變數可不經宣告即內定為整數型態

Page 12: 資電學院 計算機概論 F7810

12

Cobol

Cobol ( COmmon Business Oriental Language)發展於 1960 ~ 1970 年代

由美國防部贊助開發完成 主要用於商業資料處理 語法傾向自然語言 首創以雜訊字 (noise word) 觀念來編寫程式碼

Page 13: 資電學院 計算機概論 F7810

13

Basic

Basic 語言( Beginner‘s All-purpose Symbolic Instruction Code )在 1960 年代中期發展

當適合初學者使用的語言 語法結構簡單,操作也相當容易交談式 (interactive) 的語言 利用直譯器 (interpreter) 來處理程式

Page 14: 資電學院 計算機概論 F7810

14

Pascal

1975 年一個以數學家 Blaise Pascal 之名命名的程式語言 Pascal誕生

採區塊結構 (block structure) 來寫作程式 首創集合 (set) 資料型態供程式設計師使用 最大的優勢是具備嚴謹的語法結構,讓使用者不容易犯錯,非常適合教學用途

Page 15: 資電學院 計算機概論 F7810

15

C 語言

C 語言是由貝爾實驗室於 1970 年代所發展出來

採區塊結構,具高可攜性,因此適合發展系統程式

利用 C 語言撰寫的程式相同字元的大小寫 ( 如A 及 a)會被視為是不同的符號

Page 16: 資電學院 計算機概論 F7810

16

C++ 語言

C++ 是 C 語言的物件導向版程式開發工具 C++ 語言是由 Bjarne Stroustrup 在貝爾實驗室中設計而得

C++ 語言設計的主要目標是希望能實現物件導向程式設計的理想

Page 17: 資電學院 計算機概論 F7810

17

Java

Java 語言是由 Sun Microsystems沿襲了 C 語言的語法並加入許多新的程式結構元素發展而成的物件導向程式語言

Java 語言為提昇程式的安全性,取消– 指標 (pointer) 資料型態– 多重繼承 (multiple inheritance)– 運算子覆載 (operator overloading)等功能

Java 語言允許其程式段能夠透過網路系統到另一個機器平台上執行

Page 18: 資電學院 計算機概論 F7810

18

物件導向程式語言

物件導向程式語言 (Object Oriented Programming Language ; OOPL) 是由「抽象資料型態」 (abstract data type) 與「資料抽象化」 (data abstraction) 的觀念發展而來

「抽象資料型態」是指資料型態可區分為實作(implementation)及使用者介面 (user interface)二部分

而「資料抽象化」則是指將資料型態區分為實作與使用者介面的動作即稱為資料抽象化

Page 19: 資電學院 計算機概論 F7810

19

物件導向程式語言三大特徵

資訊隱藏或稱為封裝 (encapsulation)繼承 (inheritance)能力多面性 (polymorphism)

Page 20: 資電學院 計算機概論 F7810

20

封裝

封裝主要的目的就是期望能將不希望給外界知道的資訊,隱藏起來也就是達到「資訊隱藏」(information hidden) 的目的

通常在寫作程式時可以利用將變數宣告為不同等級便可達到「資訊隱藏」的效果

Page 21: 資電學院 計算機概論 F7810

21

繼承

繼承是指程式語言可利用已建立好的類別( class )來產生新的類別,依此方式產生的新類別將可繼承所有原來類別的特性並可依需要新增或刪除特定的功能

「繼承」是類別要完成擴充目的的基本要件 C++ 語言允許 1 對 1 , 1 對多,多對 1 的繼承方式 JAVA 語言僅允許允許 1 對 1 的繼承方式 若程式語言具備「繼承」能力則程式的可重用性將較

高,較易擴充且較易維護

Page 22: 資電學院 計算機概論 F7810

22

多面性

多面性代表具相同名稱的函式,但卻具有不同的功能

如 C++ 語言允許右方程式段之寫法

右方程式段中有四個 print函式,雖然函式的名稱都是print ,但是因為參數的型態不同,因此會被視為是四個不同的函式

Page 23: 資電學院 計算機概論 F7810

23

高階語言的處理器

高階語言的處理器主要的作用即是將利用高階語言寫成的程式段翻譯成機器可處理的碼

主要可分成編譯器 (compiler)及直譯器 (interpreter) 二類

– 編譯器 (也可稱為編譯程式 )會對原始程式碼中的每一條敘述,按照先後順序均做一次之處理,並產生對應的目的碼

– 直譯器 (也可稱為直譯程式 )會對原始程式碼中的敘述,按照執行的先後順序做處理,並直接產生程式執行結果

Page 24: 資電學院 計算機概論 F7810

24

編譯器及直譯器之區別

Page 25: 資電學院 計算機概論 F7810

25

程式語言的資料型態

資料型態是指一群個體 (object) 以及作用在這群個體上的運算

常見的資料型態分類方式是將資料型態分為基本資料型態 (elementary data type)及結構性資料型態 (structured data type) 二種

Page 26: 資電學院 計算機概論 F7810

26

基本資料型態 (1/3)

基本資料型態是指不可再切割為更小單位的型態類別– 如數值、字元 (character) 、布林值 (boolean value)、列舉式資料型態 (enumerated data type)及指標資料型態 (pointer data type)

Page 27: 資電學院 計算機概論 F7810

27

基本資料型態 (2/3)

數值一般可分為整數與浮點數二種 浮點數代表具有小數位數之數值 字元會佔用一個位元組 (byte) 的記憶體空間 布林值有「真」 (true) 與「假」 (false) 二種

– 通常程式語言不允許布林值與數值混合使用– 但 C/C++ 語言卻允許布林值與數值混合使用,在 C/C++ 語言

中只要數值非 0 便會被視為「真」,若數值為 0 則視為是「假」

– BASIC 語言以「 -1 」代表布林值「真」,「假」則為「 0 」。

Page 28: 資電學院 計算機概論 F7810

28

基本資料型態 (3/3)

列舉式資料型態是指將需要的資料一一定義與列舉出來

– 假設旗標公司編輯部有 5位主編,分別是Alice , Bob , Dick , Mark 與 Peter , C 語言將此份資料定義成一列舉式資料型態之語法如下:

enum Editor {Alice, Bob, Dick, Mark, Peter}; 指標可以是記憶體位址或 nil

– 因為指標可以隨意存取記憶體空間中之內容,所以指標型態的彈性很大,但會使得程式的可靠度不佳、存取速度較慢及可能造成懸置引用 (dangling reference) 的問題

– Java 語言並未提供指標型態供程式設計師使用

Page 29: 資電學院 計算機概論 F7810

29

C 語言指標的用法

C 語言使用「 * 」做為指標變數的「取值運算子」,「 & 」做為一般變數的「取址運算子」。– 範例如下: int a , *b;

Page 30: 資電學院 計算機概論 F7810

30

C 語言的指標與陣列型態

C 語言的指標與陣列型態經常會被比較 C 語言的陣列的起始位址有二種不同的表示法,分別

是:– 陣列名稱– 陣列的第一個元素之位址– 範例 int xxx[168];

xxx 為陣列名稱, C 語言陣列元素規定由 0 開始編號,所以本題陣列元素的編號由 0~167 ,共 168 個元素。代表陣列的起始位址的表示法有以下二種: xxx 及 &xxx[0]

Page 31: 資電學院 計算機概論 F7810

31

結構性資料型態

常見的結構性資料型態 – 字串 (string)

由字元 (character) 組成。例如,” book” 、” computer”、” internet” 均為字串

– 記錄 (record)記錄是由固定數目,但型態可以不同的元素所組成

– 聯合 (union) 資料型態同一個變數佔用的記憶體空間,在不同執行時間可由不同型態的值存放

Page 32: 資電學院 計算機概論 F7810

32

結構性資料型態 (cont.)

常見的結構性資料型態– 陣列 (array)

陣列由名稱、維度 (dimension) 、索引 (index)及元素型態陣列等元件組成。陣列的主要有二項限制:

– 元素必須存放在連續的記憶體空間。– 元素的型態必須完全相同

– 集合 (set): 集合可表示沒有順序關係的資料,若程式語言提供集合資料型態則應提供聯集、交集及差集運算。

– 檔案 (file):檔案是由相關的記錄所組成

Page 33: 資電學院 計算機概論 F7810

33

變數的實例

以 C 語言為例 int X = 5;– 變數的「名稱」為 X– 「屬性」為 int ( 即整數 )– 「值」為 5 ( 就 C 語言而言,此處的用法為變數「初值設定

」, C 語言允許在宣告變數時一併設定初值 )– 對程式設計師而言,一般來說「引用」是比較模糊的一種概

念,因為比較沒有具體的東西可代表;就 C 語言而言,變數的儲存區空間的配置有二種可能性:執行前配置或執行時配置。本範例中變數 X 所配置的空間有可能是執行前配置或執行時配置,必須視變數所在程式中的位置才可確定儲存區空間何時配置

Page 34: 資電學院 計算機概論 F7810

34

程式設計基本觀念

流程圖 結構化程式設計 程式語言的運算子

Page 35: 資電學院 計算機概論 F7810

35

流程圖

發展程式時可利用流程圖 (flow chart) 來做為分析的工具

流程圖主要的作用便是將計算方法轉換為圖形化的方式來表達

採用流程圖的主要優點– 可讀性較高– 容易維護– 容易除錯

Page 36: 資電學院 計算機概論 F7810

36

常用流程圖符號

Page 37: 資電學院 計算機概論 F7810

37

判斷課程是否必須重修之過程所對應的流程圖

Page 38: 資電學院 計算機概論 F7810

38

結構化程式設計

結構化程式設計是指從事程式設計的過程中,依照程式的邏輯特性將程式細分成幾個較小的問題,再將這些較小的問題同樣依照程式的邏輯特性再往下細分成更小的問題,依此類推直到很容易編寫程式的單元時為止

當採用結構化程式設計法來設計程式時,應當儘量避免使用 goto命令,以避免破壞程式的可讀性及結構性

Page 39: 資電學院 計算機概論 F7810

39

結構化程式設計 (cont.)

主要優點– 程式可分工完成– 容易除錯– 可讀性較高– 較容易維護

主要缺點– 經由結構化程式設計原則產生的程式碼通常會較大– 程式執行時間較久

Page 40: 資電學院 計算機概論 F7810

40

結構化程式設計 實例 -- 編輯程式 (editor)

Page 41: 資電學院 計算機概論 F7810

41

程式語言的運算子

高階語言常用的運算子 (operator)有三類,分別是算術、關係及邏輯運算子

這三類運算子的關係如下表所示:

Page 42: 資電學院 計算機概論 F7810

42

程式語言的運算子 (cont.)

程式語言對運算子定義運算優先順序的主要目的是希望程式能有唯一的執行結果,若運算子之運算優先順序未定義則可能使得程式執行結果不唯一

Page 43: 資電學院 計算機概論 F7810

43

BASIC 語言運算子執行的優先順序表

Page 44: 資電學院 計算機概論 F7810

44

程式設計的三大結構

結構化程式設計的基本結構有– 循序結構 (sequential structure)– 選擇結構 (selection structure)– 反覆結構 (iteration structure)

Page 45: 資電學院 計算機概論 F7810

45

循序結構

循序執行的程式段即為循序結構

Page 46: 資電學院 計算機概論 F7810

46

重要範例 – 二個變數值交換問題

重要結論:若要將二個變數的值交換,最少應增加一個額外變數

Page 47: 資電學院 計算機概論 F7810

47

選擇結構

選擇結構可分為– 單路選擇結構– 雙路選擇結構– 多重選擇結構

Page 48: 資電學院 計算機概論 F7810

48

單路選擇結構

單路選擇結構 (single path selection structure)– 條件成立時有對應的敘述應被處理,但是當條件不成立時則沒有對應的敘述應被處理,因此稱為單路選擇結構

– 高階程式語言提供的單路選擇結構,語法如下: if (條件 ) then {條件成立時應執行的敘述 }

Page 49: 資電學院 計算機概論 F7810

49

單路選擇結構對應的流程圖

Page 50: 資電學院 計算機概論 F7810

50

雙路選擇結構

雙路選擇結構 (double path selection structure)– 條件成立時有相對應的敘述必須被處理,而且當條件不成立時也有相對應的敘述要處理,因此稱為雙路選擇結構

– 高階程式語言提供的雙路選擇結構,語法如下: if (條件 ) then 「條件成立時應執行的敘述」 else 「條件不成立時應執行的敘述」

Page 51: 資電學院 計算機概論 F7810

51

雙路選擇結構對應的流程圖

Page 52: 資電學院 計算機概論 F7810

52

範例

Page 53: 資電學院 計算機概論 F7810

53

範例

Page 54: 資電學院 計算機概論 F7810

54

範例

Page 55: 資電學院 計算機概論 F7810

55

範例

有一流程圖如下,試寫出對應的 if敘述

答案為 if (C1){ if (C2) S1;} else S2;

Page 56: 資電學院 計算機概論 F7810

56

多重選擇結構

Page 57: 資電學院 計算機概論 F7810

57

C 語言的 switch 敘述

C 語言的 switch 敘述屬於外顯分歧( explicit branch )結構

若要表達相同的語意,「 break 」命令是不應省略

Page 58: 資電學院 計算機概論 F7810

58

C 語言的 switch 範例

Page 59: 資電學院 計算機概論 F7810

59

反覆結構

反覆結構是指重覆執行的敘述群反覆結構分為二類

– 前測迴路 (pre-test loop)– 後測迴路 (post-test loop)

Page 60: 資電學院 計算機概論 F7810

60

前測迴路

前測迴路的運作原則是先判斷執行迴圈敘述的條件是否成立,若「成立」則執行迴圈敘述,若「不成立」則跳離迴圈結構

迴圈執行的最少次數是 0 次迴圈執行的最多次數是無限多次

Page 61: 資電學院 計算機概論 F7810

61

前測迴路流程圖

Page 62: 資電學院 計算機概論 F7810

62

前測迴路種類

常見的前測迴路可分為二類– 「 while-loop 」– 「 for-loop 」

Page 63: 資電學院 計算機概論 F7810

63

C/C++/Java 語言的「 while-loop 」

語法結構如右 若「迴圈敘述」只有一條

,語法結構中的「 { 」及「 } 」 可以省略,否則「 { 」及「 } 」必須被保留下來

以「 while-loop 」設計寫一個程式片段來完成「 s=1+2+…+100 」的工作

Page 64: 資電學院 計算機概論 F7810

64

範例

Page 65: 資電學院 計算機概論 F7810

65

C/C++/Java 語言的「 for-loop 」

語法結構如右

Page 66: 資電學院 計算機概論 F7810

66

範例

Page 67: 資電學院 計算機概論 F7810

67

範例

Page 68: 資電學院 計算機概論 F7810

68

範例

Page 69: 資電學院 計算機概論 F7810

69

範例

Page 70: 資電學院 計算機概論 F7810

70

後測迴路

後測迴路的運作原則是先執行迴圈敘述再判斷繼續執行迴圈敘述的條件是否成立,若「成立」則執行迴圈敘述,若「不成立」則跳離迴圈結構

迴圈執行的最少次數是 1 次迴圈執行的最多次數是無限多次

Page 71: 資電學院 計算機概論 F7810

71

後測迴路的程式流程圖

Page 72: 資電學院 計算機概論 F7810

72

C/C++/Java 語言的後測迴路

語法結構如右 先執行迴圈敘述再檢查 <條件 > , <條件 > 成立時執行迴圈敘述,當 <條件 > 不成立時將離開迴圈結構

Page 73: 資電學院 計算機概論 F7810

73

以 do-while loop 來完成 s=1+2+…+100

此程式段的「條件」為「 i <= 100 」,先執行迴圈敘述「 s=s+i; i=i+1; 」再做條件測試,若條件成立則再執行迴圈敘述「 s=s+i; i=i+1; 」一次,因此在i 的值為 1~100 時迴圈敘述會執行

Page 74: 資電學院 計算機概論 F7810

74

副程式與參數傳遞

撰寫程式時通常會把某些可完成特定功能的敘述集合在一起,此類被集合在一起的程式段被稱為副程式 (subroutine)

副程式可以重複被呼叫

Page 75: 資電學院 計算機概論 F7810

75

副程式的組成

副程式由四項元素組成– 副程式名稱、參數、執行環境及程式段

參數分為實際參數及型式參數二類實際參數 (actual parameter) 是指呼叫敘述中的參數串列

型式參數 (formal parameter) 則是指被呼叫的副程式中的參數串列

Page 76: 資電學院 計算機概論 F7810

76

實例

變數 a 及 b 為型式參數,可在呼叫程式中利用 swap(x, y) 來呼叫副程式

變數 x 及 y 為實際參數

執行的環境為變數a, b 及 t

Page 77: 資電學院 計算機概論 F7810

77

副程式的控制流程轉移

「呼叫程式執行了呼叫副程式的敘述」,這個動作啟動了副程式的執行

當副程式要開始執行時,程式的控制流程(control flow)會由呼叫程式中呼叫副程式的敘述 ( 這個敘述的下一個敘述的位址被稱為被呼叫副程式的返回位址 )轉移到副程式的進入點,隨後開始副程式的執行,當副程式執行結束時,會將程式的控制流程轉移到返回位址處所儲存的敘述,繼續程式執行的動作

Page 78: 資電學院 計算機概論 F7810

78

副程式的控制流程轉移 (cont.)

副程式「被呼叫」、「執行」及「執行結束」時,這三個重要時刻,呼叫程式 (A)及被呼叫副程式 (B)間,控制流程的轉移方式 如右圖

執行順序為:「敘述群 A1 」「呼叫副程式 B 的敘述」「敘述群 B1 」「 expnext 」「敘述群 A2 」其中「 expnext 」代表叫式中呼叫副程式的敘述之下一個敘述,此敘述的位址即為副程式的返回位址

Page 79: 資電學院 計算機概論 F7810

79

副程式 的種類

副程式可分為程序(procedure)及函式(function )二類

程序與函式最大的不同是程序沒有傳回值而函式會有傳回值。不論是程序或函式皆為副程式,因此均會符合副程式的特性

這是一個利用 C 語言的語法及「輾轉相除法」求最大公因數的範例,這個程式段利用了遞迴副程式 (recursive subroutine)觀念