資訊工程研究所申設簡報

Download Report

Transcript 資訊工程研究所申設簡報

資電學院
計算機概論
F7810
第三章
程式語言
陳邦治編著
旗標出版社
1
本章重點




程式語言是由一組系統化的符號所構成之集合
使用程式語言的目的則是利用這些符號來表達某種機
器解決特定問題的步驟
程式語言設計的目標則是為了達到簡潔(simplicity)的
要求
學習程式語言的主要目的
–
–
–
–
–
2
可增進對程式語言的瞭解
可改進設計程式之架構
增進程式執行之效率
可選擇適用的語言
較易學習與設計新的語言
大綱






3
程式語言的分類
近代常見程式語言簡
介
物件導向程式語言
高階語言處理器
程式語言的資料型態
變數的定義






繫結
完全計算與捷徑計算
變數引用規則
程式設計基本觀念
程式設計基本結構
副程式與參數傳遞的
處理方式
程式語言的分類

程式語言依照出現的先後次序共可分成五代
–
–
–
–
–
4
機器語言(machine language)
組合語言(assembly language)
高階語言(high level language)
極高階語言
自然語言(nature language)
機器語言



5
機器語言的指令與資料均由二進碼所組成,因
此利用機器語言所寫成的程式段不需經由語言
處理器的處理便可直接在機器上執行
機器語言最難學習,不易使用
機器相關性(machine dependence)高
組合語言

組合語言的指令稱為助憶碼(mnemonic code)
–
–



6
機器指令(machine operation)
虛擬指令(pseudo operation)
利用組合語言所寫成的程式段必需經由組譯程式
(assembler)的處理才可在機器上執行
機器語言與組合語言合稱為低階語言
若將組合語言與機器語言做一比較,組合語言的可讀
性較佳,較容易學習,但是程式執行的效率則較差
高階語言



7
高階語言又稱為程序導向語言(procedure
oriented language)
利用高階語言寫成的程式碼必須經過編譯程式
(compiler)或直譯程式(interpreter)處理過後方可
執行
如Pascal、C、C++、Basic,Fortran與Cobol
極高階語言


8
極高階語言又稱為問題導向語言(problem
oriented language)
如SQL (structured query language)
自然語言


9
自然語言又稱為知識庫語言(knowledge based
language)
語法十分接近人類日常生活所用的語言,如英
文、日文或中文
近代程式語言簡介







10
Fortran
Cobol
Basic
Pascal
C/C++
Java
Lisp 及Prolog
Fortran






11
Fortran (FORmula TRANslator language)是IBM的John
Backus在1950年代中期所開發
第一個高階語言
主要是針對科學計算而設計
具固定格式(當時Fortran規定程式必須從第七行開始寫
起)
首創了輸出入格式化(I/O format)的觀念
允許「隱含性變數」(implicit variable),如變數的第一
個字元為I,J,K,L,M,N時該變數可不經宣告即
內定為整數型態
Cobol





12
Cobol(COmmon Business Oriental Language)
發展於1960~1970年代
由美國防部贊助開發完成
主要用於商業資料處理
語法傾向自然語言
首創以雜訊字(noise word)觀念來編寫程式碼
Basic





13
Basic語言(Beginner‘s All-purpose Symbolic
Instruction Code)在1960年代中期發展
當適合初學者使用的語言
語法結構簡單,操作也相當容易
交談式(interactive)的語言
利用直譯器(interpreter)來處理程式
Pascal




14
1975年一個以數學家Blaise Pascal之名命名的
程式語言Pascal誕生
採區塊結構(block structure)來寫作程式
首創集合(set)資料型態供程式設計師使用
最大的優勢是具備嚴謹的語法結構,讓使用者
不容易犯錯,非常適合教學用途
C語言



15
C語言是由貝爾實驗室於1970年代所發展出來
採區塊結構,具高可攜性,因此適合發展系統
程式
利用C語言撰寫的程式相同字元的大小寫(如A
及a)會被視為是不同的符號
C++語言



16
C++是C語言的物件導向版程式開發工具
C++ 語言是由 Bjarne Stroustrup 在貝爾實驗室
中設計而得
C++ 語言設計的主要目標是希望能實現物件導
向程式設計的理想
Java


Java語言是由Sun Microsystems沿襲了C語言的語法並
加入許多新的程式結構元素發展而成的物件導向程式
語言
Java語言為提昇程式的安全性,取消
–
–
–

