《Delphi程序设计实训教程》课件第3章_第1页
《Delphi程序设计实训教程》课件第3章_第2页
《Delphi程序设计实训教程》课件第3章_第3页
《Delphi程序设计实训教程》课件第3章_第4页
《Delphi程序设计实训教程》课件第3章_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章ObjectPascal程序设计语言

3.1ObjectPascal语言基础

3.2语句

3.3过程与函数

3.4ObjectPascal的面向对象编程基础

3.5本章小结

3.1ObjectPascal语言基础

3.1.1Pascal程序的基本组成

【例3.1】计算半径为r的圆的面积S。

programArea; {程序首部}

const {说明部分--数据描述}

pi=3.14159;

var

s,r:real;

begin

{执行部分}

readln(r);

s:=pi*sqr(r);

writeln('s=',s);

end.

1.程序首部

例3.1的第一行称为程序首部。program是保留字,之后是程序名(依据“标示符"规则自行定义),最后以分号表示程序首部结束程序主体的开始。程序首部在一个TurboPascal(仅在TurboPascal中有效)程序中并非必须出现,它是可选的。因此,在时间有限的情况下,如果在TurboPascal环境下编程则完全可以省略程序首部。

2.说明部分

说明部分用于定义和说明程序中用到的数据,依次由单元说明、标号说明、常量说明、类型说明、变量说明、函数或过程说明组成,说明的次序不能改变,但各个部分是可选的。一个简单的Pascal程序也可以不包含说明部分。例3.1的第二行是常量说明,第三行是变量说明。

3.执行部分

执行部分描述了程序要执行的操作。执行部分必须以一个Pascal保留字begin开始,以保留字end后跟句点结束,其间是一些执行具体操作的语句,并且以分号作为语句之间的分隔符。begin和end必须成对出现,这是一个Pascal程序所必需的。紧跟end之后的句号表示执行部分的结束,也表示整个程序的结束。此后的任何语句都无效。Pascal规定紧随end之前出现的分号允许省略。如例3.1中从begin到end都是执行(语句)部分。

3.1.2基本字符和符号

1.基本符号

A~Za~z0~9+-*/=<><=>=<>()[]

{}:=,;.:..'^

注意:Pascal语言除了能使用以上规定的基本符号外,不得使用任何其他符号。

2.保留字

保留字在Pascal语言中具有特定的含义,在进行程序设计时不能被重新定义或进行它用,必须了解它的含义,以便于正确地使用,否则会造成错误。ObjectPascal语言中的保留字一共有65个:

ObjectPascal语言是不区分大小写的,所以像And、AND、and等都被看做是保留字。此外,ObjectPascal语言中还定义了39个指令字(Directives),它们也具有特殊的含义,如果用户重新定义了这些指令字,在作用域内它们就失去了原来的意义。这些指令字为:

尽管private、protected、public、published和automated都是指令字,也应该将它们当作关键字来看待,不要定义与它们同名的标识符。在Delphi集成开发的代码编辑器中,关键字和指令字将以粗体显示。在定义标识符时不要定义与这些粗体显示的关键字和指令字一样。

3.标识符

1)标识符的定义

标识符是用来标识程序、过程、函数、类型、符号常量、变量、对象等的名字的符号。

ObjectPascal语言中规定,标识符由字母A~Z、a~z、下划线和数字0~9组成。标识符的命名有以下3条限制:

●首字符必须是字母或下划线,不能是数字;

●标识符不能和保留字相同;

缺省状况下,Delphi只认为标识的前255个组成字符是有意义的。

在ObjectPascal语言中,标识符也不区分大小写,所以标识符Myname、MyName、myname、myName和MYNAME被认为是同一个标识符。总体上来说,这是Pascal的一大优点,因为在大小写敏感的语言中,许多语法错误是由不正确的大小写引起的。

Pascal语言的大小写不敏感也有例外,如控件包中的Register过程必须以大写字母R开始,一些API函数调用参数也必须按要求大小写等。

