面向对象的Pascal语言_第1页
面向对象的Pascal语言_第2页
面向对象的Pascal语言_第3页
面向对象的Pascal语言_第4页
面向对象的Pascal语言_第5页
已阅读5页,还剩123页未读 继续免费阅读

下载本文档

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

文档简介

2面向对象的Pascal语言

Delphi的编程基础语言是面向对象的Pascal语言,即ObjectPascal。Object

Pascal不仅数据类型丰富、支持结构化程序设计和面向对象程序设计,而且具有代码稳

定、可读性好、编译速度快等优点,是最受程序员欢迎的程序语言之一。

本章讲述ObjectPascal语言的使用,主要内容包括ObjectPascal语言编程的基本

概念、数据类型、运算符、控制语句、过程与函数、类和对象及异常处理等。

2.1ObjectPascal概述

1.标识符

标识符(Identifiers)是以字母或下划线开头、后跟字母、数字或下划线所组成

的串,其作用是标识常量、变量、类型、属性、对象、过程、函数、程序、单元、

库和组件库等。

2.保留字

以下是ObjectPascal的保留字:

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.1ObjectPascal概述

3.注释

方便用),读程序而附加的解释说明语句。ObjectPascal支持三种类型的注释.

(1)大括号注释:“{”与"『的成对使用表示它们之间的内容为注释部分.

(2)带髻学的小括号注释:”「与"*)”的成对使用表示它们之间的内容为注释部分。

(3)双斜杠注释“//”:表示所在行的该符号之后的内容为注释。

4.常量和变量

1)常量

•一般常量

如123,-10,-10.56,"abcH,TRUE等都是一般常量。

•符号常量

z例如,在一个计堇运费的程序中,单位价格标准(假设为0.20元/公斤.公里)可

管会使用多次,一旦标准调整,将要在程序中对这多处进行修改,这样不仅工作量大、

餐率低、而且容易漏掉。在应用程序开发中,通常定义一个符号常量来表示这些反复、

徒由宿相同量来解力上述问题。ObjectPascal中,用const关键字来声明常量。一

2.1ObjectPascal既述

■‘、语法:

const常量名=表达式;

例如:

const

pi=3.14;

m=20;

st='Iamastudent.';

n=m+10;

说明:

(1)常量在说明时就被赋予了一个值,在程序执行过程中是不可改变的。

(2)等号的右边只能出现一般常量、已声明的常量或者常量表达式。

2)变量

系统根据变量的数据类型为每一个变量分配一定的内存空间,用户可以通过变量

名对内存单元进行读或写。ObjectPascal+,用var关键字声明变量。

」语法:

var变量名表:类型名;

2.1ObjectPascal概述

不说明:

(1)类型名是ObjectPascal中任何有效的数据类型。

(2)变量名表中的变量与变量之间用逗号分隔开,变量与类型名之间用冒号分隔。

例如:

varI,J:Integer;〃定义两个整型变量I和J

(3)当有几个连续的变量声明语句时,可以不必在每个声明语句前都用保留字var,

只需在最开始处使用var,例如:

var

x,y:real;//定义两个实型变量x和y

kJ:integer;//定义两个整型变量k和j

flag:Boolean;//定义一个逻辑型变量flag

2.2数据类型

2.2.1简单数据类型

1.有序数据类型

有序数据类型分为整数类型、字符类型、布尔类型、枚举类型和子界类型。

1)整数类型

整数类型是由正号或负号、数字组成的数据,数据中不包含小数。表2.1所列出

了它包括的各种类型。

表2.1对象Pascal语言中的整数类型

整数类型数值范围格式

integer-2147483648..2147483647signed32-bit

Cardinal0..4294967295unsigned32-bit

Shortint-128..127signed8-bit

Smallint-32768..32767signed16-bit

Longmt-2147483648..2147483647signed32-bit

Int64-2A63..2A63-1signed64-bit

Byte0..255unsigned8-bit

Word0..65535unsigned16-bit

Longword0..4294967295unsigned32-bit

2.2数据类型

2)字符类型

字符类型只存储一个字符,利用关键字Char来表示。除了Char数据类型外,Dephi

还提供了Char的扩展类型,它们是AnsiChar和WideChar两种类型。AnsiChar类型的数

据具有一个字节,与扩展的ANSI字符集对应,ANSI字符集是扩展的ASCII字符集,每

