pascal语法
一、pascal的基本语法单位
1、基本符号
A——Z;a——z;0——9;+,-,*,/,=,<>,<=,>=,<,>,(,),[,],{,},:=,,,;,.,:,..,',^
注意:pascal语言除了能使用以上规定的基本符号外,不得使用任何其它符号。
2、保留字
AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DIWNTO,ELSE,END,FILE,FOR,FUNTION,GOTO,IF,LABEL,MOD,NIL,OF,OR,PACKED,PROCEDURE,PROGRAM,RECORD,REPEAT,SET,THEN,TO,TYPE,UNTIL,VAR,WHILE,WITH。
注意:所起的文件名不能与保留字相同。
3、标识符
以字母打头的字母数字串,长度小于等于8。
标准标识符(共三十九个):
标准常量:
false,true,maxint
标准类型:
integer,real,char,boolean,text
标准文件:
input,output
标准函数:
abs,arctan,chr,cos,eof,eoln,exp,ln,odd,ord,ored,round,sin,sqr,
sqrt,succ,trunc
标准过程:
get,new,pack,page,put,read,readln,reset,rewrite,unpack,write, writeln
二、程序结构
1、由三大部分组成:程序首部,说明部分,语句部分。
PROGRAM 程序名(input,output);
{……} 解释
CONST
pi=3.14159;
VAR
r,l,s:real;
BEGIN
write('input r:');
read(r);
l:=2*pi*r;
write('l=',l,'s=',s);
END;
2、大量使用标点符号,保留字后不加标点符号(END除外)。
第二章、顺序结构程序设计
一、标准数据类型
1、实型(real)
小数表示法、指数表示法
2、整型(integer)
正、负整数和零
maxint=32767
pred:前导;succ:后继
[例]:pred(3)=2;succ(3)=4;
pred(true)=false;
succ(false)=true
3、字符型(char)
是指在两个单引号中的一个字符。
ord:取序数
[例]:ord('A')=65
4、布尔型(boolean)
false;true
用于布尔型的运算:NOT、AND、OR
ord(true)=1;ord(false)=0
二、常量和变量的定义
常量的定义:CONST
pi=3.14159;
blank=' ';
变量的定义:VAR
r,l,s:read;
cl:char;
三、表达式及赋值语句
[例]:b2-4ac 写成:sqt(b)-4*a*c
赋值:<变量>:=<表达式>
四、输入输出语句
1、输入语句:read(<变量表>);readln(<变量表>)
注:表达式里面变量与变量之间用逗号隔开;
readln表示下一个语句将从下一行开始操作;
输入时,整型或实型用空格或回车隔开,字符型之间无需分隔,一个接一
个输入。
2、输出语句:write(<输出表>);writeln(<输出表>)
注:对real或integer限定场宽:write('a=',a:2:0) {a为real型}
第三章、选择结构程序设计
一、if 语句
格式:IF<条件>
THEN<语句1>
ESLE<语句2>
注:1、ELSE与最近的并且未被配对的ELSE配对;
2、复合,如果THEN或ELSE带有多个语句,则要用BEGIN——END括起来。
二、CASE语句
格式:CASE <表达式> OF
<值表1>:<语句1>
<值表2>:<语句2>
……
<值表n>:<语句n>
[ELSE<语句>]
END
注:1、值表的三种表达方式:“1:”;“2,4,6:”;“10..100:”
2、CHAR,INTEGER,BOOLEAN有序
第四章、循环结构程序设计
一、FOR语句
格式:1、FOR <循环变量>:=<初值> TO <终值> DO <语句>;
2、FOR<循环变量>:=<终值> DOWNTO <初值> DO <语句>。
[例1]:输入10个数,求最大值、最小值、和、及平均值。
PROGRAM ten(input,output);
VAR
a,s,max,min,avg:real;
i:integer;
BEGIN
write('please input:');
read(a);
s:=a;
max:=a;
min:=a;
FOR i:=2 TO 10 DO
BEGIN
read(a);
s:=s+a;
IF a>max THEN
max:=a
ELSE
IF a<min THEN min:=a
END;
avg:=s/i;
writeln(……);
END.
[例2]:求s=1!+2!+3!+……+10!
program sum_fac(input,output);
var
i,j,s,m:integer;
begin
s:=0:
for j:=1 to 10 do
begin
m:=1;
for j:=1 to i do
m:=m*j;
s:=s+m;
end;
write(……);
end;
二、while语句
格式:WHILE <条件> DO
<循环体>
[例1]:输入一串字符串,求第一个“,”前的大小写字母个数和其它字符个数。
program string(input,output);
var
ch:char;
c,s,o:integer;
begin
write(……);
read(ch);
c:=0;
s:=0;
o:=0;
while ch<>',' do
begin
if (ch>='A')and(ch<='Z') then
c:=c+1
else if (ch>='a')and(ch<='z') then
s:=s+1
else
o:=o+1;
read(ch);
end;
write(……);
end.
三、REPEAT语句
格式:REPEAT
<循环体>
UNTIL
[例]:以字符(char)的形式读入一实数,以实形(real)输出该数。
第五章、函数与过程程序设计
一、函数(包括标准函数和自定义函数)
1、函数的定义
格式:FUNCTION 函数名(<形参表>):返回值类型;
VAR
<变量说明>
BEGIN
<函数体>
END
[注]:1、形参表每个参数都写明其类型;
2、有且只有一个返回值,并且要将返回值赋值给函数名。
[例]:求五边形的面积
function area(a,b,c:real):real;
var
p:real;
begin
p:=(a+b+c)/2;
area:=sqrt(p*(p-a)*(p-b)*(p-c);
end;
2、函数的调用
1)、函数的调用必然出现在表达式中(等号的右边),不能以单独地在语句出现
2)、调用时,将每个实参传递给对应的形参
program ml_area(input,output);
var
l1,l2,l3,l4,l5,l6,l7,s:real;
function area(a,b,c:real):real;
var
p:real;
begin
p:=(a+b+c)/2;
area:=sqrt(p*(p-a)*(p-b)*(p-c);
end;
begin
write('input');
readln(l1,l2,l3,l4,l5,l6,l7);
s:=area(l1,l2,l6)+area(l2,l6,l7)+……;
writeln('s=',s:10:3);
end.
二、过程
格式:PROCEDURE<过程名>(<形式参数表>)
VAR
<说明部分>
BEGIN
<过程体>
END;
[例1]某过程的形参表为(var a,b:real;c,d:integer;var e:char);
主程序中有如下变量说明:x,y:real; m:integer; next:char;
则以下实参表中合法的有:(1、2、3)
1、(x,y,m+3,70,next)
2、(y,x,m,m,next)
3、(y,x,35,m DIV 10,next)
4、(m,x,30,10,next)
5、(x,y,m,10)
6、(35,0,y,m,10,next)
7、(x,y,m,m/10,next)
8、(A,B,30,10,next)
[例2]求程序输出的结果。
program ex(input,output);
var
x,y,z:integer;
procedure s(x:integer; var y:integer);
var
z:integer
begin
x:=5; y:=6; z:=7;
end;
begin
x:=1; y:=2; z:=3;
s(x,y);
writeln(x,y,z);
end.
输出结果:1 6 3
[例3]:求五个数中的最大值。
program max_in_5(input,output);
var
n1,n2,n3,n4,n5:integer;
procedure lagest_in_three(a,b,c:integer;var e:integer)
begin
e:=a;
if b>e then
e:=b;
if c>e then
e:=c;
end;
begin
write('……');
readln(n1,n2,n3,n4,n5);
lagest(n1,n2,n3,n1);
lagest(n1,n4,n5,n1);
write(n1);
end.
三、嵌套
[例]:计算、
program Cmn(input,output);
function fax(x:integer):integer:
var
i:integer;
begin
fac:=1;
for i:=1 to x do
fac:=fac*i;
end;
function c(a,b:integer):real;
begin
c:=fac(a)/fac(b)*fac(a-b)
end;
begin
writeln('c(9,3)=',c(9,3));
writeln('c(8,5=',c(8,5));
end.
四、递归
函数或过程调用它本身,称为递归。
[例1]、用递归计算n! {=m!/n!(m-n)!}
program fac_n(input,output);
var
n:integer;
function fac(n:integer):integer;
begin
if n=1 then fac:=1
else fac:=n*fac(n-1);
end;
[例2]、用递归计算
1)、function power(a,b:integer):integer;
begin
if b=1 then power:=a
else power:=a*power(a,b-1);
end;
2)、procedure power(a,b:integer;var c:integer);
begin
if b=1 then c:=a
else power(a,b-1,c);
c:=a*c;
end;
[例3]、输入一串字符串(以‘.’结束)按逆顺输出
program revers(input,output);
procedure rever;
var
c:char;
begin
read(c);
if c<>'.' then rever;
write(c);
end;
begin
rever;
end.
五、标识符的作用域
1、全局变量和局部变量
1)、全局变量:在主程序中被说明,作用域:整个程序;
2)、局部变量:在子程序中被说明,作用域:主程序及其下级的程序。
2、子程序(function、precedure)的作用域
一个子程序可以调用它的下一级了程序,或可以调用在它之前定义的同级子程序。
[例]写出程序运行的结果。
program range(input,output);
var
x,y:integer;
procedure p1;
var
x,z:integer;
begin
x:=10; y:=y+1; z:=10;
writeln(x,y,z);
end;
begin
x:=1; y:=1;
writeln(x,y);
p1;
writeln(x,y,z);
end.
结果为:
(x y z)
1 1
10 2 10
1 2 (error)
3、在子程序中被改变值的变量可以回传的两种方法:
a、变量参数 procedure(var 变量名);
b、在上一级程序定义了的,且在下一级程序未被重新定义的。
[注]如果主程序的变量在子程序被重新定义,在子程序中主程序的变量被稳藏,在主程序中子程序的变量无效。
现在介绍 Delphi 的书大部分是控件用法的罗列,而对 Object Pascal 的介绍少之又少。但作为 Delphi 的基础,Object Pascal 知识非常重要。希望以下一段教程可以给初学者一些帮助,另外,Delphi帮助中对 Object Pascal 的介绍十分详尽,有耐心的朋友不妨研究研究。
面向对象的Pascal语言
Delphi采用面向对象的Pascal语言(Object Pascal)作为开发应用程序的语言。Pascal语言是70年代研究开发出的一种结构化程序设计语言。它具有思路清晰、结构紧凑等特点,因此被广泛使用。Pascal语言是应用程序开发的理想工具。它简单明了,适于应用程序开发者的学习,并有助于培养人们良好的结构化程序设计习惯。Pascal是一种编译性语言,它可以高效地执行代码,编译速度可达到Visual Basic的3~4倍。Object Pascal是在Pascal 语言基础上通过引入面向对象的特征发展而来的。所以,Object Pascal不但保留了Pascal的所有优点,还具有便于应用程序开发的面向对象的特征。面向对象的编程语言基于类的概念,我们在本节中会学习和介绍。
本节将从下面两部分展开讨论:
? Object Pascal的语言基础
? Object Pascal的程序设计
1. Object Pascal的语言基础
Pascal语言体现了结构化程序设计的概念。它简便易学,具有清晰明了的模块结构,丰富的数据类型和语句。Pascal语言编译、运行效率高,便于移植,因此广泛地应用于应用软件的开发。
我们将通过以下几个方面的简单介绍,让大家迅速地掌握Pascal语言的精髓。
? Object Pascal 的数据类型
? Object Pascal 的操作符和表达式
? Object Pascal 的基本语句
? Object Pascal 的过程与函数
1.1 Object Pascal的数据类型
Object Pascal的数据类型包括一些基本的简单数据类型,例如:整型、实型、字符型、字符串型和布尔型等等。表1列出了基本的数据类型。
类别
类型
bytes
范围
整型
Integer
2/4
-32768~32767/-2147483648~ 2147483647
Cardinal
2/4
0~65535/ 0~4294967295
ShortInt
1
-128~127
SmallInt
2
-32768~32767
LongInt
4
-2147483648~2147483647
Byte
1
0~255
Word
2
0~65535
实型
Real
6
2.9E-39~1.7E38,-2.9E-39~-1.7E38
Single
4
1.5E-45~3.4E38,-1.5E-45~-3.4E38
Double
8
5.0E-324~1.7E308,-5.0E-324~-1.7E308
Extended
10
3.4E-4932~1.1E4932,-3.4E-4932~-1.1E4932
Comp
8
-9.2E18~9.2E18
Currency
8
-922337203685477.5808~922337203685477.5807
布尔型
Boolean
1
True/False
ByteBool
1
True/False
WordBool
2
True / False
LongBool
4
True/False
字符型
Char
1
ASCII码
表1 基本的数据类型
除了上面四种由系统预先定义的标准数据类型以外,系统还允许用户自己定义一些较为复杂的数据类型,例如:子界类型、枚举类型、指针类型、记录类型以及文件类型等等。
考虑到这些数据类型在应用程序代码编写中有着十分重要的作用,下面将这些类型做简单介绍。
(1) 子界类型
子界类型是Pascal 允许用户定义的一个结构数据类型。如果我们预先知道一个变量的范围,我们可以通过定义子界类型和子界类型变量来实现由系统自动检查变量是否超出了允许的范围。我们看一个例子:
TYPE
TMonth = 1..12;
TScore = ‘A’..‘F’;
VAR
Month : TMonth;
Score : TScore;
如上定义了子界类型变量Month的范围从1~12,Score的范围从‘A’~‘F’。
(2) 枚举类型
我们经常要用到这样的数据,它是通过列举出该数据所有的可能值来定义的,看下面的例子:
TYPE
TWeekDay = (Mon,Tue,Wed,Thu,Fri);
VAR
WeekDay : TweekDay;
需要注意的是,每个枚举值只能出现在一个枚举类型的定义当中,而且在每个枚举类型的定义当中只能出现一次。
(3) 集合类型
集合类型是Pascal允许用户定义的一个结构数据类型,它使我们可以运用通常集合运算,例如:交集、并集和差集。集合类型是一些同类型元素的集合,这些基类型元素可以是整型、实型、布尔型、字符型、枚举型或子界类型。它通常的作用是用来检验某个元素是否被包含在一个集合当中。下面举一个例子来说明集合类型数据的定义方法和运用:
TYPE
TweekDay = Set of 1..7;
VAR
WeekDay : TWeekDay;
BEGIN
WeekDay := [1,3,5,6];
END;
注意Pascal编辑程序限制了集合数目,所以整型数据不能作为集合类型的基类型。而只能是整型子界。基类型必须是有序类型,所以实型、数组类型不能作为集合类型的基类型。
(4) 指针类型
Pascal允许建立动态数据结构,它采用指针类型数据,指针类型变量的引入大大增强了程序的灵活性。一个指针类型变量用于保存一个内存地址,由于该内存地址指向的是一个动态分配的变量,所以,在定义指针类型数据时,必须说明它所指向变量的类型。例如:
TYPE
Pbirthday = ^TBirthday;
TBirthday = Record
Name : String[30];
Year : Integer;
Month : 1..12;
Date : 1..31;
VAR
Pbirthday1 : Pbirthday;
Pint : ^Integer;
BEGIN
Pbirthday1^. Name := 'Smith';
Pint^ := 18;
END;
(5) 数组类型
数组类型数据是一种用户定义的结构数据类型,它是一些具有相同数据类型的元素的集合。根据数组的维数可以将数组分为一维数组、二维数组以及多维数组,每一维度的下标指明了元素的数目。其下标类型包括了除长整型以外的所以有序类型以及长整型的子界类型。举例如下:
TYPE
ToneArray = Array [3..39] of Integer;
TdoubleArray = Array [1..25,1..50] of Real;
VAR
(6) 记录类型
记录类型的引入使数据信息的组织和表达更加方便灵活。和数组型数据一样,记录类型包括了一组元素,但和数组型数据不同的是,记录类型数据可以包括相同的数据类型,也可以包括不同的数据类型;这些数据可以是数值型的,也可以是非数值型的。例如:我们可以使用一个记录类型数据记录一个学生的名字、出生日期、籍贯以及学习成绩等等。例如,一个学生的记录类型如下:
TYPE
TStudent = Record
Name : String[30];
Age : Integer;
StudNum : Integer;
Score : Real;
END;
VAR
Student1 : TStudent;
BEGIN
Student1.Name := 'Smith';
Student1.Age := 20;
Student1.StudNum := 950007;
Student1.Score := 87.5;
END;
(7) 文件类型
文件类型是用来对文件进行操作的,它包括同一类元素的线性有序组合。Delphi支持的文件类型有文本文件、记录文件和无类型文件。定义文件类型实际上是定义了一个文件类型的指针,例如:
TYPE
TStudent = Record
Name : String[30];
Age : Integer;
StudNum : Integer;
Score : Real;
END;
Fstudent = File of Tstudent;
Fstr = File of String;
VAR
Student1 : FStudent;
Str : Fstr;
BEGIN
Student1^.Name := 'Smith';
Student1^.Age := 20;
Student1^.StudNum := 950007;
Student1^.Score := 87.5;
Str^ = 'I love Delphi.'
END;
1.2 Object Pascal的操作符和表达式
(1) 操作符
操作符包括普通字符、Pascal保留字和标识符。其中,Pascal保留字包括:
and, array, as, asm, begin, case, class, const, constructor, destructer, div, do, downto, else, end, except, export, file, finally, for, function, goto, if, inherited, initialization inline, interface, is, label, library, mod, nil, not, object, of, on, or, packed, procedure, program, property, raise, record, repeat, set, shl, shr, string, then, to, try, type, unit, until, uses, var, while, with, xor
标识符必须由一个字母或下划线开始,后面是具有任意长度的字符串(不能包含空格字符)。例如以下几个标准的标识符:
变量类型:Integer, Real, Single, Char
过程:Read, Write, Reset, Eof
函数:Random, Upper, Date
(2) 表达式
一个表达式由运算对象和运算符两部分组成。运算符可以分为算术运算符、逻辑运算符、串运算符、字符指针运算符、集合运算符、关系运算符以及@运算符。运算符的优先顺序见表2。
运算符
优先顺序
类别
. ^
1
域、指针引用
@ not
2
取非
* / div mod shl shr and as
3
乘除法与类型转换
+ - or xor
4
加减法
= <> > < <= >= in is
5
比较操作
表2 运算符的优先顺序
1.3 Object Pascal的基本语句
(1) 赋值语句
实现功能:为变量赋值。
语法形式:<变量> := <表达式> ;
实际举例:x := y*z;
b := (x>=1) or (y>=4) and (z<>0);
t := sqrt(m)+4*sin(x);
(2) GOTO语句
实现功能:改变程序流程至标号语句处。
语法形式:goto <标号>;
实际举例:goto label1;
(3) IF语句
实现功能:作条件判断控制流程。
一、单分支语句:
语法形式: if <布尔型表达式> then <语句> ;
实际举例: if x <= 100 then y := x;
二、双分支语句:
语法形式:if <布尔型表达式> then <语句> else <语句>;
实际举例:if x<=100 then y := x else y := 100;
(4) CASE语句
多层嵌套的条件语句可读性差,实际编程中常采用case语句。
实现功能:实现多条件选择。
语法形式:case <表达式> of
值1:<语句>;
值2:<语句>;
other <语句>;
end;
(5) REPEAT-UNTIL 语句
实现功能:循环。
语法形式:REPEAT
<语句组>;
UNTIL <表达式>;
(6) WHILE语句
实现功能:循环。
语法形式:while <表达式> do <语句>;
(7) FOR语句
实现功能:循环。
语法形式:for <变量> = <表达式1> to <表达式2> do <语句>;
(8) WITH语句
实现功能:引用一个域或方法。
语法形式:with <记录名> do
begin
<语句组>
end;
1.4 Object Pascal的过程与函数
(1) 过程
过程的一般语法结构为:
Procedure <过程标识名> (<形式参数>);
<过程体>
Object Pascal支持两种调用方式:Near和Far。Near调用程序代码效率高,但使用域有限;
Far调用可以被任意模块调用,但程序代码的效率较低。
(2) 函数
函数的一般语法结构为:
Function <函数名> (<形式参数>):<类型>;
<函数体>
函数与过程基本相同,区别在于函数具有返回值而过程没有。函数的返回值可以赋给函数名,也可以赋给Result变量。
2. Object Pascal的程序设计
类与对象是Object Pascal 程序设计中的主要概念,类是用户定义的数据类型,包括内部实际变量和函数或过程形式的方法,用来描述相似对象的共同特征,是对实际对象的抽象。而对象是类的实例,它是由类定义的数据类型的变量。
2.1 类的定义
Delphi中用关键字Class来声明类,举例如下:
Type
CBirthday = class
Month,Day,Year : Integer;
Procedure Setvalue(m,d,y : integer);
Function Lucker : Boolean;
END;
声明了类之后,就可以定义类里的函数和过程,统称类的方法。
Procedure CBirthday.Setvalue(m,d,y :integer);
Begin
Month := m;
Day := d;
Year := y;
End;
Function Luckyday : boolean;
Begin
... ...
End;
定义了类的方法之后,我们便可以进行调用:
Var
Birthday : Cbirthday;
Lucker : Boolean;
Begin
Birthday.Setvalue(4,20,1976);
Lucker := Birthday.luckyday;
End;
2.2 构造函数和拆析函数
作为类类型的实例的对象(Object)是一个动态分配的内存区,它具有和类类型相同的数据结构。构造函数和拆析函数是一个类对象的特殊方法,它们控制了对象的建立和删除。它们都是类的构件。其指定方式就和过程或函数一样,然而与C++不同,Object Pascal中类的名字不是构造函数名,而是通过关键字constructor和destructor来定义类构造函数和拆析函数,函数名任意。
例如定义Cbirthday类:
Type
CBirthday = class
Month,Day,Year : Integer;
Constructor sent(m,d,y : integer);
Procedure Setvalue(m,d,y : integer);
Function Lucker : Boolean;
End;
类构造函数如下:
Constructor sent(m,d,y : integer);
Begin
Month := m;
Day := d;
Year := y;
End;
用类构造函数初始化一个对象:
Var
Bday : Cbirthday;
Lucker : Boolean;
Begin
Bday.Sent(4,20,1976);
Lucker := Birthday.luckyday;
End;
拆析函数是用来完成在删除类之前释放它所占有的内存资源的,它的定义和使用方式与构造函数类似,这里不再详细阐述。
2.3 类的封装
一个类中包含了一系列数据成员和方法,在一个好的面向对象的程序设计当中,数据应该被封装,仅在类中使用。在访问类的内部数据的时候,我们只需通过类所定义的接口进行访问。表3介绍了Object Pascal中的五个存取说明符:private、public、protected、published和automated。
关键字
意义
允许被访问
Private
表明类的专用数据和方法
声明类的单元之内
Public
表明类的公共部分
任意部分
Protected
表明了的受保护部分类和它的派生类
Published
表明数据不仅可以在运行时使用,还可以在设计时使用
Automated
用于指出自动的方法和字段,常用于响应对象链接与嵌入(OLE)自动化类型信息的公共接口
表3 存取说明符的意义
2.4 类的继承
类的继承是面向对象的程序设计允许用户定义的从一个已经存在的类(父类)定义一个新类(子类)的技术,子类建立在父类的基础之上,在修改之前,包含了父类的每一个方法与字段。它与复制相比,优点在于复制定义的两个类是两个完全不同的数据结构类型,当类中存在错误时,我们只能对每个类分别进行修改,而类的继承性避免了这样的情况。
继承性在Delphi里很容易实现,只需在定义子类时指出父类即可。例如:我们在建立新的窗体时,系统会自动产生:
Type
Tform1 = class(Tform);
End;
这表明,Tform1是Tform的子类,实际上,Tform也是其他类的子类。我们也可以自己定义一个子类,例如:
Type
CNewDay = class(Cday);
End;
2.5 滞后编制与多态
在面向对象的程序设计当中,除了对函数和过程的静态编制(通过调用指针来调用方法)以外,还可以采用另外一种动态编制的方式,称为滞后编制。在滞后编制的方式下,只有运行时才能确定调用的对象方法所占用的内存地址,这种方法叫作多态。
这一技术的应用使得面向对象的程序设计可以在用户不清楚各级子类的情况下对程序进行扩展。一种对象使用滞后编制可以有两种基本方法:一种是声明它为虚拟,另一种是声明它为动态。两种方法基本相同。
文章评论(0条评论)
登录后参与讨论