在ObjectPascal语言中,标识符也不区分大小写,所以标识符Myname、MyName、myname、myName和MYNAME被认为是同一个标识符。总体上来说,这是Pascal的一大优点,因为在大小写敏感的语言中,许多语法错误是由不正确的大小写引起的。

Pascal语言的大小写不敏感也有例外,如控件包中的Register过程必须以大写字母R开始,一些API函数调用参数也必须按要求大小写等。

保持大写使用的一致性是值得提倡的好习惯,尽量保持大写使用的一致性,可以提高代码的可读性。一个常用的方法是将每个标识符的第一个字母大写;标识符若由几个词组合而成(中间不能插入空格),每个词的第一个字母应大写,例如:

MyLongIdentifier

MyVeryLongAndAlmostStupidIdentifier

保持大写使用的一致性是值得提倡的好习惯,尽量保持大写使用的一致性,可以提高代码的可读性。一个常用的方法是将每个标识符的第一个字母大写;标识符若由几个词组合而成(中间不能插入空格),每个词的第一个字母应大写,例如:

MyLongIdentifier

MyVeryLongAndAlmostStupidIdentifier

2)标识符的分类

(1)标准标识符:指Pascal语言预先定义的标识符,具有特殊含义。

以下列举了Pascal语言部分常用的标准标识符:

标准常量FalseMaxintTrue

标准类型BooleanCharRealInteger

标准函数AbsArctanChrCosEofEolnExpLnOddOrdPredRoundSinSqrSqrtSuccTrunc

标准过程DisposeGetNewPackPagePutReadReadlnResetRewriteUnpackWriteWriteln

标准文件

InputOutput

(2)用户自定义标识符:由用户根据需要定义。

●选用的标识符不能和保留字相同。

语法上允许预定义的标准标识符作为用户定义的标识符使用,但最好还是不要用。

3.1.3常量与变量

1.常量

(1)常量:在某个程序的整个过程中其值不变的量。

(2)常量定义:常量定义出现在说明部分。它的语法格式是:

CONST

常量名=常量值;

...

常量名=常量值;根据常量定义的语法,下面的常量定义是有效的:

CONST

pi=3.14;

a=12;

常量的类型由定义它的常量值的类型决定。例如上述常量的定义中,隐含说明a是整型,r是实型。

(3)常量定义部分必须以保留字const开头,可以包含一个或几个常量定义,而且每个常量均以分号结束。

(4)Pascal类型常量。类型常量又称变量常数,它是一个全局变量,只不过在编译时用指定的值预初始化,使程序在开始运行时具有指定的初值,在运行中仍然可修改。它是Pascal的一个扩充特性,类型常量的定义与标准Pascal规定的常数定义和变量说明有所区别。类型常量定义的语法格式为:

CONST

常量名:简单类型=值;

【例3.2】

CONST

COUNTER:INTEGER=0;

FLAG:BOOLEAN=true;

INDEX:0..100=0;

LEFT:INTEGER=40;

2.变量

(1)变量:在某个程序中的运行过程中其值可以发生改变的量。

(2)变量说明:变量说明出现在说明部分。它的语法格式是:

VAR

变量名:类型;

...

变量名:类型;

其中,保留字VAR表示开始一个变量说明部分。变量名是一个用逗号隔开的标识符序列,冒号后面的类型是变量的类型,每个变量说明均以分号结束。

根据变量定义的语法,下面的变量定义是有效的:

VAR

A,B,C:INTEGER;

M,N:REAL;

注意:变量名不允许重复说明。

【例3.3】

VAR

I,J,K:INTEGER;

A,K:REAL;

M,N,I:INTEGER;

其中存在两个标识符重复说明的错误:变量I和K各被重复说明了两次。

3.1.4数据类型

数据是程序设计的一个重要内容,其重要特征——数据类型确定了该数据的形、取值范围以及所能参与的运算。