个字符占一个字节。WideChar类型的数据为双字节,与Unicode字符集对应。Unicode

字符集的前256个字符与ANSI字符集的相同。通用的字符类型为Char,与AnsiChar类

型相同。表2.2是字符数据类型的列表。

表2.2字符数据类型

字符类型占用字节数存储内容

AnsiChar1存储一个Ansi字符

存储一个Unicode字

WideChar2

Char1同AnsiChar

通过函数chr可以将一个整数转换成对应的字符。例如:赋值语句Letter:=chr(97)功

能是将ASCH码值为97的字符“a”赋给字符变量Letter。

2.2数据类型

3)布尔类型

布尔类型(Boolean)是只能表示真或假的一种数据类型,包括以下四种类别:

Boolean>ByteBooKWordBool和LongBool。布尔类型是最常用的数据类型之一。

4)枚举类型

枚举类型定义中的每个值都对应一个整数值的序号,每个枚举项所对应的整数值

由其在定义表中的位置决定,类型定义表中从左向右的第一个数据对应的整数值为0,

其余向右依次增加1。

语法(枚举类型定义和枚举类型变量声明):

type

枚举类型标识符=(枚举常量标识符列表);

var

枚举类型变量表:枚举类型标识符;

例如:

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

{以上是枚举类型定义}

vartoday:day;〃枚举变量声明

上面例子中的枚举常量Sunday、Monday>Tuesday>Wednesday>Thursday>Friday

和Saturday对应的整数值分别为0、1、2、3、4、5和6。一

有时也可以把类型定义和变量声明合二为一,例如:

varcolorl,color2:(Red,Blue,Green,Black)

2.2数据类型

*说明:

(1)枚举元素对应的值并不是一成不变的,若必要,可在定义类型时改变元素

对应的值。例如:

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

此时,Monday对应的值是1,Tuesday对应的值是2…,Sunday对应的值是7。

(2)同一个枚举项不能出现在多个枚举类型中。例如:

typeMonth1=(Jan,Feb,Mar,Api,May,Jun);

Month2=(Jun,Jul,Feb);

这两个类型Monthl,Month2中都包含Jun这个元素,这是不允许的。

(3)枚举类型是有序数据类型,对其运算可以使用Ord、Pred、Succ及关系运算

O

5)子界类型

子界类型(subrange)为某个有序类型的子集,其内部的元素可以是整型、布尔

型、字符型或者枚举型。

.?语法(子界类型定义):

type子界类型标识符=子界常量下限..子界常量上限;

舸如:下面的声明语句定义了一个枚举类型day和两个子界类型dayl、number0

2.2数据类型

type

day=(Sun,Mon,Tue,Wed,Thu,Fri,Sat);

day1=Sun..Wed

number=O..1OO;

使用子界类型,需注意以下几点:

(1)子界类型的上界和下界必须是同一类型,并且是有序类型,如整型、

布尔型、字符型或枚举型等,不能是实数类型或其它无序类型。

(2)子界类型的上界和下界不仅可以是常数,也可以是能够计算出具体值

的常数表达式。例如:

constn=10;

m=20;

typenumber=3*n..5*(m+n)

(3)子界类型的下限的序数值不能超过其上限值。

2.2数据类型

2.实数类型

预定义了七种不同的实数类型,它们分别是Real、Real48>Single>Double、

Extended>Comp和Currency,所能表示数的范围、有效位数和所占字节如表2.3所示。

表2.3实数类型

类型名范围字节数有效数字

Real5.0*10-324〜1.7*10308815-16

Real482.9*10-39〜1.7*1038611-12

Single1.5*10-45〜7.4*103847〜8

Double5.0*10-324〜1.7*10308815-16

Extende

7.4*10-4932〜1.1*1049321019-20

d

Comp-263+1-263-1819-20

CuiTenc

922337203685475.5808〜922337203685475.819-20

y5807

2.2数据类型

Real可以包含11到12位有效小数部分,不是处理器中浮点部件固有的数据类型,

每个操作都需要转换,这样就导致速度较慢,所以只有在和以前BorlandPascal兼容

的情况下才使用,否贝I」应使用Double或Single。Cueerncy类型是一种浮点型,拥有4

