第四章
This presentation is the property of its rightful owner.
Sponsored Links
1 / 78

第四章 資料型態 PowerPoint PPT Presentation


  • 101 Views
  • Uploaded on
  • Presentation posted in: General

第四章 資料型態. 陳維魁 博士 [email protected] 儒林圖書公司. 大綱. 資料型態的定義 資料型態的分類 靜態與動態型態檢驗 型態強制轉換 型態相等性 精選習題. 資料型態的 定義. 資料型態是指一群個體 (object) 以及作用在這群個體上的運算 近代高階語言均要求程式設計師在設計程式時,必須對程式段中所有使用到的變數宣告資料型態 — 外顯式型態法 增加程式的可讀性、可靠性及可維護性. 資料型態的分類. 基本資料型態 數字 整數 (integer):2Byte-32768~32767

Download Presentation

第四章 資料型態

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


5160484

第四章 資料型態

陳維魁 博士

[email protected]

儒林圖書公司


5160484

大綱

  • 資料型態的定義

  • 資料型態的分類

  • 靜態與動態型態檢驗

  • 型態強制轉換

  • 型態相等性

  • 精選習題


5160484

資料型態的定義

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

  • 近代高階語言均要求程式設計師在設計程式時,必須對程式段中所有使用到的變數宣告資料型態—外顯式型態法

  • 增加程式的可讀性、可靠性及可維護性


5160484

資料型態的分類

  • 基本資料型態

    • 數字

      • 整數(integer):2Byte-32768~32767

      • 實數(real)可具有小數點--浮點數(floating point number)

    • 字元

    • 布林資料型態

  • 列舉式資料型態

  • 指標資料型態

  • 結構性資料型態


5160484

基本資料型態

  • 數字

    • 整數(integer)

      • 若整數佔用的記憶體空間為二個位元組,則其範圍將介於–32768與32767之間

    • 實數(real)--浮點數(floating point number)

      • 實數代表可具有小數位數之數值

    • 優點

      • 可加快程式執行的速度

    • 缺點

      • 由於每種機器所允許的數值的有效範圍皆不同,所以相同的計算在不同的機器上運算所得的結果可能不盡相同


5160484

  • 整數表示法

    • 符號大小值法-首位元作為符號位元,0表示正,1表示負

    • 1的補數法-負整數以正整數的1的補數來表示

    • 2的補數法-負整數以正整數的1的補數來表示

  • 浮點數

    • 大多數實數只能表達近似值

    • 浮點數記憶格式包含三個欄位:符號欄位、指數、小數。實數佔32位元、倍精實數64位元

    • 實數儲存-轉成二進位-正規化(小數點移到最左邊非0位元前,以指數紀錄)


5160484

計算順序

  • 1. 運算子的優先順序

  • 2. 結合性:左結合由左向右計算;右結合由右向左計算

  • 3. 括號:加上括號的優先高於未加括號;多層的括號,內層優先


5160484

運算元的計算

  • 運算元的順序主要關係在邊際效應(side effects)

  • 邊際效應:副程式執行時候改變了不屬於該副程式的資料


5160484

邊際效應

  • 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;


5160484

避免邊際效應

  • 不允許函數的運用

  • 定義運算元的順序

  • 限制函數不可以改變其他運算元


5160484

多意

  • 隨著運算元(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)


5160484

基本資料型態

  • 字元

    • 字元所佔用的記憶體空間為一個位元組(byte),如英文字母、阿拉伯數字或+、-、×、/等特殊符號均可視為一個字元

  • 布林資料型態

    • 布林值可能的值為true與false二種

    • 不同的高階語言對布林值在處理的方式來說其作法不一定相同

    • C語言及C++語言允許布林值與數值混合計算,只要數值非0,在C語言及C++語言中將其視為true,但若數值為0則視為false


5160484

布林資料型態範例

底下的C程式會讓變數X之值為何?

if(((3>2)&&(2<2))∣∣(5==6)∣∣((5>4)&& 3))X=3;else X=4;


5160484

“and”與條件敘述的對應

  • and 對應的敘述if x then y else false

  • X y and

  • 0 0 0

  • 0 1 0

  • 1 0 0

  • 1 1 1


5160484

