第十三章 Pascal 程式語言

44
1 第第第第 Pascal 第第第第 第第第 第第 [email protected] 第第第第第第

description

第十三章 Pascal 程式語言. 陳維魁 博士 [email protected] 儒林圖書公司. 大綱. 程式結構 運算子 資料型態 控制結構 副程式 參數傳遞 精選習題. 簡介. 1975 年由 IBM 公司贊助製作而成 命名是為了紀念法國數學家 Blaise Pascal 採用區塊結構 (block structure) 提供集合 (set) 與記錄 (record) 等資料結構 儲存區配置法 全域變數採用靜態儲存區配置法 區域變數採用動態儲存區配置法 外顯式 (explicit) 變數型態 - PowerPoint PPT Presentation

Transcript of 第十三章 Pascal 程式語言

Page 1: 第十三章  Pascal 程式語言

1

第十三章 Pascal 程式語言

陳維魁 博士[email protected]

儒林圖書公司

Page 2: 第十三章  Pascal 程式語言

2

大綱

程式結構 運算子 資料型態 控制結構 副程式 參數傳遞 精選習題

Page 3: 第十三章  Pascal 程式語言

3

簡介 1975 年由 IBM 公司贊助製作而成 命名是為了紀念法國數學家 Blaise Pascal 採用區塊結構 (block structure) 提供集合 (set) 與記錄 (record) 等資料結構 儲存區配置法

全域變數採用靜態儲存區配置法 區域變數採用動態儲存區配置法

外顯式 (explicit) 變數型態 不論是變數、標記、程序或函數皆需經過宣告才可使用

語言處理器對註解不做處理,也就是說不會產生目的碼 註解以 "{ }" 或 "(* *)" 標示

Page 4: 第十三章  Pascal 程式語言

4

程式結構

程式名稱是指程式設計師為程式所取的名稱 而程式本體 (program body)

程式宣告 可分為單元宣告、標記宣告、常數宣告、定義資料型態、變數宣告及副程式宣告

程式敘述 代表程式要處理的動作

程式程式名稱

程式本體程式宣告

程式敘述

Page 5: 第十三章  Pascal 程式語言

5

程式宣告 單元宣告

宣告使用的單元 (unit) 名稱 標記宣告

宣告使用的標記 (label) 名稱。在標準 Pascal 語言中標記只能以數字表示,且最多只有四位數,但 Turbo Pascal 中則同時允許數字或文字做為標記

常數宣告 定義程式中使用到的常數 (constant) 名稱及其相對應的

值。如: const PI=3.14; 定義資料型態

利用“ type” 敘述使用者可自行定義一個新的資料型態

Page 6: 第十三章  Pascal 程式語言

6

程式宣告 變數宣告

變數皆必須經宣告後才可以使用而變數即是在此區宣告

例: var

    a : integer;    b : student;

此處宣告了二個變數分別是 a 與 b ,其中 a 宣告為整數資料型態,而 b 則宣告為使用者自行定義的“ student” 資料型態。

副程式宣告 的副程式分為程序 (procedure) 和函數 (function) 二類

Page 7: 第十三章  Pascal 程式語言

7

程式範例