个小数位的精度,占8个字节。在存储较大数时,使用Cueerncy类型将具有较高的精

度。

乂3.日期和时间

Delphi使用实数类型来控制日期和时间信息。为了更精确,Delphi还定义了一种

特殊的TdateTime数据类型,它属于浮点类型。该类型必须有足够的宽度,在一个变

量里存储年、月、日、小时、分和秒,一直到毫秒这些信息。日期以从12/30/1899

(带负号的值指示1899以前的日期)开始的日期数字形式存储在TdateTime值的整数

部分,时间存储在小数部分。TdateTime不是系统预先定义的类型,可在系统单元中

定义后使用,定义形式如下:

typeTDateTime=typeDouble;

2.2数据类型

2.2.2字符串类型

字符串类型包括ShortString、AnsiString和WideString三种类型,如表2.4所示。

ShortString类型中的每个元素都是AnsiChar类型,不以NULL作为结束标记;AnsiString

类型也是基于AnsiChar类型,可被动态分配存储空间,字符个数几乎不受限制,以NULL

作为结束标记;WideString与AnsiString类似,只是所包含的字符是WideCha「类型字符。

习惯上使用的String默认为AnsiString类型。

表2.4字符串类型

类型最大长度所需内存存储的字符

ShortString255字符2~256bytesAnsiChar

AnsiString231个字符4bytes-2GBAnsiChar

WideString23。个字符4bytes-2GBWideChar

说明一个字符串型的变量,应指明该字符串的大小。例如:

typeStringl:string[20];

varMyString:Stringl;

变量MyString被说明成为最多可以包含20个字符。字符串的缺省大小为255。给字

符串赋值可以直接使用单引号括起的字符串,例如:MyString:='tony';

2.2数据类型

2.2.3可变类型

这些数据的数据类型可以在运行期间进行改变,但是它们比固定类型的

数据占用更多的空间和更多的操作时间。另外,可变类型不能包含记录型、

集合类型、静态数组、文件类型、类、指针类型以及长整型等数据类型。

.,语法(可变类型变量声明):

var变量名表:Variant;

2.2.4类型相容和强制转换

1.类型相容

类型相容的数据之间可以进行关系运算。类型相容是赋值相容的前提,也是进行

数据运算的前提。在ObjectPascal中,两种数据类型只有满足下列条件之一时才是相

容的:

(1)两种类型的数据一致。

(2)两种类型的数据都是实型。

(3)两种类型的数据都是整型。

(4)一种数据的类型是另一种数据类型的子界。

(5)两种数据类型都是另外一种宿主类型的子界。

(6)两种数据类型都是另外一种相容基类型的集合类型。

2.2数据类型

(7)两种数据类型都是紧凑字符串类型,并且具有相同的元素个数。

(8)一种数据类型是字符串类型,另一种数据类型是字符串类型、紧凑字符串类型

或字符类型,或者一种数据类型是9har类型,另一种数据类型是形式为array[0..n]of

Char的字符数组。

(9)一种类型是Pointer类型,另一种数据类型是指向任意一种数据类型的指针类型,

或者两种数据类型都是基类型相同的指针类型。

(10)两种数据类型都是类数据类型或者类引用类型,并且一种数据类型继承了另

外一种类型。

(11)两种数据类型都是结果类型相同、参数个数相同、参数类型一致的过程类型。

(12)一种数据类型是可变数据类型,另外一种数据类型是整型、实型、字符串类

型或布尔类型。

2.变量强制类型转换

为了能通过编译检查,经常需要把一个变量的类型转换为另一种类型。

.?语法(强制类型转换):

类型标识符(变量名);

例如,有以下程序段:

varstrkchar;str2:byte;

begin

strl:-a';

str2:=strl;

end

2.3运算符

2.3.1赋值运算符

语法(赋值语句):

变量:=表达式;

其中;“:二”称4赋值号。赋值语句的功能是先计算赋值运算符右边表达式的值,

然后再把结果赋给左边的变量。例如:

x:=10;

y:=2*x+l;

str1,

赋值号’两边数据的数据类型要求是赋值相容的。若类型T1的值与类型T2的值满足

下列条件之一,则它们是赋值相容的:

(1)TI和T2是相同的数据类型,且都不是文件类型或包含文件类型的自定义类型。

(2)TI和T2是相容的有序类型,类型T2的值在T1的取值范围内。

