780 likes | 986 Views
第四章 資料型態. 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司. 大綱. 資料型態的定義 資料型態的分類 靜態與動態型態檢驗 型態強制轉換 型態相等性 精選習題. 資料型態的 定義. 資料型態是指一群個體 (object) 以及作用在這群個體上的運算 近代高階語言均要求程式設計師在設計程式時,必須對程式段中所有使用到的變數宣告資料型態 — 外顯式型態法 增加程式的可讀性、可靠性及可維護性. 資料型態的分類. 基本資料型態 數字 整數 (integer):2Byte-32768~32767
E N D
第四章 資料型態 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司
大綱 • 資料型態的定義 • 資料型態的分類 • 靜態與動態型態檢驗 • 型態強制轉換 • 型態相等性 • 精選習題
資料型態的定義 • 資料型態是指一群個體(object)以及作用在這群個體上的運算 • 近代高階語言均要求程式設計師在設計程式時,必須對程式段中所有使用到的變數宣告資料型態—外顯式型態法 • 增加程式的可讀性、可靠性及可維護性
資料型態的分類 • 基本資料型態 • 數字 • 整數(integer):2Byte-32768~32767 • 實數(real)可具有小數點--浮點數(floating point number) • 字元 • 布林資料型態 • 列舉式資料型態 • 指標資料型態 • 結構性資料型態
基本資料型態 • 數字 • 整數(integer) • 若整數佔用的記憶體空間為二個位元組,則其範圍將介於–32768與32767之間 • 實數(real)--浮點數(floating point number) • 實數代表可具有小數位數之數值 • 優點 • 可加快程式執行的速度 • 缺點 • 由於每種機器所允許的數值的有效範圍皆不同,所以相同的計算在不同的機器上運算所得的結果可能不盡相同
整數表示法 • 符號大小值法-首位元作為符號位元,0表示正,1表示負 • 1的補數法-負整數以正整數的1的補數來表示 • 2的補數法-負整數以正整數的1的補數來表示 • 浮點數 • 大多數實數只能表達近似值 • 浮點數記憶格式包含三個欄位:符號欄位、指數、小數。實數佔32位元、倍精實數64位元 • 實數儲存-轉成二進位-正規化(小數點移到最左邊非0位元前,以指數紀錄)
計算順序 • 1. 運算子的優先順序 • 2. 結合性:左結合由左向右計算;右結合由右向左計算 • 3. 括號:加上括號的優先高於未加括號;多層的括號,內層優先
運算元的計算 • 運算元的順序主要關係在邊際效應(side effects) • 邊際效應:副程式執行時候改變了不屬於該副程式的資料
邊際效應 • Procedure sub1 • var A:integer; • function FUN (x) • begin • FUN:=x div 2; • A:=20; • end; • Begin • A:=10; • A:=A+FUN(A);…先取出A=10計算,或先執行FUN(10)結果不同 • … • End;
避免邊際效應 • 不允許函數的運用 • 定義運算元的順序 • 限制函數不可以改變其他運算元
多意 • 隨著運算元(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)
基本資料型態 • 字元 • 字元所佔用的記憶體空間為一個位元組(byte),如英文字母、阿拉伯數字或+、-、×、/等特殊符號均可視為一個字元 • 布林資料型態 • 布林值可能的值為true與false二種 • 不同的高階語言對布林值在處理的方式來說其作法不一定相同 • C語言及C++語言允許布林值與數值混合計算,只要數值非0,在C語言及C++語言中將其視為true,但若數值為0則視為false
布林資料型態範例 底下的C程式會讓變數X之值為何? if(((3>2)&&(2<2))∣∣(5==6)∣∣((5>4)&& 3))X=3;else X=4;
“and”與條件敘述的對應 • and 對應的敘述if x then y else false • X y and • 0 0 0 • 0 1 0 • 1 0 0 • 1 1 1
“or”與條件敘述的對應 • or 對應的敘述if x then true else y • X y or • 0 0 0 • 0 1 1 • 1 0 1 • 1 1 1
“not”與條件敘述的對應 • not 對應的敘述 if x then false else true • X not • 0 1 • 1 0
“imply”與條件敘述的對應 • imply 對應的敘述if x then y else true • X y imply • 0 0 1 • 0 1 1 • 1 0 0 • 1 1 1
“equivalence”與條件敘述的對應 • equivalence 對應的敘述if x then y else (not y) • 若兩者相等則true • X y equivalence • 0 0 1 • 0 1 0 • 1 0 0 • 1 1 1
“exclusive or”與條件敘述的對應 • exclusive or 對應的敘述if x then (not y) else y • X y exclusive or • 0 0 0 • 0 1 1 • 1 0 1 • 1 1 0
列舉式資料型態(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);
列舉式資料型態 • Pascal的列舉資料型態是純量型態的一種 • 可以再定義子區間(sub-range)的資料型態 • Type Sub_student= Mary..Jany; • 用法 • 指定敘述 • 陣列的註標(index) • FOR-LOOP的控制變數 • 布林運算式中的比較項
例如 • Type seasons=(Spring,Summer,Fall,Winter); • Var P, Q, R: seasons; • P:= Spring; --指定敘述 • Q:= Fall;--指定敘述 • If P=Q then R:=Summer else R:= Winter –布林運算比較項 • For i:=Spring to Winter do–FORLOOP控制 • begin
指標(pointer)資料型態 • 指標是參考(reference)物體的一種方式 有一指標指到記憶體位址為10之處,而其內容為100 • 指標變數的值 • 記憶體位址 • NIL
指標資料型態 • 優點 • 彈性較大,可以任意存取記憶體空間中之資料 • 若有多個串列中具某筆相同的資料,則可僅配置一個記憶體空間給該筆資料使用,每個串列再用指標指到該筆資料即可 • 缺點 • 安全性較差 • 存取速度可能較慢 • 可能造成懸置引用(dangling reference) 的問題 • 可靠性(reliability)較差
Pascal 的指標資料型態範例 var ptr : ^ integer; • 其中“ptr”代表位址(address) • “ptr^”則代表值(value) • Pascal的指標變數函式 • new() • 配置新的記憶體空間供指標變數使用 • dispose() • 歸還記憶體空間給系統
C /C++ 的指標資料型態範例 • “*”代表取值運算子 • “&”代表取址運算子 • 範例 int *x,y; • x是指標變數,y是一般變數 • “x”及“&y”代表位址(address) • “*x”及“y”則代表值(value)
C/C++ 指標資料型態與陣列資料之關連 • C/C++語言的陣列起始註標(index)為0 • 陣列的第一個元素之位址即陣列之起始位址 • 範例 int a[5];int *ptr;--指標變數 ptr代表位址, *ptr表值 • “ptr = a;”與“ptr = &a[0];”二個敘述的邏輯意義是相同的
指標使用不當所可能造成的問題 • 懸置引用(dangling reference) • 懸置指標(dangling pointer) • 懸置物件(dangling object)
懸置引用 • 指標變數指到一個已經不存在的記憶體空間 • 如Pascal語言中,x是一個指標變數,當執行了dispose(x)後,若想引用x,則將造成懸置引用現象
懸置指標 • 指標指到一個不存在任何有意義資訊的記憶體空間 • 一般程式語言中會導致懸置指標的一種常見情形是某一個呼叫程式中的指標變數指向被呼叫程式中的區域變數,當被呼叫程式執行結束後,則區域變數對應的記憶體空間中的資料將會被清除,如此一來呼叫程式中的指標變數將成為“懸置指標”
懸置物件 • 一個仍然存放資訊的記憶體空間,可是已沒有辦法可存取這個空間,則此空間便被稱為懸置物件
結構性資料型態 • 定義 • 將具關連性的資料結合成一個個體的方法,即稱之為結構性資料型態 • 種類 • 陣列 • 記錄 • 聯合資料型態 • 字串 • 集合 • 可變長度資料型態
陣列 • 陣列主要是由陣列的名稱,維度,元素型態以及索引等元件組成 • 主要限制 • 陣列元素必須存放在連續的記憶體空間中(但SMALLTALK語言例外) • 陣列元素的型態必須完全相同
陣列種類 • 固定界限陣列 • 指陣列的元素個數是固定的 • 必須採用靜態儲存區配置法(static storage allocation) • PASCAL、C及C++; • 動態界限陣列 • 指陣列的元素個數是可變動的 • 採用動態儲存區配置法(dynamic storage allocation) • ALGOL
關於陣列的三個重要問題 • 計算陣列元素個數(假設為n個元素) • 作法為分別計算陣列中各個維度元素的個數再相乘即可。 • 計算陣列元素佔用之記憶體空間總量 • 假設陣列個別元素佔用之記憶體空間為w,則陣列元素佔用之記憶體空間總量為n×w) • 計算陣列中特定元素之記憶體位址
陣列描述器(array descriptor) • 包括 • 陣列名稱 • 元素的型態 • 元素的長度 • 陣列的起始位址 • 維度 • 各個維度的上、下限
陣列儲存方式 • 以列為優先 • 在編排陣列中元素之順序時,最右邊的索引值先變(加1),再向左進位 • 以行為優先 • 在編排陣列中元素之順序時,最左邊的索引值先變(加1),再向右進位 • 以列為優先法較符合人類的習慣 • 除了FORTRAN採用以行為優先法外,絕大部份的高階語言均是採用以列為優先法
四種陣列分類法 • 靜態陣列(static array) • PASCAL語言在主程式段中宣告的陣列,其元素個數在執行前決定且記憶體空間在執行前配置 • 半靜態陣列(semi-static array) • PASCAL語言在副程式段中宣告的陣列,其元素個數在執行前決定且記憶體空間在執行時配置
四種陣列分類法 • 半動態陣列(semi-dynamic array) • ADA語言中宣告的陣列,其元素個數在執行時決定且記憶體空間在執行時配置,但一旦配置即不可更改 • 動態陣列(dynamic array) • ALGOL語言中宣告的陣列,其元素個數在執行時決定且記憶體空間在執行時配置,但可更改
記錄 • 是由固定數目,但型態可以不同的元素所組成 • 屬性(attributes) • 欄位的名稱 • 欄位的資料型態 • 欄位的個數 • 一般來說記錄的欄位(field)的數目是固定的,但Pascal 提供了變異記錄(variant record)資料型態,它的欄位數目就是可變動的
記錄實例 • Pascal語言實例 Type StudentData = recordName : string〔30〕;Age : integer;PhoneNo : string[10];Sex : char;Address : string〔50〕end;
記錄引用的方式 • 函數式記號 • 由 Knuth所提出 • ALGOL 68採用 • 語法為“欄位名稱(記錄名稱)” • 限定名稱格式 • Pascal、Ada、PL/1、C及Modula-2等語言採用 • 語法為“記錄名稱.欄位名稱” • Pascal可利用with敘述簡化
聯合資料型態(union data type) • 意義 • 對同一個記憶體的空間而言在不同的執行時間可存放不同型態的值 • 提供聯合資料型態的語言 • Pascal--變異記錄(variant record) • ADA--變異記錄 • Fortran --“EQUIVALENCE”敘述
變異記錄重要範例 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 有什麼不安全的地方?(國家考試常見考題)
Age blood共用一個記憶體空間 • 當sex=M,執行age:=20 • 如果同時執行blood:=‘b’,系統也接受 • 因為兩個存在同一個記憶體空間,應該存放age資料,卻變成存了blood
變異記錄重要範例 • 試問 Ada 程式語言如何避免 Pascal 語言 中變異記錄(Variant record)的不安全性 (insecurity)? • ADA會檢查欄位的合法性
Fortran範例 • INTEGER X • REAL Y • EQUIVALENCE (X, Y) • 變數x和y占用同一個記憶體空間
字串(string) • 定義 • 由一組字元(character)所組成之集合,便 稱之為字串 • PL/1語言首先提供了對字串的運算處理功能 • SNOBOL語言的字串處理能力十分強大,可直接執行“型態比對”(pattern match)動作
三種不同的字串處理法 • 宣告具有固定之長度 • PASCAL是採用 • 利用編譯時期描述子(compile-time descriptor) • 描述子會記錄 長度、位址
字串的長度可變動,但有範圍的限制 • PL/1採用 • 利用執行時期描述子(run-time descriptor) • 描述子紀錄最大長度、目前長度、位址