1、第第2章章 Object Pascal程序设计语言程序设计语言 2.1 控制台程序2.2 注释2.3 标识符与关键字2.4 基本数据类型2.5 复杂数据类型2.6 常量与变量2.7 运算符与表达式2.8 语句2.9 过程与函数2.10 消息框过程和函数2.1 控制台程序控制台程序 控制台程序是指一些没有图形用户界面的32位Windows应用程序,通常在控制台窗口中运行,也就是在类似以前的DOS环境下运行。这些程序很少要求用户输入大量的信息,一般只实现有限的特定的功能。如Windows目录下的Ping.exe等。控制台程序的代码比较小,一般在几十千字节左右,占用的系统资源少。在开发阶段,编译、链
2、接的速度比较快。在学习计算机语言的过程中,可以上机编写一些短小的控制台程序进行练习。所以我们利用它可以方便学习和掌握Object Pascal语言。控制台程序相关文件少。最少情况下可以只有一个工程文件(.dpr)和一个可执行文件(.exe)。下面我们通过一个具体的例子进行讲解:实例讲解【例2.1】创建一个控制台程序。1)创建指定目录下新建一个“控制台”文件夹。2)在Delphi集成开发环境中,通过菜单【File】|【New】打开【New Items】对话框,选中【New】标签中的【Console Application】项,如图2-1所示,按下【OK】按钮。系统会自动创建一个控制台程序的工程,
3、并在代码编辑窗口中打开Project1.dpr文件。3)通过菜单【File】|【Save All】将工程文件保存在创建的目录中。本章后面的例程都可以利用本工程来方便地实现。4)现在可以编译、链接和运行程序,将顺利生成一个可执行程序,只是该程序不做任何工作就退出了。5)修改文件Project1.dpr中的程序。6)编译、链接和运行程序,测试效果。在程序提示“请输入一行文字:”后,输入“Hello World!”。运行结果界面如图2-2所示。Read和Write函数1)Read功能:read在DOS屏幕下通过键盘读入n个数据,并将这些数据赋值给n个变量。各个数据之间可以通过指定字符,如果没有指定字
4、符用空格字符或用回车符分隔。用法与C语言的scanf函数用法相似。格式:read(V1,V2,.,Vn)说明:V1可以是基本数据类型的变量,也可以是字符常量。例如:var a,b:integer;read(a,b);/读入2个整型数据,并将这2个整型数据赋值给a、b这两个变量。在DOS屏幕下输入1 2回车后,a的值是1,b的值是2。2)write功能:write在DOS屏幕下输出n个数据,并将这些数据赋值给n个变量。格式:write(P1,P2,.,Pn)说明:P1可以是基本数据类型的变量,也可以是字符常量。例如:var a,b:integer;a=1;b=2;write(a,b);/输出a、
5、b两个整型变量的数据。3)readln功能:readln与read的功能相似,只是在最后多读入一个回车符。格式:readln(V1,V2,.,Vn)4)writeln功能:writedln与write的功能相似,只是在输出的后面多输出一个回车符。格式:writeln(V1,V2,.,Vn)注意:这4个函数只能在DOS环境下使用。2.2 注释 Object Pascal语言中的注释有下面三种形式:组合符号“”与“”的成对使用表示它们之间的内容为注释部分。组合符号“(*”与“*)”的成对使用表示它们之间的内容为注释部分。符号“/”的单个使用表示所在行的该符号之后的内容为注释。注意:注释符“”与“”
6、、“(*”与“*)”在使用时不支持注释的嵌套,而且必须成对使用。建议对于单行和少量几行的注释使用符号“/”,对于大块注释使用“”和“”或“(*”和“*)”。有时可以利用注释在代码中形成一个醒目的标志。比如利用注释符号形成一个矩形方框,在其中可以添加一些重要的说明文字。在注释符“”或“(*”后紧接着的是一个美元符号“$”时,表示该句是一个编译器指令,它与普通的注释不同,通常用来对编译过程进行设置。比如前面的例2.1中的第二句就是一个编译器指令。由于Delphi集成开发环境中的代码编辑器在显示不同类型的代码时通过使用不同的颜色来加以区别,所以在编程的过程中,只要注意文件中代码的颜色,一般就不会错误
7、地使用注释符了。2.3 标识符与保留字标识符与保留字2.3.1 标识符的组成和作用 在Object Pascal语言中使用的是ASCII码字符集,包括英语字母A.Z、a.z、数字0.9和其他的一些标准字符。下面的单个字符作为特殊符号存在:#$&()*+,?./:;另外,有些字符对也作为单个的特殊符号存在,具体有:(*(.*).)./:=其中,左中括号“”等价于“(.”,右中括号“”等价于“.)”,左大括号“”等价于“(*”,右大括号“)”等价于“*)”。标识符可以由任意长的一个不带空格的字符串组成,但是只有前面的255个字符有效。标识符的第一个字符必须是字母或下划线,其余字符可以是字母、数字或
8、下划线。下面是一些正确或错误标识符命名的实例。正确形式错误形式 count123count test123 14_count timenew$123 _123 abc 123 一般标识符可以由一个或多个具有适当意义的英文单词组成。Pascal语言对于字母的大小写不敏感。当然,字符串中的大小写字母是需要分清的。在编写程序的时候要保持一定的风格,不要有时候全部大写标识符,另一些时候又实行大小写混写。标识符是用来对常量、变量、函数标号和其他用户定义对象等进行命名的。在程序设计语言中,程序中的数据定义、流程控制语句等都是由标识符组成的。2.3.2 保留字和指令字 在标识符中,有一些是系统已经使用的,它
9、们已有特定的含义,用户不能再用它们对自己定义的量命名。下面我们来学习下Object Pascal的保留字。Object Pascal语言本身使用的一组标识符亦称为保留字,你必须了解它的含义,以便于正确的使用,否则会造成错误。Object Pascal语言定义了65个保留字,这些保留字不能被定义为标识符。2.4 基本数据类型基本数据类型2.4.1 整型 整型数据(integer)用来存放整数。Object Pascal支持五种预定义整型,它们是shortint(短整型)、smallint(整型)、longint(长整型)、byte(字节型)、word(字类型)和longword(双字型),每一种
10、类型规定了相应的整数取值范围以及所占用的内存字节数。它们的特性如下表2-3所示。实例讲解【例2.2】将输入一个整数值并把它输出到屏幕上。program Project1;$APPTYPE CONSOLEvarx:integer;begin writeln(请输入一个整数:);readln(x);writeln(你输入整数的是:,x);/下面的代码是为了在按下回车键前始终显示运行界面 writeln(按下回车键退出。);readln;end.2.4.2 实型实型数据(real)用类存放实数。Object Pascal支持五种预定义实型,它们是real(基本实型)、single(单精度实型)、do
11、uble(双精度实型)、extended(扩展实型)、comp(装配实型)和currency(货币实型),每一种类型规定了相应的实数取值范围、所占用的内存字节数以及它们所能达到的精度。类型 数值范围 占字节数 有效位数Real 2.910-391.71038 6 1116Single 1.510-453.41038 4 78Double 5.010-3241.710308 8 1516Comp -263+1263-1 8 19202.4.3 布尔型 布尔型(boolean)数据用来存放逻辑值(布尔值)。布尔型的值只有两个:false和True,并且false的序号是0,True的序号是1。fa
12、lse 和True都是预定义常数标识符,分别表示逻辑假和逻辑真。boolean是布尔型的标识符。2.4.4 字符型 字符型(character)用char作为标识符。字符型必须用单引号“”括起来,字母作为字符型时,大小写是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。字符型是ASCII字符的集合,包括2种类型:标准字符和宽字符。AnsiChar是传统的Pascal语言的字符,是标准的一字节的ANSI字符;WideChar用于保存单个两字节的Unicode字符。Unicode字符集的前256个字符与ANSI字符集相同。一般的Char表示一个AnsiChar字符。2.4.5 枚举类
13、型 枚举类型(enumerated)是由一组有序的标识符组成的,形式如下:type typeName=(标识符1,标识符n);通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序识一致的。例如:type Weektype=(Sun,Mon,Tue,Wed,Thur,Fri,Sat);枚举元素只能是标识符,而不能是数值常量或字符常量。不要把作为枚举元素的标识符视作变量名,它不能被赋值。同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。2.4.6 字界类型 子界类型(subrange)为某个有序类型的子集。例如开始定义了一个表示颜色的枚举类型:type
14、TColors=(Red,Blue,Green,Yellow,Orange,Purple,White,Black);接着就可以定义一个子界类型如下:type TMyColors=Green.White;其中TMyColors包括了Green、Yellow、Orange、Purple和White。2.5 复杂数据类型复杂数据类型 结构类型(Struct)包括集合类型(set)、数组类型(array)、记录类型(record)、文件类型(file)、类类型(class)、类引用类型(class reference)和接口类型(interface)等。2.5.1 集合类型 集合类型(set)由有序类
15、型的一些数值组成。定义方法如下:set of 基类型 例如:type TSomeInts=1.250;/基本类型为有序类型 TIntSet=set of TSomeInts;/定义集合类型 TACopyOfByte=set of Byte;TSuit=set of(Club,Diamond,Heart,Spade);TACopyOfChar=set of Char;2.5.2 数组类型 数组类型(array)的数据为某一类相同类型的元素按一定的顺序组成的序列,包括静态数组和动态数组两种。1静态数组的定义方式如下:array 下标下限.下标上限 of 基类型 例如:var MyArray:arr
16、ay 1.100 of Char;/一维数组 type TMatrix=array 1.10 of array 1.50 of Real;/两维数组 type TMatrix=array 1.10,1.50 of Real;/与上面的两维数组相同2动态数组的定义方式如下:array of 基类型例如:var a:array of Real;/定义动态数组可以通过过程SetLength来为动态数组指定空间大小,例如:SetLength(a,20);/为动态数组指定空间大小其中数组a的索引值为0.19。2.5.3 记录类型 记录类型(record)可以由不同类型的元素组成,这些元素称为域。在记录类
17、型中为每个域指定了一个名称和数据类型。数据类型可以是Object Pascal语言中预定义的类型,也可以是程序员自定义的类型。记录类型的定义方式如下:type 标识符=record 域1:数据类型;域n:数据类型;end;实例讲解【例2.3】该例说明了记录类型的定义与使用,同时也对with语句进行了说明。program Project1;$APPTYPE CONSOLE type TDateRec=record/记录类型的定义 Year:integer;Month:(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);Day:1.31;end;va
18、r Record1,Record2:TDateRec;/记录类型变量的声明begin Record1.Year:=1975;/给记录中的域赋值 Record1.Month:=Sep;Record1.Day:=13;with Record1 do/使用with语句可以简化代码的输入 begin Year:=1973;/相当于Record1.Year:=1973;Month:=Jul;Day:=21;end;Record2:=Record1;/对记录进行拷贝with Record1 dobegin writeln(format(%d年%d月%d日,Year,7,Day);end;writeln(按
19、下回车键退出。);readln;end.运行结果如图2-4所示:2.6 常量与变量常量与变量2.6.1 常量 常量存储的是在程序中不能被修改的固定值。常量定义出现在说明部分。它的语法格式如下:const=;=;常量标识符的类型由定义它的常量的类型决定。例如:const a=12 隐含说明a是整型;const r=3.21隐含说明r是实型 常量定义部分必须以保留字const开头,可以包含一个或几个常量定义,而且每个常量均以分号结束。2.6.2 变量变量存储的是在程序中可以修改的值。变量具有三个基本要素:名字、类型和值。Object Pascal的每一个变量都具有一种类型,变量的类型决定了变量的数
20、据性质和范围、变量存储在内存中所占的大小(字节数)以及对变量可以进行的合法操作等。1变量声明格式一个变量由标识符、类型和可选的初始化共同定义的。变量声明格式如下:var变量标识符列表1:类型1;变量标识符列表2:类型2;变量标识符列表n:类型n;其中,保留字var表示开始一个变量说明部分。变量标识符列表是一个用逗号隔开的标识符序列,冒号后面的类型是类型标识符。每个变量说明均以分号结束。例如:vara,b,c:integer;m,n:real;2变量初始化在声明变量的同时也可以对变量进行初始化,即赋初值。格式如下:var 变量标识符:类型=常量表达式;例如:var i:integer=7;相当于
21、声明和语句 var i:integer;i:=7;同时声明多个变量(比如var x,y,z:Real;)时不能包括初始化,variant 和文件类型的变量声明也不能初始化。2.7 运算符和表达式运算符和表达式2.7.1 运算符 运算符是在代码中对各种数据类型进行运算的符号。例如,有能进行加(+)、减(-)、乘(*)、除(/)的运算符,有能访问一个数组的某个单元地址的运算符()。按照操作数数目的多少来分,运算符分为下面两类:单目运算符(Unary Operator)和双目运算符(Binary Operator)。例如算术运算符的+、-、*和/为双目运算符,+(正)和-(负)为单目运算符来使用。单
22、目运算符一般放在操作对象的前面,只有指针运算符()可以放在操作对象的后面。双目运算符都放在两个操作数之间。Object Pascal语言中主要的运算符有:算术运算符、逻辑运算符、关系运算符、布尔运算符、字符串运算符、集合运算符、地址运算符等。本节将主要学习这些运算符的功能、性质及其优先级。1算术运算符 算术运算符与普通数学中的运算符意义相同。它们的操作数可以是整型或实型,包括+、-、*、/、div 和 mod等。以下规则适用于算术运算符:不管x 和y 的类型是什么,x/y 的结果总是扩展类型(extended);对其它运算符,只要有一个运算数是实数类型,它的结果就是扩展类型;另外,只要有一个运
23、算数是Int64 类型,它的结果就是Int64 类型;否则,结果就是整数类型。如果一个运算数是整数的子界类型,它就像整数类型一样被对待。x div y 的值取整数,也就是取得x/y 的值,然后以0 的方向取得最近的整数。mod 运算返回对运算数进行整数除后得到的余数。换句话说,就是x mod y=x-(x div y)*y。若y 为0 的话,表达式x/y、x div y 和x mod y 将发生运行时错误。2逻辑运算符 逻辑运算符对逻辑类型的操作数进行运算,数据结果也为逻辑类型,如表2-8所示。3关系运算符 关系运算符用来比较两个运算数。=、=也用作集合运算符,=和 也用作指针运算符。对大多数
24、简单类型,比较运算非常容易理解。比如,只有i 和j 有相同的值,i=j 才是真,否则ij为真。下面的规则适用于关系运算符:除了实数和整数能一起比较外,两个运算数必须是兼容的类型;对字符串进行比较,是依据它的每个字符在扩展ASCII 字符集中的顺序,字符类型被当作长度为1 的字符串;两个packed string 要进行比较,它们必须具有相同数目的元素;一个具有n 个元素的packed string与一个字符串比较时,它被看作长度为n 的字符串;只有当两个PChar 指针都指向同一个字符数组的范围内时,、=运算符才能作用于它们;运算符=和 能以类或类引用类型作为运算数。当用于类类型时,=和 的计
25、算规则与指针一样,只有当C 和D 指向同一个实例对象时,C=D 为真,否则C D 为真;当用于类引用时,只有当C 和D 表示同一个类时,C=D 为真,否则C D 为真。4字符串运算符 加号(+)还可以作为字符串运算符,它可以将两个字符串联接在一起。如果两个字符串都是短字符串,那么在结果字符串长度超过255个字符的情况下,只有前面255个字符有效。5集合运算符 以下规则适用于+、和*运算符:当且仅当序数(集合基础类型中的一个值)O 属于集合X 或集合Y(或同时属于X 和Y)时,O 属于X+Y;当且仅当O 属于X 但不属于Y 时,O 属于X Y;当且仅当O 同时属于X 和Y时,O 属于X*Y。+、
26、和*的运算结果属于集合类型set of A.B,这里A 是结果中的最小序数,B 是结果中的最大序数。以下规则适用于=、=、和 in 运算符:只有当X(集合)中的每个成员也是Y(集合)中的成员时,X=W 等同于W=Z;只有当U(集合)和V(集合)正好拥有相同的成员时,U=V 才为真,否则U V为真;对于序数O 和集合S,只有当O 是S 的一个成员时,O in S 才为真。6地址运算符 地址运算符为,其作用是用来获取变量、函数或对象方法的地址。它返回的是运算对象的地址,也就是说它建立了一个指向其他运算对象的指针值。如:k:Integer;p:Integer;k:=8;p:=k;7.类运算符 类运算
27、符as和is对类或类的实例进行操作。此外,关系运算符=和也可以对类进行操作。8运算符的优先级 具有较高优先级的运算符先进行运算,具有相同优先级的运算符从左边开始。因此表达式x+y*z先执行y*z,然后加上x作为结果,*先被执行,因为它比+有较高优先级,但x-y+z先从x减去y,然后加上z作为结果,和+具有相同优先级,因此左边的运算先执行。使用圆括号来覆盖优先级规则。有括号的表达式先被运算,然后把它作为单个运算数。比如(x+y)*z,它把x 和y 的和乘以z。这里的明显用意是(x=y)or(x=z),但若没有括号,编译器遵循优先级规则把它读作(x=(y or x)=z,此时,若z不是布尔类型,它
28、将导致编译错误。括号通常使代码更容易读写,即使有时候严格说来它们是多余的。这样,上面第一个例子可写作x+(y*z)。2.7.2 表达式表达式是算法语言的基本组成部分,它表示一种求值规则,通常由操作数、运算符和圆括号。操作数是参加运算的数据,可以是常数、常量、变量或方法引用。表达式中出现的变量名必须已经被初始化。表达式按照运算符的优先级进行计算,求得一个表达式的值。运算符中圆括号的优先级最高,运算次序是“先内层后外层”,因此先计算由圆括号括起来的子表达式,圆括号还可以多级嵌套。大多运算符按照从左到右的次序进行计算,少数运算符的运算次序是从右向左的,如赋值运算、三元条件运算符等。Object Pa
29、scal规定了表达式的运算规则,对操作数类型、运算符性质、运算结果类型、及运算次序都做了严格的规定,程序员使用是必须严格遵循系统的规定,不能自定义。由于操作数和运算符都是有类型的,因而表达式也是有类型的,表达式的类型不一定和操作数相同,它取决于其中的运算结果。Object Pascal表达式即可以单独组成语句,也可以出现在循环条件、变量声明、方法的参数调用等场合。2.8 语句语句程序是由一系列语句组成的。语句描述了要执行的运算规则和动作。2.8.1 语句的格式1.声明语句声明语句主要实现对标号、常量、数据类型、变量、过程、函数、过程和函数的输出等进行声明。1)标号的声明格式如下:label 标
30、号1,标号n;其中的标号1,标号n可以是一个0.9999的整数,也可以是一个标识符。2)常量的声明格式如下列所示:const PI=3.1415926535897932385;在声明常量的时候,等号右边可以使用一些预定义的函数,如abs、chr、cos、exp、frac、hi、high、int、length、lo、low、odd、ord、pred、round、sin、sizeof、sqr、sqrt、和trunc等。3)在基本数据类型的基础上,还可以利用保留字type自定义一些数据类型,例如:typeMyType=array 1.100 of real;4)利用保留字var可以声明已存在数据类型
31、的变量,例如:varx,y:integer;m:MyType;赋值语句是最简单的语句,赋值语句的作用是计算表达式的值,并赋给变量。对于任何一个变量必须首先赋值,然后才能引用,否则,未赋初值的变量将以一个随机值参与运算。另外,赋值号两边的类型必须相同,但表达式值为整数时,它可自动化为实型后赋给该实型变量,即符合赋值相容。赋值语句的格式为:变量:=表达式;例如:a:=10;/把10的值赋给a b:=a+123;/把a的值与123相加,再把结果赋给b2.8.2 赋值语句2.8.3 goto语句goto语句是一种无条件转向语句,它可以控制直接从程序的一条语句转向另一条语句。goto语句的格式为:got
32、o标号;例如:a:=b+10;goto c;c:n:=i+j;上面的例子中,c是语句标号,语句标号要在程序说明部分用保留字label加以说明。当程序执行到goto c;这一句时就会发生跳转,转到c:n:=i+j;这里并执行。使用goto语句时,标号所指向的的语句与goto语句本身要在同一程序块内。不能用goto语句转入一个过程或函数内。Goto语句虽然增加了程序的灵活性,但是goto语句会使程序出现一种称为“乱面条”的结构,不符合结构化程序设计思想。因此,从结构化程序设计的角度来考虑,尽量不要使用goto语句。2.8.4 复合语句复合语句用关键字begin和end将若干条语句括起来组成的,也称
33、块语句。复合语句可以嵌套使用,也允许空的复合语句出现,也就是在begin和end之间没有其他语句。其格式为:begin 语句1;语句2;语句N;end;例如:begin i:=1;s:=i+1;end;这里,begin和end以及期间的3条赋值语句构成了一个复合语句。2.8.5 with语句在使用记录类型的变量时,可以通过with语句指定一些语句都是针对某一个变量来说的,这样可以简化代码的输入量。with语句的格式如下:with 目标对象 do 语句如果with语句指定的某个变量具有某个字段,另一个变量也具有该字段,则在with语句中对不指明变量的该字段来说,所有的操作都是针对with语句指定
34、的变量来进行的。如果要对其他变量的该字段进行操作,要在with语句中指明变量名。此外,还可以使用下面形式的with语句:with 目标对象1,目标对象n do statement2.8.6 条件语句 条件语句用于实现分支结构。Object Pascal条件语句有两种基本形式:if 语句和case语句。1if语句 if语句是由一个布尔表达式和两个供选择的操作序列组成。运行时根据布尔表达式求值结果,选取其中之一的操作序列执行。有两种形式的if语句:1)if布尔表达式then 语句;2)if布尔表达式then 语句1 else 语句2;当布尔表达式的值为真,则执行then后面的语句,值为假时有两种情
35、况:要么什么也不做,要么执行else后面的语句。注意else前面没有分号,因为分号是两个语句之间的分隔符,而else并非语句。如果在该处添了分号,则在编译的时候就会认为if 语句到此结束,而把else当作另一句的开头,输出出错信息。例如:if ab thenmax:=a elsemax:=b;if语句的then或else之后如果又是if语句,则构成嵌套的if 语句。嵌套的if语句中,else与最近的一个if语句匹配。语法格式为:if 表达式1 then 语句1else if表达式2 then语句2else if 表达式n-1 then 语句n-1else 语句n;例如:if a1 then b
36、:=a+1else if a=1 then b:=aelse if a1 then b:=a-1;else b:=0;在嵌套的if语句中,只有在最后一个else下面的一条语句结尾才加分号“;”表示if语句到该处结束。2case语句if语句根据某种条件,最多仅有两种可能的后继流向。如果想在多个语句中选择后继流向,就要使用case流向。case语句执行的是多重选择。case语句的语法为:case 表达式 of常量1:语句1;常量2:语句2;常量n:语句n;else 语句n;end;其中表达式的值必须是有序类型,不能是实型值或字符串。常量的类型必须与表达式的类型一致。case常数冒号右边的语句可以是
37、函数、过程调用、条件语句等,这为编写程序提供了极大的灵活性。2.8.7 循环语句循环语句实现循环结构。循环语句有三种:while语句、repeat语句、for语句。while语句和repeat语句是条件型循环,当循环是由条件控制,且循环次数不确定时适用。for语句是计数型循环,在循环次数已知时适用。1while循环while循环结构用在先判断某些条件是否为真,然后重复执行某一段代码的情况下。While的条件是在循环体执行前进行判断的。即“当满足某一条件时进行循环”,While语句的语法如下:while 布尔表达式 do 语句;while语句的执行过程是,先计算布尔表达式的值,当其值True时,
38、执行循环体中的语句序列,然后再重新计算布尔表达式的值,当布尔表达式的值为false时,循环终止,执行下一条语句。我们来看一个例子:i:=0;s:=0;while i10 do begin i:=i+1;s:=s+i;end;2repeat循环repeat语句是“重复执行循环体,直到指定的条件为真时为止”,Repeat语句的语法如下:repeat语句1;语句2;语句n;until 表达式;repeat循环与while循环相似,区别在于while循环结构的布尔表达式在循环开头进行判断,循环次数最少为0次,而repeat循环是先执行后判断,重复执行repeat与until之间的语句,直到布尔表达式为
39、True时,循环终止。循环次数最少为1次。如上面例子可以用repeat循环来实现:i:=0;s:=0;repeati:=i+1;s:=s+i;until i:=10;3for循环for循环适合用在事先知道循环次数的情况下,for语句的格式如下:for 循环变量:=初值 to 终值 do语句/递增循环for 循环变量:=初值 downto 终值 do 语句/递减循环其中循环变量用来控制循环次数,在程序的开头,需要声明该变量,其类型一般为整形。初值和终值可以是常数,也可以是表达式。第一种形式的for 语句是递增循环。首先将初值赋给控制变量,接着判断控制变量的值是否小于或等于终值,若是,则执行循环体
40、,在执行了循环体之后,自动将控制变量的值该为它的后继值,并重新判断是否小于或等于终值。当控制变量的值大于终值时,退出for循环,执行for语句之后的语句。第二种形式的for 语句是递减循环。首先将初值赋给控制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的前趋值,并重新判断是否大于或等于终值。当控制变量的值小于终值时,退出for循环,执行for语句之后的语句。例1:计算1+2+3+99+100var n,sum:integer;beginsum:=0;for i:=1 to 100 dosum:=sum+i;writeln(sum
41、);end;例2:for i:=5 downto 1 dowriteln(i);2.8.8 break过程 在w-h-i-l-e、f-o-r或r-e-p-e-a-t循环中调用b-r-e-a-k-,使得程序的执行流程立即跳到循环的结尾,在循环中当某种条件满足时需要立即跳出循环,这时调用br-e-a-k。Object P-a-s-c-a-l中的br-e-a-k-类似于C语言中的break-。实例讲解【例2.4】下面的代码演示了在5次循环后跳出循环。program Project1;$APPTYPE CONSOLE uses SysUtils;var i,j:integer;begin j:=1;f
42、or i:=1 to 100000 do begin j:=j+1;if i=5 then break;end;writeln(j的值是:,j);writeln(按下回车键退出。);readln;end.2.8.9 continue过程 如果想跳过循环中部分代码重新开始下一次循环,就调用Continue过程。【例2.5】下面的代码在执行第一次循环时continue后的代码不执行。program Project1;$APPTYPE CONSOLE uses SysUtils;var i:integer;begin for i:=1 to 3 do begin writeln(i,.before
43、continue);if i=1 then continue;实例讲解 writeln(i,.after continue);end;writeln(按下回车键退出。);readln;end.2.9 过程与函数过程与函数 过程与函数是实现一定功能的语句块,可以在程序的其他地方被调用,也可以进行递归调用。过程与函数的区别在于:过程没有返回值,而函数有返回值。2.9.1 过程所有过程(procedure)在使用前都必须先声明。过程根据有无参数可以分为带参过程和不带参过程。过程的结构与程序类似,由过程首部和过程体组成。过程说明的语法如下:1.带参过程procedure 过程名(参数列表);变量声明;
44、begin 过程体;end;2.不带参过程procedure 过程名;变量声明;begin过程体;end;过程是以保留字procedure开头的,接下来就是过程名称和过程体部分,过程体部分是位于begin和end之间的语句。定义了有参过程后,在程序中就可以调用它了。调用的格式为:过程名(实际参数);实例讲解【例2.6】定义一个求两个整数变量之和,并把和输出的过程。program Project1;$APPTYPE CONSOLEuses SysUtils;procedure sum(a,b:integer);begin writeln(format(%d+%d=%d,a,b,a+b);end;
45、var x,y:integer;begin x:=2;y:=3;sum(x,y);writeln(按下回车键退出。);readln;end.2.9.2 函数函数(function)和过程相似,也是一个能够完成某各特定功能的程序块。函数也是由函数首部和函数体组成。函数声明的语法如下:function 函数名(形参表):类型;变量声明;begin 函数体;end;函数中的形参表也可以没有,即定义无参函数,但在大多数情况下,函数都是有参数的。函数的变量声明用于定义函数中的局部变量,即在此处声明的变量只在这个函数中有效,不能在程序中使用。变量的作用范围称为它的作用域。在主程序中说明的变量称为全局变量,
46、全局变量的作用域是主程序和所有子程序。首部中的形式参数也是局部的。实例讲解【例2.7】定义一个比较两个整数变量中较大者的函数。program Project1;$APPTYPE CONSOLEuses Sysutils;/定义一个比较两个整数变量中较大者的函数。function max(a,b:integer):integer;begin if ab then result:=a elseresult:=b;end;var x,y:integer;begin x:=3;y:=4;write(format(%d和%d的最大数是,x,y);writeln(inttostr(max(x,y);wri
47、teln(按下回车键退出。);readln;end.函数被声明后,在调用该函数时,函数体中的语句才会函数被声明后,在调用该函数时,函数体中的语句才会被执行,要注意函数调用只能出现在表达式中被执行,要注意函数调用只能出现在表达式中 2.10 消息框过程和函数消息框过程和函数 在 Delphi 7的程序编写中,经常会用到一些过程和函数。其中Delphi消息框过程和函数是程序编写中使用率比较高的。2.10.1 ShowMessage过程 ShowMessage过程用于显示一个最简单的信息对话框,它以应用程序的标题为标题,且只有一个【OK】按钮。该过程声明如下:procedure ShowMessag
48、e(const Msg:string);其中参数Msg为对话框显示的信息。例如:ShowMessage(您好!),运行后将显示如图所示2-10的对话框。2.10.2 MessageDlg函数 MessageDlg函数用于定制一个消息框,用户可确定显示的符号及多个位图按钮。调用函数,系统显示消息并等待用户的回应。该函数声明如下:function MessageDlg(const Msg:string;DlgType:TMsgDlgType;Buttons:TMsgDlgButtons;HelpCtx:Longint):Word;其中参数Msg为对话框显示的信息;参数DlgType指定信息对话框的
49、类型,该参数是一个枚举型,其取值与说明如表2-13所示;参数Buttons用于指定出现的按钮组,是一个集合型,其取值与说明如表2-14所示;参数HelpCtx用于指定用户按Help按钮或按下F1键时,显示的帮助主题。表2-13 参数DlgType的取值说明取值说明mtWarning在对话框中出现黄色的感叹号。mtErro在对话框中出现红色的错误号。mtInformaiton在对话框中出现蓝色的信息号。mtConfirmation在对话框中出现绿色的问号。表2-14参数Buttons的取值说明取值说明mbOK在对话框中出现Yes按钮,单击该按钮时函数返回值为mrOK或1。mbCancel在对话框
50、中出现Yes按钮,单击该按钮时函数返回值为mrCancel或2。mbAbout在对话框中出现mbAbout按钮,单击该按钮时函数返回值为mrAbout或3。mbRetry在对话框中出现mbRetry按钮,单击该按钮时函数返回值为mrRetry或4。mbIgnore在对话框中出现mbIgnore按钮,单击该按钮时函数返回值为mrIgnore或5。mbYes在对话框中出现Yes按钮,单击该按钮时函数返回值为mrYes或6。mbNo在对话框中出现Yes按钮,单击该按钮时函数返回值为mrNo或7。mbAll在对话框中出现mbAll按钮,单击该按钮时函数返回值为mrAll或8。mbNoToAll在对话框