《《Delphi程序设计及实验指导》电子教案--第2章.ppt》由会员分享,可在线阅读,更多相关《《Delphi程序设计及实验指导》电子教案--第2章.ppt(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Delphi 7 程序设计与实验指导张景安张景安 赵慧勤赵慧勤 张叶娥张叶娥 傅文博傅文博编编 著著第二章第二章 面向对象的面向对象的Pascal DelphiDelphi的的编编程程语语言言即即Object Object PascalPascal是是在在PascalPascal的的基基础础上上发发展展起起来来的的,它它继继承承了了PascalPascal语语言言语语法法结结构构严严谨谨和和编编译译代代码码高高效效优优化化等等优优点点。本本章章将将介介绍绍Object Object PascalPascal的的数数据据类类型、常量、变量、运算符、语句、函数和过程等。型、常量、变量、运算符、语句
2、、函数和过程等。2.1 数据类型数据类型2.1.1 2.1.1 简单数据类型简单数据类型 简单类型包括有序类型和实型两种。简单类型包括有序类型和实型两种。1 1有序类型有序类型 有序类型包括整型、字符型、布尔型、枚举型和子界型。有序类型包括整型、字符型、布尔型、枚举型和子界型。有序类型是一种线性的数据结构,每个值都有唯一的前有序类型是一种线性的数据结构,每个值都有唯一的前驱(除第一个)和唯一的后继(除最后一个)。驱(除第一个)和唯一的后继(除最后一个)。(1)(1)整型整型 整型的表示范围及存储格式见表整型的表示范围及存储格式见表2-12-1。类型取值范围存储格式Integer-2147483
3、6482147483647有符号32位整数Cardinal04294967295无符号32位整数Shortint-128127有符号8位整数Smallint-3276832767有符号16位整数Longint-21474836482147483647有符号32位整数Int64-263263-l有符号64位整数Byte0255无符号8位整数Word065535无符号16位整数Longword04294967295无符号32位整数表2-1 整型的取值范围和存储格式2.1 数据类型数据类型2.1 数据类型数据类型(2)(2)字符型字符型 字符型的类型标识符是字符型的类型标识符是CharChar。字符
4、型的数据只能是单。字符型的数据只能是单个字符,不能是一串字符。例如个字符,不能是一串字符。例如ABCABC,x=?x=?等都不是等都不是字符型的数据,而是字符串。字符型的数据,而是字符串。(3)(3)布尔型布尔型 通常用到的布尔类型是通常用到的布尔类型是BooleanBoolean,一个,一个BooleanBoolean类型的变类型的变量占一个字节,它只有两种取值:量占一个字节,它只有两种取值:truetrue和和falsefalse。定义变。定义变量量i i,chch,t t分别为整型、字符型、布尔型。分别为整型、字符型、布尔型。varvar i:i:IntergeInterge;chch:
5、Char;:Char;t:Boolean;t:Boolean;2.1 数据类型数据类型(4)(4)枚举类型枚举类型 枚举类型是用一些标识符来表示一系列有序数,即由枚举类型是用一些标识符来表示一系列有序数,即由一些标识符组成的一个线性表。定义枚举类型的语法一些标识符组成的一个线性表。定义枚举类型的语法是:是:typetype typeNametypeName=(val1,.,=(val1,.,valnvaln)(5)(5)子界类型子界类型 子界类型指的是某个有序类型(称为基类)的一个子子界类型指的是某个有序类型(称为基类)的一个子集。定义子界类型的语法是:集。定义子界类型的语法是:typetyp
6、e typeNametypeName=Low.HighLow.High;2.1 数据类型数据类型 2 2实型实型实型实型 表表表表2-22-2给出了实型的表示范围和存储格式。给出了实型的表示范围和存储格式。给出了实型的表示范围和存储格式。给出了实型的表示范围和存储格式。类型范围有效位所占位数Real2.9*10-241.7*1030811-28Real482.9*10-391.7*103811-26Single1.510-453.4*1038784Double5.0*10-3241.7*1030815168Extended3.6*10-49511.1*104932192010Comp-263+
7、l263-l19208Currency-922337203685477.5808922337203685477.580719208表2-2 实型的表示范围和存储格式2.1 数据类型数据类型2.1.2 2.1.2 字符串类型字符串类型 字符串类型是用一对单引号括起来的一系列字符。字符串字符串类型是用一对单引号括起来的一系列字符。字符串类型的表示范围和存储格式见表类型的表示范围和存储格式见表 2-32-3。类型最多字符字节数字符集ShortString2552256BANSI向后兼容AnsiString23142GBSBCS,MBCSLongString23142GBUnicodeWideStri
8、ng23042GB等价于AnsiChar表2-3 字符串类型的表示范围和存储格式2.1 数据类型数据类型2.1.3 2.1.3 结构类型结构类型 结构数据类型是一种复合数据类型,由多个数据组成。结构结构数据类型是一种复合数据类型,由多个数据组成。结构类型包括集合类型、数组类型、记录类型、文件类型等。类型包括集合类型、数组类型、记录类型、文件类型等。1 1集合类型集合类型 集合类型是一组相同类型元素的组合。定义集合类型:集合类型是一组相同类型元素的组合。定义集合类型:typetype Name=set of Name=set of BaseTypeBaseType 2 2数组数组 数组是一些具有
9、相同类型元素的有序组合。数组是一些具有相同类型元素的有序组合。(1)(1)静态数组静态数组 静态数组的声明格式为:静态数组的声明格式为:typetype Name=arrayindexType1,.,Name=arrayindexType1,.,indexTypenindexTypen of of BaseTypeBaseType;2.1 数据类型数据类型(2)(2)动态数组动态数组 动态数组没有固定的大小或长度。当赋值或使用某些函动态数组没有固定的大小或长度。当赋值或使用某些函数(如数(如SetLengthSetLength)时,动态数组在内存中重新分配。)时,动态数组在内存中重新分配。动态
10、数组的声明格式为:动态数组的声明格式为:type type Name=array of Name=array of BaseTypeBaseType;定义动态数组不需声明元素的个数。例如:定义动态数组不需声明元素的个数。例如:typetype DynamicarrayDynamicarray=array of Real;=array of Real;varvar a1,a2:Dynamicarry;a1,a2:Dynamicarry;a1:=a2;/a1a1:=a2;/a1和和a2a2指向相同的内存单元。指向相同的内存单元。2.1 数据类型数据类型 3 3记录类型记录类型 记录类型(有的语言中
11、被称为结构)是一个不同种类记录类型(有的语言中被称为结构)是一个不同种类元素的集合,每个元素称为字段(元素的集合,每个元素称为字段(fieldfield)。在声明时,)。在声明时,指定记录的名字和每个字段。声明格式为:指定记录的名字和每个字段。声明格式为:typetype RecordTypeNameRecordTypeName=record=record FieldListFieldList 1:type1;1:type1;FieldListFieldList 2:type2;2:type2;FieldListFieldList n:typen:type n;n;end;end;2.1 数据
12、类型数据类型 4 4文件类型文件类型 文件类型是由相同类型的元素组成的有序集合。文件文件类型是由相同类型的元素组成的有序集合。文件类型的声明格式为:类型的声明格式为:typetype fileTypeNamefileTypeName=file of type=file of type 例:声明一个文件类型例:声明一个文件类型RecordListRecordList,以上面已定义的,以上面已定义的TdateRecTdateRec为数据类型。为数据类型。typetype RecordListRecordList=file of =file of TdateRecTdateRec;varvar My
13、recordlist:RecordListMyrecordlist:RecordList;2.1 数据类型数据类型2.1.4 2.1.4 可变类型可变类型 有时要对一些数据类型变化的数据进行操作,并且在有时要对一些数据类型变化的数据进行操作,并且在编译期间不能确定数据的类型,这时就可以使用可变编译期间不能确定数据的类型,这时就可以使用可变类型的数据。类型的数据。可变类型可以使用除记录、集合、静态数组、文件等可变类型可以使用除记录、集合、静态数组、文件等结构类型、指针类型及长整型外的所有类型。可变类结构类型、指针类型及长整型外的所有类型。可变类型有一个特殊的值型有一个特殊的值NullNull,表
14、示不明的或丢失的数据。,表示不明的或丢失的数据。可变类型变量的声明格式为:可变类型变量的声明格式为:varvar v1:Variant;v1:Variant;2.2 常量与变量常量与变量2.2.1 2.2.1 标识符标识符 标识符是描述标识符是描述Object PascalObject Pascal程序各个部分的名称,这些程序各个部分的名称,这些部分包括标记、对象、过程、类型、单元、变量及程部分包括标记、对象、过程、类型、单元、变量及程序。标识符的大小写无关(即它不区分大小写),并序。标识符的大小写无关(即它不区分大小写),并且遵循以下规则:且遵循以下规则:可为任意长度,但只有前可为任意长度,
15、但只有前255255个字符有效。个字符有效。标识符的第标识符的第1 1个字符必须是字母或下划线。个字符必须是字母或下划线。跟在第跟在第1 1个字符后面的字符必须是字母、数字或下划线。个字符后面的字符必须是字母、数字或下划线。标识符中不允许出现空格。标识符中不允许出现空格。2.2.2 2.2.2 常量常量 常量是一个在程序的运行过程中具有不变值的标识符,常量是一个在程序的运行过程中具有不变值的标识符,常量的声明格式如下:常量的声明格式如下:Const Const 常量名常量名=表达式表达式;变量不能在一个常量声明中使用,变量不能在一个常量声明中使用,但算术和逻辑运算符可以,下面的函数可以在常量声
16、明但算术和逻辑运算符可以,下面的函数可以在常量声明中使用。中使用。Abs Low Round Abs Low Round ChrChr Odd Odd SizeOfSizeOf Hi Hi OrdOrd SuccSucc High High PredPred Swap Length Swap Length PtrPtr TruncTrunc Lo Lo2.2 常量与变量常量与变量2.2 常量与变量常量与变量2.2.3 2.2.3 变量变量 变量是程序代码中代表一个内存地址的标识符,而此变量是程序代码中代表一个内存地址的标识符,而此地址中的内容在程序执行过程中可以改变。在变量使地址中的内容在程序
17、执行过程中可以改变。在变量使用之前必须先声明,变量声明格式如下:用之前必须先声明,变量声明格式如下:varvar 变量名表变量名表:类型名类型名;例:例:varvar s:strings:string;i:integeri:integer;flag:Booleanflag:Boolean;2.3 表达式与运算符表达式与运算符2.3.1 2.3.1 表达式表达式 表达式就是变量、常量、字符串、运算符及函数按照一定表达式就是变量、常量、字符串、运算符及函数按照一定规则的组合。例:规则的组合。例:Peoples Republic Of+ChinaPeoples Republic Of+China G
18、ross/12Gross/12 Max(x,y)-Min(x,yMax(x,y)-Min(x,y)2.3.2 2.3.2 运算符运算符 1 1赋值运算符(赋值运算符(:=:=)赋值运算符赋值运算符“:=”:=”是先计算赋值运算符右边表达式的值,是先计算赋值运算符右边表达式的值,再将结果赋给左边的变量。再将结果赋给左边的变量。2.3 表达式与运算符表达式与运算符 2 2算术运算符算术运算符 表表2-4 2-4 算术运算符算术运算符运算符作用操作数类型结果类型+表示正值Integer或RealInteger或Real算术加Integer或RealInteger或Real表示负值Integer或Re
19、alInteger或Real算术减Integer或RealInteger或Real*算术的乘运算Integer或RealInteger或Real/浮点数的除运算Integer或RealRealDiv整型数的除运算IntegerIntegerMod模运算IntegerInteger2.3 表达式与运算符表达式与运算符 3 3关系运算符关系运算符 关系运算符是对两个类型相容且可以比较大小的数据进关系运算符是对两个类型相容且可以比较大小的数据进行比较,结果为布尔类型,见表行比较,结果为布尔类型,见表2-52-5。表表2-5 2-5 关系运算符关系运算符运算符作用结果类型=等于Bealoon不等于Be
20、aloon大于Bealoon=大于或等于BealoonIn属于Bealoon2.3 表达式与运算符表达式与运算符 4 4逻辑运算符逻辑运算符 逻辑运算符对逻辑类型的操作数进行运算,结果为布尔逻辑运算符对逻辑类型的操作数进行运算,结果为布尔型,见表型,见表2-62-6。表表2-6 2-6 逻辑运算符逻辑运算符运算符作用操作数类型结果类型not逻辑非BealoonBealoonand逻辑与BealoonBealoonor逻辑或BealoonBealoonxor逻辑异或BealoonBealoon2.3 表达式与运算符表达式与运算符 5 5集合运算符集合运算符 表表2-7 2-7 集合运算符集合运算
21、符运算符作用操作数类型结果类型+集合的并集集合类型集合类型-集合的差集集合类型集合类型*集合的交集集合类型集合类型=A=A=B,B是否是A的子集集合类型Bealoon=两个集合是否相等集合类型Bealoon两个集合是否不相等集合类型Bealoonins in A,s是否属于集合A有序类型,集合类型Bealoon2.3 表达式与运算符表达式与运算符 6 6运算符的优先级运算符的优先级运算符优先级not1(最高)*,/,div,mod,and2+,or,xor3关系运算符4(最低)表2-8 Object Pascal各运算符的优先级2.4 语句语句2.4.1 2.4.1 注释注释 注释是添加在程序
22、中用来说明代码功能的语句,它是非执行注释是添加在程序中用来说明代码功能的语句,它是非执行语句,对程序的执行部分不会产生任何影响,有助于提高程语句,对程序的执行部分不会产生任何影响,有助于提高程序的可读性。在序的可读性。在Object PascalObject Pascal中,有三种注释标记:中,有三种注释标记:花括号花括号“”注释:位于注释:位于“”中的内容为注释。中的内容为注释。双斜杠双斜杠“/”/”注释:注释:“/”/”之后到本行结束的内容为注释。之后到本行结束的内容为注释。圆括号及星号对圆括号及星号对“(*)”注释:(注释:(*)中的内容)中的内容为注释。为注释。例如以下语句都是注释:例
23、如以下语句都是注释:The first kind Of comment.The first kind Of comment./The second/The secondkind Of comment.kind Of comment.(*The third kind Of comment.*)(*The third kind Of comment.*)2.4 语句语句2.4.2 2.4.2 简单语句和复合语句简单语句和复合语句 简单语句是简单语句是Object PascalObject Pascal中最简单也最常用的语句,简单中最简单也最常用的语句,简单语句用分号分隔。赋值语句、函数、过程调用语
24、句等是语句用分号分隔。赋值语句、函数、过程调用语句等是简单语句,例如下面的语句都是简单语句:简单语句,例如下面的语句都是简单语句:r:=r:=m+nm+n;/两个值相加并赋值两个值相加并赋值 ShowMessage(ImShowMessage(Im a student.);a student.);复合语句是多个简单语句的组合,复合语句以复合语句是多个简单语句的组合,复合语句以beginbegin表示表示开始,以开始,以endend表示结束。例如:表示结束。例如:beginbegin i:=1;i:=1;j:=i+1;j:=i+1;s:=s:=abcabc;end;end;2.4 语句语句2.4
25、.3 2.4.3 条件语句条件语句 条件语句是条件语句是Object PascalObject Pascal语言提供的选择结构语句,主要语言提供的选择结构语句,主要有如下两种:有如下两种:1 1if if语句语句 if if语句的表示形式:语句的表示形式:if if then then elseelse 2.4 语句语句【例例2-12-1】求两个数中的最大值。求两个数中的最大值。if ab thenif ab then max:=a /max:=a /在变量在变量a a之后不能加之后不能加“;”;”ElseElse max:=b;max:=b;【例例2-22-2】符号函数。符号函数。-1 (x
26、0)-1 (x0)1 (x0)用用if if语句的嵌套实现,如下:语句的嵌套实现,如下:if x0 thenif x0 thenif x0 then y:=1 y:=1else else y:=0;y:=0;2.4 语句语句 2 2casecase语句语句 casecase语句的表示形式:语句的表示形式:case case of of :1:1 :n:n elseelse n+1end;end;2.4 语句语句【例例2-32-3】编写一个程序,输入一个年份,判断是否是闰编写一个程序,输入一个年份,判断是否是闰年。闰年的条件是满足下面条件之一:年。闰年的条件是满足下面条件之一:(1)(1)能被能
27、被4 4整除,但不能被整除,但不能被100100整除的年份;整除的年份;(2)(2)能被能被100100整除,也能被整除,也能被400400整除的年份。整除的年份。对这两个条件都不符合的年份不是闰年。对这两个条件都不符合的年份不是闰年。程序功能:输入一个年份,显示其是否为闰年的信息。程序功能:输入一个年份,显示其是否为闰年的信息。界面设计:四个组件:两个文本框界面设计:四个组件:两个文本框Label1Label1和和Lable2Lable2,分别,分别显示提示和结果信息;一个显示提示和结果信息;一个EditEdit组件组件Edit1Edit1,用来输入要进,用来输入要进行判断的年份;一个行判断
28、的年份;一个ButtonButton组件组件Button1Button1,用来查询结果。,用来查询结果。如图如图2-12-1所示。所示。2.4 语句语句图2-1 窗体界面程序代码:procedure TForm1.Button1Click(Sender:TObject);var year:Integer;flag:Boolean;2.4 语句语句 beginbegin year:=StrtoInt(Edit1.text);/year:=StrtoInt(Edit1.text);/将字将字符串转变为整型符串转变为整型 if year mod 4=0 thenif year mod 4=0 the
29、n begin begin if year mod 100=0 then if year mod 100=0 then begin begin if year mod 400=0 then if year mod 400=0 then flag:=true flag:=true else else flag:=false;flag:=false;end end else else flag:=true;flag:=true;end end else else flag:=false;flag:=false;if flag then if flag then Label2.Caption:=La
30、bel2.Caption:=该年该年份是闰年份是闰年 else else Label2.Caption:=Label2.Caption:=该年该年份不是闰年份不是闰年;end;end;2.4 语句语句 2.4.4 循环控制语句 循环语句可以使用户重复执行一条或多条语句,直到满足某个条件时为止。1for语句 for语句的一般形式为:for 循环变量:=to/downto do ;【例2-4】求1100所有整数的累加和。var s,i:Integer;s:=0;for i:=l to 100 do s:=s+i;2.4 语句语句 2 2whilewhile语句语句 whilewhile语句的一般形
31、式为:语句的一般形式为:while while do do whilewhile后面的后面的 为为逻辑表达式,先计算表达逻辑表达式,先计算表达式的结果,如果表达式为式的结果,如果表达式为truetrue,whilewhile语句将重复执语句将重复执行循环体。如果表达式结行循环体。如果表达式结果为果为falsefalse,则跳出循环,则跳出循环,执行执行whilewhile之后的语句。之后的语句。【例例2-52-5】求求1 1100100所有整所有整数的累加和。数的累加和。varvars,is,i:Integer;:Integer;i:=1;i:=1;s:=0;s:=0;while i=100
32、dowhile i=100 dobeginbegins:=s:=s+is+i;i:=i+1;i:=i+1;end;end;2.4 语句语句 3 3repeatrepeat语句语句 repeatrepeat语句的一般形式为:语句的一般形式为:repeat repeat until until 当使用当使用repeatrepeat语句时,先执语句时,先执行循环体,再判断表达式,行循环体,再判断表达式,只要只要untiluntil后面的表达式为后面的表达式为truetrue,则将再执行循环体。,则将再执行循环体。因此,因此,repeatrepeat语句下面的循语句下面的循环体至少执行一次。环体至少执
33、行一次。【例例2-62-6】求求1 1100100所所有整数的累加和。有整数的累加和。varvars,is,i:Integer;:Integer;i:=1;i:=1;s:=0;s:=0;repeatrepeats:=s:=s+is+i;i:=i+1;i:=i+1;until i100until i100;2.4 语句语句 4 4breakbreak语句语句 功能是强行退出循环,功能是强行退出循环,breakbreak语句只能用在循环体内。语句只能用在循环体内。【例例2-72-7】利用利用breakbreak语句退出一个语句退出一个whilewhile循环。循环。varvar s:String;
34、s:String;beginbegin while true do /while true do /条件恒为真条件恒为真 beginbegin ReadLn(sReadLn(s);/);/读入一字符串读入一字符串 if s=then break;/if s=then break;/不输入任何字符,则退出循环不输入任何字符,则退出循环 WriteLn(sWriteLn(s);/);/输出字符串输出字符串 end;end;end;end;2.4 语句语句 5 5continuecontinue语句语句 continuecontinue语句也用在循环体中,其作用是强行结束本次循环,转入语句也用在循环
35、体中,其作用是强行结束本次循环,转入循环开始处,开始执行下一次循环操作。循环开始处,开始执行下一次循环操作。【例例2-82-8】使用使用continuecontinue语句,求语句,求1 1100100所有奇数之和。所有奇数之和。varvar i,si,s:Integer;:Integer;s=0;s=0;beginbegin for i:=1 to 100 dofor i:=1 to 100 do begin begin if i mod 2=0 then continue;/if i mod 2=0 then continue;/如果为空,跳过剩余语句,转到下如果为空,跳过剩余语句,转到下
36、一个循环一个循环 s:=s:=s+is+i;end;end;end;end;2.5 函数和过程函数和过程 函数和过程是实现一定功能的语句块,是程序中的特定函数和过程是实现一定功能的语句块,是程序中的特定功能单元。可以在程序的其他地方被调用,也可以进行功能单元。可以在程序的其他地方被调用,也可以进行递归调用。函数和过程的区别在于函数有返回值,而过递归调用。函数和过程的区别在于函数有返回值,而过程没有返回值程没有返回值。2.5.1 2.5.1 函数和过程的声明函数和过程的声明 函数和过程在使用前必须进行声明。函数和过程在使用前必须进行声明。1 1函数的声明函数的声明 函数的声明是在程序的函数的声明
37、是在程序的typetype区,具体形式如下:区,具体形式如下:function function():):;2.5 函数和过程函数和过程 函数的定义是在程序的函数的定义是在程序的implementationimplementation部分,具体形式如下:部分,具体形式如下:function function():):;varvar beginbegin :=:=/也可以用也可以用ResultResult系统保留字代替系统保留字代替 end;end;在在beginbegin与与endend之间是在函数调用时实现特定功能的一系列语句。之间是在函数调用时实现特定功能的一系列语句。函数值的返回有两种方
38、式:函数值的返回有两种方式:将返回值直接赋给函数名。将返回值直接赋给函数名。将返回值赋给将返回值赋给ResultResult。2.5 函数和过程函数和过程【例例2-92-9】求两个数中的最大数。求两个数中的最大数。function function Max(a,bMax(a,b:integer):integerinteger):integer;/;/两个形参为整型值两个形参为整型值a a、b b,函数返回值为整型,函数返回值为整型 varvar m:Integer;m:Integer;beginbegin if ab thenif ab then m:=am:=a elseelse m:=b;
39、m:=b;Max:=m;/Max:=m;/或或result:=m;result:=m;end;end;2.5 函数和过程函数和过程 2 2过程的声明过程的声明 过程的声明与函数类似,所不同的是使用的保留字不过程的声明与函数类似,所不同的是使用的保留字不同,而且少了一个返回值类型;同,而且少了一个返回值类型;过程的声明是在程序过程的声明是在程序的的typetype区,具体形式如下:区,具体形式如下:procedure procedure():):;过程的定义是在程序的过程的定义是在程序的implementationimplementation部分,具体形式部分,具体形式如下:如下:procedu
40、re procedure();begin begin end;end;2.5 函数和过程函数和过程【例例2-102-10】显示一行显示一行numnum个星号个星号*。procedure procedure ShowStar(num:IntegerShowStar(num:Integer););varvar i:Integer;i:Integer;s:Strings:String;begin begin s:=;s:=;for i:=1 to num do for i:=1 to num do s:=s+*;s:=s+*;ShowMessage(sShowMessage(s););end;end
41、;2.5 函数和过程函数和过程2.5.2 2.5.2 重载函数和过程重载函数和过程 所谓重载,是指在同一个作用范围内给不同的函数或所谓重载,是指在同一个作用范围内给不同的函数或过程取同一个名称。重载可以方便编程,重载函数必过程取同一个名称。重载可以方便编程,重载函数必须用指令字须用指令字overloadoverload来进行说明。来进行说明。下面的两个函数就是重载函数:下面的两个函数就是重载函数:function function Max(a:Integer;b:Integer):Integer;overloadMax(a:Integer;b:Integer):Integer;overload
42、;/;/求求两个整数的最大值两个整数的最大值 function function Max(a:Real;b:Real):Real;overloadMax(a:Real;b:Real):Real;overload;/;/求两个求两个实数的最大值实数的最大值 下面两条语句就调用了不同的函数:下面两条语句就调用了不同的函数:Max(3.7,4.6);/Max(3.7,4.6);/调用的是第二个重载函数调用的是第二个重载函数 Max(3,4);/Max(3,4);/调用的是第一个重载函数调用的是第一个重载函数2.5 函数和过程函数和过程2.5.3 2.5.3 参数参数 1 1形参与实参形参与实参 函数
43、或过程的声明和定义时参数列表中的参数称为形式函数或过程的声明和定义时参数列表中的参数称为形式参数,简称形参;而函数或过程调用时参数列表中的参参数,简称形参;而函数或过程调用时参数列表中的参数称为实在参数,简称实参。数称为实在参数,简称实参。2 2数值参数、变量参数和常量参数数值参数、变量参数和常量参数(1)(1)数值参数数值参数 在调用函数或过程时,数值参数在运行过程中只改变其在调用函数或过程时,数值参数在运行过程中只改变其形参的值,不改变其实参的值,即形参不会影响原来实形参的值,不改变其实参的值,即形参不会影响原来实参的值。参的值。(2)(2)变量参数变量参数 如果用户想改变传递的参数值,就
44、需要使用变量参数,如果用户想改变传递的参数值,就需要使用变量参数,即在被调用程序的参数表中的形参前加上保留字即在被调用程序的参数表中的形参前加上保留字varvar。2.5 函数和过程函数和过程(3)(3)常量参数常量参数 如果当过程或函数执行时要求不改变形参的值,最保如果当过程或函数执行时要求不改变形参的值,最保险的办法是使用常量参数。在参数表的参数名称前加险的办法是使用常量参数。在参数表的参数名称前加上保留字上保留字constconst可以使一个形参成为常量参数。使用常可以使一个形参成为常量参数。使用常量参数代替数值参数可以保护用户的参数,使用户在量参数代替数值参数可以保护用户的参数,使用户
45、在不想改变参数值时不会意外地将新的值赋给这个参数。不想改变参数值时不会意外地将新的值赋给这个参数。2.5.4 2.5.4 作用域作用域 在在Object PascalObject Pascal中,根据变量的作用域,可将变量分为:中,根据变量的作用域,可将变量分为:全局变量和局部变量。所谓变量的作用域,是指变量全局变量和局部变量。所谓变量的作用域,是指变量的有效范围。全局变量在整个程序中都有效,其作用的有效范围。全局变量在整个程序中都有效,其作用域为整个程序;局部变量只在声明它的函数和过程中域为整个程序;局部变量只在声明它的函数和过程中有效,其作用域只限于该函数或过程本身。有效,其作用域只限于该
46、函数或过程本身。2.5 函数和过程函数和过程 例:例:typetype varvar Form1:TForm1;/Form1:TForm1;/全局变量全局变量Form1Form1 implementationimplementation$R*.$R*.dfmdfm procedure TForm1.FormCreate(Sender:procedure TForm1.FormCreate(Sender:TObjectTObject););varvar m,n:Integerm,n:Integer;/;/局部变量局部变量m,nm,n Form1:Tform1;Form1:Tform1;(*(*局
47、部变量局部变量Form1Form1,与上面的全局变量同名,在过程,与上面的全局变量同名,在过程TForm1.FormCreateTForm1.FormCreate中局部变量起作用。中局部变量起作用。*)2.5 函数和过程函数和过程 2.5.5 2.5.5 函数和过程的调用函数和过程的调用 1 1函数和过程的调用函数和过程的调用(1)(1)函数的调用函数的调用 函数调用的一般形式为:函数调用的一般形式为:()函数的调用往往是将返回值赋给某个变量或参与运算。例如调用函数的调用往往是将返回值赋给某个变量或参与运算。例如调用例例2-92-9,将其返回值赋给变量,将其返回值赋给变量x x的语句为:的语句
48、为:x:=Max(3,6);x:=Max(3,6);(2)(2)过程的调用过程的调用 过程的调用的一般形式为:过程的调用的一般形式为:(););其中的实参可以是常量、变量或表达式,但实参的个数和类型与其中的实参可以是常量、变量或表达式,但实参的个数和类型与形参完全匹配,即个数相同、类型一致。例如:调用例形参完全匹配,即个数相同、类型一致。例如:调用例2-102-10的过的过程程ShowStarShowStar的语句为:的语句为:ShowStar(20);ShowStar(20);2.5 函数和过程函数和过程 2 2函数和过程的递归调用函数和过程的递归调用 所谓递归调用,是指函数所谓递归调用,是
49、指函数A A调调用函数用函数B B,而函数,而函数B B又调用函数又调用函数A A的情况,或是指一个函数调的情况,或是指一个函数调用自身的特殊情况。用自身的特殊情况。【例例2-112-11】递归调用递归调用 program Project1;program Project1;($($SappTypeConsoleSappTypeConsole)varvar alpha:Integeralpha:Integer;procedure Test2(var procedure Test2(var A:Integer):forwordA:Integer):forword;(*Test2(*Test2被说
50、明为前置过程被说明为前置过程*)procedure procedure Testl(VarTestl(Var A:IntegerA:Integer);beginbegin a:=a-1;a:=a-1;if a0 thenif a0 thenTest2(a);Test2(a);Writeln(aWriteln(a););end;end;procedure Test2(var procedure Test2(var a:Integera:Integer););经前经前置说明的置说明的Test2Test2的执行部分的执行部分 beginbegin a:=a div 2;a:=a div 2;if a