Transcript 投影片 1

第四章
資料型態
陳維魁 博士
[email protected]
儒林圖書公司
1
大綱






資料型態的定義
資料型態的分類
靜態與動態型態檢驗
型態強制轉換
型態相等性
精選習題
2
資料型態的定義

資料型態是指一群個體(object)以及作用在
這群個體上的運算
3
資料型態的分類

基本資料型態

數字
整數(integer)
 實數(real)--浮點數(floating point number)






字元
布林資料型態
列舉式資料型態
指標資料型態
結構性資料型態
4
基本資料型態

數字




整數(integer)
 若整數佔用的記憶體空間為二個位元組,則其範圍將
介於–32768與32767之間
實數(real)--浮點數(floating point number)
 實數代表可具有小數位數之數值
優點
 可加快程式執行的速度
缺點
 由於每種機器所允許的數值的有效範圍皆不同,所以
相同的計算在不同的機器上運算所得的結果可能不盡
相同
5
基本資料型態

字元


字元所佔用的記憶體空間為一個位元組(byte),如英文
字母、阿拉伯數字或+、-、×、/等特殊符號均可視為
一個字元
布林資料型態



布林值可能的值為true與false二種
不同的高階語言對布林值在處理的方式來說其作法不
一定相同
C語言及C++語言允許布林值與數值混合計算,只要數
值非0,在C語言及C++語言中將其視為true,但若數值
為0則視為false
6
布林資料型態範例
底下的C程式會讓變數X之值為何?
if(((3>2)&&(2<2))∣∣(5==6)∣∣((5>4)&& 3))
X=3;
else
X=4;
7
“and” 與條件敘述的對應

and 對應的敘述
if x then y else false
8
“or” 與條件敘述的對應

or 對應的敘述
if x then true else y
9
“not” 與條件敘述的對應

not 對應的敘述
if x then false else true
10
“imply” 與條件敘述的對應

imply 對應的敘述
if x then y else true
11
“equivalence” 與條件敘述的對應

equivalence 對應的敘述
if x then y else (not y)
12
“exclusive or” 與條件敘述的對應

exclusive or 對應的敘述
if x then (not y) else y
13
多意


隨著運算元(operand)型態的不同,運算子(operator)作不同
的計算處理即稱之為多意(polymorphism)
範例

假設A與B為二個數值變數,當執行A+B敘述時



常見情形


若A、B為整數時則A+B是做整數的加法運算
若A、B為實數時則A+B是做實數的加法運算
前面所說明的A+B敘述之運算,運算元A與B之型態都是相
同的,但是事實上,運算元A與B之型態可能是不相同的,譬
如A是整數而B是實數,此時必須將A與B之型態一致化之
後,才能進行運算
“型態一致化”


寬化(widening)
窄化(narrowing)
14
型態一致化

寬化



指將一型態轉化為另一型態其值不會改變者
如整數型態轉化為實數型態
窄化


將一型態轉化為另一型態其值可能會改變者
如實數型態轉化為整數型態
15
列舉式資料型態(enumerated data type)

定義


將需要的資料一一定義與列舉出來
假設一班級有學生七人分別是John,Mary,
May,Peter,Jacky,Jany與Tom

用C語言將此份資料定義成一列舉式資料型態
之語法如下:
enum Student {John, Mary, May, Peter, Jacky, Jany, Tom};

以Pascal語言來處理同一份資料則其作法如下:
type Student = (John, Mary, May, Peter, Jacky, Jany, Tom);
16
列舉式資料型態

用法




指定敘述
陣列的註標(index)
FOR-LOOP的控制變數
布林運算式中的比較項
17
指標(pointer)資料型態

指標是參考(reference)物體的一種方式
10
100
point er
有一指標指到記憶體位址為10之處,而其內容為100

指標變數的值


記憶體位址
NIL
18
指標資料型態

優點



彈性較大,可以任意存取記憶體空間中之資料
若有多個串列中具某筆相同的資料,則可僅配置一個
記憶體空間給該筆資料使用,每個串列再用指標指到
該筆資料即可
缺點




安全性較差
存取速度可能較慢
可能造成懸置引用(dangling reference) 的問題
可靠性(reliability)較差
19
Pascal 的指標資料型態範例
var ptr : ^ integer;



其中“ptr”代表位址(address)
“ptr^”則代表值(value)
Pascal的指標變數函式

new()


配置新的記憶體空間供指標變數使用
dispose()

歸還記憶體空間給系統
20
C /C++ 的指標資料型態範例



“*”代表取值運算子
“&”代表取址運算子
範例
int *x,y;

x是指標變數,y是一般變數
“x”及“&y”代表位址(address)
 “*x”及“y”則代表值(value)

21
C/C++ 指標資料型態與陣列資料之關連