17
指標(pointer)資料型態
多重繼承(multiple inheritance)
運算子覆載(operator overloading)等功能
Java語言允許其程式段能夠透過網路系統到另一個機
器平台上執行
物件導向程式語言



18
物件導向程式語言(Object Oriented
Programming Language;OOPL)是由「抽象資
料型態」(abstract data type)與「資料抽象化」
(data abstraction)的觀念發展而來
「抽象資料型態」是指資料型態可區分為實作
(implementation)及使用者介面(user interface)二
部分
而「資料抽象化」則是指將資料型態區分為實
作與使用者介面的動作即稱為資料抽象化
物件導向程式語言三大特徵



19
資訊隱藏或稱為封裝(encapsulation)
繼承(inheritance)能力
多面性(polymorphism)
封裝


20
封裝主要的目的就是期望能將不希望給外界知
道的資訊,隱藏起來也就是達到「資訊隱藏」
(information hidden)的目的
通常在寫作程式時可以利用將變數宣告為不同
等級便可達到「資訊隱藏」的效果
繼承





21
繼承是指程式語言可利用已建立好的類別(class)來
產生新的類別,依此方式產生的新類別將可繼承所有
原來類別的特性並可依需要新增或刪除特定的功能
「繼承」是類別要完成擴充目的的基本要件
C++ 語言允許 1對1,1對多,多對1的繼承方式
JAVA語言僅允許允許1對1的繼承方式
若程式語言具備「繼承」能力則程式的可重用性將較
高,較易擴充且較易維護
多面性



22
多面性代表具相同名稱的函
式,但卻具有不同的功能
如C++語言允許右方程式段
之寫法
右方程式段中有四個print函
式,雖然函式的名稱都是
print,但是因為參數的型態
不同,因此會被視為是四個
不同的函式
高階語言的處理器


高階語言的處理器主要的作用即是將利用高階語言寫
成的程式段翻譯成機器可處理的碼
主要可分成編譯器(compiler)及直譯器(interpreter)二類
–
–
23
編譯器(也可稱為編譯程式)會對原始程式碼中的每一條敘述
,按照先後順序均做一次之處理,並產生對應的目的碼
直譯器(也可稱為直譯程式)會對原始程式碼中的敘述,按照
執行的先後順序做處理,並直接產生程式執行結果
編譯器及直譯器之區別
24
程式語言的資料型態


25
資料型態是指一群個體(object)以及作用在這群
個體上的運算
常見的資料型態分類方式是將資料型態分為基
本資料型態(elementary data type)及結構性資料
型態 (structured data type)二種
基本資料型態 (1/3)

基本資料型態是指不可再切割為更小單位的型
態類別
–
26
如數值、字元(character)、布林值(boolean value)、
列舉式資料型態(enumerated data type)及指標資料
型態 (pointer data type)
基本資料型態(2/3)




數值一般可分為整數與浮點數二種
浮點數代表具有小數位數之數值
字元會佔用一個位元組(byte)的記憶體空間
布林值有「真」(true)與「假」(false)二種
–
–
–
27
通常程式語言不允許布林值與數值混合使用
但C/C++語言卻允許布林值與數值混合使用,在C/C++語言中
只要數值非0便會被視為「真」,若數值為0則視為是「假」
BASIC語言以「-1」代表布林值「真」,「假」則為「0」。
基本資料型態(3/3)

列舉式資料型態是指將需要的資料一一定義與列舉出
來
–

指標可以是記憶體位址或nil
–
–
28
假設旗標公司編輯部有5位主編,分別是Alice,Bob,Dick,
Mark與Peter,C語言將此份資料定義成一列舉式資料型態之
語法如下:
enum Editor {Alice, Bob, Dick, Mark, Peter};
因為指標可以隨意存取記憶體空間中之內容,所以指標型態
的彈性很大,但會使得程式的可靠度不佳、存取速度較慢及
可能造成懸置引用(dangling reference)的問題
Java語言並未提供指標型態供程式設計師使用
C語言指標的用法

29
C語言使用「*」做為指標變數的「取值
運算子」,「&」做為一般變數的「取址
運算子」。
– 範例如下:
int a,*b;
C語言的指標與陣列型態


C語言的指標與陣列型態經常會被比較
C語言的陣列的起始位址有二種不同的表示法,分別
是:
–
–
–
30
陣列名稱
陣列的第一個元素之位址
範例 int xxx[168];
xxx為陣列名稱,C語言陣列元素規定由0開始編號,所以本
題陣列元素的編號由0~167,共168個元素。代表陣列的起始
位址的表示法有以下二種:xxx及&xxx[0]
結構性資料型態

