Transcript 投影片 1

第十三章
Pascal程式語言
陳維魁 博士
[email protected]
儒林圖書公司
1
大綱







程式結構
運算子
資料型態
控制結構
副程式
參數傳遞
精選習題
2
簡介





1975年由 IBM 公司贊助製作而成
命名是為了紀念法國數學家 Blaise Pascal
採用區塊結構(block structure)
提供集合(set)與記錄(record)等資料結構
儲存區配置法



外顯式(explicit)變數型態



全域變數採用靜態儲存區配置法
區域變數採用動態儲存區配置法
不論是變數、標記、程序或函數皆需經過宣告才可使用
語言處理器對註解不做處理,也就是說不會產生目的碼
註解以"{ }"或"(* *)"標示
3
程式結構
程式名稱
程式
程式宣告
程式本體


程式敘述
程式名稱是指程式設計師為程式所取的名稱
而程式本體(program body)


程式宣告
 可分為單元宣告、標記宣告、常數宣告、定義資料型
態、變數宣告及副程式宣告
程式敘述
 代表程式要處理的動作
4
程式宣告

單元宣告


標記宣告


宣告使用的標記(label)名稱。在標準Pascal語言中標記
只能以數字表示,且最多只有四位數,但Turbo Pascal
中則同時允許數字或文字做為標記
常數宣告


宣告使用的單元(unit)名稱
定義程式中使用到的常數(constant)名稱及其相對應的
值。如:const PI=3.14;
定義資料型態

利用“type”敘述使用者可自行定義一個新的資料型態
5
程式宣告

變數宣告

變數皆必須經宣告後才可以使用而變數即是在此區宣
告
例:
var

a : integer;
b : student;
此處宣告了二個變數分別是a與b,其中a宣告為整
數資料型態,而b則宣告為使用者自行定義的
“student”資料型態。
副程式宣告