C/C++語言的陣列起始註標(index)為0
陣列的第一個元素之位址即陣列之起始位
址
範例
int a[5];
int *ptr;

“ptr = a;”與“ptr = &a[0];”二個敘述的邏輯意義
是相同的
22
指標使用不當所可能造成的問題



懸置引用(dangling reference)
懸置指標(dangling pointer)
懸置物件(dangling object)
23
懸置引用


指標變數指到一個已經不存在的記憶體空
間
如Pascal語言中,x是一個指標變數,當執
行了dispose(x)後,若想引用x,則將造成
懸置引用現象
24
懸置指標


指標指到一個不存在任何有意義資訊的記
憶體空間
一般程式語言中會導致懸置指標的一種常
見情形是某一個呼叫程式中的指標變數指
向被呼叫程式中的區域變數,當被呼叫程
式執行結束後,則區域變數對應的記憶體
空間中的資料將會被清除,如此一來呼叫
程式中的指標變數將成為“懸置指標”
25
懸置物件

一個仍然存放資訊的記憶體空間,可是已
沒有辦法可存取這個空間,則此空間便被
稱為懸置物件
26
結構性資料型態

定義


將具關連性的資料結合成一個個體的方法,即稱之為
結構性資料型態
種類






陣列
記錄
聯合資料型態
字串
集合
可變長度資料型態
27
陣列


陣列主要是由陣列的名稱,維度,元素型態
以及索引等元件組成
主要限制


陣列元素必須存放在連續的記憶體空間中(但
SMALLTALK語言例外)
陣列元素的型態必須完全相同
28
陣列種類

固定界限陣列




指陣列的元素個數是固定的
必須採用靜態儲存區配置法(static storage allocation)
PASCAL、C及C++;
動態界限陣列



指陣列的元素個數是可變動的
採用動態儲存區配置法(dynamic storage allocation)
ALGOL
29
關於陣列的三個重要問題

計算陣列元素個數(假設為n個元素)


計算陣列元素佔用之記憶體空間總量


作法為分別計算陣列中各個維度元素的個數再
相乘即可。
假設陣列個別元素佔用之記憶體空間為w,則
陣列元素佔用之記憶體空間總量為n×w)
計算陣列中特定元素之記憶體位址
30
陣列儲存方式

以列為優先


以行為優先



在編排陣列中元素之順序時,最右邊的索引值
先變(加1),再向左進位
在編排陣列中元素之順序時,最左邊的索引值
先變(加1),再向右進位
以列為優先法較符合人類的習慣
除了FORTRAN採用以行為優先法外,絕
大部份的高階語言均是採用以列為優先法
31
陣列描述器(array descriptor)

包括






陣列名稱
元素的型態
元素的長度
陣列的起始位址
維度
各個維度的上、下限
32
四種陣列分類法

靜態陣列(static array)


PASCAL語言在主程式段中宣告的陣列,其元
素個數在執行前決定且記憶體空間在執行前配
置
半靜態陣列(semi-static array)

PASCAL語言在副程式段中宣告的陣列,其元
素個數在執行前決定且記憶體空間在執行時配
置
33
四種陣列分類法

半動態陣列(semi-dynamic array)


ADA語言中宣告的陣列,其元素個數在執行
時決定且記憶體空間在執行時配置,但一旦配
置即不可更改
動態陣列(dynamic array)

ALGOL語言中宣告的陣列,其元素個數在執
行時決定且記憶體空間在執行時配置,但可更
改
34
記錄


是由固定數目,但型態可以不同的元素所組成
屬性(attributes)




欄位的名稱
欄位的資料型態
欄位的個數
一般來說記錄的欄位(field)的數目是固定的,但
Pascal 提供了變異記錄(variant record)資料型態,
它的欄位數目就是可變動的
35
記錄實例

Pascal語言實例
Type StudentData = record
end;
Name : string〔30〕;
Age : integer;
PhoneNo : string[10];
Sex : char;
Address : string〔50〕
36
記錄引用的方式

函數式記號




由 Knuth所提出
ALGOL 68採用
語法為“欄位名稱(記錄名稱)”
限定名稱格式


Pascal、Ada、PL/1、C及Modula-2等語言採用
語法為“記錄名稱.欄位名稱”
37
聯合資料型態(union data type)

意義


對同一個記憶體的空間而言在不同的執行時間
可存放不同型態的值
提供聯合資料型態的語言



Pascal--變異記錄(variant record)
ADA--變異記錄
Fortran --“EQUIVALENCE”敘述
38
變異記錄重要範例
Pascal:
type T= record
price : real;
case sex : (M, F) of
M : (age : integer);
F : (blood : (A, B, O, AB))
end;
end;
請問以上 Pascal 之 Variant record type 有什麼不安全的地方?(國家考試
常見考題)
39
變異記錄重要範例

