资源描述
总目录,Delphi,数据库基础,清华大学出版社,第,4,章,Object Pascal,程序设计基本方法,教学要求:,我们将介绍面向对象,Object Pascal,语言,以及如何在,Delphi,中书写,Pascal,代码。本书假设你已经具有基本的编程经验,并对程序设计方法有所了解。,4.1,基本字符和符号,4.2,变量与常量,4.3,数据类型,4.4 Object Pascal,基本运算符,4.5 Object Pascal,程序设计语句,4.6,过程(,Procedure,)与函数(,function,),Object Pascal,使用,ASCII,字符集,包括:英文字母:“,A”,到“,Z”,,“,a”,到“,z”,阿拉伯数字:“,0”,到“,9”,其它标准字符,包括:“,#”,、“,$”,、“,&”,、“,”,、“,(”,、“,)”,、“*”、“,+”,、“,”,、“,?”,、“,.”,、“,/”,、“,:”,、“,;”,、“,”,、“,”,、“,”,、“,”,、“,”,、“,”,、“,”,,以及下列字符的组合:“,(*”,、“,(.”,、“*,)”,、“,.)”,、“,.”,、“,/”,、“,:=”,、“,=”,、“,”,。注意:“,!”,、“,”,、“,%”,、“,?”,、“,”,、“,_”,、“,|”,、“,”,不是特殊字符。,注意:,“,!”,、“,”,、“,%”,、“,?”,、“,”,、“,_”,、“,|”,、“,”,不是特殊字符。,Object Pascal,的字符集,4.1,基本字符和符号,特殊字符,特殊字符既不是字母,也不是阿拉伯数字,它是一些有固定意义的字符的组合。包括:“,#”,、“,$”,、“,&”,、“,”,、“,(”,、“,)”,、“*”、“,+”,、“,”,、“,?”,、“,.”,、“,/”,、“,:”,、“,;”,、“,”,、“,”,、“,”,、“,”,、“,”,、“,”,、“,”,以及下列字符的组合:“,(*”,、“,(.”,、“*,)”,、“,.)”,、“,.”,、“,/”,、“,:=”,、“,=”,、“,”,。,注意,:,“!”,、“,”,、“,%”,、“,?”,、“,”,、“,_”,、“,|”,、“,”,不是特殊字符。,标识符,标识符是用来表示常量、变量、域、类型、特性、过程、函数、程序单元、库以及包等语法成分的名称。标识符可以是任何长度,但只有最前面的,255,个字符有效。标识符只能以字母或下划线(“,_”,)开始,第一个字符之后可以是数字、字母或下划线,但不能包含空格。保留字不能用作标识符。,下面的标识符具有相同的含意:,CalculateValue,;,calculateValue,;,calculatevalue,;,CALCULATEVALUE,保留字是,Object Pascal,预定义的具有特殊意义和用途的字符串。不能被用户再定义或用作其它标识符,在对象类型定义时,,private,protected,public,published,以及,automated,也作为保留字,但在其它情况下可以看作为指令字,保留字,指令字在,Object Pascal,具有特殊意义,但是,与保留字不同的是,指令字只在特殊的上下文中才有意义,在其它场合,用户可以再定义或用作其它标识符。,指令字,数字,标号,标号是不大于,4,位数的数字序列,即,0,到,9999,之间的数值,前导,0,无效。标识符也可以作为标号。例如,,33,,,0033,,,P12,等都是合法的标号。标号主要用于,Goto,语句中。,字符串,字符串又称为串常量,通常包含一个引用串,一个控制串或一个引用或控制串的组合。分隔符只能出现在引用串中。标号是不大于,4,位数的数字序列,即,0,到,9999,之间的数值,前导,0,无效。标识符也可以作为标号。例如,,33,、,0033,、,P12,等都是合法的标号。,例如:,BORLAND ,表示字符串“,BORLAND”,Youll see,表示字符串“,Youll see”,表示字符串“,”,空串,表示一个空格,4.2,变量与常量,变量是用来存储数据的命令区域,是在运行时可以改变其值的标识符。一般来说,常量是在运行时不改变值的标识符,也不需要专门的存储数据区域。这里介绍一下变量及常量的概念及定义。由于变量及常量与数据类型密切相关,因此具体的使用在后面还要介绍。,声明变量,变量必须有类型,类型确定了变量的值。因此,变量在使用前必须先声明,变量声明包括两部分:名字及类型。,在变量声明部分,是一个或多个标识符,后跟一个冒号,再跟该变量的类型。,例如:,Var,ABC:String,;/,定义了,String,类型变量,ABC,。,Begin,end;,在,Object Pascal,中,常量有许多种:有数字常量,例如“,17”,;有字符串常量,例如“,Hello world!”,;还有预先定义的常量,如,True,、,False,和,nil,。也有常量像变量那样,需要在定义部分单独创建。声明常量有两种,一种是纯常量(,true constant,),一种是类型常量。虽然两者表面上是一样的,但它们有不同的使用规则和目的。,声明常量,纯常量,类型常量,4.3,数据类型,类型是某类数据的名称,用于确定能存储信息,及能存储多少信息等。,ObjectPascal,是一种强类型的语言,其数据类型的定义、声明以及数据的赋值和传递都必须遵循严格的语法规则。因此,学习和掌握数据类型是设计好程序的关键。,简单类型,字符串类型,结构类型,指针类型,过程类型,变体类型,简单类型,包括有序类型和实数型。其中有序类型是指整数类型、字符类型、布尔类型、枚举类型以及子界类型。,结构类型,包括集合类型、数组类型、记录类型、文件类型、类类型、类引用类型、接口类型等。,数组的定义,要声明一个数组变量,要求你提供一个标识符,使用,array,保留词,在方括号中指定数组的界限,并指定编译器数组将用于存储什么类型,例如:,Var,Check:array1.100 of Integer;,多维数组,如果你想编写一个数组来容纳一张电子表格中的值,那么就可以使用,2,维数组。下面的例子说明如何使用,2,维数组定义一个有,20,行和,20,列的表格:,Type,Ttable,=array1.20,1.20 of Double;,Var,BigTable:Ttable,;,字符数组,字符串类型本质上等同于下列类型:,type,StringType:array0.255 of char;,下面是几个字符串类型定义:,type,MyString:string15;,BigString:string,;,LittleString:string1,上面语句定义,MyString,类型包含,15,个字符,,LittleString,包含,1,个字符,,BigString,没有说明大小,就取字符串包含字符的最大个数,255,。,数组类型常量,一个数组类型常量由括号括起来的类型常量组成,不同类型常量用逗号隔开。像简单类型常量一样,数组类型常量用来定义一个数组常量,下面是一个例子。,Type,TStatus,=(Active,Passive,Waiting);,TStatusMap,=,arrayTStatus,of string;,const,StatStr,:,TStatusMap,=(Active,Passive,Waiting);,开放式数组,所谓开放式数组,是指数组作为形参传递给过程或函数时其长度是可变的,这样在调用过程或函数时,可以传递不同长度的数组作为实际参数。,开放式数组在过程或函数中作为形参可以定义为:,array of T,这里,T,是数组的元素类型标识符,实际参数必须是,T,类型的变量或元素类型为,T,的数组变量。在过程或函数内形参的作用可看作为下面的数组:,array0.N-1 of T,集合类型,集合类型是,Integer,,,Boolean,Char,,枚举型,子界型等类型数据的一个子集。在应用程序中,当要检测一个数是否属于一个特定的集合时,就可以使用集合类型。,下面是一些集合类型的例子:,type,VoterDataSet,=Set Of(,Democrat,Republican,Male,Female,LowOpinion,HighOption,Confused,),;,Chars=Set of Char;,Letters=Set of A.Z,VIBGYOR=(,Violet,Indigo,Blue,Green,Yellow,Orange,Red,);,这是枚举型,ColorSet,=set of VOBGYOR;,上面枚举型的集合类型,集合类型常量,像简单类型常量一样,集合类型常量用来定义一组常量的集合。例如:,type,TDigits,=set of 0.9;,TLetters,=set of,A.Z;const,EvenDigits,:,TDigits,=0,2,4,6,8;Vowels:,TLetters,=A,E,I,O,U,Y;,记录类型,记录是一系列相关的变量,这些变量被称为域,它们放在一起,作为一个整体使用。例如,一个雇员可能包含姓名、雇用时间、薪金等数据,这时你可以像下面那样定义一个雇员记录类型:,type,TEmployee,=record,LastName,:String20;,FirstName:String15;,YearHired:1990.2000;,Salary:Double,;,Position:string20;,end;,Pascal,的记录类型跟数据库中的记录很相似,记录类型中的元素可以理解为数据库中的字段。,文件类型,文件是指相同类型元素的有序集合。,Delphi,处理文件有三种方式,一种是使用,Object Pascal,标准的文件处理技术;一种是使用,Windows,的文件处理函数;还有一种是使用文件流对象。,Object Pascal,标准的文件处理技术,有专门的数据类型和文件处理例程,并且与,Windows,的标准,API,不兼容,但对于熟悉,Pascal,的用户来说,仍然是操作文件的好选择。下面我们就对此进行介绍。,声明一个文件类型的语法如下:,type,fileTypeName,=file of type,指针类型,指针类型对程序员来说可能是最复杂和最灵活的数据类型。当你在,Delphi,中创建一个数据结构时,首先要分配内存空间。分配的内存空间用于存储数据结构中的数据。而指针就是指向分配空间的内存地址。使用指针,可以使程序不必每次需要时都去分配,只要申请一次即可,其它过程或函数使用同一块内存空间时,只要使用该内存空间的地址。,下面是带有指针类型声明的例子:,type,WordPtr,=Word;,RealPtr,=Real;,PersonType,=Record,LAstNAme:String,;,FirstNAme:String,;,Age:Integer,;,end;,PersonPointer,=,PersonType,;,上例中,声明了三个指针类型,一个是,WordPtr,指向,Word,,一个是,RealPtr,指向,Real,,还有一个是,PersonPointer,,指向一个标识符,而该标识符标识一个记录类型。声明了指针类型之后,就可以声明指针类型变量,指针的使用,Delphi,提供专门的过程和函数操作指针,这些过程和函数是:,New,过程,,操作符,,PTR,函数,,GetMem,过程。,New,过程,New,过程是,Pascal,中的标准例程(在,System,单元声明),用于在应用程序堆栈中为动态变量申请一块区域,并把该区域的地址赋予指针变量。,New,过程的语法为:,procedure,New(var,P:Pointer);,操作符,操作符是个一元操作符,用于获得操作数的地址,PTR,函数,Ptr,函数是,Pascal,中的标准例程(在,System,单元声明),用于把一个指定的地址转换为指针。,Ptr,函数的语法为:,function,Ptr(Address,:Integer):Pointer;,其中,Address,是一个整数,用于表示一个,32,位地址,函数执行的结果是把,32,位地址转化为指针。,GetMem,过程,GetMem,过程也是,Pascal,中的标准例程(在,System,单元声明),类似于,New,用于在应用程序堆栈中为动态变量申请一块指定大小的区域,并把该区域的地址赋予指针变量。,GetMem,函数的语法为:,procedure,GetMem(var,P:Pointer;Size:Integer);,其中,P,是一个指针变量,Size,指定区域的字节数。,无类型指针,无类型的指针是指指针变量在声明时没有指明基类型。无类型指针在声明中只使用,Pointer,。例如:,var,pAnyPoint:Pointer,;,指针,pAnyPoint,可以指向任何变量类型。,字符指针类型,字符指针类型即,PChar,数据类型,是一个指向以,NULL(,不是零,),字符结尾的字符(,Char,)串的指针。这种类型主要用于与外部函数如在,Windows API,中所用的函数兼容。与,Pascal,字符串不同,,Windows,和,C,字符串没有一个长度字节。,过程类型,Object Pascal,允许把过程和函数作为一个整体赋给变量和作为参数传递。实现这一功能的途径是使用,Object Pascal,的过程类型。,声明一个过程类型的语法与声明过程或函数的首部的语法相似,不同的是声明一个过程类型时不需要过程或函数保留字后面的标识符。声明过程类型时可以指定一种调用约定方式,缺省的调用方式是,Register,。,下面是声明过程类型的举例:,type,TProcedure,=procedure;,TStrProc,=,procedure(const,S:string);,TMathFunc,=,function(X,:Double):Double;,Variant,数据类型,Variant,主要用于表达需要动态改变类型的数据。例如,当一个数据的实际类型在编译时不知道或运行时需要改变类型时,就可以使用,Variant,类型,Variant,变量的定义:,var,V1,V2,V3,V4,V5:Variant;,4.4 Object Pascal,基本运算符,在学习了各种数据类型之后,下面就需要知道如何比较、计算这些类型变量的值,因此需要各种各样的运算符。,Object Pascal,支持下列运算符:,算术运算符,逻辑运算符,关系运算符,下面分别介绍这些运算符及它们之间的操作顺序。,算术运算符,算术运算符用于完成二元或一元算术运算。,二元运算符需要两个操作数,其代数表达式为,A+B,的形式。,一元运算符只需要一个操作数。大多数,Object Pascal,运算符是二元的,只有部分运算符是一元的。,逻辑运算符,逻辑运算符实际上可分为两类:逻辑运算符和布尔运算符。,逻辑运算符在按位对操作数移位、比较、操作等,而布尔运算符在,TRUE,、,FALSE,级对两个布尔操作数进行比较、操作等。,关系运算符,关系运算符用于比较两个变量的值。,运算符的优先级,not(,最高,),一元运算符,*,/,div,mod,and,shl,shr,as 2,乘法运算符,+,-,or,xor3,加法运算符,=,=,in,is4(,最低,),关系运算符,递减,4.5 Object Pascal,程序设计语句,顺序语句,赋值语句,Value:=12;,块语句,ASM/END,块语句;,BEGIN/END,块语句;,条件语句,条件语句用于判断某个条件是否满足,根据满足与否来控制程序的执行流程。,If/then,语句的语法如下:,If,表达式,then,Begin,语句,end;,If/then/else,语句的语法如下:,If,表达式,then,Begin,语句,end,else,语句,end,;,if/then/else,与,if/then,的语句流程图,多重,if/then/else,语句,实际应用中常常面对更多的选择,这时,将,if/else,扩展一下,就得到多重,if/then/else,语句结构。,多重,if/then/else,语句,Case,语句,CASE,语句类似于,C,语言中的,SWITCH,语句,也是根据一个条件语句来决定程序的运行。,CASE,语句包含一个被称为选择支的表达式和若干语句,每个语句都以一个或多个常量(,CASE,常量)开头。选择支必须是有序类型,如,CHAR,BYTE,型数据或介于,0,到,255,之间的整数。所有,CASE,常量必须是唯一的,并且是与选择支类型兼容的有序类型。,Case,语句的流程图表示,CASE,语句的例子:,CASE Choice of,1,:,EvaluateChoice,;,2,:,InitializeFunction,;,A,,,B,,,C,:,DoThis,;,END;,循环语句,REPEAT/UNTIL,语句,REPEAT/UNTIL,构成一个循环语句,该循环语句总是先执行一次,然后判断,UNTIL,中的条件语句。如果条件成立(值为,TRUE,),则终止循环语句的执行,转而执行,REPEAT/UNTIL,后面的语句;如果条件不成立,(,值为,False),则继续执行循环语句。,下面是,Repeat,语句的语法规则,:,WHILE/DO,语句,WHILE/DO,构成一个循环语句,该循环语句执行前总是先判断,WHILE,中的条件,如果条件成立(值为,TRUE,),则执行循环语句,然后再判断条件语句是否成立;如果条件不成立(值为,False,),则终止执行循环语句。,下面是,WHILE/DO,语句的语法规则:,FOR/DO,语句,FOR/DO,是最简单的循环语句之一。该循环语句的执行次数必须预先给定。控制循环次数的变量必须是有序数数据类型。,Break,语句和,Continue,语句,在前面的,FOR/DO,语句介绍中,我们知道,如果要退出循环,跳到,FOR/DO,语句下面的语句执行,可以使用,break,语句;如果不想执行循环下面的语句,而要求直接进入下一个循环,可以使,Continue,语句。,其实,,Break,和,Continue,可以应用于,for,,,while,或,repeat,循环语句中。,Break,语句引起控制流退出一个,for,,,while,或,repeat,循环语句,,Continue,语句引起控制流直接进入下一次,for,,,while,,,repeat,循环语句。,其它语句,GOTO,语句,GOTO,语句强行将程序转向一个指定的点执行。该指定点用一个标号标识。下面是一个,GOTO,语句的例子:,JUMP1,:,Writeln(This,is a jump point for a GOTO);,For Count:=1 to 15 DO,BEGIN,arrayCount,:=,GetChar,;,if,arrayCount,=$D,Then GOTO,JUMP1;,如果输入回车符,则转到,JUMP1,执行,writeln(I,Have collected,,,Count,,,Of 15 Characters.);,END;,Exit,语句,EXIT,语句的功能是退出当前的代码块。如果代码块是主程序,,EXIT,语句导致程序的终止;如果当前块是嵌套的,,EXIT,语句跳到外一层嵌套继续执行。如果当前块是过程或函数,,EXIT,语句导致过程或函数执行终止,跳到调用过程或函数的语句的下一条语句执行。,HALT,语句,HALT,语句导致程序的非正常结束,并返回到操作系统。通常是在程序遇到致命错误时才使用,HALT,语句。,HALT,语句后可跟一个整数代码,以指定错误的原因。,4.6,过程(,Procedure,)与函数(,function,),过程与函数的定义,过程与函数的定义包括过程原型或函数原型、过程体或函数体的定义。,过程定义的形式如下:,procedure,procedureName(parameterList,);directives;,localDeclarations,;,begin,statements,;,end;,参数,一般将函数定义时参数列表中的参数称为形参,将函数调用时参数列表中的参数称为实参。在函数原型中,多个参数之间用分号隔开,同一类型的参数可以放在一起,以逗号隔开。在函数调用的时候,在函数原型中,多个参数之间用逗号隔开。,例如:,function,ShowNum(Num:Double;Precision:Integer,=4):Boolean;,过程与函数的调用约定,在调用过程或函数的时候,如果参数列表中具有多个参数,那么参数传递给过程或函数的顺序会对结果产生一定的影响。对于不同的语言,参数传递的顺序是不同的:,Pascal,语言是按照从左向右的顺序进行传递的,而,C,语言是按照从右向左的顺序来传递的。为了确定传递的顺序,可以在过程或函数定义的时候,在,directives,部分利用指令字指定传递的顺序。表,2-11,中的数据来自,Delphi,的联机帮助,其中列举了,directives,部分可使用的关于函数调用约定的指令字。,过程和函数类型变量,可以定义过程和函数类型的变量,它可以等效于同一类型的过程或函数中的任何一个。在例程,【4-3】,中可以加入下面的代码:,.,var,F:function:Integer,;/,定义过程与函数类型的变量,begin,GetMax(GetNum1,GetNum2);,F:=GetNum1;/F,等效于,G etNum1,Writeln(F,);,F:=GetNum2;/F,等效于,GetNum2,Writeln(F,);,end.,4.7,习题,1.,编写这样一个函数,从键盘上输入,5,个数,选出其中最大的一个。要求该功能在一个函数中实现,并在主函数中调用这个函数。,2.,将一个班的学生成绩分类程序,对一个班的学生成绩进行分类,大于等于,90,分为优秀,,70,89,分段为良好,,60,69,为合格,,60,分一下为不合格。假设班上有,20,名学生,使用数组,多重,IF/ELSE,或,CASE,语句来实现程序,打印出各等级学生的统计数。,3.,综合运用本章的知识编写以下程序,从键盘上输入一个二目算术运算表达式,如“,47,”,求此表达式的值。,
展开阅读全文