(3)T1和T2都是实型,类型T2的值在T1的取值范围内。

(4)T1是实型,T2是整型。

(5)T1和T2都是字符串类型,或者T1是字符串类型,T2是字符类型。

(6)T1和T2是相容的集合类型,并且T2是T1的子集。

(7)T1和T2是相容的指针类型。

(8)T1是类类型,T2是T1的继承类类型,或者T1是类引用类型,T2是T1的继承类

引用类型。

2.3运算符

2.3.2算术运算符

如表2.5所示。

在进行“+”、运算中,只要有一个运算分量为real类型,则结果就为

real类型,只有两个运算分量都为integer类型时,结果才为integer类型。例如:

varn,m,r:integer;

x,y,z:real;

begin

n:=10;m:=3;x:=2.5;y:=1.5;

r:=nmodm;〃将n除以m所

得的余数赋给r

z:=n+x;y:=n/x;

end

则上述程序段执行后r的值为1,z的值为12.5,y的值为4.0。

2.3运算符

表2.5算术运算符

运算符作用操作数类型结果类型

+表小正:数integer或realinteger或real

—表下负数integer或realinteger•或real

+两个数相加integer或realinteger,real

—两个数相减integer或realinteger,real

*两个数相乘integer或realinteger,real

/两个浮点数相除integer或realreal

div两个整型数相除integerinteger

mod整除取余数integerinteger

2.3运算符

2.3.3关系运算符

关系运算符可以对两个普通数据类型、类、对象、接口类型或字符串类型的数据

进行比较,结果数据类型为布尔类型。ObjectPascal的关系运算符包括“二”、“<>"、

“<=,,、“>=”、">,,、“V”和“m”,它们的操作对象、结果数据类型如表2.6所示。

表2.6关系运算符

操作符操作结果数据类型

=X=Y,若X等于Y则结果为True,否则为FalseBoolean

<>X<>Y,若X不等于Y则结果为True,否则为FalseBoolean

>=X>=Y,若X大于等于Y则结果为True,否则为FalseBoolean

<=X<=Y,若X小于等于Y则结果为True,否则为FalseBoolean

>X>Y,若X大于Y则结果为True,否则为FalseBoolean

<X<Y,若X小于Y则结果为True,否则为FalseBoolean

InXinY,若X属于Y则结果为True,否则为FalseBoolean

2.3运算符

2.3.4逻辑运算符

逻辑运算符对逻辑类型的操作数进行运算,数据结果为逻辑型,如表2.7所示。

表2.7逻辑运算符

运算符作用操作数类型结果类型

Not逻辑非BooleanBoolean

And逻辑与BooleanBoolean

Or逻辑或BooleanBoolean

Xor逻辑异或BooleanBoolean

其中Not是一元运算符,And、Or和Xor是二元运算符,运算分量均为布尔型数据。

例如:设A和B是两个逻辑变量,A和B进行逻辑操作的情况如表28所示。

表2.8逻辑运算的真值表

ABNotAAandBAorBAXorB

FalseFalseFalseFalseFalse

True

FalseTrueFalseTrueTrue

TrueFalseFalseTrueTrue

False

TrueTrueTrueTrueFalse

2.3运算符

2.3.5集合运算符

集合运算符主要对两个集合进行操作,判断两个集合之间的关系,假设A和B是两

个相容集合,s是一个普通类型数据,则A和B进行操作的情况如表2.9所示。

例如,有以下说明和集合的运算:

typeNumbers".100;

Nnmset=setofNumbers;

varSet1,Set2,Set3,Set4,Set5:Numset;

begin

Set1:=[1,2,6,8];

Set2:=[2,3,6,7];

Set4:=[1,2];

Set5:=[2,3];

Set3:=set1+set2;

end;

上述程序段执行后,$913的值为[1,2,3,6,7,8];若改为Set3:=Set1-Set2则Set3值为

[1,8];若5戌3:=56u*$312则$83值为[2,6];条件表达式Set1=Set2的值为False,而

Set1〈>Set2的值为True,Set4V二Set1的殖为True,Set4〈二Set2的值为False,1in

Set1的值为True。

2.3运算符

表2.9集合运算规则表

运算符运算规则操作数类型结果类型

+A+B,求A和B的并集setset

-A-B,求A和B的差集setset

