440 likes | 758 Views
第十三章 Pascal 程式語言. 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司. 大綱. 程式結構 運算子 資料型態 控制結構 副程式 參數傳遞 精選習題. 簡介. 1975 年由 IBM 公司贊助製作而成 命名是為了紀念法國數學家 Blaise Pascal 採用區塊結構 (block structure) 提供集合 (set) 與記錄 (record) 等資料結構 儲存區配置法 全域變數採用靜態儲存區配置法 區域變數採用動態儲存區配置法 外顯式 (explicit) 變數型態
E N D
第十三章 Pascal程式語言 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司
大綱 • 程式結構 • 運算子 • 資料型態 • 控制結構 • 副程式 • 參數傳遞 • 精選習題
簡介 • 1975年由 IBM 公司贊助製作而成 • 命名是為了紀念法國數學家 Blaise Pascal • 採用區塊結構(block structure) • 提供集合(set)與記錄(record)等資料結構 • 儲存區配置法 • 全域變數採用靜態儲存區配置法 • 區域變數採用動態儲存區配置法 • 外顯式(explicit)變數型態 • 不論是變數、標記、程序或函數皆需經過宣告才可使用 • 語言處理器對註解不做處理,也就是說不會產生目的碼 • 註解以"{ }"或"(* *)"標示
程式結構 • 程式名稱是指程式設計師為程式所取的名稱 • 而程式本體(program body) • 程式宣告 • 可分為單元宣告、標記宣告、常數宣告、定義資料型態、變數宣告及副程式宣告 • 程式敘述 • 代表程式要處理的動作
程式宣告 • 單元宣告 • 宣告使用的單元(unit)名稱 • 標記宣告 • 宣告使用的標記(label)名稱。在標準Pascal語言中標記只能以數字表示,且最多只有四位數,但Turbo Pascal中則同時允許數字或文字做為標記 • 常數宣告 • 定義程式中使用到的常數(constant)名稱及其相對應的值。如:const PI=3.14; • 定義資料型態 • 利用“type”敘述使用者可自行定義一個新的資料型態
程式宣告 • 變數宣告 • 變數皆必須經宣告後才可以使用而變數即是在此區宣告 例: vara : integer;b : student; 此處宣告了二個變數分別是a與b,其中a宣告為整數資料型態,而b則宣告為使用者自行定義的“student”資料型態。 • 副程式宣告 • 的副程式分為程序(procedure)和函數(function)二類
程式範例 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. 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)
運算子 • 在寫作程式時,常用的運算子有三類 • 算術運算子 • 關係運算子 • 邏輯運算子 • 在計算時,這三類運算子的運算優先順序 算術運算子>關係運算子>邏輯運算子
整數 實數 布林值 字元 列舉式資料型態 子範圍 指標 陣列 記錄 集合 檔案 資料型態
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 整數
實數 • Real • 長度為 4 bytes • Single • 長度為 4 bytes • Double • 長度為 8 bytes • Extended • 長度為 10 bytes • Copm • 長度為 8 bytes
布林型態 • 布林型態有二種 • 真(true) • 假(false)
字元資料型態 • 字元資料型態佔用一個位元組空間 • 宣告方式如下 var變數名稱: char;
字元資料型態 實例 • 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
列舉式資料型態 • 列舉式資料型態 • 將所需的資料一一的定義與列舉出來 • 如 Type Days = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
列舉式資料型態 實例 • 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
子範圍 • 子範圍是指根據列舉式資料型態之定義,擷取其一部份即成子範圍 • 如, type Days = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); type LikeDays=Sunday..Tuesday;
指標 • 指標的宣告範例如下 type node=^integer;var ptr:node; • “ptr”代表位址,而“ptr^”才代表真正的內容 • 指標的內容可為位址或nil • Pascal語言提供了二個指標函數供程式設計師使用 • 第一個是“new( )”,其作用是配置新的記憶體空間 • 第二個是“dispose( )”其作用是釋放記憶體空間 • 指標變數為不具名變數(anonymous variable),指標變數的生命週期由使用者控制,也就是說利用new()命令來建立指標變數,利用dispose()命令來結束指標變數之生命週期,因此指標變數是一種動態變數(dynamic variable)
結構性資料型態 • 字串 • 陣列 • 集合 • 記錄 • 檔案
標準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 字串
陣列 • 陣列需利用連續的記憶體空間來存放其元素 • 陣列之宣告方式 • 一維陣列var ArrayName : array[下限..上限] of 型態; • 二維陣列var ArrayName : array〔下限1..上限1, 下限2..上限2〕of 型態; • 三維陣列var ArrayName : array [下限1..上限1, 下限2..上限2, 下限3..上限3] of 型態; • 若為四維或更高維度之陣列,其作法與三維陣列類似
集合 • 集合資料型態代表資料項目的聚集 • 集合中元素的順序並無意義 • 宣告方式有以下二種 • 將所有元素列舉出來 • type animal=[’Dog’,’Pig’,’Cat,’Monkey’]; • 標示元素範圍 • type animal=[‘A’..‘Z’];
集合 • 集合資料型態所提供的運算子有以下四種 • “+”代表“聯集”運算 • “-”代表“差集”運算 • “*”代表“交集”運算 • “in”代表“屬於”運算 • 空集合以“〔〕”表示
記錄 • 記錄宣告方式如下 type 記錄名稱 = record 欄位名稱 1 : 型態 1; 欄位名稱 2 : 型態 2;.... 欄位名稱 n : 型態 nend; • 範例 typeStudentData = recordName : string〔20〕;Id : integer;Score : integerend;
檔案 • 檔案的宣告方式如下 type 檔案定義名稱 = File of 型態;var 檔案變數名稱 : 檔案定義名稱; 或 var 檔案變數名稱 : File of 型態; 如, typeFiletype = File of char;varV6 : FileType;或varV6 : File of char; Pascal語言以循序存取(sequential access)的方式對檔案中的資料做處理,並未支援隨機存取(random access)
常用的檔案處理函數 • reset( ) • 開啟一個已經存在的檔案作讀取資料之用。語法為reset (檔名); • rewrite( ) • 開啟一個檔案(若不存在則create)作寫入資料之用語法為rewrite(檔名); • assign( ) • 將實體檔案名稱指定給檔案變數,語法為assign(檔案變數,實體檔案名稱); • close( ) • 關閉一個已經開啟的檔案,語法為close(檔名); • EOLN( ) • 檢查是否到達檔案中一列的尾端,語法為EOLN(檔名); • EOF( ) • 檢查是否到達檔案尾端,語法為EOF(檔名);
控制結構 • 基本控制結構共有三類 • 循序結構(sequential structure) • 敘述會按照先後順序來執行 • 選擇結構(selection structure) • 單路選擇 • 雙路選擇 • 多重選擇 • 反覆結構(iteration structure) • 前測迴路 • 後測迴路
單路選擇if <條件> then exp 雙路選擇if <條件> then exp 1 else exp 2 當條件成立或不成立時,需執行的敘述超過一行時(即為複合敘述時),必需以“begin..end”加以標示 單路選擇與雙路選擇結構
多重選擇結構 • 多重選擇結構即為case結構 • 語法結構如下case <選擇運算式> of <選擇標記1>: exp 1; <選擇標記2>: exp 2; .... [else exp N]end; • 在以上的case結構中之else敘述不一定存在,若存在則表示將處理所有未列舉出來的情況 • Pascal語言的case結構屬於內隱分歧(implicit branch)的控制結構
while loop • 語法 while <條件> dobegin 迴圈敘述 end; • while迴路屬於前測迴路(PreTest Loop) • 進入迴圈前先檢查條件是否成立 • 迴圈敘述可能一次也不會執行
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. sum=1+2+3+…+10
for loop • Pascal語言提供二類計數反覆敘述 • for <控制變數>:=<初值> to <終值> dobegin 迴圈敘述 end; • for <控制變數>:=<初值> downto <終值> dobegin迴圈敘述 end;
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. sum=1+2+3+…+10
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.
repeat until loop • repeat 迴圈敘述 until <條件>; • repeat..until迴路屬於後測迴路(PostTest Loop) • 離開迴圈時檢查條件是否成立 • 迴圈敘述至少會執行一次
副程式 • 副程式的執行模式 • 副程式的執行動作是因為呼叫程式呼叫了副程式所引起 • 當呼叫程式呼叫副程式時會將程式的控制流程轉移到副程式開始處 • 待副程式執行結束時會將程式的控制流程轉移到呼叫程式中呼叫副程式敘述的下一個敘述 • 副程式執行時可改變其所處的環境的狀態
副程式 • 副程式的種類 • 程序(procedure) • 沒有傳回值 • 函式(function) • 函式與程序類似,最大的不同之處是函式會傳回一個值 • 函式本身亦具有型態 • 函式也可作為運算式的一部分
副程式 • 副程式中宣告之變數為區域變數 • 領域(scope)為定義該區域變數之副程式段 • 範圍(extend)則為副程式段被呼叫時開始至副程式段執行結束時為止 • 採靜態領域法(static scoping)來處理變數定義問題
參數傳遞 • Pascal語言參數傳遞的方法分為二類 • 傳值呼叫法(call by value) • 內定參數傳遞法,型式參數不需做記號 • 傳址呼叫法(call by reference) • 型式參數需以“var”做記號
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。 範例
精選習題 • Pascal語言如何處理dangling else問題? • 請說明常見的迴圈結構中之前測迴路與後測迴路之意義各別為何?並請詳細描述前測迴路與後測迴路中的迴圈敘述執行的最少次數為何? • 何以Pascal程式要呼叫宣告在後面的程序(procedure)或函數(function)時,須要有前置宣告(forward declaration)在呼叫程序之前? • 試問C語言和Pascal語言的for敘述有何不同?二種語言不同設計的主要理由為何? • 試寫出Pascal語言裡的結構化資料型態有那些? • 試寫出Pascal語言裡的五種純量(scalar)型態?