Pascal提供了丰富的数据类型,这些数据类型可以分为三大类:简单类型、构造类型和指针类型。其中简单类型可以分为标准类型(整型、实型、字符型和布尔型)和自定义类型(枚举型和子界型),构造类型可以分为数组类型、集合类型、记录类型和文件类型。这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。在这些数据类型中简单类型都是有序类型,除了实型以外的简单类型都是顺序类型。所谓顺序类型,就是它们的值不仅是有序的而且还有顺序号。

1.简单类型

1)整数类型

整数类型简称整型,用标准类型名INTEGER来表示。TurboPascal支持五种整型,它们是shortint(短整型)、integer(整型)、longint(长整型)、byte(字节型)和word(字类型),每一种类型规定了相应的整数取值范围以及所占用的内存字节数(见表3-1)。

表3-1Pascal语言中整型变量所分配的内存字节数

及其数值的表示范围

2)实数类型

实数类型简称实型,用标准类型名REAL来表示。

Pascal支持五种实型,它们是real(基本实型)、single(单精度实型)、double(双精度实型)、extended(扩展实型)和comp(装配实型),每一种类型规定了相应的实数取值范围、所占用的内存字节数以及它们所能达到的精度(见表3-2)。

表3-2Pascal语言中实型变量所分配的内存字节数

及其数值的表示范围

实数有两种表示方式。一种是日常习惯使用的含有小数点的十进位表示法,例如-12.5,0.0001,-0.25,10.0。另一种是符点表示法,又叫科学表示法,例如

9.1e-28表示9.1*10-28,-1e-7表示-1*10-7。

3)布尔型

布尔类型又称逻辑型,用标准类型名BOOLEAN来表示。布尔型的值只有两个:False(布尔假)和True(布尔真),并且False可用0表示,True可用1表示。False和True都是预定义常数标识符,可以直接用于布尔类型数据的运算中,并且规定True>False。

在程序设计语言里,布尔值的产生与条件的判断是联系在一起的。关系运算符的两边可以是整型或实型数据,也可以是同为字符型或同为布尔型的数据,运算的结果产生一个布尔值。关系运算表达的是一种二值条件,即要么成立,要么不成立,例如,-3>-2的取值是False,3>2的取值是True。

4)字符型

字符型用标准类型名CHAR来表示。字符型数据对象的值是系统内定的字符集中的一个字符。字符型必须用单引号括起来,字母作为字符型时,大小写是不等价的,并且字符型只允许单引号中有一个字符。

5)枚举类型

枚举类型是一个以标识符标识的有序整型常数的集合,这些常数是该类型变量可取的合法值。声明枚举类型的语法如下:

typetypeName=(val1,...,valn);

其中,typeName和vali是有效的标识符,typeName是枚举类型,vali是枚举量的标识符。例如:

typeTWeekDay=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);

这些枚举量不能再定义为其他标识符。当用Ord函数分别对其取值时,将得到0、1、2、3、4、5、6。

在默认的情况下,枚举值是从0开始的有序整数,在实际编程的过程中,可以越过这种限制,根据需要指定标识符表中的值。例如:

typeMyColor=(red=2,green=6,white=7,black=9);

一些枚举类型的值只有两种可能的值,如下声明:

typeSampleEnum=(val1,val2,val3=0);

SampleEnum中val1、val2、val3的Ord函数值分别为0、1、0,即Ord(val1)与Ord(val3)相同。

枚举量的取值范围为0~255。

6)子界类型

子界类型的声明形式如下:

type

类型标识符=上界值..下界值;

其中,上、下界值是某种已定义的有序类型的值,上界值小于或等于下界值。例如:

type

TAge=18..60; //TAge是一个整型的子界类型

type

Caps='A'..'Z';//Caps是一个字符型的子界类型

子界类型变量的值是有序的,对其进行增/减量操作都要在其定义范围内。

2.构造类型

1)数组类型

数组类型数据表示的是同种类型数据的集合。数组类型的数据是排列有序的,每个数据元素都有一个唯一的索引号。与集合类型不同的是,数组类型的数据可以重复。数组类型分为静态数组和动态数组。