常見的結構性資料型態
–
字串(string)

–
記錄(record)

–
記錄是由固定數目,但型態可以不同的元素所組成
聯合(union)資料型態

31
由字元(character)組成。例如,”book”、”computer”、
”internet”均為字串
同一個變數佔用的記憶體空間,在不同執行時間可由不同
型態的值存放
結構性資料型態(cont.)

常見的結構性資料型態
–
陣列(array)

–
集合(set):

–
集合可表示沒有順序關係的資料,若程式語言提供集合資料型
態則應提供聯集、交集及差集運算。
檔案(file):

32
陣列由名稱、維度(dimension)、索引(index)及元素型態陣列等元
件組成。陣列的主要有二項限制:
– 元素必須存放在連續的記憶體空間。
– 元素的型態必須完全相同
檔案是由相關的記錄所組成
變數的實例

以C語言為例 int X = 5;
–
–
–
–
33
變數的「名稱」為X
「屬性」為int (即整數)
「值」為5 (就C語言而言,此處的用法為變數「初值設定」
,C語言允許在宣告變數時一併設定初值)
對程式設計師而言,一般來說「引用」是比較模糊的一種概
念,因為比較沒有具體的東西可代表;就C語言而言,變數
的儲存區空間的配置有二種可能性:執行前配置或執行時配
置。本範例中變數X所配置的空間有可能是執行前配置或執
行時配置,必須視變數所在程式中的位置才可確定儲存區空
間何時配置
程式設計基本觀念



34
流程圖
結構化程式設計
程式語言的運算子
流程圖



發展程式時可利用流程圖(flow chart)來做為分
析的工具
流程圖主要的作用便是將計算方法轉換為圖形
化的方式來表達
採用流程圖的主要優點
–
–
–
35
可讀性較高
容易維護
容易除錯
常用流程圖符號
36
判斷課程是否必須重修之過程
所對應的流程圖
37
結構化程式設計


38
結構化程式設計是指從事程式設計的過程中,
依照程式的邏輯特性將程式細分成幾個較小的
問題,再將這些較小的問題同樣依照程式的邏
輯特性再往下細分成更小的問題,依此類推直
到很容易編寫程式的單元時為止
當採用結構化程式設計法來設計程式時,應當
儘量避免使用goto命令,以避免破壞程式的可
讀性及結構性
結構化程式設計 (cont.)

主要優點
–
–
–
–

主要缺點
–
–
39
程式可分工完成
容易除錯
可讀性較高
較容易維護
經由結構化程式設計原則產生的程式碼通常會較大
程式執行時間較久
結構化程式設計 實例--編輯程式(editor)
40
程式語言的運算子


41
高階語言常用的運算子(operator)有三類,分別
是算術、關係及邏輯運算子
這三類運算子的關係如下表所示:
程式語言的運算子 (cont.)

42
程式語言對運算子定義運算優先順序的主要目
的是希望程式能有唯一的執行結果,若運算子
之運算優先順序未定義則可能使得程式執行結
果不唯一
BASIC語言運算子執行的優先順序表
43
程式設計的三大結構

結構化程式設計的基本結構有
–
–
–
44
循序結構(sequential structure)
選擇結構(selection structure)
反覆結構(iteration structure)
循序結構

45
循序執行的程式段即為循序結構
重要範例 – 二個變數值交換問題

46
重要結論:若要將二個變數的值交換,最少應增加一
個額外變數
選擇結構

選擇結構可分為
–
–
–
47
單路選擇結構
雙路選擇結構
多重選擇結構
單路選擇結構

單路選擇結構(single path selection structure)
–
–
48
條件成立時有對應的敘述應被處理,但是當條件不
成立時則沒有對應的敘述應被處理,因此稱為單路
選擇結構
高階程式語言提供的單路選擇結構,語法如下:
if (條件) then {條件成立時應執行的敘述}
單路選擇結構對應的流程圖
49
雙路選擇結構

雙路選擇結構(double path selection structure)
–
–
50
條件成立時有相對應的敘述必須被處理,而且當條
件不成立時也有相對應的敘述要處理,因此稱為雙
路選擇結構
高階程式語言提供的雙路選擇結構,語法如下:
if (條件) then 「條件成立時應執行的敘述」
else 「條件不成立時應執行的敘述」
雙路選擇結構對應的流程圖
51
範例
52
範例
53
範例
54
範例
有一流程圖如下,試寫出對應的if敘述
55
答案為 if (C1){ if (C2) S1;} else S2;
多重選擇結構
56
C語言的 switch 敘述