“or”與條件敘述的對應

  • or 對應的敘述if x then true else y

  • X y or

  • 0 0 0

  • 0 1 1

  • 1 0 1

  • 1 1 1


5160484

“not”與條件敘述的對應

  • not 對應的敘述

    if x then false else true

  • X not

  • 0 1

  • 1 0


5160484

“imply”與條件敘述的對應

  • imply 對應的敘述if x then y else true

  • X y imply

  • 0 0 1

  • 0 1 1

  • 1 0 0

  • 1 1 1


5160484

“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


5160484

“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

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


5160484

列舉式資料型態

  • Pascal的列舉資料型態是純量型態的一種

  • 可以再定義子區間(sub-range)的資料型態

  • Type Sub_student= Mary..Jany;

  • 用法

    • 指定敘述

    • 陣列的註標(index)

    • FOR-LOOP的控制變數

    • 布林運算式中的比較項


5160484

例如

  • 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

指標(pointer)資料型態

  • 指標是參考(reference)物體的一種方式

    有一指標指到記憶體位址為10之處,而其內容為100

  • 指標變數的值

    • 記憶體位址

    • NIL


5160484

指標資料型態

  • 優點

    • 彈性較大,可以任意存取記憶體空間中之資料

    • 若有多個串列中具某筆相同的資料,則可僅配置一個記憶體空間給該筆資料使用,每個串列再用指標指到該筆資料即可

  • 缺點

    • 安全性較差

    • 存取速度可能較慢

    • 可能造成懸置引用(dangling reference) 的問題

    • 可靠性(reliability)較差


Pascal

Pascal 的指標資料型態範例

var ptr : ^ integer;

  • 其中“ptr”代表位址(address)

  • “ptr^”則代表值(value)

  • Pascal的指標變數函式

    • new()

      • 配置新的記憶體空間供指標變數使用

    • dispose()

      • 歸還記憶體空間給系統


5160484

C /C++ 的指標資料型態範例

  • “*”代表取值運算子

  • “&”代表取址運算子

  • 範例

    int *x,y;

    • x是指標變數,y是一般變數

      • “x”及“&y”代表位址(address)

      • “*x”及“y”則代表值(value)


5160484

C/C++ 指標資料型態與陣列資料之關連

  • C/C++語言的陣列起始註標(index)為0

  • 陣列的第一個元素之位址即陣列之起始位址

  • 範例

    int a[5];int *ptr;--指標變數 ptr代表位址, *ptr表值

    • “ptr = a;”與“ptr = &a[0];”二個敘述的邏輯意義是相同的


5160484

指標使用不當所可能造成的問題

  • 懸置引用(dangling reference)

  • 懸置指標(dangling pointer)

  • 懸置物件(dangling object)


5160484

懸置引用

  • 指標變數指到一個已經不存在的記憶體空間

  • 如Pascal語言中,x是一個指標變數,當執行了dispose(x)後,若想引用x,則將造成懸置引用現象


5160484

懸置指標

  • 指標指到一個不存在任何有意義資訊的記憶體空間

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


5160484

懸置物件

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


5160484

結構性資料型態

  • 定義

    • 將具關連性的資料結合成一個個體的方法,即稱之為結構性資料型態

  • 種類

    • 陣列

    • 記錄

    • 聯合資料型態

    • 字串

    • 集合

    • 可變長度資料型態


5160484

陣列

  • 陣列主要是由陣列的名稱,維度,元素型態以及索引等元件組成

  • 主要限制

    • 陣列元素必須存放在連續的記憶體空間中(但SMALLTALK語言例外)

    • 陣列元素的型態必須完全相同


5160484

陣列種類

  • 固定界限陣列

    • 指陣列的元素個數是固定的

    • 必須採用靜態儲存區配置法(static storage allocation)

    • PASCAL、C及C++;

  • 動態界限陣列

    • 指陣列的元素個數是可變動的

    • 採用動態儲存區配置法(dynamic storage allocation)

    • ALGOL


5160484

關於陣列的三個重要問題

  • 計算陣列元素個數(假設為n個元素)

    • 作法為分別計算陣列中各個維度元素的個數再相乘即可。

  • 計算陣列元素佔用之記憶體空間總量

    • 假設陣列個別元素佔用之記憶體空間為w,則陣列元素佔用之記憶體空間總量為n×w)

  • 計算陣列中特定元素之記憶體位址