(1)静态数组:在声明时指定了数组的大小。

定义静态数组的语法形式如下:

type

数组类型标识符号=array[indexType1,...,indexTypen]ofbaseType;

其中,indexType是有序类型,indexType通常是以Integer为子界的,也可以是其他有序类型的子界;baseType声明元素的数据类型;数组由同一类型的数据元素组成。

例如:

type

Tarr1=Array[1..10]ofInteger;

Tarr2=Array[1..3,1..5]ofChar;

var

a:Tarr1; //声明变量a是Tarr1类型数组

b:Tarr2; //声明变量b是Tarr2类型数组

也可以声明变量时直接定义数组的类型,如:

vara:Array[1..10]ofInteger;

数组元素的访问是通过数组名后面加上方括号和下标值来访问的,如a[1]:=10;。

(2)动态数组:在定义时并没有确定数组的大小或长度,而是在访问之前用SetLength过程为数组动态或重新分配其存储空间。

定义动态数组的语法形式如下:

Var数组类型标识符:arrayofbaseType;

例如:

varDynArr:arrayofInteger; //声明DynArr为元素是整型的动态数组

也可以先定义类型,再声明变量,如:

typeTdynIntArr=arrayofinteger;

varDynArr:TdynIntArr;语句SetLength(DynIntArr,10);为动态数组DynIntArr分配10个元素的存储空间,下标从0到9(动态数组的下标总是从0开始)。如要释放动态数组占用的存储空间,可以将nil赋值给该动态数组变量,或调用过程SetLength(DyIntArr,0)实现。

多维动态数组通过使用嵌套的“arrayof...”结构实现,例如:

typeTGrid=arrayofarrayofString;//定义二维动态字符串数组类型Tgrid

2)集合类型

格式:setofbaseType;

其中baseType是集合中元素的类型或值域。

ObjectPascal中规定了基类型只能是不超过256个有序值的集合,集合的元素的序数值必须介于0和255之间。例如:

type

TsetA=setofInteger; //错误

TsetB=setof255..300; //错误

TsetC=setofWideChar; //错误

TsetD=setof10..50; //正确

TsetE=setofchar; //正确

3)记录类型

记录类型描述一组不同类型的数据元素集合,每个数据元素称为“域”。在定义一个记录类型时,需要指定每个数据域的数据类型。定义记录类型的语法如下:

type

记录类型标识符=record

域1:类型1;

域2:类型2;

域n:类型n;

end;

例如:

type

TPerson=record

name:String[10];

id:String[15];

sex:Boolean;

age:Byte;

height,weight:Real;

end;

3.指针类型

指针类型的变量存储的是内存地址,利用指针可以灵活地访问内存中的数据。

指针类型的声明格式如下:

type指针类型标识符=^数据类型;

指针可以指向任何数据类型。System和SysUtils单元声明了许多常用的标准指针。

(1)指针取值运算符^:取指针(地址)所指向单元的数据。

(2)指针的关系运算符<、<=、>、>=、=、<>:判断两个同种类型的指针的位置大小。例如,P1、P2指针,P1在P2之前,则P2>=P1为True,P1<>P2为True。

(3)移动指针运算:调用过程Inc(指针类型变量,偏移量N),使指针依据其所指数据类型往后偏移N个数据单元;调用过程Dec(指针类型变量,偏移量N),使指针往前偏移N个数据单元。

4.字符串类型

和传统Pascal语言不同,ObjectPascal语言专门提供了预定义的字符串数据类型,可以方便地表示字符串,实现存储、处理字符串等操作。

字符串类型(String)主要包括表3-3中的字符串类型。

表3-3ObjectPascal语言中的字符串类型

WideString和AnsiString类似,只不过是基于WideChar字符集(Unicode字符集),用来存储Unicode字符。ObjectPascal语言引入这种类型,主要是为了支持OLE编程。

可以用如下的方式来声明相应的字符串变量:

