Presentation is loading. Please wait.

Presentation is loading. Please wait.

陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司 第四章 資料型態 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司.

Similar presentations


Presentation on theme: "陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司 第四章 資料型態 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司."— Presentation transcript:

1 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司
第四章 資料型態 陳維魁 博士 儒林圖書公司

2 大綱 資料型態的定義 資料型態的分類 靜態與動態型態檢驗 型態強制轉換 型態相等性 精選習題

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

4 資料型態的分類 基本資料型態 列舉式資料型態 指標資料型態 結構性資料型態 數字 字元 布林資料型態 整數(integer)
實數(real)--浮點數(floating point number) 字元 布林資料型態 列舉式資料型態 指標資料型態 結構性資料型態

5 基本資料型態 數字 整數(integer) 實數(real)--浮點數(floating point number) 優點 缺點
若整數佔用的記憶體空間為二個位元組,則其範圍將介於–32768與32767之間 實數(real)--浮點數(floating point number) 實數代表可具有小數位數之數值 優點 可加快程式執行的速度 缺點 由於每種機器所允許的數值的有效範圍皆不同,所以相同的計算在不同的機器上運算所得的結果可能不盡相同

6 基本資料型態 字元 字元所佔用的記憶體空間為一個位元組(byte),如英文字母、阿拉伯數字或+、-、×、/等特殊符號均可視為一個字元 布林資料型態 布林值可能的值為true與false二種 不同的高階語言對布林值在處理的方式來說其作法不一定相同 C語言及C++語言允許布林值與數值混合計算,只要數值非0,在C語言及C++語言中將其視為true,但若數值為0則視為false

7 布林資料型態範例 底下的C程式會讓變數X之值為何?
if(((3>2)&&(2<2))∣∣(5==6)∣∣((5>4)&& 3)) X=3; else X=4;

8 “and” 與條件敘述的對應 and 對應的敘述 if x then y else false

9 “or” 與條件敘述的對應 or 對應的敘述 if x then true else y

10 “not” 與條件敘述的對應 not 對應的敘述 if x then false else true

11 “imply” 與條件敘述的對應 imply 對應的敘述 if x then y else true

12 “equivalence” 與條件敘述的對應
equivalence 對應的敘述 if x then y else (not y)

13 “exclusive or” 與條件敘述的對應
exclusive or 對應的敘述 if x then (not y) else y

14 多意 隨著運算元(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)

15 型態一致化 寬化 窄化 指將一型態轉化為另一型態其值不會改變者 如整數型態轉化為實數型態 將一型態轉化為另一型態其值可能會改變者
如實數型態轉化為整數型態

16 列舉式資料型態(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);

17 列舉式資料型態 用法 指定敘述 陣列的註標(index) FOR-LOOP的控制變數 布林運算式中的比較項

18 指標(pointer)資料型態 指標是參考(reference)物體的一種方式 有一指標指到記憶體位址為10之處,而其內容為100
指標變數的值 記憶體位址 NIL

19 指標資料型態 優點 缺點 彈性較大,可以任意存取記憶體空間中之資料
若有多個串列中具某筆相同的資料,則可僅配置一個記憶體空間給該筆資料使用,每個串列再用指標指到該筆資料即可 缺點 安全性較差 存取速度可能較慢 可能造成懸置引用(dangling reference) 的問題 可靠性(reliability)較差

20 Pascal 的指標資料型態範例 var ptr : ^ integer; 其中“ptr”代表位址(address)
“ptr^”則代表值(value) Pascal的指標變數函式 new() 配置新的記憶體空間供指標變數使用 dispose() 歸還記憶體空間給系統

21 C /C++ 的指標資料型態範例 “*”代表取值運算子 “&”代表取址運算子 範例 int *x,y; x是指標變數,y是一般變數
“x”及“&y”代表位址(address) “*x”及“y”則代表值(value)

22 C/C++ 指標資料型態與陣列資料之關連 C/C++語言的陣列起始註標(index)為0 陣列的第一個元素之位址即陣列之起始位址 範例
int a[5]; int *ptr; “ptr = a;”與“ptr = &a[0];”二個敘述的邏輯意義是相同的

23 指標使用不當所可能造成的問題 懸置引用(dangling reference) 懸置指標(dangling pointer)
懸置物件(dangling object)