Array descriptor

陣列描述器(array descriptor)

  • 包括

    • 陣列名稱

    • 元素的型態

    • 元素的長度

    • 陣列的起始位址

    • 維度

    • 各個維度的上、下限


5160484

陣列儲存方式

  • 以列為優先

    • 在編排陣列中元素之順序時,最右邊的索引值先變(加1),再向左進位

  • 以行為優先

    • 在編排陣列中元素之順序時,最左邊的索引值先變(加1),再向右進位

  • 以列為優先法較符合人類的習慣

  • 除了FORTRAN採用以行為優先法外,絕大部份的高階語言均是採用以列為優先法


5160484

四種陣列分類法

  • 靜態陣列(static array)

    • PASCAL語言在主程式段中宣告的陣列,其元素個數在執行前決定且記憶體空間在執行前配置

  • 半靜態陣列(semi-static array)

    • PASCAL語言在副程式段中宣告的陣列,其元素個數在執行前決定且記憶體空間在執行時配置


5160484

四種陣列分類法

  • 半動態陣列(semi-dynamic array)

    • ADA語言中宣告的陣列,其元素個數在執行時決定且記憶體空間在執行時配置,但一旦配置即不可更改

  • 動態陣列(dynamic array)

    • ALGOL語言中宣告的陣列,其元素個數在執行時決定且記憶體空間在執行時配置,但可更改


5160484

記錄

  • 是由固定數目,但型態可以不同的元素所組成

  • 屬性(attributes)

    • 欄位的名稱

    • 欄位的資料型態

    • 欄位的個數

  • 一般來說記錄的欄位(field)的數目是固定的,但Pascal 提供了變異記錄(variant record)資料型態,它的欄位數目就是可變動的


5160484

記錄實例

  • Pascal語言實例

    Type StudentData = recordName : string〔30〕;Age : integer;PhoneNo : string[10];Sex : char;Address : string〔50〕end;


5160484

記錄引用的方式

  • 函數式記號

    • 由 Knuth所提出

    • ALGOL 68採用

    • 語法為“欄位名稱(記錄名稱)”

  • 限定名稱格式

    • Pascal、Ada、PL/1、C及Modula-2等語言採用

    • 語法為“記錄名稱.欄位名稱”

    • Pascal可利用with敘述簡化


Union data type

聯合資料型態(union data type)

  • 意義

    • 對同一個記憶體的空間而言在不同的執行時間可存放不同型態的值

  • 提供聯合資料型態的語言

    • Pascal--變異記錄(variant record)

    • ADA--變異記錄

    • Fortran --“EQUIVALENCE”敘述


5160484

變異記錄重要範例

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 有什麼不安全的地方?(國家考試常見考題)


5160484

  • Age blood共用一個記憶體空間

  • 當sex=M,執行age:=20

  • 如果同時執行blood:=‘b’,系統也接受

  • 因為兩個存在同一個記憶體空間,應該存放age資料,卻變成存了blood


5160484

變異記錄重要範例

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

  • ADA會檢查欄位的合法性


Fortran

Fortran範例

  • INTEGER X

  • REAL Y

  • EQUIVALENCE (X, Y)

  • 變數x和y占用同一個記憶體空間


String

字串(string)

  • 定義

    • 由一組字元(character)所組成之集合,便 稱之為字串

  • PL/1語言首先提供了對字串的運算處理功能

  • SNOBOL語言的字串處理能力十分強大,可直接執行“型態比對”(pattern match)動作


5160484

三種不同的字串處理法

  • 宣告具有固定之長度

    • PASCAL是採用

    • 利用編譯時期描述子(compile-time descriptor)

    • 描述子會記錄 長度、位址


5160484

  • 字串的長度可變動,但有範圍的限制

    • PL/1採用

    • 利用執行時期描述子(run-time descriptor)

    • 描述子紀錄最大長度、目前長度、位址


5160484

  • 對字串的長度沒有任何限制

    • SNOBOL採用

    • linked list連接串列方式:變長或縮短較易處理,但是需要較多記憶空間,運算缺乏效率

    • Adjacent memory相鄰記憶體:運算較快、節省空間,但是變長或縮短不容易處理


