
♦1. 赋值语句
♦赋值语句的一般格式为:
♦<变量> := <表达式>;
♦其中符号“:=”是赋值运算符,它表示将运算符右侧表达式运算的结果存入左侧变量相对应的存储单元中,作为左侧变量当前的值。
♦赋值运算符“:=”和符号“=”具有完全不同的含义,注意不要混淆。
♦赋值运算符的左侧可以是变量标识符、对象的属性标识符、函数标识符等,不允许是常量或表达式。
♦赋值运算符右侧表达式运算结果的类型必须与左侧变量的数据类型相同或相容。
♦
♦2. 基本输入/输出语句
♦(1)Read和Readln语句(过程)
♦Read过程用于从外部设备(如键盘)或打开的文件中顺序读入数据,并将这些数据依次赋值给变量列表中相应的变量。Readln过程与Read过程不同在于前者读入数据后,自动读取换行符。二者语法形式如下:
♦Read([文件变量,]变量列表);
♦Readln([文本文件变量,]变量列表);
♦省略文件变量参数,则表示从键盘输入中读取数据。
♦
♦
♦(2)Write和Writeln语句(过程)
♦与输入语句类似,也存在两种形式的输出语句:
♦Write([文件变量,]输出项表);
♦Writeln([文本文件变量,]输出项表);
♦输出项可以是常量、变量、函数、字符串或表达式。如果输出项是常量,则语句直接输出常量的值;如果输出项是变量,则输出该变量所对应存储单元的数据内容;如果输出项是字符串,则直接输出字符串;如果输出项是表达式,则首先对表达式进行计算,然后输出表达式的运算结果。Writeln与Write的不同在于前者输出“输出项表”后自动输出换行符。
♦另外,PutChar(ch:ShortInt)过程和GetChar()函数可用于输出字符和输入字符。
♦
♦3. 复合语句
♦复合语句是指把若干条语句用begin 和end括起来的语句块。在语法上把语句块看成是一条语句。
♦4. 空语句
♦空语句,即两个分号之间没有内容(除了空格),不执行任何操作。
♦5. 注释和编译指令
♦注释的作用在于增强程序的可读性。有如下几种形式:
♦// 单行注释内容
♦{ 注释内容 }
♦(* 注释内容 *)
♦函数过程的说明 ______________________________________________________________________________________________________________________________
♦过程的说明分为过程声明和过程定义两部分,过程的声明在程序的type区中,即指定过程标识符(即过程名)和形式参数。过程名可以是任何合法的标识符;过程名后的括号内可以有多个参数也可以没有参数,若有多个参数,不同类型之间用分号隔开。过程声明后,还需要在implementation部分进行过程定义,过程定义即给出完整的过程头部和过程体的定义。
♦ 过程声明的格式如下:
♦ procedure <过程名>([<形式参数表>]);
♦ 过程定义的格式如下:
♦ procedure <过程名>([<形式参数表>]);
♦ [<局部变量和常量声明>]
♦ begin
♦ <过程语句体>
♦ end;
♦过程调用的格式如下:
♦ 过程名 ([<实际参数表>]);
♦ 其中过程名是过程的标识符;实际参数可以是常量、变量或表达式,但实际参数的个数和类型必须与形式参数完全匹配,即个数相同,类型一致。
♦ 例4-1:使用过程实现三个数从大到小排序输出。
♦ 函数的定义
函数与过程基本相同,只是使用的保留字不同,而且多了一个返回值类型,它就可以用于表达式中,称这种子程序为函数,这种语句序列的定义称为函数的定义。函数定义在程序的说明部分进行,由函数首部和函数体组成,它指明函数名、函数形参及类型、函数返回值可以赋给函数名,也可以赋给Result变量。
函数定义的格式如下:
function 函数名 (形式参数列表:参数类型):函数返回类型;
<说明部分>;
begin
语句1;
…… 函数体
语句n
end;
例4-2:该实例定义了一个函数ShowNum,可以将一个浮点数按指定的精度输出在屏幕上。
函数的调用
函数返回一个函数值,过程则能完成一系列各种操作。函数的调用方式出现在表达式中,而过程调用是一句的语句。
函数调用的格式如下:
函数名([<实际参数表>]);
其中函数名是函数的标识符,它必须在程序调用之前进行说明;实际参数表是一些由逗号分隔的参数,参数出现的顺序必须和函数定义时形式参数出现的顺序和类型一致,一一对应。
例4-3:求五边形的面积,如教材图4-1。
过程和函数的递归调用
♦过程和函数调用他们本身,称为递归调用。过程或函数A直接调用A本身,称直接递归。过程或函数A调用过程或函数B,B又调用A,称间接递归。在递归调用中,一个过程执行的某一步要用到它自身的上一步(或上几步)的结果。
♦递归在解决某些问题中,如在处理阶乘运算、级数运算、幂指数运算等方面是十分有用的方法。它可以使某些看起来不易解决的问题变得容易解决,写出的程序较简短。但是递归通常需要花费较多的机器时间和占用较多的存储空间,效率不太高。
过程和函数的类型
♦Delphi7允许把过程和函数作为一个整体赋给某个变量或者作为参数传递给其他的过程和函数,这种变量就是过程或函数类型的变量。
♦过程和函数类型的声明过程如下例:
type
TIntegerFunction=function:integer;
TProcedure=procedure;
TStrProc=procedure(const s:string);
var
f:TIntegerFunction;
//f是一个无参数、返回值为整数的函数类型的变量
proc: TProcedure;
//proc是一个无参数的过程类型变量
sp:TStrProc;
//sp是一个需要一个字符串为参数的过程类型变量
有了上面的声明之后,若有如下函数定义:
procedure FLength(s:string);
begin
<过程体>
end;
过程与函数的调用约定
在调用过程或函数的时候,如果参数列表中具有多个参数,那么参数传递给过程或函数的顺序会对结果产生一定的影响。对于不同的语言,参数传递的顺序是不同的: Pascal语言是按照从左向右的顺序进行传递的,而C语言是按照从右向左的顺序来传递的。为了确定传递的顺序,可以在过程或函数定义的时候,在directives部分利用指令字指定传递的顺序。
例4-5:可以通过该例看看参数传递的顺序。
标准函数
取子串函数,Copy(字符串,开始位置,长度)。
取左子串,LeftStr(字符串, 长度)。
取右子串,RightStr(字符串, 长度)。
判断一个子串在一个字符串中的起始位置,Pos(字符串A,字符串B), 如:Pos(‘abc’, ‘axabcdef’)的值为3。
取的字符串的长度,Length(字符串)。
二、分支语句
分支语句根据用户输入或程序运行的中间结果来确定转向执行哪个分支流程。Object Pascal提供的if语句和case语句用来实现程序的分支结构。
其语义为:判断条件是否为真,为真则执行then之后的语句A,为假则执行语句B。其中语句A和语句B可以是复合语句。
▪if 条件表达式 then
语句A
else
语句B;
在else之前不能加分号,
因为分号是语句的分隔
符,而if…then…else…
是一个完整的语句结构。
▪if 条件1 then
语句1
else
if 条件2 then
语句2
else
if 条件3 then
语句3
else
……
嵌套过多的if语句往往分不清if与else的匹配关系,影
响程序的清晰,有碍阅读。对于多分支的结构宜采用
case 语句。
其语法格式如下:
case 选择表达式 of
常量1: 语句1;
常量2: 语句2;
……
常量n-1: 语句n-1;
[else 语句n;]
end;
▪保留字case后的选择表达式,其值必须是有序类型,如整型、字符型、布尔型、枚举型、子界型等。
▪case常量列表中列出的值必须是选择表达式可能具有的值之一,或可能取值的子集,且由每一个情况常量列表列出的值在case语句中必须是唯一的。如果是子界类型,则不允许相互覆盖。
▪如果表达式的值在所列出的case常量列表中都不出现,则执行else后的语句。
例2-14:输入百分制的考试成绩,按“满分”、“优秀”、
“合格”和“不合格”等输出。
▪保留字case后的选择表达式,其值必须是有序类型,如整型、字符型、布尔型、枚举型、子界型等。
▪case常量列表中列出的值必须是选择表达式可能具有的值之一,或可能取值的子集,且由每一个情况常量列表列出的值在case语句中必须是唯一的。如果是子界类型,则不允许相互覆盖。
▪如果表达式的值在所列出的case常量列表中都不出现,则执行else后的语句。
例2-14:输入百分制的考试成绩,按“满分”、“优秀”、
“合格”和“不合格”等输出。
三、循环语句
循环语句可以使一个语句块(循环体)重复执行,它是实现复杂程序流程的基础之一。Object Pascal提供了三种循环语句:while语句、repeat语句、for语句。
2. repeat语句
其语义是:重复执行循环体,直到指定的条件为真时
为止。其语法形式如下:
3. for语句
在循环次数已知或可计算的场合,用for语句来实现循
环,更为简便。for语句分为递增型和递减型两种形式。
(2)递减型for语句
for 循环变量:=初值 downto 终值 do
语句A;
4. 多重循环
如果循环语句的循环体中又出循环语句,便构成多重循环结构。常见有2到3重的循环,循环嵌套的层次太多,将使程序的可读性和运行效率大大降低。
5. break和continue过程
在循环体中调用break过程,可使程序的执行流程立即退出该层循环,跳到该循环语句结构的下一条语句执行。
在循环体中调用continue过程,则使程序直接转入下一次循环。
例2-18:求S=1+2+4+5+…+N。求不能被3整除的自然数的和,和不超过1000。输出S及N的最大值。
2.4 结构类型
▪结构类型是能够描述和扩展定义较复杂的数据的存储类型,通过结构类型,程序中可以存储结构复杂数据。
▪结构类型可通过将多种基本数据类型结合在一起,也可以通过扩展预先定义的数据类型来得到。
▪结构数据类型有下面的几类:集合类型(set)、数组类型(array)、记录类型(record)、文件类型(file)、类类型(class)、类引用类型(class reference)、接口类型(interface)。
▪在使用结构类型时,Object Pascal语言提供了一种压缩机制,可以最大限度地节省结构类型的存储空间。在声明结构类型时引用保留字packed,数据将以压缩方式存储,但是,这样延缓了数据的访问速度,还会产生类型的兼容性的问题。
一、集合类型
格式:set of baseType;
其中baseType是集合中元素的类型或值域。
Object Pascal中规定了基类型只能是不超过256个有
序值的集合,集合的元素的序数值必须介于0和255之
间。
type
TSetA = set of Integer; // 错误
TSetB = set of 255..300; // 错误
TSetC = set of WideChar; // 错误
TsetD = set of 10..50; // 正确
TsetE= set of char; // 正确
一、集合类型
格式:set of baseType;
其中baseType是集合中元素的类型或值域。
Object Pascal中规定了基类型只能是不超过256个有
序值的集合,集合的元素的序数值必须介于0和255之
间。
type
TSetA = set of Integer; // 错误
TSetB = set of 255..300; // 错误
TSetC = set of WideChar; // 错误
TsetD = set of 10..50; // 正确
TsetE= set of char; // 正确
1. 集合的并、交、差运算
集合运算有:交(*)、并(+)、差(-),运算对
象是两个相同类型的集合,运算结果也是集合。
如:x为[1,3,5],y为[3,4,5],则x*y 为[3,5],x+y
为[1,3,4,5],x-y为[1]。
2. 集合的关系运算
(1)运算符=、<>判断两个集合相同或不相同。如:表达式 [1, 3, 5] = [3, 1, 5] 的值为True;
(2)>= (包含)、<= (包含于)。
如:表达式 [1,3] >= [3] 的值为True;
(3)属于运算in,如:表达式 3 in [3,5] 的值为True。
二、数组类型
数组类型数据表示的是同种类型数据的集合。数组类型的数据是
排列有序的,每个数据元素都有一个唯一的索引号。与集合类型
不同的是,数组类型的数据可以重复。数组类型分为静态数组和
动态数组。
1. 静态数组:在声明时指定了数组的大小。
定义静态数组的语法形式如下:
type
数组类型标识符号=array [indexType1, ..., indexTypen] of baseType;
其中,indexType是有序类型,indexType通常是以Integer为子
界的,也可以是其它有序类型的子界;baseType声明元素的数
据类型;数组由同一类型的数据元素组成。
例:
type
Tarr1 = Array [1..10] of Integer;
Tarr2 = Array [1..3,1..5] of Char;
var
a:Tarr1; // 声明变量a是Tarr1类型数组
b:Tarr2; // 声明变量b是Tarr2类型数组
也可以声明变量时直接定义数组的类型,如:
var a: Array [1..10] of Integer;
数组元素的访问是通过数组名后面加上方括号和下标
值来访问的。如:a[1]:=10;
2. 动态数组:在定义时并没有确定数组的大小或长度,而是在访问之前用SetLength过程为数组动态或重新分配其存储空间。
定义动态数组的语法形式如下:
Var 数组类型标识符: array of baseType;
例如:var DynArr: array of Integer; 声明DynArr为元素是整型的动态数组。
也可以先定义类型,再声明变量,如:
type TdynIntArr = array of integer;
var DynArr:TdynIntArr;
语句SetLength(DynIntArr,10); 为动态数组
DynIntArr分配10个元素的存储空间,下标从0到9(动
态数组的下标总是从0开始)。如要释放动态数组占用
的存储空间,可以将nil赋值给该动态数组变量,或调
用过程SetLength(DyIntArr,0)实现。
动态数组通过使用嵌套的“array of ...”结构实
现,例如:
type TGrid = array of array of String;
// 定义二维动态字符串数组类型Tgrid
记录类型
记录类型(record)可以由不同类型的元素组成,这些元素称为域。在记录类型中为每个域指定了一个名称和数据类型。数据类型可以是对象Pascal语言中预定义的类型,可以是相同的数据类型,也可以是不同的数据类型;这些数据可以是数值型的,也可以是非数值型的;还可以包括也可以是程序员自定义的类型。
♦定义和变量声明
记录类型的定义方式如下:
type recordTypeName = record
fieldList1: type1;
♦定义和变量声明
域为记录类型的元素。记录的每个域都有名称,不同域的数据类型可以各不相同,这一点是数组所不能做到的。引用记录变量的元素采用以下标记法:
直接引用,其形式为:
记录变量名.域名
使用with开域语句,其形式为:
with 记录变量名 do 语句
…
fieldListn: typen;
end
枚举类型(enumerated)
枚举类型是一个以标识符标识的有序整型常数的集合,这些常数是该类型变量可取的合法值。声明枚举类型的语法如下:
type typeName = (val1, ..., valn);
其中typeName和vali是有效的标识符, typeName 是枚举类型,vali是枚举量的标识符。
例:type TWeekDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
这些枚举量不能再定义为其它标识符。当用Ord函数分别对其取值时,将得到0、1、2、3、4、5、6。
在默认的情况下,枚举值是从0开始的有序整数,在实际编程的过程中,可以越过这种,可以根据需要指定标识符表中的值。例如:
type MyColor = (red=2,green=6,white=7,black=9);
一些枚举类型的值只有两种可能的值,如下声明:
type SampleEnum = (val1, val2, val3 = 0);
SampleEnum中val1、val2、val3的Ord函数值分别为:0、1、0,即Ord(val1)与Ord(val3)相同。
枚举量的取值范围为0~255。
简答题
1.While语句和repeat语句的区别
a) while语句
while语句是在执行前判断下一步的操作,可能做多次循环,可能一次循环也不做。
while语句的格式如下:
while <表达式> do
begin
<语句组>
end;
●repeat-until语句
repeat-until语句是重复做循环体内的语句直到条件满足终止循环。它是先执行循环体,最后判断终止条件,因此至少应做一次循环。
repeat-until语句的格式如下:
repeat
<语句组>;
until <表达式>;
2.参数的传递方式
1.以值方式传递参数
2.按引用方式传递参数
3.什么是形参、实参?形参有几种,区别是什么?
形参:声明或实现一个过程使用的参数成为形式参数
实参:调用过程时传入的参数成为实际参数
形参的种类和区别请娜娜自行解决> . <
4.描绘case语句。变量的类型.xin枚举_________________________________________________________________________________________________________________________
case 语句。
其语法格式如下:
case 选择表达式 of
常量1: 语句1;
常量2: 语句2;
……
常量n-1: 语句n-1;
[else 语句n;]
end;
▪保留字case后的选择表达式,其值必须是有序类型,如整型、字符型、布尔型、枚举型、子界型等。
▪case常量列表中列出的值必须是选择表达式可能具有的值之一,或可能取值的子集,且由每一个情况常量列表列出的值在case语句中必须是唯一的。如果是子界类型,则不允许相互覆盖。
▪如果表达式的值在所列出的case常量列表中都不出现,则执行else后的语句。
5.break continue 区别
通常可以在以上三种语句组成的循环体中调用break()和continue()过程。如果调用break()过程,会使程序立刻跳出循环而执行循环后的那条语句,如果调用continue()过程,会使循环体内continue()后的代码不再执行而返回去再次判断循环条件,以决定是否继续循环。
6.定义结构体 record
记录类型(record)可以由不同类型的元素组成,这些元素称为域。在记录类型中为每个域指定了一个名称和数据类型。数据类型可以是对象Pascal语言中预定义的类型,可以是相同的数据类型,也可以是不同的数据类型;这些数据可以是数值型的,也可以是非数值型的;还可以包括也可以是程序员自定义的类型。
♦定义和变量声明
记录类型的定义方式如下:
type recordTypeName = record
fieldList1: type1;
…
fieldListn: typen;
end
7.枚举类型定义,输出结果