24 懸置引用 指標變數指到一個已經不存在的記憶體空間
如Pascal語言中,x是一個指標變數,當執行了dispose(x)後,若想引用x,則將造成懸置引用現象

25 懸置指標 指標指到一個不存在任何有意義資訊的記憶體空間
一般程式語言中會導致懸置指標的一種常見情形是某一個呼叫程式中的指標變數指向被呼叫程式中的區域變數,當被呼叫程式執行結束後,則區域變數對應的記憶體空間中的資料將會被清除,如此一來呼叫程式中的指標變數將成為“懸置指標”

26 懸置物件 一個仍然存放資訊的記憶體空間,可是已沒有辦法可存取這個空間,則此空間便被稱為懸置物件

27 結構性資料型態 定義 種類 將具關連性的資料結合成一個個體的方法,即稱之為結構性資料型態 陣列 記錄 聯合資料型態 字串 集合
可變長度資料型態

28 陣列 陣列主要是由陣列的名稱,維度,元素型態以及索引等元件組成 主要限制
陣列元素必須存放在連續的記憶體空間中(但SMALLTALK語言例外) 陣列元素的型態必須完全相同

29 陣列種類 固定界限陣列 動態界限陣列 指陣列的元素個數是固定的
必須採用靜態儲存區配置法(static storage allocation) PASCAL、C及C++; 動態界限陣列 指陣列的元素個數是可變動的 採用動態儲存區配置法(dynamic storage allocation) ALGOL

30 關於陣列的三個重要問題 計算陣列元素個數(假設為n個元素) 計算陣列元素佔用之記憶體空間總量 計算陣列中特定元素之記憶體位址
作法為分別計算陣列中各個維度元素的個數再相乘即可。 計算陣列元素佔用之記憶體空間總量 假設陣列個別元素佔用之記憶體空間為w,則陣列元素佔用之記憶體空間總量為n×w) 計算陣列中特定元素之記憶體位址

31 陣列儲存方式 以列為優先 以行為優先 以列為優先法較符合人類的習慣
在編排陣列中元素之順序時,最右邊的索引值先變(加1),再向左進位 以行為優先 在編排陣列中元素之順序時,最左邊的索引值先變(加1),再向右進位 以列為優先法較符合人類的習慣 除了FORTRAN採用以行為優先法外,絕大部份的高階語言均是採用以列為優先法

32 陣列描述器(array descriptor)
包括 陣列名稱 元素的型態 元素的長度 陣列的起始位址 維度 各個維度的上、下限

33 四種陣列分類法 靜態陣列(static array) 半靜態陣列(semi-static array)
PASCAL語言在主程式段中宣告的陣列,其元素個數在執行前決定且記憶體空間在執行前配置 半靜態陣列(semi-static array) PASCAL語言在副程式段中宣告的陣列,其元素個數在執行前決定且記憶體空間在執行時配置

34 四種陣列分類法 半動態陣列(semi-dynamic array) 動態陣列(dynamic array)
ADA語言中宣告的陣列,其元素個數在執行時決定且記憶體空間在執行時配置,但一旦配置即不可更改 動態陣列(dynamic array) ALGOL語言中宣告的陣列,其元素個數在執行時決定且記憶體空間在執行時配置,但可更改

35 記錄 是由固定數目,但型態可以不同的元素所組成 屬性(attributes)
欄位的名稱 欄位的資料型態 欄位的個數 一般來說記錄的欄位(field)的數目是固定的,但Pascal 提供了變異記錄(variant record)資料型態,它的欄位數目就是可變動的

36 記錄實例 Pascal語言實例 Type StudentData = record             Name : string〔30〕;             Age : integer;             PhoneNo : string[10];               Sex : char;            Address : string〔50〕          end;

37 記錄引用的方式 函數式記號 限定名稱格式 由 Knuth所提出 ALGOL 68採用 語法為“欄位名稱(記錄名稱)”
Pascal、Ada、PL/1、C及Modula-2等語言採用 語法為“記錄名稱.欄位名稱”

38 聯合資料型態(union data type)
意義 對同一個記憶體的空間而言在不同的執行時間可存放不同型態的值 提供聯合資料型態的語言 Pascal--變異記錄(variant record) ADA--變異記錄 Fortran --“EQUIVALENCE”敘述