5160484

集合資料型態

  • 用來儲存沒有順序關係的資料

  • 由PASCAL語言所首創

  • 在PASCAL語言中空集合以“[ ]”表示,“+”代表聯集運算、“*”代表交集運算,而“-”則代表差集運算


5160484

可變長度資料結構

  • 又稱為動態資料結構

    • 資料的大小在編譯階段未被設定,執行時得以改變

  • 靜態資料結構(static data structure)是指資料的大小在編譯階段被設定,執行時不得改變

  • 常見的可變長度資料結構

    • 鏈結串列(linked list)

    • 佇列(queue)

    • 堆疊(stack)

    • 樹(tree)


5160484

鏈結串列為最簡單的動態資料結構

優點

插入或刪除一個節點非常容易

當鏈結串列被破壞時,較易恢復

缺點

增加了一個指標欄位較浪費儲存區空間

鏈結串列


Queue

佇列(queue)

  • FIFO (First In First Out)

  • 佇列結構在電腦上的應用

    • 作業系統(OS)工作排程(job scheduling)

    • 中斷處理的等候佇列(waiting queue)

    • Input / Output Queue


Stack

堆疊(stack)

  • 主要運算有五種

    • PUSH, POP, CREATE, TOP, ISEMPTY

  • 堆疊結構在電腦上的應用

    • 副程式的呼叫,儲存活動記錄(activation record)

    • Macro call within macro call的製作須堆疊

    • 在編譯程式中堆疊可幫助分析指令,如算術運算子的值

    • 中斷處理


5160484

樹(tree)

  • 定義

    • 是由一個或多個節點(node)構成

    • 其中一個節點稱為樹根(root)

    • 除去樹根節點,剩下的節點可分為n個互斥(n≧0)集合,分別為T1,T2,…,Tn,而Ti,1≦i≦n,本身也是樹-T的子樹(sub-tree)

  • 特性

    • 樹是連通圖(connected graph)

    • 樹中不允許迴路(cycle)

    • 假設樹中有x個節點,y個邊,則x = y+1


5160484

型態檢驗

  • 分類

    • 靜態型態檢驗

    • 動態型態檢驗


Static type checking

靜態型態檢驗(static type checking)

  • 定義

    • 變數的型態在編譯時即已決定

  • 優點

    • 產生較有效率的目的碼(object code)

  • 缺點

    • 欠缺彈性

  • 範例

    • Pascal、C、C++、Java等語言採用此法


Dynamic type checking

動態型態檢驗(dynamic type checking)

  • 定義

    • 變數的型態在執行時決定

  • 優點

    • 彈性較佳

  • 缺點

    • 處理過程較複雜

  • 範例

    • APL、Smalltalk、Lisp、Prolog等語言採用此法


Coercion

型態強制轉換(coercion)

  • 定義

    • 將某一型態的值強制轉換成為另一種型態之值

  • 種類

    • 拓寬法(widening)

      • 將某一型態的值轉換為另一型態,而值不會改變者稱之。

    • 縮窄法(narrowing)

      • 將某一型態的值轉換為另一型態,而值可能會改變者稱之。


Strongly typed language

強制型態語言(strongly typed language)

  • 條件

    • 在編譯時變數的型態可被決定

    • 在編譯時可檢查同一運算式中,所有變數的相容性

    • 若允許同一記憶體空間在不同時刻儲存不同型態之值時,必須能確保其安全性


5160484

型態相等性

  • 名稱相等法(name equivalence)

    • 若變數用相同型態名稱宣告或一起宣告即滿足名稱相等法

  • 結構相等法(structure equivalence)

    • 變數的各項元件皆相等,即滿足結構相等法

    • 陣列元素則應考慮維度,若二陣列元素個數相同,但維度不同則視為不滿足結構相等法

  • 宣告相容性(declaration equivalence)

    • 變數必須一起宣告始滿足宣告相容性


5160484

範例

Type

vector=array[1..10] of integer;

var

a: vector:

b, c:array[1..10] of integer;

d: vector;

結構相等法: abcd都滿足

名稱相等法:a與d b與c

宣告相容性:b與c滿足


5160484