Var

Str1:ShortString;

Str2:AnsiString;

Str2:WideString;但是在一般情况下,当我们声明一个变量为字符串类型时使用String保留字。例如:

Var

Str:String;

缺省时,String类型就是AnsiString类型。在Delphi中,众多组件的属性使用了String类型,如每个组件的Caption属性、Edit组件中的Text属性等。同时,Delphi中封装了众多的String类型字符串的操作过程和函数,因此应尽量使用String类型。

3.1.5运算符和优先级

1.运算符

1)算术运算符

算术运算符如表3-4所示。

表3-4算

【例3.4】

3/4结果是实数0.75

3.0/4.0结果是实数0.75

3DIV4结果是整数0

3MOD4结果是整数3

6/2

结果是实数

3.02)逻辑运算符

表3-5逻

表3-6布尔运算规则表

3)关系运算符

表3-7关

【例3.5】

5>6 结果是False

8>6 结果是True

‘A’=‘a’ 结果是

False

3)类运算符

类运算符as和is对类或实例进行操作。

2.优先级

各种运算符的优先级如表3-8所示。

表3-8各种运算符的优先级

3.表达式

(1)算术表达式。算术表达式是由算术运算符连接常量、变量、函数的式子。算术表达式中各个运算符的次序为:()→函数→*,/,DIV,MOD→+,-。

(2)布尔表达式。Pascal提供给布尔表达式的基本操作有逻辑运算和关系运算。

3.2语

3.2.1赋值语句

赋值语句是最简单的语句,其一般形式为:

变量:=表达式

赋值语句的作用是计算表达式的值,并赋给变量。对于任何一个变量必须首先赋值,然后才能引用,否则,未赋初值的变量将以一个随机值参与运算。另外,赋值号两边的类型必须相同,但表达式值为整数时,它可自动化为实型后赋给该实型变量,即符合赋值相容。

【例3.5】关于赋值的例子——互换a、b变量的值。

vara,b:integer;

...

a:=3;b:=2;

a:=a+b;

b:=a-b;

a:=a-b3.2.2复合语句

复合语句是由若干语句组成的序列,语句之间用分号“;”隔开,并且以begin和end括起来,作为一条语句。复合语句的一般形式为:

begin

语句1;

语句2;

...

语句n;

end

【例3.6】变量值的交换。

programjiaohuan;

var

a,b,t:integer;

begin

a:=10;b:=20;

begin

t:=a;

a:=b;

b:=t;

end;

writeln(‘a=’,a,‘b=’,b){输出a,b的值}

end;

end.3.2.3控制语句

ObjectPascal的控制语句有if和case两个。

1.if语句

if语句是由一个布尔表达式和两个供选择的操作序列组成的。if语句运行时根据布尔表达式的值,选取其中之一的操作序列执行。有两种形式的if语句:

(1)if布尔表达式then语句;

(2)if布尔表达式then语句1

else语句2;

当布尔表达式的值为真时,执行then后面的语句;值为假时有两种情况:要么什么也不做,要么执行else后面的语句。注意else前面没有分号,因为分号是两个语句之间的分隔符,而else并非语句。如果在该处添了分号,则在编译的时候就会认为if语句到此结束,而把else当作另一句的开头,输出出错信息。

【例3.7】求y=f(x),当x>0时,y=1;当x=0时,y=0;当x<0时,y=-1。

programlianxi;

varx,y:real;

begin

ifx>0theny:=1;

ifx=0theny:=0;

ifx<0theny:=-1;

writeln('y=',y);

end.【例3.8】当x>0时,计算x*x,并且输出x和x*x。

programlianxi2;

varx,x1:real;

begin

readln('x=',x); {输入x的值}

ifx>0then

begin

x1:=x*x;

writeln('x*x=',x1);

writeln('x=',x);

end;

else

writeln('error');

end.

2.case语句

case语句是由一个表达式和众多可选择的操作序列组成的。运行时,根据表达式的求值结果,在众多的分支中选取一个分支执行。其形式为:

case表达式of

常量1:语句1;

常量2:语句2;

...

常量n:语句n;

else语句n+1;{可选项}

end;表达式只能是顺序类型(除了实型以外的简单类型),其值必须唯一确定并且和表达式类型相同。case语句执行和表达式值相匹配的case常数所指向的那条语句,如果没有相匹配的值,则执行else部分(如果有的话)或者什么也不做。在else前面的语句末尾有分号,这是和if语句不同的。每一个常量是一个或多个用逗号分开的、具有相同类型的常数值。

【例3.9】根据学生的成绩给予相应的等级,对应关系如下:

90—100A

80—89B

60—79C

60以下D

programchengji;

var

s:real;

ch:char;

begin

write('inputthescore:');

readln(s);

if(s>=0)and(s<=100)then

casesdiv10of

10,9:ch:='B';

8:ch:ch='B';

7,6:ch='C';

elsech:='D';

end;

writeln(s,'--',ch);

end.3.2.4循环语句

1.while语句

while语句用于“当满足某一条件时进行循环”的情况。while语句的语法格式为:

while布尔表达式do语句;

do后面的语句为循环体,布尔表达式起循环条件控制的作用。只要布尔表达式的值为True便重复地执行循环体,直到该布尔表达式的值为False时才结束循环。也就是说while循环属于当型循环。为了能使while重复终止,循环体中一定要有影响布尔表达式的操作,否则该循环就是一个死循环。

【例3.10】计算从0到某个数之间所有奇数的和。

programjishu;

varodds,limit,sum:integer;

begin

readln(limit);

sum:=0;

odds:=1;

whileodds<=limitdo

begin

sum:=sum+odds;

odds:=odds+2;

end;

writeln(sum);

end.

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语句描述。

【例3.11】用repeat语句编写求s=1+2+3+...+100的程序片段为:

s:=0;

n:=1;

repeat

s:=s+n;

n:=n+1;

untiln>100;

3.for语句

for语句用来描述已知重复次数的循环结构。for语句有两种形式:

(1)for控制变量:=初值to终值do语句;

(2)for控制变量:=初值downto终值do语句;

第一种形式的for语句是递增循环。首先将初值赋给控制变量,接着判断控制变量的值是否小于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值改为它的后继值,并重新判断是否小于或等于终值。当控制变量的值大于终值时,退出for循环,执行for语句之后的语句。第二种形式的for语句是递减循环。首先将初值赋给控制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值改为它的前趋值,并重新判断是否大于或等于终值。当控制变量的值小于终值时,退出for循环,执行for语句之后的语句。for语句中的初值、终值、控制变量的数据都必须是顺序类型。当初值和终值确定后,重复的次数就确定不变了,并且控制变量在重复语句内不能施加任何赋值操作。

【例3.12】计算1+2+3+...+99+100的值。

programjia;

varn,sum:integer;

begin

sum:=0;

fori:=1to100do

sum:=sum+i;

writeln(sum);

end.以上程序还可以写成如下形式:

programjia;

varn,sum:integer;

begin

sum:=0;

fori:=100downto1do

sum:=sum+i;

writeln(sum);

end. 3.3过

3.3.1过程

给某个语句序列组成的子程序赋予一个适当的名字。程序中凡是需要出现这个语句序列的地方,都可以简单地写上子程序的名字。这种完成一个操作的子程序称为过程;子程序的定义称为过程说明。过程说明由过程首部和过程体组成,其形式如下:

procedure过程名(形式参数列表);{过程首部}

说明部分;

begin

语句1;

语句2;

...

语句n;

end;{语句结束}

end;{过程结束}

【例3.13】输出两个数中最大值的过程。

procedurelargest(a,b:integer);

begin

ifa>bthenwriteln(a)

elsewriteln(b);

end;

上面largest过程由两个类型为整型的形式参数(a,b)向过程传入两个需要比较大小的数。

3.3.2函数

