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