第一章 Pascal語言概述與預備知識
1 關於Turbo Pascal
Pascal是一種計算機通用的高級程式設計語言。它由瑞士Niklaus Wirth教授於六十年代末設計並創立。
以法國數學家命名的Pascal語言現已成為使用最廣泛的基於DOS的語言之一,其主要特點有:嚴格的結構化形式;豐富完備的數據類型;運行效率高;查錯能力強。
正因為上述特點,Pascal語言可以被方便地用於描述各種算法與數據結構。尤其是對於程式設計的初學者,Pascal語言有益於培養良好的程式設計風格和習慣。IOI(國際奧林匹克信息學競賽)把Pascal語言作為三種程式設計語言之一, NOI(全國奧林匹克信息學競賽)把Pascal語言定為唯一提倡的程式設計語言,在大學中Pascal語言也常常被用作學習數據結構與算法的教學語言。
在Pascal問世以來的三十餘年間,先後產生了適合於不同機型的各種各樣版本。其中影響最大的莫過於Turbo Pascal系列軟體。它是由美國Borland公司設計、研製的一種適用於微機的Pascal編譯系統。該編譯系統由1983年推出1.0版本發展到1992年推出的7.0版本,其版本不斷更新,而功能更趨完善。
詳情
下面列出Turbo Pascal編年史
出版年代
版本名稱
主要特色
1983
Turbo Pascal 1.0
Turbo Pascal 2.0
Turbo-87 Pascal
提高實數運算速度並擴大值域
1985
Turbo Pascal 3.0
增加圖形功能
Turbo BCD Pascal
特別適合套用於商業
1987
Turbo Pascal 4.0
提供集成開發環境(IDE),引入單元概念
1988
Turbo Pascal 5.0
增加調試功能
1989
Turbo Pascal 5.5
支持面向對象的程式設計(OPP)
1990
Turbo Pascal 6.0
提供面向對象的套用框架和庫(Turbo Vision)
1992
Turbo Pascal 7.0
面向對象的套用系統、更完善的IDE
Turbo Vision 2.0
1993
Borland Pascal 7.0
開發 Object Windows庫、
(For Windows)
提供對OLE多媒體套用開發的支持
1995
Delphi
Visual Pascal
Turbo Pascal語言是編譯型程式語言,它提供了一個集成環境的工作系統,集編輯、編譯、運行、調試等多功能於一體。
1.2 Turbo Pascal 或 Borland Pascal 的啟動
(1) Turbo Pascal的啟動
a.DOS下的啟動(適用於MS-DOS6.22之前的版本或Win 9X & Win2000 的Command Mode)
DOS下,在裝有Turbo Pascal的檔案目錄下,鍵入turbo即可進入Turbo Pascal集成環境。
b.Win9X或Win2000模式下的啟動(適用於Turbo Pascal 3.0以後的版本)
如果在Win9X或Win2000的“資源管理器”裝有Turbo Pascal的目錄中,雙擊turbo.exe或在“開始--程式”選單中通過MS-DOS方式來運行turbo.exe,它會提示你“該程式設定為MS-DOS方式下運行,並且其它程式運行時,無法運行它。如果選擇繼續所有其它程式將關閉”,所以在Win9X或Win2000下無法直接運行它,這時你可以在你希望的地方(比如說桌面上)單擊滑鼠右鍵“新建--捷徑”,單擊“瀏覽”,找到turbo.exed選中,然後單擊“打開”,再單擊“下一步”,再單擊完成;這還沒完,選中前面新建的捷徑(應該叫Turbo Pascal吧),單擊右鍵,單擊“屬性”,選擇“程式”,然後再單擊“高級”,把“MS-DOS方式”前面的那個勾去掉,也就是不要選“MS-DOS方式”,然後單擊“確定”,在單擊“確定”就大功告成了,以後你運行Turbo Pascal的時候,只要雙擊那個你建立起的捷徑就可以直接在Win9X或Win2000下運行Turbo Pascal。
(2)Borland Pascal的啟動
Borland Pascal的啟動沒有像Turbo Pascal那樣複雜,一般來說在任何情況下雙擊bp.exe或是在MS-DOS下運行都不會出現什麼問題。
Pascal基本教程 第二章
Pascal語言基礎知識
2.1 Pascal程式基本組成
例1.1計算半徑為R的圓面積S
program Area; {程式首部}
{已知半徑求圓的面積}
const pi=3.14159;{說明部分——數據描述}
var s,r:real;
begin {執行部分}
readln(r);
s:=pi*sqr(r);
writeln('s=",s);
end.
上述程式第一行稱為程式首部。其中用花括弧(注釋可以用{ }或(* *)來表示)括起來的內容是注釋,程式第二行就是一個注釋,注釋除了給人看,增加程式的可讀性外,對程式編譯和運行不起作用。一個程式可以包含多個出現在不同處注釋,亦可無注釋。程式第三行是常量說明,程式第四行是變數說明。程式從begin到end都是執行(語句)部分
(1)程式首部
例1.1的第一行稱為程式首部。program是保留字,接著是程式名(由你依據“標示符”規則自行定義),最後以分號表示程式首部結束,下面是程式主體的開始。程式首部在一個Turbo Pascal(僅在Turbo Pascal中有效)程式中並非必須出現,它是可選的。寫上它僅起了文檔作用。因此,在時間有限的情況下,如果用Turbo Pascal編程完全可以省略程式首部。
(2)程式體
a.說明部分
說明部分用於定義和說明程式中用到的數據,由單元說明、標號說明、常量說明、類型說明、變數說明、函式或過程說明組成,並且這些數據的說明次序必須按照以上次序。但是一個簡單的Turbo Pascal程式也可以不包含說明部分,也就是說說明部分是可選的。
b.執行部分
執行部分描述了程式要執行的操作。它必須以一個Turbo Pascal保留字begin開始,以保留字end後跟句點結束,其間是一些執行具體操作的語句,並且以分號作為語句之間的分隔設定。begin 和end必須成對出現,這是一個Turbo Pascal程式所必須有的。緊跟end之後的句號表示執行部分的結束,也表示整個程式的結束。此後的任何語句都無效。Turbo Pascal規定緊隨end之前出現的分號允許省略。
(3)一個完全的Pascal程式結構
program 程式名;
uses
已知單元說明;
label
標號說明;
const
常量說明;
type
類型說明;
var
變數說明;
function
函式說明;
procedure
過程說明;
begin
語句;
語句;
……
語句
end.
2.2 Pascal字元與符號
1.保留字(關鍵字)
所謂保留字是指在Pascal語言中具有特定的含義,你必須了解它的含義,以便於正確的使用,否則會造成錯誤。標準Pascal語言中的保留字一共有35個,Turbo Pascal語言一共有51個。下面是Pascal語言的保留字(斜體是Turbo Pascal特有的保留字):
AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,FUNTION,GOTO,IF,IN,LABEL,MOD,NIL,NOT,OF,OR,PACKED,PROCEDURE,PROGRAM,RECORD,REPEAT,SET,THEN,TO,TYPE,UNTIL,VAR,WHILE,WITH,EXPORTS,SHR,STRING,ASM,OBJECT,UNIT,CONSTRUCTOR,IMPLEMENTATION,DESTRUCTOR,USES,INHERITED,INLINE,INTERFACE,LIBRARY,XOR,SHL
2.標識符
(1)表識符的定義:標識符就是以字母開頭的字母數字序列,有效長度為63個字元,並且大小寫等效。可以用來標示常量、變數、程式、函式等。例如例1.1中的Area(程式名),pi(符號常量),s、r(變數名)都是標識符。
(2)表識符的分類:
a.標準標識符:指Pascal語言預先定義的表識符,具有特殊含義。
以下列舉了Turbo Pascal語言部分常用的標準表識符:
標準常量 False Maxint True
標準類型 Boolean Char Real Integer
標準函式 Abs arctan Chr Cos EOF Eoln Exp
Ln Odd Ord Pred Round Sin Sqr
Sqrt Succ Trunc
標準過程 Dispose Get New Pack Page Put Read
Readln Reset Rewrite unpack Write Writeln
標準檔案 Input Output
b.用戶字定義表識符:由你來根據需要定義。
(1)選用的表識符不能和保留字相同。
(2)語法上允許預定義的標準標識符作為你定義的的表識符使用,但最好還是不要用。
以下列舉了你在定義表識符時可以用的字元:
A——Z;a——z;0——9;+,-,*,/,=,<>,<=,>=,<,>,(,),【,】,{,},:=,,,;,.,:,..,",^
2.3 Pascal數據類型
數據是程式設計的一個重要內容,其重要特徵----數據類型,確定了該數據的形、取值範圍以及所能參與的運算。
Turbo Pascal 提供了豐富的數據類型,這些數據類型可以分為三大類:簡單類型、構造類型和指針類型,其中簡單類型可以分為標準類型(整型、實型、字元型和布爾型)和自定義類型(枚舉型和子界型),構造類型可以分為數組類型、集合類型、記錄類型和檔案類型。這些數據類型中除了指針類型是動態數據類型外,其他的都是靜態數據類型。在這些數據類型中簡單類型都是有序類型,除了實型以外的簡單類型都是順序類型,所謂順序類型就是他們的值不僅是有序的而且是有順序號。
在這裡主要介紹整型、實型、字元型和布爾型四種常用的數據類型。
1.整型
一個整型數據用來存放整數。Turbo Pascal支持五種預定義整型,它們是shortint(短整型)、 integer(整型)、 longint(長整型)、 byte(位元組型)和 word(字類型),Turbo Pascal分別用相同的名字作為他們的表識符。每一種類型規定了相應的整數取值範圍以及所占用的記憶體位元組數。
類型 數值範圍 占位元組數 格式
shortint -128..128 1 帶符號8位
inteter -32768..32767 2 帶符號16位
longint -2147483648..2147483647 4 帶符號32位
byte 0..255 1 帶符號8位
word 0..65535 2 帶符號16位
Turbo Pascal規定了兩個預定義整型常量表識符maxint和maxlonint,他們各表示確定的常數值,maxint為32767, longint為2147483647,他們的類型分別是integer 和longint。
2.實型
一個實型數據用類存放實數。Turbo Pascal支持五種預定義實型,它們是real(基本實型)、 single(但精度實型)、double(雙精度實型)、extended(擴展實型)、comp(裝配實型),Turbo Pascal分別用相同的名字作為他們的表識符。每一種類型規定了相應的實數取值範圍、所占用的記憶體位元組數以及它們所能達到的精度。
類型 數值範圍 占位元組數 有效位數
real 2.9e-39..1.7e38 6 11..12
single 1.5e-45..3.4e38 4 7..8
double 5.0e-324..1.7e308 8 15..16
extended 3.4e-4932..1.1e4932 10 19..20
comp -2**63+1..2**63-1 8 19..20
Turbo Pascal支持兩種用於執行實型運算的代碼生成模式:軟體仿真模式和80x87浮點模式。除了real可以在軟體仿真模式下直接運行以外,其他類型必須在80x87浮點模式下運行。
3.布爾型
一個布爾型數據用來存放邏輯值(布爾值)。布爾型的值只有兩個:false和true,並且false的序號是0,true的序號是1。false 和true都是預定義常數表識符,分別表示邏輯假和邏輯真。並且true<false。boolean是布爾型的表識符。
4.字元型
字元型用char作為表識符。字元型必須用單引號括起來,字母作為字元型時,大小寫是不等價的,並且字元型只允許單引號中有一個字元,否則就是字元串。
2.4 常量與變數
1.常量
(1)常量:在某個程式的整個過程中其值不變的量。
(2)常量定義:常量定義出現在說明部分。它的語法格式是:
const
<常量標識符>=<常量>;
...
<常量標識符>=<常量>;
常量表識符的類型由定義它的常量的類型決定。例如:const a=12 隱含說明a是整型;const r=3.21 隱含說明r是實型......
(3)常量定義部分必須以保留字const開頭,可以包含一個或幾個常量定義,而且每個常量均以分號結束。
(4)Turbo Pascal類型常量
類型常量,又稱變數常數,它是Turbo Pascal的一個擴充特性。類型常量的定義與標準Pascal規定的常數定義和變數說明有所區別。類型常量定義的語法格式:
const
<簡單類型常量標識符>:簡單類型=常數;
例如:
const
counter:integer=0;
flag:boolean=true;
index:0..100=0;
2.變數
(1)變數:在某個程式中的運行過程中其值可以發生改變的量
(2)變數說明:變臉說明出現在說明部分。它的語法格式是:
var
<變數標識符列表>:<類型>;
...
<變數標識符列表>:<類型>;
其中,保留字var表示開始一個變數說明部分。變數標識符列表是一個用逗號隔開的標識符序列,冒號後面的類型是類型標識符。每個變數說明均以分號結束。
例如:
var
a,b,c:integer;
m,n:real;
2.5 標準函式
1.算術函式
函式標識符
自變數類型
意義
結果類型
abs
整型、實型
絕對值
同自變數
arctan
整型、實型
反正切
實型
cos
整型、實型
餘弦
實型
exp
整型、實型
指數
實型
frac
整型、實型
小數部分
實型
int
整型、實型
整數部分
實型
ln
整型、實型
自然對數
實型
pi
無自變數
圓周率
實型
sin
整型、實型
正弦
實型
sqr
整型、實型
平方
同自變數
sqrt
整型、實型
平方根
實型
例:
abs(-4)=4
abs(-7.49)=7.49
arctan(0)=0.0
sin(pi)=0.0
cos(pi)=-1.0
frac(-3.71)=-0.71
int(-3.71)=-3.0
sqr(4)=16
sqrt(4)=2
2.標量函式
函式標識符
自變數類型
意義
結果類型
odd
整型
判斷奇數
布爾型
pred
離散類型
求前趨
同自變數
succ
離散類型
求後繼
同自變數
例:
odd(1000)=false
odd(3)true
pred(2000)=1999
succ(2000)=2001
pred('x')="w"
succ('x')="y"
3.轉換函式
函式標識符
自變數類型
意義
結果類型
chr
byte型
自量對應的字元
字元型
ord
離散類型
自量對應的序號
longint
round
實型
四捨五入
longint
trunc
實型
截斷取整
longint
4.雜類函式
函式標識符
自變數類型
意義
結果類型
random
無自變數
【0,1)之間的隨機實數
real
random
word
【0,自變數)之間的隨機整數
wird
randomize
無自變數
用一隨機值初始化內部隨機數產生器
longint
upcase
字元型
使小寫英文字母變為大寫
字元型
2.6 運算符和表達式
1.運算符和優先權
(1)運算符
a.算術運算符 運算符
運算
運算對象
結果類型
+
加
整型、實型
只要有一個運算對象是實型,結果就是實型,如果全部的運算對象都是整型並且運算不是除法,則結果為整型,若運算是除法,則結果是實型
-
減
整型、實型
*
乘
整型、實型
/
除
整型、實型
div
整除
整型
整型
mod
取余
整型
整型
b.邏輯運算符
運算符
運算
運算對象
結果類型
not
邏輯非
布爾型
布爾型
and
邏輯與
布爾型
布爾型
or
邏輯或
布爾型
布爾型
xor
邏輯異或
布爾型
布爾型
c.關係運算符
運算符
運算
運算對象
結果類型
=
等於
簡單類型
布爾型
<>
不等於
簡單類型
布爾型
<
小於
簡單類型
布爾型
>
大於
簡單類型
布爾型
<=
小於等於
簡單類型
布爾型
>=
大於等於
簡單類型
布爾型
(2)優先權
運算符
優先權
not
1(高)
*,/,div,mod,and
2
xor,+,-,or
3
in,=,<>,>=,<=,<>
4(低)
2.表達式
(1)算術表達式:算術表達式是由算術運算符連線常量、變數、函式的式子。算術表達式中各個運算符的次序為: ( )-->函式-->*,/,div,mod-->+,1
(2)布爾表達式:Turbo Pascal提供給布爾表達式以下基本操作:邏輯運算和關係運算。
Pascal基本教程 第三章
順序結構程式設計 </P><P>3.1 賦值語句
賦值語句是最簡單的語句,其一般形式為:
<變數>:=<表達式>
賦值語句的作用是計算表達式的值,並賦給變數。對於任何一個變數必須首先賦值,然後才能引用,否則,未賦初值的變數將以一個隨機值參與運算。另外,賦值號兩邊的類型必須相同,但表達式值為整數時,它可自動化為實型後賦給該實型變數,即符合賦值相容。
例:關於賦值的例子
program example;
var a,b:integer;
begin
a:=3;b:=2;
writeln(a);
writeln(b);
a:=a+b;
writeln(a);
writeln(b);
b:=a-b;
writeln(a);
writeln(b);
a:=a-b;
writeln(a);
writeln(b);
readln
end.</P><P>
3.2 輸入語句
通過計算機的外設把數據送到計算機記憶體的過程稱為輸入。Turbo Pascal語言的輸入語句有如下兩種形式:
read(<變數名表>);
readln(<變數名表>);
<輸入項表>是一個或幾個由逗號隔開的變數標識符,他們必須在程式說明部分預先說明,他們可以是整型、實型或字元型,布爾型不可以直接讀入。
例如a,b,c為整型變數,read(a,b,c)之後
鍵盤輸入:20 30 40 <CR>(<CR>表示回車)
結果: a=20,b=30,c=40
readln語句和read語句不同之處在於輸入數據到各變數之後,readln自動換行,從下一行開始再輸入數據。一個read語句執行完後,數據行中多餘的未讀數據可以被下一個輸入語句讀入;而一個readln於執行完後,數據行中多餘未讀數據就沒有用了。readln語句中可以不包含變數名表。即有以下等價情況:
readln(a,b);readln等價於readln(a,b)
輸入語句輸入的數據類型必須和變數一一對應。如果輸入的是一串整數或實數,數據間用空格或回車分隔;若輸入的是一串字元,則不用分隔。
例:輸入語句示例
program shuru;
var
x:real;
c:char;
begin
write('please input the number: ($XXX.XX)');
readln(c,x);
writeln('The price is ',c,x)
end.
3.3 輸出語句
輸出是將記憶體中的數據送到外設的過程。Turbo Pascal的輸出語句有兩種形式:
write(<輸出項表>)
writeln(<輸出項表>)
其中<輸出項表>是一串用逗號分隔的常量、變數、函式名、表達式或字元串。如果是變數、函式名、表達式,則將其計算結果輸出;如果是常量或字元串,則直接輸出其值。
writeln和writeln的區別在於:write語句是輸出項輸出後,不換行,游標停留在最後一項後,writeln語句按項輸出後,自動換行,游標則停留在下一行的開始位置。
writeln語句允許不含有輸出項,即僅writeln;表示換行。
Turbo Pascal語言把輸出項的數據顯示占用的寬度稱為域寬,你可以根據輸出格式的要求在輸出語句中自動定義每個輸出項的寬度。定義寬度時分為單域寬和雙域寬。
(1)單域寬輸出格式:
writeln(I:n)
在n個字元寬的輸出域上按右對齊方式輸出I的值,若n大於I的實際位數,則在I值前面補(n-I的實際位數)個空格。若I的實際位數大於n,則自動突破限制。n必須是整數。
(2)雙域寬輸出格式:
writeln(a:m:n)
雙域寬主要用於實型數據的輸出。n的用法同上。在n個字元寬的輸出域上按右隊齊方式用小數點形式輸出a的數值,m是小數點後的位數。原來的數據按該該格式指定的小數位數四捨五入。若m=0 ,則不輸出小數部分和小數點,原數據四捨五入取整。n,m必須是整數。
例:輸出語句的例子
program shuchu;
const
s="pascal";
var
i:integer;
r:real;
c:char;
b:boolean;
begin
i:=12345;
r:=123.45
c:="a";
b:=true;
writeln('i=");
writeln(i:6);
writeln("r=",r,r:6:1);
writeln("c=",c,c:10);
writeln("b=",b,b:10)
end.
3.4 複合語句
複合語句是由若干語句組成的序列,語句之間用分號“;”隔開,並且以begin和end括起來,作為一條語句。複合語句的一般形式:
begin
語句1;
語句2;
……
語句n;
end
例:變數值的交換
program jiaohuan;
var
a,b,t:integer;
begin
a:=10;b:=20;
begin
t:=a;
a:=b;
b:=t;
end;
writeln("a=",a,"b=",b)
end.
Pascal基本教程 第四章
4.1 if語句
IF語句是由一個布爾表達式和兩個供選擇的操作序列組成。運行時根據布爾表達式求值結果,選取其中之一的操作序列執行。有兩種形式的IF語句:
if <布爾表達式> then <語句>;
if <布爾表達式> then <語句1>
else <語句2>;
當布爾表達式的值為真,則執行then後面的語句,值為假時有兩種情況:要么什麼也不做,要么執行else後面的語句。注意else前面沒有分號,因為分號是兩個語句之間的分隔設定,而else並非語句。如果在該處添了分號,則在編譯的時候就會認為if 語句到此結束,而把else當作另一句的開頭,輸出出錯信息。
例:求y=f(x),當x>0時,y=1,當x=0時,y=0,當x<0時,y=-1
program lianxi;
var x,y:real;
begin
if x>0 then y:=1;
if x=0 then y:=0;
if x<0 then y:=-1;
writeln("y=",y);
end.
在Turbo Pascal語言if語句中被構造的語句只能是一條語句,當條件選擇某個分支的計算要用多個語句描述時,就必須把該分支用begin和 end括來,寫成複合語句。在用if語句連續嵌套時,如果你插入適量的複合語句,有利於程式的閱讀和理解。
例:當x>0時候,計算x*x,並且輸出x和x*x,
program lianxie3;
var x,x1:real;
begin
readln("x=",x);
if x>= then
begin
x1:=x*x;
writeln("x*x=",x1);
writeln("x=",x);
end;
end.
當if 語句嵌套時,Turbo Pascal約定else總是和最近的一個if配對。
4.2 case語句
case語句是由一個表達式和眾多可選擇的操作序列組成。運行時,根據表達式的求值結果,在眾多的分支中選取一個分支執行。其形式為:
case 表達式 of
常量1:語句1;
常量2:語句2;
……
常量n:語句n;
else 語句 n+1 {可選項}
end;
表達式只能是順序類型(除了實型以外的簡單類型),其值必須是唯一確定並且和表達式類型相同。case語句執行和表達式值相匹配的case常數所指向的那條語句,如果沒有相匹配的值,則執行else部分(如果有的話)或者什麼也不做。在else前面的語句末尾有分號,這是和if語句不同的。
例:根據學生的成績給予相應的等低,對應關係如下:
90——100 A
80——89B
60——79C
60以下 D
program chengji;
var s:real;ch:char;
begin
write("input the score: ');
readln(s);
if(s>=0)and(s<=100)then
case s div 10 of
10,9:ch:="B";
8:ch:="B";
7,6:="C";
else ch:="D";
end;
writeln(s,'--',ch);
end.
Pascal基本教程 第五章
循環結構程式設計
5.1 while語句
while語句用於“當滿足某一條件時進行循環”的情況。while語句的語法格式:
while 布爾表達式 do 語句;
循環結束條件在進入循環體之前測試,若最初的測試值為false,則根本不進入循環體,也就是說while循環是是屬於當型循環。為了能使while重複能終止,循環體中一定要有影響布爾表達式的操作,否則該循就是一個死循環。
例:計算從0到某個數之間所有奇數的和。
program jishu;
var odds,limit,sum:integer;
begin
readln(limit);
sum:=0;
odds:=1;
while odds<=limit do
begin
sum:=sum+odds;
odds:=odds+2
end;
writeln(sum:1)
end.
5.2 repeat語句
repeat 語句用於“重複執行循環體,一直到指定的條件為真時為止”。語法格式為:
repeat
語句1;
……
語句n;
until 布爾表達式;
repeat重複基本上有和while重複一樣的描述循環計算的能力,但有一些不同:在repeat語句的結構中,布爾表達式求值在計算操作之後,而while語句中,布爾表達式求值在計算操作之前,也就是說repeat至少執行一次循環體。while語句的成分語句只能是一個語句。因此,當重複動作包含多個語句時,要用begin和end ,使它變成一個複合語句。而repeat語句的保留字repeat和until已經起語句括弧作用,可以包含多個語句而無須begin和end。repeat語句中,當布爾表達式為true時結束循環,而while語句中,是當表達式為false時才結束循環。當描述由計算操作後的情況確定重複是否繼續進行的計算時,通常用repeat語句描述。
5.3 for 語句
for 語句用來描述已知重複次數的循環結構。for 語句有兩種形式:
(1) for 控制變數:=初值 to 終值 do 語句;
(2) for 控制變數:=初值 downto 終值 do 語句;
第一種形式的for 語句是遞增循環。首先將初值賦給控制變數,接著判斷控制變數的值是否小於或等於終值,若是,則執行循環體,在執行了循環體之後,自動將控制變數的值該為它的後繼值,並重新判斷是否小於或等於終值。當控制變數的值大於終值時,退出for循環,執行for語句之後的語句。第一種形式的for 語句是遞減循環。首先將初值賦給控制變數,接著判斷控制變數的值是否大於或等於終值,若是,則執行循環體,在執行了循環體之後,自動將控制變數的值該為它的前趨值,並重新判斷是否大於或等於終值。當控制變數的值小於終值時,退出for循環,執行for語句之後的語句。for 語句中的初值、終值、控制變數的數據都必須是順序類型。當初值和終值確定後,重複的次數就確定不變了,並且控制變數在重複語句內不能施加任何賦值操作。
例:計算1+2+3+……+99+100
program jia;
var n,sum:integer;
begin
sum:=0;
for i:=1 to 100 do
sum:=sum+i;
writeln(sum);
end.
5.4 goto語句
goto語句是一種無條件轉向語句,它可以控制直接從程式的一條語句轉向另一條語句。goto語句的語法形式為:
goto 標號;
其中標號必須是不超過4位整數的正整數或標識符組成,但標號必須在說明語句中先予以說明。
goto語句會使程式出現一種稱為“亂麵條”的結構,因此你最好還是不要去用。
Pascal基本教程 第六章枚舉型和子界型
6.1 類型定義
類型定義的語法格式:
type
<標識符1>=<類型1>;
<標識符1>=<類型1>;
……
<標識符n>=<類型n>;
6.2 枚舉類型
通過預定義列出所有值的標識符來定義一個有序集合,這些值的次序和枚舉類型說明中的標識符的次序識一致的。枚舉類型的形式:(標識符1,……,標識符n)
例如:type daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday)
枚舉元素只能是標識符,而不能是數值常量或字元常量。例如以下的定義是錯誤的:
type daystype=('sun','mon','tue','wed','thu','fri','sat')
枚舉元素是標識符,不要把作為枚舉元素的標識符視作變數名,它不能被賦值。同一個枚舉元素不能出現在兩個或兩個以上的枚舉類型定義中。例如以下的定義是錯誤的:
type daytype1=(monday,tuesday);
daytype2=(monday,wednesday);
可以將枚舉類型的定義和變數的定義結合在一起。例如:var a:(monday,tuesday,sunday)
枚舉類型屬於順序類型。根據定義類型時各枚舉元素的排列順序確定它們的序列,序列號從0開始。
例如:已經定義daystype
ord(sunday)=0,succ(sunday)=monday,pred(friday)=thursday
但是枚舉類型中的第一個元素沒有前趨,最後一個元素沒有後繼。Turbo Pascal不允許直接讀寫枚舉值,所以枚舉值的輸出常用case語句間接的輸出。枚舉值的輸入,則要一一判斷讀入字元是否是枚舉類型的標識符。若是才能賦給枚舉變數,否則就會出錯。
例如:枚舉值的輸出
case day of
sunday:write('sunday');
monday:write('monday');
tuesday:write('tuesday');
wednesday:write('wednesday');
thursday:write('thursday');
friday:write('friday');
saturday:write('saturday');
end;
6.3 子界類型
子界類型是由整型、字元型、枚舉型、布爾型的兩個常量指定該類型的值域區間。子界類型的形式:
常量..常量
兩個常量必須是同一種順序類型。例如:a..b,要求a<=b
例如:
type a=1..3;
b="a"..'d';
一個子界類型繼承它的常量類型的運算符和標準函式,常量類型相容的不同子界類型可以混合運算,可以賦值。可以將子界類型的定義和變數的定義結合在一起。例如:var a:1..9
例 按月、日、年順序讀入一日期,輸出該日期是這一年中的第幾天。
program date;
var year:0..2010;
month,i:1..12;
day:1..31;
dayth:integer;
begin
read(month,day,year);
dyath:=0;
for i:=1 to month-1 do
case i of
1,3,5,7,8,10,12:dayth:=dayth+31;
2:if ((year mod 4=0)and(year mod 100<>0)or(year mod 400 =0)
then dayth:=dayth+29
else dayth=:=dayth+28;
4,6,9,11:dayth:=dayth+30;
end;
dayth:=dayth+day;
writeln(dayth)
end.
6.4 類型相容和賦值相容
1.類型相容性
類型相容是對參加同一運算的兩個對象的類型要求。設有兩個變數,如果滿足下列條件之一,就說這兩個變數的類型相容。
(1)兩個變數的類型相同
a.兩個變數被同一類型說明。
例如:var a,b:1..30;
b.兩個變數的類型是同一類型標識符。
例如:var a:1..30;
b:1..30;
c.兩個變數的類型是不同的類型標識符,但在類型定義中已經說明兩個標識符相同。
例如:type date=1..100;
range=date;
var m:data;
n:range;
(2)一個變數的類型是另一個變數的子界。
(3)兩個變數的類型都是同一基類型的子界。
(4)兩個變數的類型是基類型相容的集合類型。
(5)兩個變數的類型是成分相同的串類型。
2.賦值相容性
賦值相容是對賦值操作的兩個對象的類型要求。設賦值語句“:=”左邊的變數類型為T,右邊表達式的類型為E,若類型T和類型E滿足下列條件之一,則稱他們是賦值相容的。
(1)T和E是相同的類型,而且類型不是檔案類型,也不是具有檔案類成分的構造類型。
(2)T是實型,而E是整型或整型的子界。
(3)T和E是類型相容的順序類型,並且E的值不超出T所定義的值的範圍
(4)T和E是類型相容的集合類型,並且E的值不超出T所定義的值的範圍
(5)T和E是類型相容的串類型。
當T和E是順序類型或都是集合類型時,不僅要求這兩個類型是相容的,而且要求E的值不超出T所定義的值的範圍;否則將產生類型溢出,而這種錯誤只能在你運行程式時進行檢查,因此你必須要避免不發生這種錯誤。
Pascal基本教程 第七章
7.1 數組
1.數組的定義
數組是程式中最常用的結構數據類型,用來描述由固定數目的同一類型的元素組成的數據結構。數組的每個元素和下標相關聯,根據下標指示數組的元素。數組的存儲方式為按行存儲,在編譯階段,計算機根據數組的類型說明,確定其存儲空間的大小。數組可以是任何順序類型。
數組的定義形式:
array 【<下標類型1>,……<下標類型n>】 of <元素類型>
其中n稱為數組的維數,每維的下標類型必須是一個順序類型,通常為子界類型或枚舉類型,其作用是指定數組下標的編制方式和下標取值範圍。
例如:
type
color=(red,yellow,blue);
sample1=array 【1..10】of integer;{有10個元素的一維數組}
sample2=arrayp【1..5,1..5】of real;{有25個元素的二維數組,依次按【1,1】……,【1,5】,【2,1】……,【2,5】,……【5,1】,……【5,5】}
2.數組的操作
當數組的元素類型為簡單類型時,其下標變數和簡單類型變數一樣使用。例如:
a【50】:=50; a【20】:=a【5】;
一個數組,下標的起始值和終止值是在類型定義中給定的,不能在程式執行中再通過其他途徑來改變,所以數組元素的個數在程式運行期間是固定不變的。數組變數作為整體僅允許同類型數組之間的賦值運算。
例如:var x,y:array【1..10】of integer;
x::=y
例:讀入5個學生的學號和成績,計算他們的平均分,若比平均分高10分的等第為A,若比平均分高小於10分的等地為B,若低於平均分,則等第為C,輸出他們的成績和等第。
program sample7d1(input,output);
const n=5;
type
no=array【1..n】 of integer;
s=array【1..n】of real;
var
i:integer;
k:real;
num:no;
score:s;
begin
k:=0;
for i:=1 to n do
begin
readln(num,score);
k:=k+score;
end;
k:=k/n;
for i:=1 to n do
begin
write(num,score);
if (score-k)>=10 then writeln('A')
else if((score-k)<10)and((score-k)>0) then writeln('B')
else writeln('C');
end;
end.
7.2 字元串
為了使程式能夠處理文字信息,Turbo Pascal特別引入了字元串類型,其值表示一個具有可變長度的字元序列。字元串類型定義形式為:
strign【n】或者string
其中正整數n(1<=n<=255)表示構成字元串的字元最多個數,即通常所說的字元串最大長度。而字元串的實際長度決定程式運行時的實際字元個數,可以由函式length返回。若字元串說明中沒有指定長度,預設值為255。
字元串類型定義字元串連線操作‘+’,是將兩個字元串連線成新字元串。連線操作允許字元串類型和字元串類型混合運用。
字元串常量可以通過常量說明語句
const 字元串常量名:string【n】="字元串";
規定其常量的串長n,並賦初值。例如:const head:string【7】="zhoufei";
Turbo Pascal還提供了不少預定義函式和過程:
(1)字元串函式 函式名
自變數及類型
意義
結果類型
concat
s1【,s2……,sN】:string
連線字元串序列
string
copy
s:string,index,count:integer
返回串s的一個子串
string
length
s:string
返回串s的動態長度
integer
pos
substr,s:string
返回子串substr在串s中的起始位置
byte
(1)字元串過程
過程名
自變數及類型
意義
delete
var s,source:string;index,count:integer
從串S中刪除一個子串
insert
var s:string;index:integer;
在串S中插入一個指定子串
str
var x【:width【:Decimals】】;s:string
把一數值轉換成相應的字元串表示
val
var s:string;code:integer
把一字元串轉換成相應的數值
例:字元串函式調用示例
program samplefun;
const
tur="turbo";
pas="pascal";
var
st:string【60】;
p:byte;
begin
st:=concat(tur,pas,'is better than','stand',pas,'.');
writeln(st);
writeln(length(st));
st:=copy(st,29,15);
writeln(st);
p:=pos(pas,st);
writeln(p);
p:=pos(tur,st);
writeln(p);
end.
例:字元串過程調用示例
program guocheng;
const
typedstring:string="turbo pascal is better than standard pascal.";
total:real=388.4;
var
totalstring:string【60】;
integervalue:integer;
realvalue:real;
status:integer;
begin
delete(typedstring,13,40);
writeln(typedstring);
insert('using',typedstring,1);
writeln(typedstring);
str(total:8:2,totalstring);
writeln(totalstring);
str(total,totalstring);
writeln(totalstring);
val('-33',integervalue,status);
writeln(integervalue,'':2,status);
val('-33.99',realvalue,status);
writeln(realvalue:6:2,'':2,status);
end.
Pascal基本教程 第八章
函式和過程 </P><P>8.1 函式
如果一個子程式執行後能夠返回其結果制,那么它就可以用於表達式中,稱這種子程式為函式,這種語句序列的定義稱為函式說明。函式說明形式如下:
function 函式名(形式參數表):函式類型;
說明部分;
begin
語句1;
語句2;
……
語句n
end
函式返回一個函式值,過程則能完成一系列各種操作。函式的調用方式出現在表達式中,而過程調用是一句獨立的語句。
例:計算|X|的函式
function zhoufei(x:real):real;
var z:integer;
begin
if x>=0 then z:=x
else z:=-x
zhoufei:=z;
end;
函式說明第一行為函式首部。它指明函式名、函式形參信息和函式值的數據類型。如上面求x絕對值的函式說明,函式名是zhoufei;它有一個值參數X為實型;函式值的數據類型為實型。Turbo Pascal規定一個函式只能求出一個簡單值,所以函式值類型只能是任何非結構類型。
除函式首部和過程首部的句法略有差別外,函式體和過程體完全相同。函式體中至少要有一條語句對函式名賦值。如函式zhoufei 中有語句“power:=z”。函式的每次求值至少要執行這樣的一條語句,為次計算求得一個值。返回時就把這個值帶調用的地方。
8.2 過程
給某個語句序列組成的子程式賦於一個適當的名字。程式中凡是需要出現這個語句序列的地方,可以簡單的寫上子程式的名字。這種完成一個操作的子程式稱為過程;子程式的定義稱為過程說明。
過程說明由過程首部和過程體組成,其形式如下:
procedure 過程名(形式參數表);-------過程首部
說明部分;
begin
執行語句;
……
end;
例 輸出兩個數中最大值的過程
procedure largest(a,b:integer);
begin
if a>b then writeln(a)
else writeln(b);
end.
上面largest過程由兩個類型為整型的形式參數:a,b,你向過程傳入的兩個需要比較大小的數。
8.3 形參和實參
子程式調用(過程調用或函式調用)的執行順序分為以下幾步:
實參和形參結合——〉執行子程式——〉返回調用處繼續執行
子程式說明的形式參數表對子程式體直接引用的變數進行說明,詳細指明這些參數的類別、數據類型要求和參數的個數。子程式被調用時必須為它的每個形參提供一個實參,按參數的位置順序一一對應,每個實參必須滿足對應形參的要求
Turbo Pascal子程式形參有四類:
1.值參數
形式參數表中前面沒有var,後有類型的參數。它類似過程和函式的局部變數,僅為過程和函式的執行提供初值而不影響調用時實際參數的值。在調用過程或套用函式時,值參數所對應的實際參數必須是表達式,而且它的值不能使檔案類型或包括檔案類型的值。實參必須和形參賦值相容。
2.變數參數
形式參數表中前面有var後由類型的參數。如果需要子程式向調用程式返回值時,應採用變數參數。變數參數要求它的實參是和它同一類型的變數。因為在子程式執行時,遇到對相應形參的引用式定值,就是對相應實參的引用式定值,即對形參的任何操作就是對實參本身的操作。
3.無類型變數參數
形式參數表中前面有var而後面沒有類型的參數。形參是無類型變數,對應的實參允許為任意類型的變數,但要在子程式中設定的強制類型轉換(類型名(無類型變數參數名)),將無類型變數參數改變為相應類型。
4.子程式參數
用過程首部或函式首部作為形式參數。
8.4 標識符的作用域
1.全局變數和它的作用域
全局變數是指在程式開頭的說明部分定義和說明的量。它的作用域分為兩種情況:
(1)在全局變數和局部變數不同名時,其作用域是整個程式。
(2)在全局變數和局部變數同名時,全局變數的作用域不包含同名局部變數的作用域。
2.局部變數和它的作用域
凡是在子程式內部使用的變數,必須在子程式中加入說明。這種在子程式內部說明的變數稱為局部變數。局部變數的作用域是其所在的子程式。形式參數也只能在子程式中有效。因此也屬於局部變數。局部變數的作用域分為兩種情況:
(1)當外層過程式的局部變數名和嵌套過程中的局部變數不同名時,外層過程的局部變數作用域包含嵌套過琛。
(2)當外層過程的局部變數名和嵌套過程內的局部變數名同名時,外層局部變數名的作用域不包含此過程。