永州网,内容丰富有趣,生活中的好帮手!
永州网 > 推荐 > 正文

信息学奥赛第七讲:探索枚举型 函数与过程 指针等

时间:2024-02-13

枚举型是一种数据类型,可用于定义一组常量,对于程序设计中的状态等概念具有重要应用;函数与过程是程序中的基本构建模块,对于代码的封装和模块化具有重要意义;指针是编程语言...

友情提示:本文共有 5190 个字,阅读大概需要 11 分钟。

信息学奥赛第七讲将重点介绍枚举型、函数与过程以及指针等内容。枚举型是一种数据类型,可用于定义一组常量,对于程序设计中的状态等概念具有重要应用;函数与过程是程序中的基本构建模块,对于代码的封装和模块化具有重要意义;指针是编程语言中的重要概念,能够对内存地址进行操作,对于数据的灵活管理和处理提供了更多可能。本讲将深入探讨这些内容,通过理论讲解和实际案例分析,帮助学习者更好地理解并掌握信息学竞赛中的相关知识,提升编程能力和解题技巧。

一、 枚举型和子界型

7 .1 .1 类型定义

类型定义的语法格式:

type

<标识符1>=<类型1>;

<标识符1>=<类型1>;

……

<标识符n>=<类型n>;

7 . 1. 2枚举类型

通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序 是一致的。枚举类型的形式:(标识符1,……,标识符n)

例如:type daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday)

枚举元素只能是标识符,而不能是数值常量或字符常量。例如以下的定义是错误的:

type daystype=("sun","mon","tue","wed","thu","fri","sat")

枚举元素是标识符,不要把作为枚举元素的标识符视作变量名,它不能被赋值。同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。例如以下的定义是错误的:

type daytype1=(monday,tuesday);

daytype2=(monday,wednesday);

可以将枚举类型的定义和变量的定义结合在一起。例如:var a:(monday,tuesday,sunday)

枚举类型属于顺序类型。根据定义类型时各枚举元素的排列顺序确定它们的序列,序列号从0开始。

例如:已经定义daystype

ord(sunday)=0,succ(sunday)=monday,pred(friday)=thursday

Turbo Pascal不允许直接读写枚举值,所以枚举值的输出常用case语句间接的输出。枚举值的输入,则要一一判断读入字符是否是枚举类型的标识符。若是才能赋给枚举变量,否则就会出错。

例如:枚举值的输出

case day of

sunday:write("sunday");

monday:write("monday");

tuesday:write("tuesday");

wednesday:write("wednesday");

thursday:write("thursday");

friday:write("friday");

saturday:write("saturday");

end;

7 . 1. 3子界类型

子界类型是由整型、字符型、枚举型、布尔型的两个常量指定该类型的值域区间。

子界类型的形式:常量..常量

两个常量必须是同一种顺序类型。例如:a..b,要求a<=b

例如:

type a=1..3;

b="a".."d";

可以将子界类型的定义和变量的定义结合在一起。例如:var a:1..9

例按月、日、年顺序读入一日期,输出该日期是这一年中的第几天。

program date;

var year:0..;

month,i:1..12;

day:1..31;

dayth:integer;

begin

read(month,day,year);

dyath:=0;

for i:=1 to month-1 do

case i of

1,3,5,7,8,10,12:dayth:=dayth+31;

