1、群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲 - 1 -第五讲:枚举型/子界型/函数与过程/集合与记录/指针一、枚举型和子界型 7.1.1 类型定义类型定义的语法格式:type=;=;=; 7.1.2 枚举类型通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序是一致的。枚举类型的形式:(标识符 1,标识符 n)例如:type daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday)枚举元素只能是标识符,而不能是数值常量或字符常量。例如以下的定义是错误的: type
2、daystype=(sun,mon,tue,wed,thu,fri,sat)枚举元素是标识符,不要把作为枚举元素的标识符视作变量名,它不能被赋值。同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。例如以下的定义是错误的:type daytype1=(monday,tuesday);daytype2=(monday,wednesday);可以将枚举类型的定义和变量的定义结合在一起。例如:var a:(monday,tuesday,sunday)枚举类型属于顺序类型。根据定义类型时各枚举元素的排列顺序确定它们的序列,序列号从 0 开始。例如:已经定义 daystypeord(sunday)=
3、0,succ(sunday)=monday,pred(friday)=thursdayTurbo Pascal 不允许直接读写枚举值,所以枚举值的输出常用 case 语句间接的输出。枚举值的输入,则要一一判断读入字符是否是枚举类型的标识符。若是才能赋给枚举变量,否则就会出错。例如:枚举值的输出群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲 - 2 -case day ofsunday:write(sunday);monday:write(monday);tuesday:write(tuesday);wednesday:write(wednesday);thursday:write(t
4、hursday);friday:write(friday);saturday:write(saturday);end;7.1.3 子界类型子界类型是由整型、字符型、枚举型、布尔型的两个常量指定该类型的值域区间。子界类型的形式: 常量 常量两个常量必须是同一种顺序类型。例如:a b,要求 a0)or(year mod 400 =0)群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲 - 3 -then dayth:=dayth+29else dayth=:=dayth+28;4,6,9,11:dayth:=dayth+30;end;dayth:=dayth+day;writeln(dayt
5、h)end. 二、函数和过程 7.2.1 函数如果一个子程序执行后能够返回其结果值,那么它就可以用于表达式中,称这种子程序为函数,这种语句序列的定义称为函数说明。函数说明形式如下:function 函数名(形式参数表):函数类型;说明部分;begin语句 1;语句 2;语句 nend函数返回一个函数值,过程则能完成一系列各种操作。函数的调用方式出现在表达式中,而过程调用是一句独立的语句。例:计算|X|的函数function zhoufei(x:real):real;var z:integer;beginif x=0 then z:=xelse z:=-xzhoufei:=z;end;Turbo
6、 Pascal 规定一个函数只能求出一个简单值。 群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲 - 4 -7.2.2 过程给某个语句序列组成的子程序赋于一个适当的名字。程序中凡是需要出现这个语句序列的地方,可以简单的写上子程序的名字。这种完成一个操作的子程序称为过程;子程序的定义称为过程说明。过程说明由过程首部和过程体组成,其形式如下:procedure 过程名(形式参数表);-过程首部说明部分;begin执行语句;end;例 输出两个数中最大值的过程procedure largest(a,b:integer);beginif ab then writeln(a)else writ
7、eln(b);end. 三、集合与记录 7.3.1 集合以已知序数类型值的集合为值,所构成的类型是集合类型,称已知序数类型为基类型。集合类型的定义形式为:集合类型名set of 基类型基类型中不能超过 256 个可能值,且它们的序数值应在 0 255 之间。表示一个集合值的最通用的方法是逐个枚举集合的元素。下面是集合值标记的例子:3,9,15,20 由 3,9,15,20 组成的集合 空集lp,z 由字符 l,m,n,o,p,z 组成的集合两个相连的集合对象之间,可以通过下列运算符进行运算集合运算符:+ 产生一个包含两个集合元素的集合 群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲
8、- 5 -* 产生一个只包含两个集合元素公共元素的集合 - 产生一个包含所有属于第一个集合、但不属于第二个机和的元素的集合 例如:A,B,C+D等于A,B,C,DA,B,C*A等于AA,B,CA等于B,C关系运算符= 检查两个集合所包含的元素相同 C,B,A 等于 FALSE 7.3.2 记录记录是描述同一对象的一组类型可能不同的数据的集合。使用记录类型实现了数据逻辑关系和存放形式上的一致。定义记录类型的一般形式记录类型名record域名 1:类型 1;域名 2:类型 2;域名 m:类型 m;end;例如:表示学生信息的记录定义typestype=recordname:string20;num
9、ber:integer;sex:(male,female);class:120address:string群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲 - 6 -end;域为记录类型的元素。记录的每个域都有名称,不同域的数据类型可以各不相同,这一点是数组所不能做到的。引用记录变量的元素采用以下标记法:(1)直接引用,其形式为记录变量名域名例如:var str1,str2:stype;则 str1.name 表示学生 str1 的姓名,str2.sex 表示学生 str2 的性别。(2)使用 with 开域语句,其形式为with 记录变量名 do 语句在 with 语句中,引用记录变
10、量名不再冠以记录变量名,以简化对记录中域的引用写法。例如描述 100 个学生的数据信息,引入元素类型为 stype 的数组 students。varstudents:array1100of stype;number_of_boy,number_of _girl,k:integer:例如下面是一段统计一个班级中男生人数和女生人数的程序。beginnumber_of_boy:=0; number_of_girl:=0;for k:=1 to 100 dowith studentk doif sex=male then number_of_boy:=number_of_boy+1else numbe
11、r_of_girl:=number_of_girl+1end;with 语句的嵌套结构的一般形式:with dowith dowith do;上面的嵌套格式也可以简写为:with do群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲 - 7 -; 四、指针 741 指针的动态变量1.定义指针类型在 Pascal 中,指针变量中存放的某个存储单元的地址,即指针变量指向某个存储单元。一个指针变量仅能指向某一种类型的存储单元,这种数据类型是在指针类型的定义中确定的,称为指针类型的基类型。指针类型定义如下:类型名基类型名;例如:type q=integer;var a,b,c:q;说明 q 是
12、一指向整型存储单元的指针类型,其中“为指针符。a,b,c 均定义为指针变量,分别可以指向一个整型存储单元。上例也可定义为:var a,b,c:integer;指针也可以指向有结构的存储单元。例如:type person=recordname:string10;sex:(male,female);age:2070end;var pt:person;pt 为指向记录类型 person 的指针变量。2.动态变量应用一个指针指向的动态存储单元即动态变量的形式如下:指针变量名例如:p、q、r指针变量 p 和它所指向的动态变量p 之间有如下关系: PP以下语句把整数 5 存放到 p 所指向的动态变量 p
13、中去: p:=5;以下语句把 p 所指向的 p中的值赋给整型变量 i: i:=p;如果指针变量 p 并未指向任何存储单元,则可用下列赋值语句:群星学校信息学奥林匹克竞赛辅导资料 指导老师:姜峰第七讲 - 8 -p:=nil; 其中 nil 是 Turbo Pascal 保留字,表示“空” ,相当于 C 里面的 null 7.4.2 对动态变量的操作在 Turob Pascal 程序中,动态变量不能由 var 直接定义而是通过调用标准过程 new 建立的。过程形式为:new (指针变量名);如果有下列变量定义语句:var p:integer;仅仅说明了 p 是一个指向整型变量单元的指针变量,但这
14、个整型单元并不存在,在指针变量 p 中还没有具体的地址值。在程序中必须通过过程调用语句:new(p);才在内存中分配了一个整型变量单元,并把这个单元的地址放在变量 p 中,一个指针变量只能存放一个地址。在同一时间内一个指针只能指向一个变量单元。当程序再次执行 new(p)时,又在内存中新建立了一个整型变量单元,并把新单元的地址存放在 p 中,从而丢失了旧的变量单元的地址。为了节省内存空间,对于一些已经不使用的现有动态变量,应该使用标准过程 dispose予以释放。过程形式为:dispose(指针变量名);为 new(指针变量名)的逆过程,其作用是释放由指针变量所指向的动态变量的存储单元。例如在
15、用了 new(p)后在调用 dispose(p),则指针 p 所指向的动态变量被撤销,内存空间还给系统,这时 p 的值为 nil。 例:输入两个数,要求先打印大数后打印小数的方式输出,用动态变量做。program dongtai;type intepter=integer;var p1,p2:intepter;procedure swap(var,q1,q2:intepter);var p:integer;beginp:=q1;q1:=q2;q2:=p;end;beginnew(p1);new(p2);writeln(input 2 data: );readln(p1,p2);if p1 writeln(output 2 data: ,p1:4,p2:$);end.