1. program structure; 2. label ErrInput,Ok; 3. const 4. no=5; 5 .type 6. StudentData=array[1..no]of string[10]; 7. var 8. student:StudentData; 9. i:integer;10. procedure output;11. var12. i:integer;13. begin14. writeln('The student''s name is as follow

s: ');15. for i:=1 to no do16. write(student[i],' ':3)

17.end;18.begin19.for i:=1 to no do begin20.write('Please enter the ', i , ' stud

ent''s name ');21.readln(student[i]);22.if student[i]=' ' then goto ErrInp

ut23.end;24.output;25.goto Ok;26.ErrInput:writeln('Student''s nam

e can not be empty string ');27.Ok:28.writeln29.end.

Page 8: 第十三章  Pascal 程式語言

8

運算子

在寫作程式時,常用的運算子有三類 算術運算子 關係運算子 邏輯運算子

在計算時,這三類運算子的運算優先順序 算術運算子 > 關係運算子 > 邏輯運算子

Page 9: 第十三章  Pascal 程式語言

9

算術運算子

運算子 意義 範例 結果+ 加法 10+4 14

- 減法 10-4 6

* 乘法 10*4 40

/ 除法 10/4 2.5

div 除法 (取商 )

10 div 4 2

mod 除法 (取餘 )

10 mod 4 2

Page 10: 第十三章  Pascal 程式語言

10

關係運算子

運算子 意義 範例 結果

< 小於 4<10 T

<= 小於等於 4<=10 T

> 大於 10>4 T

>= 大於等於 10>=4 T

= 等於 10 =10 T

<> 不等於 10 <> 4 T

Page 11: 第十三章  Pascal 程式語言

11

邏輯運算子

運算子 意義 範例

not 否 not A

and 及 A and B

or 或 A or B

Page 12: 第十三章  Pascal 程式語言

12

資料型態

整數 實數 布林值 字元 列舉式資料型態 子範圍

指標 陣列 記錄 集合 檔案

Page 13: 第十三章  Pascal 程式語言

13

整數 Byte : 長度: 1 byte 範圍: 0~255 ShortInt : 長度: 1 byte 範圍: -128~127 Word : 長度: 2 bytes 範圍: 0~65535

Integer : 長度: 2 bytes 範圍: -32768 ~ 32767 LongInt : 長度: 4 bytes 範圍: -2147483648 ~ 2147483647

Page 14: 第十三章  Pascal 程式語言

14

實數 Real

長度為 4 bytes Single

長度為 4 bytes Double

長度為 8 bytes Extended

長度為 10 bytes Copm

長度為 8 bytes

Page 15: 第十三章  Pascal 程式語言

15

布林型態

布林型態有二種 真 (true) 假 (false)

Page 16: 第十三章  Pascal 程式語言

16

字元資料型態

字元資料型態佔用一個位元組空間 宣告方式如下 var

變數名稱 : char;

Page 17: 第十三章  Pascal 程式語言

17

字元資料型態 實例 1. program ch1;

2. var3. ch : char;4. num, value, code, sum : integer;5. begin6. write(′Please enter an integer string --->′);7. sum:=0;8. while not eoln do begin9. read(ch);10. if ch < >′′then begin11. num:=num+1;12. val(ch, value, code);13. sum := sum + value14. end{of if}15. end;{of while}16. readln;17. writeln(‘num=’, num, ‘ sum=’, sum);18. end.

輸入:    Please enter an integer string ---> 12345輸出:    num=5 sum=15

Page 18: 第十三章  Pascal 程式語言

18

列舉式資料型態

列舉式資料型態 將所需的資料一一的定義與列舉出來

如 Type

Days = (Sunday, Monday, Tuesday, Wednesday,

Thursday, Friday, Saturday);

Page 19: 第十三章  Pascal 程式語言

19

列舉式資料型態 實例 1. program enum;

2. type 3. Days = (Sunday, Monday, Tuesday,

Wednesday, Thursday, Friday, Saturday);

4. var 5. I : Days; 6. sum, val : integer; 7. begin 8. sum := 0; 9. adder := 2;10. for I := Sunday to Saturday do11. sum := sum + adder;12. writeln(′sum=′,sum)13. end.

利用列舉式資料型態 I 作為 for loop 的控制變數,故迴圈敘述會執行 7次,因此 sum=14

Page 20: 第十三章  Pascal 程式語言

20

子範圍

子範圍是指根據列舉式資料型態之定義,擷取其一部份即成子範圍

如, type

Days = (Sunday, Monday, Tuesday, Wednesday,

Thursday, Friday, Saturday); type

LikeDays = Sunday..Tuesday;

Page 21: 第十三章  Pascal 程式語言

21

指標 指標的宣告範例如下 type

node=^integer;var ptr:node;

“ptr” 代表位址,而“ ptr^” 才代表真正的內容 指標的內容可為位址或 nil Pascal 語言提供了二個指標函數供程式設計師使用

第一個是“ new( )” ,其作用是配置新的記憶體空間 第二個是“ dispose( )” 其作用是釋放記憶體空間

指標變數為不具名變數 (anonymous variable) ,指標變數的生命週期由使用者控制,也就是說利用 new() 命令來建立指標變數,利用 dispose() 命令來結束指標變數之生命週期,因此指標變數是一種動態變數 (dynamic variable)

Page 22: 第十三章  Pascal 程式語言

22

結構性資料型態 字串 陣列 集合 記錄 檔案

Page 23: 第十三章  Pascal 程式語言

23

字串 標準 Pascal 語言未提供字串資料型態

Turbo Pascal 提供的字串資料型態其宣告方式如下:

var變數名稱 : string[ 字串長度 ];

介紹一個實際的範例如下: 1. program stringl;

2. var 3. str : string〔 20〕 ; 4. begin 5. str :=′Happy New Year′; 6. insert(′Pig′, str , 6); 7. writeln(′String=′, str); 8. delete(str, 6 , 4); 9. writeln(′String=′, str)10. end.

輸出:String = Happy Pig New YearString = Happy New Year

Page 24: 第十三章  Pascal 程式語言

24

陣列 陣列需利用連續的記憶體空間來存放其元素 陣列之宣告方式

一維陣列var ArrayName : array[ 下限 ..上限 ] of 型態 ;

二維陣列var ArrayName : array〔下限 1..上限 1, 下限 2..上限 2〕 of 型態 ;

三維陣列var ArrayName : array [ 下限 1..上限 1, 下限 2..上限 2, 下限 3..上限 3] of 型態 ;

若為四維或更高維度之陣列,其作法與三維陣列類似

Page 25: 第十三章  Pascal 程式語言

25

集合 集合資料型態代表資料項目的聚集 集合中元素的順序並無意義 宣告方式有以下二種

將所有元素列舉出來 type animal=[’Dog’,’Pig’,’Cat,’Monkey’];

標示元素範圍 type animal=[‘A’..‘Z’];

Page 26: 第十三章  Pascal 程式語言

26

集合 集合資料型態所提供的運算子有以下四種

“+” 代表“聯集”運算 “-” 代表“差集”運算 “*” 代表“交集”運算 “in” 代表“屬於”運算

空集合以“〔〕”表示

Page 27: 第十三章  Pascal 程式語言

27

記錄 記錄宣告方式如下 type

   記錄名稱 = record           欄位名稱 1 : 型態 1;           欄位名稱 2 : 型態 2;            ....           欄位名稱 n : 型態 n         end;

範例 type

   StudentData = record             Name : string〔 20〕 ;             Id : integer;            Score : integer         end;

Page 28: 第十三章  Pascal 程式語言

28

檔案 檔案的宣告方式如下 type 檔案定義名稱 = File of 型態 ;

var 檔案變數名稱 : 檔案定義名稱 ; 或 var 檔案變數名稱 : File of 型態 ; 如,    type

      Filetype = File of char;   var      V6 : FileType;或   var      V6 : File of char;

Pascal 語言以循序存取 (sequential access) 的方式對檔案中的資料做處理,並未支援隨機存取 (random access)

Page 29: 第十三章  Pascal 程式語言

29

常用的檔案處理函數 reset( )

開啟一個已經存在的檔案作讀取資料之用。語法為 reset ( 檔名 );

rewrite( ) 開啟一個檔案 (若不存在則 create) 作寫入資料之用

語法為 rewrite( 檔名 ); assign( )

將實體檔案名稱指定給檔案變數,語法為 assign( 檔案變數 , 實體檔案名稱 );

close( ) 關閉一個已經開啟的檔案,語法為 close( 檔名 );

EOLN( ) 檢查是否到達檔案中一列的尾端,語法為 EOLN( 檔名 );

EOF( ) 檢查是否到達檔案尾端,語法為 EOF( 檔名 );

Page 30: 第十三章  Pascal 程式語言

30

控制結構 基本控制結構共有三類

循序結構 (sequential structure) 敘述會按照先後順序來執行

選擇結構 (selection structure) 單路選擇雙路選擇 多重選擇

反覆結構 (iteration structure)前測迴路 後測迴路

Page 31: 第十三章  Pascal 程式語言

31

單路選擇與雙路選擇結構 單路選擇

if <條件 > then exp 雙路選擇

if <條件 > then exp 1 else exp 2 當條件成立或不成立時,需執行的敘述超過一

行時 ( 即為複合敘述時 ) ,必需以“ begin..end” 加以標示

Page 32: 第十三章  Pascal 程式語言

32

多重選擇結構 多重選擇結構即為 case 結構 語法結構如下

case < 選擇運算式 > of < 選擇標記 1>: exp 1; < 選擇標記 2>: exp 2; .... [else exp N]end;

在以上的 case 結構中之 else 敘述不一定存在,若存在則表示將處理所有未列舉出來的情況

Pascal 語言的 case 結構屬於內隱分歧 (implicit branch) 的控制結構

Page 33: 第十三章  Pascal 程式語言

33

while loop

語法 while <條件 > do

begin   迴圈敘述 end;

while 迴路屬於前測迴路 (PreTest Loop) 進入迴圈前先檢查條件是否成立 迴圈敘述可能一次也不會執行

Page 34: 第十三章  Pascal 程式語言

34

sum=1+2+3+…+10

1 program while_loop;2 var3 i,sum:integer;4 begin5 i:=1;6 sum:=0;7 while(i<=10) do begin8 sum:=sum+i;9 i:=i+110 end;11 writeln(‘1+2+...+10=’,sum)12 end.

Page 35: 第十三章  Pascal 程式語言

35

for loop

Pascal 語言提供二類計數反覆敘述 for < 控制變數 >:=<初值 > to <終值 > do

begin  迴圈敘述 end;

for < 控制變數 >:=<初值 > downto <終值 > dobegin 迴圈敘述 end;

Page 36: 第十三章  Pascal 程式語言

36

sum=1+2+3+…+10

1 program for1;2 var3 i,sum:integer;4 begin5 sum:=0;6 for i:=1 to 10 do7 sum:=sum+i;8 writeln(’1+2+...+10=’,sum)9 end.

Page 37: 第十三章  Pascal 程式語言

37

sum=1+2+3+…+10

1 program for2;2 var3 i,sum:integer;4 begin5 sum:=0;6 for i:=10 downto 1 do7 sum:=sum+i;8 writeln(’10+9+...1=’,sum)9 end.

Page 38: 第十三章  Pascal 程式語言

38

repeat until loop

repeat  迴圈敘述 until <條件 >;

repeat..until 迴路屬於後測迴路 (PostTest Loop)離開迴圈時檢查條件是否成立 迴圈敘述至少會執行一次

Page 39: 第十三章  Pascal 程式語言

39

副程式

副程式的執行模式 副程式的執行動作是因為呼叫程式呼叫了副程式所引起

當呼叫程式呼叫副程式時會將程式的控制流程轉移到副程式開始處

待副程式執行結束時會將程式的控制流程轉移到呼叫程式中呼叫副程式敘述的下一個敘述

副程式執行時可改變其所處的環境的狀態

Page 40: 第十三章  Pascal 程式語言

40

副程式

副程式的種類 程序 (procedure)

沒有傳回值 函式 (function)

函式與程序類似,最大的不同之處是函式會傳回一個值

函式本身亦具有型態 函式也可作為運算式的一部分

Page 41: 第十三章  Pascal 程式語言

41

副程式

副程式中宣告之變數為區域變數領域 (scope) 為定義該區域變數之副程式段 範圍 (extend) 則為副程式段被呼叫時開始至副程式段執行結束時為止

採靜態領域法 (static scoping) 來處理變數定義問題

Page 42: 第十三章  Pascal 程式語言

42

參數傳遞

Pascal 語言參數傳遞的方法分為二類 傳值呼叫法 (call by value)

內定參數傳遞法,型式參數不需做記號 傳址呼叫法 (call by reference)

型式參數需以“ var” 做記號

Page 43: 第十三章  Pascal 程式語言

43

範例 program Exchange (Input, Output);

var a, b: real; procedure swap (x : real; var y : real); var t : real; begin t := x; x := y; y := t; writeln (′x=′,x,′y=′,y) end;begin a:=3.5; b:=2.2; swap(a, b); writeln(′a=′,a,′b=′,b)end.

由 procedure swap (x : real; var y : real);知 x 是以傳值呼叫法來傳遞參數,而 y 則是以傳址呼叫法來傳遞參數;結果: x =2.2 , y = 3.5 及 a = 3.5 , b =3.5 。

Page 44: 第十三章  Pascal 程式語言

44

精選習題 Pascal 語言如何處理 dangling else問題? 請說明常見的迴圈結構中之前測迴路與後測迴路

之意義各別為何?並請詳細描述前測迴路與後測迴路中的迴圈敘述執行的最少次數為何?

何以 Pascal 程式要呼叫宣告在後面的程序 (procedure) 或函數 (function) 時,須要有前置宣告 (forward declaration) 在呼叫程序之前?

試問 C 語言和 Pascal 語言的 for 敘述有何不同?二種語言不同設計的主要理由為何?

試寫出 Pascal 語言裡的結構化資料型態有那些? 試寫出 Pascal 語言裡的五種純量 (scalar) 型態?