精選習題

  • 何謂欠位(Underflow),溢位(Overflow)?

  • (1)Underflow:指一個運算式經過電腦的計算後所得到的結果,比電腦所能儲存的最小值還小的現象,導致電腦無法貯存該值,此種情形稱之為Underflow。

  • (2)Overflow:指一個運算式經過電腦的計算後所得到的結果,比電腦所能儲存的最大值還大的現象,導致電腦無法貯存該值,此種情形稱之為Overflow。


5160484

練習

  • 下列程式,可能印出的答案

  • Int fun(int*k)

  • {*k+=2;

  • return 2*(*k)+1; }

  • Void main()

  • {int i=10, dat;

  • dat=fun(&i)+I;

  • printf(“%d”, dat);


5160484

Ans

  • 非函數運算元先取出

  • dat=fun(&i)+1=fun(&i)+10=25+10=35

  • 先進入函數運算

  • dat=fun(&i)+i=25+i=25+12=37


5160484

  • (1)試寫出Pascal語言裡的結構化資料型態有那些?

  • (2)試寫出Pascal語言裡的五種純量型態?

  • (1)集合(set),記錄(record),陣列(array),字串(string)與檔案(file)。

  • (2)整數(integer),實數(real),字元(char),布林值(boolean),列舉式資料型態(enumerated data type)與子範圍(subrange)。


5160484

  • 6.假設存在一個二維陣列A[1...u1,1...u2],而每個元素在記憶體中佔2 Bytes,已知A[6,2]的存放位址為204010,A[3,4]的存放位址為209410;

  • (a)A陣列在記憶體中的儲存是否為column-major方式?

  • (b)A[1,1]之存放位址為何?

  • (c)u1=?

  • (a)[6,2]在第二列,[3,4]在第四列,如果是列優先,則[3,4]的位址會在前面,所以不是列優先

  • (b)2000

  • (c)15


5160484

  • 7.說明Fortran語言中,two-dimensional array (如DIMENSION A(3,4))在記憶體(memory)內存放的方式。

  • Fortran陣列元素在memory中之儲存方式是以column major為主。如DIMENSION A(3,4)依以下順序存放A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3),A(1,4),A(2,4),A(3,4)。


5160484

  • 試比較linked list與sequential list的區別。


5160484

  • 說明C語言中會導致懸置指標的兩種情況

  • (1)若同時有多個指標指向同一個記憶體空間,若某一個指標將此記憶體空間中的資料清除,如此一來其他指標將成為“懸置指標”。

  • (2)某一個呼叫程式中的指標變數指向副程式中的區域變數,當副程式執行結束後,則區域變數對應的記憶體空間中的資料將會被清除,如此一來呼叫程式中的指標變數將成為“懸置指標”。


5160484

練習

  • 16.一陣列(Array)被以橫列為主的順序存放在記憶體內,每個陣列佔用四個單位的記憶體,若起始位置是100,下列宣告中所列元素的存放位置為何?

  • (1)var A:array[-100..1,1..100] 求 A[1,12]的位址

  • (2)var A:array[5..10,-10..20] 求 A[5,-5]的位址


5160484

Ans

  • (1)Loc(A[1,12])=100+4×[(1-(-100)) ×(100-1+1)+(12-1)]=40544

  • (2)Loc(A[5,-5])=100+4×[(5-5)×(20-(-10)+1)+(-5-(-10))]=120


5160484

  • 17.請以圖形表示下列陣列的Descriptor. integer array A:〔-1..10,0..5〕


5160484

  • 假設Type Q=array〔1..100〕 of real; Var w:Q; x:array〔301..400〕 of real; y,z:array〔301..400〕 of real;

  • (1)請問有那些變數為結構等價的?

  • (2)請問有那些變數為名稱等價的?

  • (1)結構等價:w=x=y=z

  • (2)名稱等價:y=z


5160484

練習

  • 寫出下列程式執行結果

  • Main(){

  • int a,b,c,d,e;

  • a=b=c=d=e;

  • a+=b-=c*=d=e+=2;

  • printf(“%d %d %d%d%d\n”,a,b,c,d,e);

  • a+=(b+=c)+(e-=2)-1;

  • printf(“%d %d %d%d%d\n”,a,b,c,d,e);

  • }


5160484

Ans

  • 結果

  • -9 -12 15 5 5

  • -4 3 15 5 3


  • Login