試問 Ada 程式語言如何避免 Pascal 語言 中
變異記錄(Variant record)的不安全性
(insecurity)?
40
字串(string)

定義



由一組字元(character)所組成之集合,便 稱之為
字串
PL/1語言首先提供了對字串的運算處理功
能
SNOBOL語言的字串處理能力十分強大,
可直接執行“型態比對”(pattern match)動
作
41
三種不同的字串處理法

宣告具有固定之長度


字串的長度可變動,但有範圍的限制


PASCAL是採用
PL/1採用
對字串的長度沒有任何限制

SNOBOL採用
42
字串資料型態範例
用圖表示以下字串
“COMPUTER GAME”
在記憶體(memory)中之儲存方式,如果字串
(a) 已經宣告具有固定的長度。
(b) 可變長度,但有宣告的長度限制。
(c) 無長度限制
43
集合資料型態



用來儲存沒有順序關係的資料
由PASCAL語言所首創
在PASCAL語言中空集合以“[ ]”表示,
“+”代表聯集運算、“*”代表交集運
算,而“-”則代表差集運算
44
可變長度資料結構

又稱為動態資料結構



資料的大小在編譯階段未被設定,執行時得以改變
靜態資料結構(static data structure)是指資料的大
小在編譯階段被設定,執行時不得改變
常見的可變長度資料結構




鏈結串列(linked list)
佇列(queue)
堆疊(stack)
樹(tree)
45
鏈結串列

鏈結串列為最簡單的動態資料結構
Head
P

R
nil
優點



Q
插入或刪除一個節點非常容易
當鏈結串列被破壞時,較易恢復
缺點

增加了一個指標欄位較浪費儲存區空間
46
佇列(queue)


FIFO (First In First Out)
佇列結構在電腦上的應用



作業系統(OS)工作排程(job scheduling)
中斷處理的等候佇列(waiting queue)
Input / Output Queue
47
堆疊(stack)

主要運算有五種


PUSH, POP, CREATE, TOP, ISEMPTY
堆疊結構在電腦上的應用




副程式的呼叫,儲存活動記錄(activation
record)
Macro call within macro call 的製作須堆
疊
在編譯程式中堆疊可幫助分析指令,如算術運
算子的值
中斷處理
48
樹(tree)

定義




是由一個或多個節點(node)構成
其中一個節點稱為樹根(root)
除去樹根節點,剩下的節點可分為n個互斥(n≧0)集合,
分別為T1,T2,…,Tn,而Ti,1≦i≦n,本身也是樹
-T的子樹(sub-tree)
特性



樹是連通圖(connected graph)
樹中不允許迴路(cycle)
假設樹中有x個節點,y個邊,則x = y+1
49
型態檢驗

分類


靜態型態檢驗
動態型態檢驗
50
靜態型態檢驗(static type checking)

定義


優點


產生較有效率的目的碼(object code)
缺點


變數的型態在編譯時即已決定
欠缺彈性
範例

Pascal、C、C++、Java等語言採用此法
51
動態型態檢驗(dynamic type checking)

定義


優點


彈性較佳
缺點


變數的型態在執行時決定
處理過程較複雜
範例

APL、Smalltalk、Lisp、Prolog等語言採用此
法
52
型態強制轉換(coercion)

定義


將某一型態的值強制轉換成為另一種型態之值
種類

拓寬法(widening)


將某一型態的值轉換為另一型態,而值不會改變
者稱之。
縮窄法(narrowing)

將某一型態的值轉換為另一型態,而值可能會改
變者稱之。
53
強制型態語言(strongly typed language)

條件



在編譯時變數的型態可被決定
在編譯時可檢查同一運算式中,所有變數的相
容性
若允許同一記憶體空間在不同時刻儲存不同型
態之值時,必須能確保其安全性
54
型態相等性

名稱相等法(name equivalence)


結構相等法(structure equivalence)



若變數用相同型態名稱宣告或一起宣告即滿足
名稱相等法
變數的各項元件皆相等,即滿足結構相等法
陣列元素則應考慮維度,若二陣列元素個數相
同,但維度不同則視為不滿足結構相等法
宣告相容性(declaration equivalence)

變數必須一起宣告始滿足宣告相容性
55
精選習題



何謂欠位(Underflow),溢位(Overflow)?
說明C語言中會導致懸置指標的兩種情況 。
在C程式中,假設我們已宣告了以下的幾個變數
及函式:int k, temp, *p1, *p2, a[5], f( ), *p3( ) ;
以下之指定敘述(Assignment statements)中,何者
有文法上的錯誤?
(1) p1=&k; (2) p2=a; (3) p3=f; (4) p1=&a[3]; (5) p1=p2;
56