2:if ((year mod 4=0)and(year mod 100<>0)or(year mod 400 =0)

then dayth:=dayth+29

else dayth=:=dayth+28;

4,6,9,11:dayth:=dayth+30;

end;

dayth:=dayth+day;

writeln(dayth)

end.

二、 函数和过程

7.2.1 函数

如果一个子程序执行后能够返回其结果 值,那么它就可以用于表达式中,称这种子程序为函数,这种语句序列的定义称为函数说明。函数说明形式如下:

function函数名(形式参数表):函数类型;

说明部分;

begin

语句1;

语句2;

……

语句n

end

函数返回一个函数值,过程则能完成一系列各种操作。函数的调用方式出现在表达式中,而过程调用是一句独立的语句。

例:计算|X|的函数

function zhoufei(x:real):real;

var z:integer;

begin

if x>=0 then z:=x

else z:=-x

zhoufei:=z;

end;

Turbo Pascal规定一个函数只能求出一个简单值。

7.2.2过程

给某个语句序列组成的子程序赋于一个适当的名字。程序中凡是需要出现这个语句序列的地方,可以简单的写上子程序的名字。这种完成一个操作的子程序称为过程;子程序的定义称为过程说明。

过程说明由过程首部和过程体组成,其形式如下:

procedure 过程名(形式参数表);-------过程首部

说明部分;

begin

执行语句;

……

end;

例输出两个数中最大值的过程

procedure largest(a,b:integer);

begin

if a>b then writeln(a)

else writeln(b);

end.

三、 集合与记录

7.3 .1集合

以已知序数类型值的集合为值,所构成的类型是集合类型,称已知序数类型为基类型。集合类型的定义形式为:

集合类型名=set of基类型

基类型中不能超过256个可能值,且它们的序数值应在0..255之间。

表示一个集合值的最通用的方法是逐个枚举集合的元素。下面是集合值标记的例子:

[3,9,15,20] {由3,9,15,20组成的集合}

[] {空集}

["l".."p","z"] {由字符l,m,n,o,p,z组成的集合}

两个相连的集合对象之间,可以通过下列运算符进行运算

集合运算符:

+ 产生一个包含两个集合元素的集合

* 产生一个只包含两个集合元素公共元素的集合

- 产生一个包含所有属于第一个集合、但不属于第二个机和的元素的集合

例如:[A,B,C]+[D]等于[A,B,C,D]

[A,B,C]*[A]等于[A]

[A,B,C]-[A]等于[B,C]

关系运算符

= 检查两个集合所包含的元素相同

<> 检查两个集合不相等

<= 检查第一个集合中的元素都在第二个集合中出现

>= 检查第一个集合中的元素包含第二个集合中的所有元素

in 检查集合基类型的一个元素属于集合

例如:[A,B,C]=[A,B,C]等于true

[A,B,C]<>[C,B,A]等于FALSE

7.3. 2记录

记录是描述同一对象的一组类型可能不同的数据的集合。使用记录类型实现了数据逻辑关系和存放形式上的一致。定义记录类型的一般形式

记录类型名=record

域名1:类型1;

域名2:类型2;

……

域名m:类型m;

end;

例如:表示学生信息的记录定义

type

stype=record

name:string[20];

number:integer;

sex:(male,female);

class:1..20

address:string

end;

域为记录类型的元素。记录的每个域都有名称,不同域的数据类型可以各不相同,这一点是数组所不能做到的。引用记录变量的元素采用以下标记法:

(1)直接引用,其形式为

记录变量名.域名

例如:var str1,str2:stype;

则str1.name表示学生str1的姓名,str2.sex表示学生str2的性别。

(2)使用with开域语句,其形式为

with 记录变量名 do 语句

在with语句中,引用记录变量名不再冠以记录变量名,以简化对记录中域的引用写法。例如描述100个学生的数据信息,引入元素类型为stype的数组students。

var

students:array[1..100]of stype;

number_of_boy,number_of _girl,k:integer:

例如下面是一段统计一个班级中男生人数和女生人数的程序。

begin

number_of_boy:=0; number_of_girl:=0;

for k:=1 to 100 do

with student[k] do

if sex=male then number_of_boy:=number_of_boy+1

else number_of_girl:=number_of_girl+1

end;

with语句的嵌套结构的一般形式:

with <记录变量名1>do

with <记录变量名2>do

……

with <记录变量名n>do

<语句>;

上面的嵌套格式也可以简写为:

with <记录变量名1,记录变量名2,……,记录变量名n>do

<语句>;

四、 指针

7.4.1 指针的动态变量

1.定义指针类型

在Pascal中,指针变量中存放的某个存储单元的地址,即指针变量指向某个存储单元。一个指针变量仅能指向某一种类型的存储单元,这种数据类型是在指针类型的定义中确定的,称为指针类型的基类型。指针类型定义如下:

类型名=^基类型名;

例如:type q=^integer;

var a,b,c:q;

说明q是一指向整型存储单元的指针类型,其中"^"为指针符。a,b,c均定义为指针变量,分别可以指向一个整型存储单元。

上例也可定义为:

var a,b,c:^integer;

指针也可以指向有结构的存储单元。

例如:type person=record

name:string[10];

sex:(male,female);

age:20..70

end;

var pt:^person;

pt为指向记录类型person的指针变量。

2.动态变量

应用一个指针指向的动态存储单元即动态变量的形式如下:

指针变量名^

例如:p^、q^、r^

指针变量p和它所指向的动态变量^p之间有如下关系: P->P"

以下语句把整数5存放到p所指向的动态变量p^ 中去: p^:=5;

以下语句把p所指向的p^中的值赋给整型变量i: i:=p^;

如果指针变量p并未指向任何存储单元,则可用下列赋值语句:

p:=nil; 其中nil是Turbo Pascal保留字,表示“空”,相当于C里面的null

7.4 .2对动态变量的操作

在Turob Pascal程序中,动态变量不能由var直接定义而是通过调用标准过程new建立的。过程形式为:

new (指针变量名);

如果有下列变量定义语句:

var p:^integer;

仅仅说明了p是一个指向整型变量单元的指针变量,但这个整型单元并不存在,在指针变量p中还没有具体的地址值。在程序中必须通过过程调用语句:new(p);才在内存中分配了一个整型变量单元,并把这个单元的地址放在变量p中,一个指针变量只能存放一个地址。在同一时间内一个指针只能指向一个变量单元。当程序再次执行new(p)时,又在内存中新建立了一个整型变量单元,并把新单元的地址存放在p中,从而丢失了旧的变量单元的地址。

为了节省内存空间,对于一些已经不使用的现有动态变量,应该使用标准过程dispose予以释放。过程形式为:dispose(指针变量名);为new(指针变量名)的逆过程,其作用是释放由指针变量所指向的动态变量的存储单元。例如在用了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;

begin

p:=q1;q1:=q2;q2:=p;

end;

begin

new(p1);new(p2);

writeln("input 2 data: ");readln(p1^,p2^);

if p1^writeln("output 2 data: ",p1^:4,p2^:$);

end.

收集不易,本文《信息学奥赛第七讲:探索枚举型 函数与过程 指针等》知识如果对你有帮助,请点赞收藏并留下你的评论。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
显示评论内容(5)
  1. 魔幻之子2024-02-13 21:18魔幻之子[贵州省网友]203.191.118.2
    听到有关枚举型和指针的讲座,感觉会是一次收获满满的学习经历!
    顶0踩0
  2. 11094637312024-02-13 21:071109463731[湖南省网友]202.38.171.254
    指针一直是我的短板,希望这次能够从中有所突破。
    顶11踩0
  3. Jenny2024-02-13 20:56Jenny[澳门网友]117.53.56.72
    函数与过程的区别一直搞不太清楚,希望这次的讲座能够澄清我的疑惑。
    顶0踩0
  4. 魔.裂天.复仇之子2024-02-13 20:45魔.裂天.复仇之子[吉林省网友]103.53.216.173
    枚举型和指针感觉好高深啊,希望这次讲座能够帮助我更好地理解这些概念。
    顶9踩0
  5. 唯爱是从2024-02-13 20:34唯爱是从[内蒙古网友]103.252.36.41
    挺有意思的,枚举和指针一直是我感觉比较难以理解的地方,期待能从这个讲座中有所收获。
    顶0踩0
相关阅读
探讨方程的根与函数的零点: 一场思考与反思

探讨方程的根与函数的零点: 一场思考与反思

通过对方程的根和函数的零点的研究,我们可以深入理解数学中的基本概念和原理,揭示数学世界中的奥秘

2024-02-05 #随笔

Excel函数IF详解:从入门到实践

Excel函数IF详解:从入门到实践

通过IF函数,可以实现根据不同情况做出不同的计算或决策

2024-01-28 #百科

突破中考数学难点:掌握二次函数综合问题解法并重视数形结合

突破中考数学难点:掌握二次函数综合问题解法并重视数形结合

课程将深入讲解二次函数的基本概念和解题方法,并结合实际问题进行综合分析与求解,帮助学生掌握数学建模和实际问题求解的能力

2024-01-29 #头条

深入了解Python中series函数及其顺序参数的使用指南

深入了解Python中series函数及其顺序参数的使用指南

通过使用series函数,程序员可以按照需要对数据进行处理和分析,而顺序参数则可以帮助程序更精准地获取所需的数据

2024-01-29 #知识

高一函数学习重点概览

高一函数学习重点概览

通过本篇文章的系统总结,读者将能够全面了解高一阶段所学习的函数知识点,包括函数的定义、函数的奇偶性、函数的单调性、函数的周期性、函数的图像特征以及函数在数学和实际问题...

2024-02-06 #生活

如何在Windows 7中调节鼠标灵敏度?

如何在Windows 7中调节鼠标灵敏度?

调节鼠标灵敏度可以让操作更加流畅和舒适,尤其是在进行设计、游戏等任务时尤为重要

2024-02-08 #随笔

帝舵M74033-0005手表时间调整方法指南

帝舵M74033-0005手表时间调整方法指南

在24时表针处于后半圈、时间在晚上10点到2点直接不要调日期,这样可能损坏日期传动齿轮

2024-01-25 #百科

解决电脑鼠标频繁失灵的问题

解决电脑鼠标频繁失灵的问题

频繁失灵的鼠标可能源于硬件故障、驱动程序问题或是操作系统错误

2024-01-31 #生活

苹果引领无障碍体验:手语服务今日正式推出!

苹果引领无障碍体验:手语服务今日正式推出!

新功能将以软件更新的形式出现,主要包括:手语翻译功能、适用于Apple Watch的辅助触控、iPadOS双眼控制iPad、旁白阅读功能、Made for iPhone助听器与听力支持、抵抗周边干扰的环境音

2024-01-25 #知识