39 變異記錄重要範例 Pascal: type T= record price : real; case sex : (M, F) of
M : (age : integer); F : (blood : (A, B, O, AB)) end; 請問以上 Pascal 之 Variant record type 有什麼不安全的地方?(國家考試常見考題)

40 變異記錄重要範例 試問 Ada 程式語言如何避免 Pascal 語言 中變異記錄(Variant record)的不安全性 (insecurity)?

41 字串(string) 定義 PL/1語言首先提供了對字串的運算處理功能
由一組字元(character)所組成之集合,便 稱之為字串 PL/1語言首先提供了對字串的運算處理功能 SNOBOL語言的字串處理能力十分強大,可直接執行“型態比對”(pattern match)動作

42 三種不同的字串處理法 宣告具有固定之長度 字串的長度可變動,但有範圍的限制 對字串的長度沒有任何限制 PASCAL是採用 PL/1採用
SNOBOL採用

43 字串資料型態範例 用圖表示以下字串 “COMPUTER GAME” 在記憶體(memory)中之儲存方式,如果字串
(b) 可變長度,但有宣告的長度限制。 (c) 無長度限制

44 集合資料型態 用來儲存沒有順序關係的資料 由PASCAL語言所首創

45 可變長度資料結構 又稱為動態資料結構 資料的大小在編譯階段未被設定,執行時得以改變 靜態資料結構(static data structure)是指資料的大小在編譯階段被設定,執行時不得改變 常見的可變長度資料結構 鏈結串列(linked list) 佇列(queue) 堆疊(stack) 樹(tree)

46 鏈結串列 鏈結串列為最簡單的動態資料結構 優點 缺點 插入或刪除一個節點非常容易 當鏈結串列被破壞時,較易恢復
增加了一個指標欄位較浪費儲存區空間

47 佇列(queue) FIFO (First In First Out) 佇列結構在電腦上的應用
作業系統(OS)工作排程(job scheduling) 中斷處理的等候佇列(waiting queue) Input / Output Queue

48 堆疊(stack) 主要運算有五種 堆疊結構在電腦上的應用 PUSH, POP, CREATE, TOP, ISEMPTY
副程式的呼叫,儲存活動記錄(activation record) Macro call within macro call 的製作須堆疊 在編譯程式中堆疊可幫助分析指令,如算術運算子的值 中斷處理

49 樹(tree) 定義 特性 是由一個或多個節點(node)構成 其中一個節點稱為樹根(root)
除去樹根節點,剩下的節點可分為n個互斥(n≧0)集合,分別為T1,T2,…,Tn,而Ti,1≦i≦n,本身也是樹-T的子樹(sub-tree) 特性 樹是連通圖(connected graph) 樹中不允許迴路(cycle) 假設樹中有x個節點,y個邊,則x = y+1

50 型態檢驗 分類 靜態型態檢驗 動態型態檢驗

51 靜態型態檢驗(static type checking)
定義 變數的型態在編譯時即已決定 優點 產生較有效率的目的碼(object code) 缺點 欠缺彈性 範例 Pascal、C、C++、Java等語言採用此法

52 動態型態檢驗(dynamic type checking)
定義 變數的型態在執行時決定 優點 彈性較佳 缺點 處理過程較複雜 範例 APL、Smalltalk、Lisp、Prolog等語言採用此法

53 型態強制轉換(coercion) 定義 種類 將某一型態的值強制轉換成為另一種型態之值 拓寬法(widening)
將某一型態的值轉換為另一型態,而值不會改變者稱之。 縮窄法(narrowing) 將某一型態的值轉換為另一型態,而值可能會改變者稱之。

54 強制型態語言(strongly typed language)
條件 在編譯時變數的型態可被決定 在編譯時可檢查同一運算式中,所有變數的相容性 若允許同一記憶體空間在不同時刻儲存不同型態之值時,必須能確保其安全性

55 型態相等性 名稱相等法(name equivalence) 結構相等法(structure equivalence)
若變數用相同型態名稱宣告或一起宣告即滿足名稱相等法 結構相等法(structure equivalence) 變數的各項元件皆相等,即滿足結構相等法 陣列元素則應考慮維度,若二陣列元素個數相同,但維度不同則視為不滿足結構相等法 宣告相容性(declaration equivalence) 變數必須一起宣告始滿足宣告相容性

56 精選習題 何謂欠位(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;


Download ppt "陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司 第四章 資料型態 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司."

Similar presentations


Ads by Google