57
C語言的 switch 敘述屬於外顯分歧(explicit
branch)結構
若要表達相同的語意,「break」命令是不應
省略
C語言的 switch 範例
58
反覆結構


反覆結構是指重覆執行的敘述群
反覆結構分為二類
–
–
59
前測迴路(pre-test loop)
後測迴路(post-test loop)
前測迴路



60
前測迴路的運作原則是先判斷執行迴圈敘述的
條件是否成立,若「成立」則執行迴圈敘述,
若「不成立」則跳離迴圈結構
迴圈執行的最少次數是0次
迴圈執行的最多次數是無限多次
前測迴路流程圖
61
前測迴路種類

常見的前測迴路可分為二類
–
–
62
「while-loop」
「for-loop」
C/C++/Java 語言的「while-loop」



63
語法結構如右
若「迴圈敘述」只有一
條,語法結構中的「{」
及「}」 可以省略,否則
「{」及「}」必須被保留
下來
以「while-loop」設計寫
一個程式片段來完成「
s=1+2+…+100」的工作
範例
64
C/C++/Java 語言的「for-loop」

65
語法結構如右
範例
66
範例
67
範例
68
範例
69
後測迴路



70
後測迴路的運作原則是先執行迴圈敘述再判斷
繼續執行迴圈敘述的條件是否成立,若「成立
」則執行迴圈敘述,若「不成立」則跳離迴圈
結構
迴圈執行的最少次數是1次
迴圈執行的最多次數是無限多次
後測迴路的程式流程圖
71
C/C++/Java語言的後測迴路


72
語法結構如右
先執行迴圈敘述再
檢查<條件>,<條
件>成立時執行迴
圈敘述,當<條件>
不成立時將離開迴
圈結構
以do-while loop來完成s=1+2+…+100

73
此程式段的「條件」
為「i <= 100」,先執
行迴圈敘述「s=s+i;
i=i+1;」再做條件測試
,若條件成立則再執
行迴圈敘述「s=s+i;
i=i+1;」一次,因此在
i的值為1~100時迴圈
敘述會執行
副程式與參數傳遞


74
撰寫程式時通常會把某些可完成特定功能的敘
述集合在一起,此類被集合在一起的程式段被
稱為副程式(subroutine)
副程式可以重複被呼叫
副程式的組成

副程式由四項元素組成
–



75
副程式名稱、參數、執行環境及程式段
參數分為實際參數及型式參數二類
實際參數(actual parameter)是指呼叫敘述中的
參數串列
型式參數(formal parameter)則是指被呼叫的副
程式中的參數串列
實例



76
變數a及b為型式參
數,可在呼叫程式
中利用swap(x, y)來
呼叫副程式
變數x及y為實際參
數
執行的環境為變數
a, b及t
副程式的控制流程轉移


77
「呼叫程式執行了呼叫副程式的敘述」,這個
動作啟動了副程式的執行
當副程式要開始執行時,程式的控制流程
(control flow)會由呼叫程式中呼叫副程式的敘
述(這個敘述的下一個敘述的位址被稱為被呼
叫副程式的返回位址)轉移到副程式的進入點
,隨後開始副程式的執行,當副程式執行結束
時,會將程式的控制流程轉移到返回位址處所
儲存的敘述,繼續程式執行的動作
副程式的控制流程轉移 (cont.)

副程式「被呼叫」、
「執行」及「執行結
束」時,這三個重要
時刻,呼叫程式(A)
及被呼叫副程式(B)
間,控制流程的轉移
方式 如右圖
執行順序為:
「敘述群A1」「呼叫副程式B的敘述」「敘述群B1」「expnext」「敘述群A2」
78
其中「expnext」代表叫式中呼叫副程式的敘述之下一個敘述,此敘述的
位址即為副程式的返回位址
副程式 的種類


79
副程式可分為程序
(procedure)及函式
(function)二類
程序與函式最大的不同
是程序沒有傳回值而函
式會有傳回值。不論是
程序或函式皆為副程式
,因此均會符合副程式
的特性
這是一個利用C語言的語法及「輾轉相除法」求最大公因數的範
例,這個程式段利用了遞迴副程式(recursive subroutine)觀
念