*A*B,求A和B的交集setset

A<=B,若A中的每个元素都是B中的元素,结果为

<=setBoolean

True,否则为False

A>=B,若B中的每个元素都是A中的元素,结果为

>=setBoolean

True,否则为False

A=B,若A和B中的元素完全相同,结果为True,否则

=setBoolean

为False

A<>B,若A和B中的元素不完全相同,结果为True,

<>setBoolean

否则为False

insinB,若s属于B则结果为True,否则为False有序,setBoolean

2-3运算符

2.3.6位运算符

位运算符能操作一个变量的各二进制位。最常用的按位运算符能把一个数左移或右

移,或对两个数按位执行与、取反、或和异或等运算。位运算符对整型的数据进行按位

操作,所得结果也为整型数据,如表2.10所示。

表2.10位运算符

运算符作用

not按位取反

and按位与

Or按位或

xor按位异或

shl按位左移

shr按位右移

2-3运算符

例如,x,y是整型,x的值是12(二进制表示为1100),y的值是8(二进制表示为

1000),x和y对应的位运算结果如表2.11所示。

表2.11位运算示例

XYnotxXandyxoryXxoryXshl2Xshr1

1000

1100B001IB1000B1100B0100B0000B0110B

B

2.3.7其他运算符

字符串连接运算符+(或&),作用是将两个字符串联接在一起。当两个字符串都是短

字符串时,进行连接若结果字符串长度超过255个字符,则只有前255个字符有效。

此外还有用于指针类型数据运算的运算符+、-、3=和。等。

2.3运算符

2.3.8运算符的优先级

通常在一个表达式中可能含有多种运算符,在求解的过程中必须清楚对表达

式中的各部分是按什么样的顺序来进行运算的,即必须考虑各操作符的优先关系。

表2.12列出了ObjectPascal各运算符的优先级。

表达式在求值时,遵循以下原则:

•两个操作符之间的操作数总是先参加高优先级的运算。

•在优先级相等的情况下,操作数按从左到右的顺序参加运算。

•在有括号的情况下应先计算括号内的运算。

表2.12ObjectPascal各运算符的优先级

运算符优先级分类

@,not1(最高)一元运算符

*,/,div,nld,and,shl,shr,as2乘除运算符

+,-,or,xor3加减运算符

in,is4(最低)关系运算符

2.4语句

2.4.1声明语句

声明语句主要实现对标号、常量、数据类型、变量、过程、函数、过程和函数

等进行声明。声明语句的使用在2.2节中已经多次使用过,在此作一总结。

1.标号声明

标号总是和一些控制转移语句一起使用,它可以是一个0〜9999的整数,也可以

是一个标识符。

.,语法(标号声明):