假如调用一个过程,结果只产生一个值,我们也可以把过程说明写成函数说明。函数说明形式如下:

function函数名(形式参数列表):函数类型;{函数首部}

说明部分;

begin

语句1;

语句2;

...

语句n;

end;{语句结束}

end;{函数结束}过程执行的结果可以通过变量返回一个或多个数据值,还可以完成一系列操作。概言之,过程执行的结果是产生一个效果,而函数返回一个函数值。过程调用是一句独立的语句,而函数的调用方式出现在表达式中。

【例3.14】计算|X|的函数。

functionjdz(x:real):real;

varz:integer;

begin

ifx>=0thenz:=x

elsez:=-x;

end;

jdz:=z;

end;第一行为函数首部,它指明函数名、函数形参信息和函数值的数据类型。如上面求x绝对值的函数首部,函数名是jdz;它有一个值参数x为实型;函数值的数据类型为实型。Pascal规定一个函数只能求出一个简单值,所以函数值的类型只能是任何非结构类型。

除函数首部和过程首部的句法略有差别外,函数体和过程体完全相同。但函数体中至少要有一条语句对函数名赋值,如函数jdz中有语句“jdz:=z”。函数每次求值至少要执行这样一条语句,为计算求得一个值,返回时就把这个值带回调用的地方。

3.4ObjectPascal的面向对象编程基础

3.4.1对象与类的定义

面向对象编程是当前流行的编程技术,它解决了传统面向过程编程带来的许多问题。面向过程编程所有的功能都包含在几个代码模块中(常常是一个代码模块)。而使用OOP(面向对象程序设计)技术,常常要使用许多代码模块,每个模块都提供特定的功能,每个模块都是独立的。这种模块编程方法提供了非常大的多样性,大大增加了代码的重用机会。

例如,我们可以将计算机程序考虑为一个房子,如果使用面向过程编程,这栋房子就是一个单元,如果你想为房子换个门窗,就必须替换整个单元,重新建造一栋房屋。如果使用OOP技术,就可以在建造时将房屋设计成一个个独立的模块(对象)。如果需要换玻璃,只需要选择门窗,调换玻璃即可;如果需要改变风格,只需要重新调整房屋的颜色和布局即可。这就是OOP编程的优势。

可以说,对象是OOP技术的关键。那么,什么是对象呢?

对象是OOP应用程序的一个重要组成部件,这个组成部件封装了部分应用程序,这部分应用程序可以是几个过程、数据或更抽象的实体。

简单来说,对象是数据和代码封装的统一体,对象非常类似于前面介绍的记录类型的变量。但与记录类型不同的是,对象不但能够包含数据成员(字段),还能够包含函数和过程(方法),这些数据和方法被统称为类的成员。

Delphi中的对象是从类型中创建的,就像前面的变量一样。对象的类型在OOP中有一个特殊的名称:类。对象与类是OOP中极其重要的两个概念,要注意,类和对象是两个完全不同的东西,它们之间的关系就像类型与变量的关系。

下面介绍对象中的几个基本概念。

●字段:字段就是对象中的数据成员,它可以是一组任何Delphi支持的类型变量的集合,比如integer、string、数组等。字段用来标志对象的状态,因为同一个类的不同对象可能在属性和字段中存储了不同的值。在这一点上它与记录类型的变量是一致的。

属性:属性和字段一样,都可以访问对象中包含的数据。字段和属性都可以输入,所以可以把信息存储在字段和属性中。同时,属性与字段又是有差异的,属性不能直接访问数据。有些属性是只读的,只能查看它们的值,而不能改变它们。

●方法:方法是用于表示对象中的过程或函数,它用于访问对象的功能。与字段和属性一样,方法可以是共有的或私有的,从而根据需要限制外部的访问。

●对象的生命周期:每个对象都有一个明确定义的生命周期,即从使用类定义开始一直到删除它为止。

实际上,Delphi中几乎所有东西都是对象,尽管有时它们处在Delphi完美的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论