的副程式分為程序(procedure)和函數(function)二類
6
程式範例
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. var
12. i:integer;
13. begin
14. writeln('The student''s name is as
follows: ');
15. for i:=1 to no do
16. write(student[i],' ':3)
17.end;
18.begin
19.for i:=1 to no do begin
20.write('Please enter the ', i , '
student''s name ');
21.readln(student[i]);
22.if student[i]=' ' then goto
ErrInput
23.end;
24.output;
25.goto Ok;
26.ErrInput:writeln('Student''s
name can not be empty
string ');
27.Ok:
28.writeln
29.end.
7
運算子

在寫作程式時,常用的運算子有三類




算術運算子
關係運算子
邏輯運算子
在計算時,這三類運算子的運算優先順序
算術運算子>關係運算子>邏輯運算子
8
算術運算子
運算子
意義
範例
結果
+
加法
10+4
14
-
減法
10-4
6
*
乘法
10*4
40
/
除法
10/4
2.5
div
除法(取商)
10 div 4
2
mod
除法(取餘) 10 mod 4
2
9
關係運算子
運算子
意義
範例
結果
<
小於
4<10
T
<=
小於等於
4<=10
T
>
大於
10>4
T
>=
大於等於
10>=4
T
=
等於
10 =10
T
<>
不等於
10 <> 4
T
10
邏輯運算子
運算子
意義
範例
not
否
not A
and
及
A and B
or
或
A or B
11
資料型態






整數
實數
布林值
字元
列舉式資料型態
子範圍





指標
陣列
記錄
集合
檔案
12
整數



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
13
實數

Real


Single


長度為 8 bytes
Extended


長度為 4 bytes
Double


長度為 4 bytes
長度為 10 bytes
Copm

長度為 8 bytes
14
布林型態

布林型態有二種


真(true)
假(false)
15
字元資料型態


字元資料型態佔用一個位元組空間
宣告方式如下
var
變數名稱: char;
16
字元資料型態 實例

1. program ch1;
2. var
3. ch : char;
4. num, value, code, sum : integer;
5. begin
6. write(′Please enter an integer string --->′);
7. sum:=0;
8. while not eoln do begin
9.
read(ch);
10.
if ch < >′′then begin
11.
num:=num+1;
12.
val(ch, value, code);
13.
sum := sum + value
14.
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
17
列舉式資料型態

列舉式資料型態


將所需的資料一一的定義與列舉出來
如
Type
Days = (Sunday, Monday, Tuesday, Wednesday,
Thursday, Friday, Saturday);
18
列舉式資料型態 實例

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 do
11.
sum := sum + adder;
12. writeln(′sum=′,sum)
13. end.
利用列舉式資料型態I作為for loop的控制變數,故迴圈敘述會執行7次,
19
因此sum=14
子範圍


子範圍是指根據列舉式資料型態之定義,
擷取其一部份即成子範圍
如,
type
Days = (Sunday, Monday, Tuesday, Wednesday,
Thursday, Friday, Saturday);
type
LikeDays=Sunday..Tuesday;
20
指標




指標的宣告範例如下
type
node=^integer;
var
ptr:node;
“ptr”代表位址,而“ptr^”才代表真正的內容
指標的內容可為位址或nil
Pascal語言提供了二個指標函數供程式設計師使用



第一個是“new( )”,其作用是配置新的記憶體空間
第二個是“dispose( )”其作用是釋放記憶體空間
指標變數為不具名變數(anonymous variable),指標變數的
生命週期由使用者控制,也就是說利用new()命令來建立指
標變數,利用dispose()命令來結束指標變數之生命週期,
因此指標變數是一種動態變數(dynamic variable)
21
結構性資料型態
字串
 陣列
 集合
 記錄
 檔案

22
字串
標準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 Year
String=Happy New Year
23
陣列


陣列需利用連續的記憶體空間來存放其元素
陣列之宣告方式


一維陣列
var ArrayName : array[下限..上限] of 型態;
二維陣列
var ArrayName : array〔下限1..上限1, 下限2..上限2〕of 型態;

三維陣列
var ArrayName : array [下限1..上限1, 下限2..上限2, 下限3..上限3] of 型態;

若為四維或更高維度之陣列,其作法與三維陣列類似
24
集合



集合資料型態代表資料項目的聚集
集合中元素的順序並無意義
宣告方式有以下二種

將所有元素列舉出來


type animal=[’Dog’,’Pig’,’Cat,’Monkey’];
標示元素範圍

type animal=[‘A’..‘Z’];
25
集合

集合資料型態所提供的運算子有以下四種





“+”代表“聯集”運算
“-”代表“差集”運算
“*”代表“交集”運算
“in”代表“屬於”運算
空集合以“〔〕”表示
26
記錄

記錄宣告方式如下
type
記錄名稱 = record
欄位名稱 1 : 型態 1;
欄位名稱 2 : 型態 2;
....
欄位名稱 n : 型態 n
end;

範例
type
StudentData = record
Name : string〔20〕;
Id : integer;
Score : integer
end;
27
檔案
檔案的宣告方式如下
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)

28
常用的檔案處理函數

reset( )


rewrite( )


關閉一個已經開啟的檔案,語法為close(檔名);
EOLN( )


將實體檔案名稱指定給檔案變數,語法為assign(檔案變數,實體檔案
名稱);
close( )


開啟一個檔案(若不存在則create)作寫入資料之用
語法為rewrite(檔名);
assign( )


開啟一個已經存在的檔案作讀取資料之用。
語法為reset (檔名);
檢查是否到達檔案中一列的尾端,語法為EOLN(檔名);
EOF( )

檢查是否到達檔案尾端,語法為EOF(檔名);
29
控制結構

基本控制結構共有三類

循序結構(sequential structure)


敘述會按照先後順序來執行
選擇結構(selection structure)
單路選擇
 雙路選擇
 多重選擇


反覆結構(iteration structure)
前測迴路
 後測迴路

30
單路選擇與雙路選擇結構



單路選擇
if <條件> then exp
雙路選擇
if <條件> then exp 1 else exp 2
當條件成立或不成立時,需執行的敘述超過一
行時(即為複合敘述時),必需以“begin..end”
加以標示
31
多重選擇結構




多重選擇結構即為case結構
語法結構如下
case <選擇運算式> of
<選擇標記1>: exp 1;
<選擇標記2>: exp 2;
....
[else exp N]
end;
在以上的case結構中之else敘述不一定存在,若存
在則表示將處理所有未列舉出來的情況
Pascal語言的case結構屬於內隱分歧(implicit
branch)的控制結構
32
while loop
語法
while <條件> do
begin
迴圈敘述
end;
 while迴路屬於前測迴路(PreTest Loop)
 進入迴圈前先檢查條件是否成立
 迴圈敘述可能一次也不會執行

33
sum=1+2+3+…+10
1 program while_loop;
2 var
3
i,sum:integer;
4 begin
5
i:=1;
6
sum:=0;
7
while(i<=10) do begin
8
sum:=sum+i;
9
i:=i+1
10
end;
11
writeln(‘1+2+...+10=’,sum)
12 end.
34
for loop

Pascal語言提供二類計數反覆敘述


for <控制變數>:=<初值> to <終值> do
begin
迴圈敘述
end;
for <控制變數>:=<初值> downto <終值> do
begin
迴圈敘述
end;
35
sum=1+2+3+…+10
1
2
3
4
5
6
7
8
9
program for1;
var
i,sum:integer;
begin
sum:=0;
for i:=1 to 10 do
sum:=sum+i;
writeln(’1+2+...+10=’,sum)
end.
36
sum=1+2+3+…+10
1
2
3
4
5
6
7
8
9
program for2;
var
i,sum:integer;
begin
sum:=0;
for i:=10 downto 1 do
sum:=sum+i;
writeln(’10+9+...1=’,sum)
end.
37
repeat until loop


repeat
迴圈敘述
until <條件>;
repeat..until迴路屬於後測迴路(PostTest
Loop)


離開迴圈時檢查條件是否成立
迴圈敘述至少會執行一次
38
副程式

副程式的執行模式




副程式的執行動作是因為呼叫程式呼叫了副程
式所引起
當呼叫程式呼叫副程式時會將程式的控制流程
轉移到副程式開始處
待副程式執行結束時會將程式的控制流程轉移
到呼叫程式中呼叫副程式敘述的下一個敘述
副程式執行時可改變其所處的環境的狀態
39
副程式

副程式的種類

程序(procedure)


沒有傳回值
函式(function)
函式與程序類似,最大的不同之處是函式會傳回
一個值
 函式本身亦具有型態
 函式也可作為運算式的一部分

40
副程式

副程式中宣告之變數為區域變數



領域(scope)為定義該區域變數之副程式段
範圍(extend)則為副程式段被呼叫時開始至副
程式段執行結束時為止
採靜態領域法(static scoping)來處理變數定
義問題
41
參數傳遞

Pascal語言參數傳遞的方法分為二類

傳值呼叫法(call by value)


內定參數傳遞法,型式參數不需做記號
傳址呼叫法(call by reference)

型式參數需以“var”做記號
42
範例

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。
43
精選習題






Pascal語言如何處理dangling else問題?
請說明常見的迴圈結構中之前測迴路與後測迴路
之意義各別為何?並請詳細描述前測迴路與後測
迴路中的迴圈敘述執行的最少次數為何?
何以Pascal程式要呼叫宣告在後面的程序
(procedure)或函數(function)時,須要有前置宣告
(forward declaration)在呼叫程序之前?
試問C語言和Pascal語言的for敘述有何不同?二
種語言不同設計的主要理由為何?
試寫出Pascal語言裡的結構化資料型態有那些?
試寫出Pascal語言裡的五種純量(scalar)型態?
44