labellabell[,labe12[,label3[,

label10,20,label1;〃1。和20是常数标号,labell是一个标识符。

2.常量声明

语法(常量声明):

const常量名=表达式;

声明常量时,=右边可以使用预定义函数,如Abs、Addr>ArcTan>Chr>Cos>

Exp>Frac^Hi>High>Int^Length、Ln>Lo>Low、Odd>Ord、Pred>Round、

Sin>SizeOf>Sqr>Sqrt>Succ>Swap和Trunc等。

2.4语句

3.类型声明

.?语法(类型声明):

type类型名=类型定义;

例如,typeDefType=Array[1..100]ofreal;〃声明一个具有100元素的实数数组

4.变量声明

4〃语法(变量声明):

vai变量名表:类型;

例如:varX,Y:Integer;

关于“过程和函数的声明”可参阅2.5“过程与函数”一节。

注意:

声明语句的使用在程序中的次序是固定的,应该按照标号、常量、类型、变量

、过程和函数的顺序来声明。

2.4语句

2.4.2简单语句

常见的简单语句有赋值语句、过程和函数调用语句和got。语句三种。

1.赋值语句

赋值语句是形式最简单,使用最频繁的语句。其语法及要点请见231。

以下是一些赋值语句的例子:

Flag:=(I>=1)and(I<100);//将逻辑表达式的结果赋值为一个变量

Hue1:=[Blue,Red.Green];〃将一个集合赋给一个变量

I:=Sqr(J)-1*K;〃将一个表达式的结果赋值为一个变量

Shortint(MyChar):=122;//给类型转换后的变量赋值

Array1[l]:='A';//给数组的一个元素赋值

Labell.captioni请输入姓名';〃给对象的属性赋值

2.goto语句

从结构化程序设计的角度来考虑,尽量不要使用goto语句。

J语法:

goto标号;

在使用goto语句之前,要首先声明出现在goto语句中的标号,并且声明语句一定与

goto语句语句处于同一个程序块中。另外,不能用goto语句从一个过程跳转到另一个过

程中。过多地使用goto语句,会使得程序在运行过程中频繁跳来跳去,使整个程序变得

混乱无序,建议在编程时,尽量少使用got。语句。

2.4语句

2.4.3条件控制语句

在ObjectPascal中,条件语句有两种:if语句和case语句。

if加句%在编程时经常用到的语句之一,它首先判断条件表达式是否成立,根

据条件表达式成立与否来决定某些语句是否要执行。

1)if…then…else语句

语法:

if(条件表达式)then

语句1

[else

语句2

]

语法格式中的口,表示其中的内容为可选项。该if语句的执行过程为:首先判断

条件表达式的真假,如果为真,则执行then后面的语句1;如果为假,则执行else后

面的语句2,如图2.1(a)所示。若省略else子句,当条件表达式的值为假,则跳过

条件语句而去执行条件语句后的语句,如图2.1(b)所示。

2.4语句

Then和else后面的语句可以是简单语句,也可是由begin和end定界的复合语句。

(a)(b)

图2.1if语句执行流程图

例如:

ifa>bthen

max:=a

else

max:=b;

2.4语句

2)if语句的嵌套

若在if语句的then或else部分中又出现了if语句,就形成了if语句的嵌套。格式如下:

if(条件表达式)then

begin

语句1

if(条件表达式)then

语句2

else

语句3

end

else

语句4

在if语句嵌套中,if...then…else语句的复合形式最为常用,它用于处理程序中两

路以上分支的情况。该形式是将许多条件语句嵌套起来使用,使程序有多条分支。

语法(if…then…else语句的复合形式):

if(条件表达式1)then

2.4语句

语句1

elseif(条件表达式2)then

语句2

else

语句n

其中法语句1~语句n既可以是简单语句,又可以是复合语句。

如果所有条件表达式的值都为假,则执行else后面的语句。

例如以下程序段实现的功能是:如果J不等于0,则执行begin和end之间的语句;

否则如果count等于last,则给Done赋真值,如果count不等于Last,则退出,即最后

的else是与ifCount=Lastthen相匹配的else。

ifJ<>0then

begin

Result:=l/J;

Count:=Count+1;

end

elseifCount=Lastthen

Done:=True

else

Exit;

2.4语句

【例2.1】计算下列函数:

'1(x>0)

y5=o(x=o)

、-1(x<0)

函数分成三种情况,即x<0、x=0和x>0时执行不同的语句块。

方法1:用if嵌套结构来设计,将x>0的判断嵌套在x<>0的分支结构中:

y:=-i;

ifx<>0then

begin

ifx>0then

y:=l;

end

else

y:=°;

方法2:用if嵌姿结构来设计,将x>0和x=0的判断嵌套在x>=0的分支结构中:

ifx>=0then

begin

ifx>0then

y:=l

else

y:=0;

2.4语句

end

else

y:=-1;

方法3:用if...then...else语句的复合语句来设计:

ifx>0then

y:=1

elseifx=0then

y:=0

else

y:=-1;

【例2.2】写一程序,判断所输入年份是否是闰年。闰年的条件是:

(1)能被4整除,但不能被100整除的年份是闰年;

(2)能被100整除,又能被400整除的年份是闰年。对这两个条件都不符合的

年份不是闰年。

程序功能:输入一年份,显示其是否为闰年的信息。

2.4语句

界面设计:由四个组件组成,两个文本框labell(用来显示提示)和Iabel2(用来显

示结果信息),一个Edit组件Editl(用来输入要进行判断的年份)和一个Button组件

Button10如图2.2所示。

图2.2界面设计图2.3运行结果

2.4语句

程序代码:

procedureTForm1.Button1Click(Sender:TObject);

varyeaninteger;

flag:boolean;

begin

year:=strtoint(edit1.text);

ifyearmod4=0then

begin

ifyearmod100=0then

begin

ifyearmod400=0then

flag:=true//year同时能被100和400整除

else

flag:=false;〃year能被4和100整除,但不能被400整除

end

else

flag:=true;〃year能被4整除,但不能被100整除

end

2.4语句

else

flag:=false;//year不能被4整除

ifflagthen

Iabel2.Caption:='该年是闰年,

else

Iabel2.Caption:二'该年不是闰年,

end;

运行程序,在editl内输入要判断的年份,按“结果”按钮则输出结果信息。如图

2.3所示。

本例也可以用一个逻辑表达式包含所有的闰年条件,将上述程序中判断是否是闰

年的if语句用下面的if语句代替:

if((yearmod4=0)and(yearmod100<>0))or(yearmod400=0)then

flag:=true

else

flag:=false;

2.Case语句

case语句对一个结果的多个分支进行判断,可以用来在多个可能的情况中选择一

个条件,而不再需要用大量嵌套的if…elseif...elseif结构。

2.4语句

・'>语法(case语句):

case表达式of

值表1:语句1;

值表2:语句2;

值表n:语句n;

[else

语句n+1;

]

end;

case开始语句中的表达式的值必须是有序类型,并且各值表中的数据类型必须与

表达式值的类型一致,且每个值只能出现一次,不允许重复出现。若值表中有多个值,

则各值之间逗号分隔开来。例如:

caseIof

1..5:Caption:='Low';

6..9:Caption:='High';

0,10..99:Caption:="Outofrange';

else

Caption:=

end;

2.4语句

【例2.3】编程为某运输公司计算运费。

运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:

s<250km没有折扣

250<s<5002%折扣

500<s<10005%折扣

1000<s<20008%折扣

2000<s<300010%折扣

3000<s15%折扣

设每公里每吨货物的基本运费为p(price的缩写),货物重为w(weight的缩

写),距离为s,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公

式为:

f=p*w*s*(1-d)

2.4语句

程序功能:输入要运输的货物重量、运输距离和每公里每吨货物的基本运费,单

击“计算”按钮,输出用户应支付的运费。

图2.4界面设计图2.5运行结果

界面设计:界面由八个组件组成,其中四个Label组件(Labell、Label2和Label3

用来显示提示,resultstr用来显示运费结果),三个Edit组件(txtweight用来输入货物

重量,txtdistence用来输入运输距离,txtprice用来输入每公里每吨货物的基本运费)

和——个Button组件btnok,如图2.4所示。

2.4语句

程序代码:

procedureTForml.btnokClick(Sender:TObject);

varp,w,d,f:real;s:integer;

begin

w:=strtofloat(txtweight.Text);//货物重量赋给w

s:=strtoint(txtdistence.Text);//运输距离赋给s

p:=strtofloat(txtprice.Text);〃基本费用赋给p

casesof

0..249:d:=0;

250..499:d:=0.02;

500..999:d:=0.05;

1000..1999:d:=0.08;

2000..2999:d:=0.1;

else

d:=0.15;

end;

f:=p*w*s*(1-d);

resultstr.Caption:二'运费为'+floattostr⑴;

end;

运行程序:按F9,输入货物重量、运输距离和基本运费,单击“计算”按钮,结

果如图2.5所示。

2.4语句

2.4.4循环语句

常用的循环语句有for...do语句、while…do语句和repeat…until语句等3种,下

面逐一加以介绍。

1.for…do语句

语法(for…do语句):

for循环变量:=初值to|downto终值do

循环体;

for...do语句是最常用的循环语句。有两种形式,分别使用关键字to和downto。

这两种形式的差别有两处:

(1)循环终止条件,前者是循环变量大于终值,而后者则是循环变量小于终

值;

(2)每执行一次循环体后,前者将循环变量加1,而后者减1。

使用to的for...do语句执行流程如图2.6所示,使用downto的形式其执行流

程与之相似,读者可自行分析。

例如:fori:=1to10doData[i]:=i;〃为Data数组的10个元素分别赋值

1,2...10o

’再如,以下程序段求10的阶乘:

fac:=1;

fori:=10downto2do

fac:=fac*i;〃计算10!

2.4语句

for循环适合用在事先知道循环次数的情况。使用for语句时应注意以下儿点:

(1)循环变量的声明必须在包含该循环的最内层程序块中进行。

(2)循环变量的初值、终值可以是能计算出具体值的表达式(包括常量、变量)。

(3)循环变量必须是有序类型,且与初值、终值属于同一数据类型。

(4)循环体可以是简单语句,也可以是由begin和end界定的复合语句。

(5)在循环体中不允许用任何语句改变循环变量的值。

(6)For循环结束后,循环变量的值会自动变成不确定值,不能再使用它。

图2.6for...do语句执行流程

2.4语句

2.while…do语句

while循环结构用在先判断条件表达式是否为真,然后重复执行某一段代码的情况

下。while的条件是在循环体执行前进行判断的,即“先判断,后执行”。

语法(while…do语句):

while条件表达式do

循环体;

while…do语句的执行流程如图2.7所示。

图2.7while…do语句执行流程

2.4语句

例如:whileData[i]<>Xdoi:=i+1;〃在Data数组中查找X。

再如,下列程序段求自然数1700的和:

vari,sum:integer;

i:=0;sum:=0;

whilei<=100do

begin

sum:=sum+i;

i:=i+1;

end;

3.repeat…until语句

repeat...until在条件表达式为真前反复执行给定的代码。它与while的区别在于

循环体至少要执行一遍,因为条件测试在循环的结尾。

语法(repeat...until语句):

repeat

循环体;

until条件表达式

2.4语句

repeat...until的执行流程如图2.8所示。

例如,以下程序段的功能是直到输入一个。到9之间的数才结束数据输入循环。

repeat

Write('Enteravalue(0..9):');

Readln(i);

until(i>=0)and(i<=9);

2.4语句

以下举例说明使用循环来解决实际问题。

【例2.4】利用公式亍E-;+;-《..公式求的近似值,直到某一项的绝对值小于

10-6为止。

分析:本问题属于累加和问题,反复执行的操作是加(减)法,解决的基本思路是:

设置累加单元存放和值,利用各项规律的变化求出每个累加项,注意为累加项设置初

始值。以下是程序:

vars:integer;〃$为累加项

n,t,pi:real;〃1为当前项

begin

_t:=l;pi:=0;n:=1.0;s:=l;

while(abs(t)>0.000001)do〃计算精度

begin

pi:=pi+t;〃执行累加

n:=n+2;〃各项分母

s:=-s;//用于改变相邻两项的符号

t:=s/n;//计算下一个项

end;

pi:=pi*4;〃求得的pi就是我近似值

end;

2.4语句

【例2.5】求Fibonacci数列前20项。这个数列有如下特点:第1、2两项都为1。从第

3项开始,每项都是其前两项之和。即:

F1=1(n=1)

F2=1(n=2)

Fn=Fn-1+Fn-2(n>3)

界面设计:界面由一个ListBox组件(ListBoxFei用来显示级数)和一个Button组件

(BtnShow组成),如图2.9所示。程序功能是单击“输出级数”按钮,将Fibonacc嗷

列前20项添加到列表ListBoxFei中显示出来。

图2.9界面设计图2.10运行结果

2.4语句

程序代码如下:

procedureTForml.BtnShow(Sender:TObject);

vari,f1,f2:integer;

begin

f1:=1;f2:=1;

fori:=1to10do

begin

ListBoxFei.items.add(inttostr(f1));〃将f1添加到列表中

ListBoxFei.items.add(inttostr(f2));〃将f2添加到列表中

f1:=f1+f2;

f2:=f2+f1;

end

end;

运行程序:单击“输出级数”按钮,Fibonacci数列前20项显示在ListBoxI中。如图2.10所示,

2.4语句

2.4.5其他语句

1brea/&J

'break'句用于在循环语句的循环体中强行退出循环,跳到循环语句后面的

语句继续执行。例如:

varS:string;

begin

whileTruedo

begin

ReadLn(S);//读入一字符串

ifS="thenBreak;〃不输入任何字符,则退出循环

WriteLn(S);〃输出字符串

end;

end;

end;

执行该程序段时,当输入一个空串时结束while循环。

2.4语句

2.continue语句

continue语句和break语句类似,用于循环语句的循环体中强行结束本次循环,开

始执行本循环的下一次循环操作。

例如,以下程序段的功能是单击窗体上的BtnShow,将100~200之间的不能被3整

除的数添加到列表框ListlBoxNum中

温馨提示

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

评论

0/150

提交评论