Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_часть1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
3.89 Mб
Скачать

Теоретические сведения

Определение

Запись – структура, состоящая из конечного числа компонент, называемых полями.

Компоненты записи (поля) могут принадлежать разным типам. Компонента (поле) – переменная некоторого типа.

Описание.

а) type <имя типа> = record

поле1 : тип поля1;

поле2 : тип поля 2;

…………………………

поле n : тип поля n

end;

var a: <имя типа>;

б) var a: record

…..

end;

в) допускается переменные одного типа записывать через запятую:

Поле2, поле3 : тип полей 1 и 2;

Примеры:

Type TPoint = record

x : real;

y : real;

End;

Var Point: Tpoint;

Type TPoint = record

x,y : real;

End;

Var Point: record

x,y : real;

End;

Типизированные константы

При введении исходных данных в виде типизированных констант приходится использовать явное указание на идентификатор поля. Например, для ввода координат точки при использовании модуля GRAPH можно воспользоваться зарезервированным типом точки:

Type TPoint = record

x,y : real;

End;

Const Point : TPoint = (x : 2.0; y : -1.5);

Вызов в программе: <имя переменной>.<имя поля>, например, Point.х.

Имя поля неизменно во всей программе, если идентификатор рассматривается как идентификатор поля данной записи. Вне записи этот же идентификатор может означать совершенно другую величину.

Таким образом, имя поля как идентификатор может использоваться только совместно с записью:

<идентификатор записи >.< имя поля >.

Например, Var Point: record

x,y : real;

End;

x : string;

Point.x:=1.5;

x:=’some’;

Переменная х, описанная в программе, и Point.х – разные переменные.

Составные записи, поля-массивы, массивы записей

Поле записи может иметь тип «запись», «массив». Массив в свою очередь может состоять из записей. В качестве примера рассмотрим набор (массив) многоугольников.

Program Polygons;

Const MaxNumVert = 125;

MaxNumPol=125;

Type TPoint = record {точка}

x,y : real;

End;

TPolygon = record {многоугольник}

Num_vert : 1.. MaxNumVert; {количество вершин}

{вершины многоугольника}

Vertex : array [1.. MaxNumVert] of TPoint;

End;

{набор многоугольников}

Var Polygon : array [1.. MaxNumPol] of Tpolygon;

X : real;

Polygon[4].Vertex[2].x := x + Polygon[4].Vertex[2].x;

Polygon[4].Vertex[2].y:= 2+ Polygon[4].Vertex[2].y;

В приведенной программе x и Polygon[4].Vertex[2].x – различные числа, различные области памяти.

Оператор присоединения: with <имя записи> do <оператор>

Как видим, «добраться» до поля не так просто. Однако если в какой-то части программы осуществляют операции с конкретной записью, то можно упростить действия, применив оператор

WITH <Имя записи> DO.

Начиная с момента введения оператора WITH, имена полей указанной записи можно употреблять без указания имени текущей записи. Например, последний пример можно записать так:

with Polygon[4] do

begin

Vertex[2].x := x + Vertex[2].x;

Vertex[2].y:= 2+ Vertex[2].y;

End;

with Polygon[4] do

with Vertex[2] do

begin

x := Polygons.x + x; {имя программы}

y:= 2+ y;

еnd;

или так:

with Polygon[4].Vertex[2] do

begin

x := Polygons.x + x; {имя программы}

y:= 2+ y;

end;

При использовании оператора With могут происходить казусы, если некоторый Ваш идентификатор совпадает по имени с именем поля. Этого следует избегать путем изменения имени внешнего идентификатора (так как имя поля в описании жестко зафиксировано) или употребления имени программы в качестве расширения, как это сделано в последних примерах.

Пример:

Определить самого старшего рабочего бригады из нескольких (не более 10) человек, если сведения о рабочих включают:

  • фамилию;

  • год рождения.

Программа расчета:

program lab9; {ЧТЕНИЕ, ОБРАБОТКА И ВЫВОД ЗАПИСЕЙ}

uses crt;

type birthday=record {ТИП-ЗАПИСЬ}

name :string[15]; {ПОЛЕ-ИМЯ}

year :word {ПОЛЕ-ГОД РОЖДЕНИЯ}

end; {birthday}

arr=array[1..10] of birthday; {ТИП-БРИГАДА}

var a :arr; {ПЕРЕМЕННАЯ-БРИГАДА}

b :birthday; {САМЫЙ СТАРШИЙ}

n :byte; {КОЛИЧЕСТВО ВСЕХ РАБОЧИХ}

fi,fo :text; {ФАЙЛОВЫЕ ПЕРЕМЕННЫЕ}

{------- ПРОЦЕДУРА ЧТЕНИЯ ФАЙЛА: ----------------------------}

procedure Read_File ( var f:text; var a:arr; var n:byte );

{ВЫХОДНЫЕ ПАРАМЕТРЫ: ПЕРЕМЕННЫЕ a, n}

var i :byte;

begin

reset (f); {ОТКРЫВАЕТСЯ ФАЙЛ ДЛЯ ЧТЕНИЯ}

i:=0; {НАЧАЛЬНОЕ ЗНАЧЕНИЕ КОЛИЧЕСТВА ЗАПИСЕЙ}

while not SeekEOf(f) do {ЧТЕНИЕ ДАННЫХ ДО КОНЦА ФАЙЛА}

begin

i:=i+1; {ПОДСЧИТЫВАЕМ КОЛИЧЕСТВО ЗАПИСЕЙ}

with a[i] do readln (f,name,year);

end;

close (f);

end;

{------- ПРОЦЕДУРА ОБРАБОТКИ ИНФОРМАЦИИ: -------------------}

procedure Work ( a:arr; n:byte; var b:birthday );

{ВЫХОДНОЙ ПАРАМЕТР: ПЕРЕМЕННАЯ b --САМЫЙ СТАРШИЙ}

var i:byte;

begin {ПОИСК САМОГО СТАРШЕГО}

b:=a[1];

for i:=1 to n do

if a[i].year<b.year then b:=a[i];

end;

{------- ПРОЦЕДУРА ЗАПИСИ РЕЗУЛЬТАТОВ В ФАЙЛ: -------------}

procedure Write_File ( var f:text; a:arr; n:byte; b:birthday );

{ВСЕ ПАРАМЕТРЫ --- ВХОДНЫЕ}

var i:byte;

begin

rewrite (f);

writeln (f,' Ф.И.O. ГОД РОЖДЕНИЯ');

writeln (f,'------------------------------------------');

for i:=1 to n do

with a[i] do writeln (f, name:-15, year:9);

writeln(f); writeln (f,' САМЫЙ СТАРШИЙ:'); writeln(f);

writeln (f, b.name:-15, b.year:9);

close(f);

end;

{----------- ОСНОВНАЯ ПРОГРАММА --------------------------}

begin

clrscr;

assign (fi,'input9.pas'); {ИНИЦИАЛИЗАЦИЯ ФАЙЛА ИСХ. ДАННЫХ}

assign (fo,'output9.pas');{ИНИЦИАЛИЗАЦИЯ ФАЙЛА РЕЗУЛЬТАТА}

Read_File (fi,a,n); { ВЫЗОВ ПРОЦЕДУРЫ ЧТЕНИЯ ИЗ ФАЙЛА }

if n=0 then writeln ('ФАЙЛ ИСХОДНЫХ ДАННЫХ - ПУСТОЙ');

else begin

Work(a,n,b); { ВЫЗОВ ПРОЦЕДУРЫ ОБРАБОТКИ}

Write_File(fo,a,n,b);{ВЫЗОВ ПРОЦЕДУРЫ ЗАПИСИ В ФАЙЛ}

writeln('РЕЗУЛЬТАТЫ СМОТРИТЕ В ФАЙЛЕ OUTPUT9.PAS');

end;

repeat until keypressed;

end.

Файл исходных данных Input9.pas:

Файл результата Output9.pas:

Иванов И.И. 1975

Сидоров С.П. 1961

Петров М.И. 1974

Павлов Л.В. 1977

Потапов В.М. 1966

Ф.И.O. ГОД РОЖДЕНИЯ

------------------------------------------

Иванов И.И. 1975

Сидоров С.П. 1961

Петров М.И. 1974

Павлов Л.В. 1977

Потапов В.М. 1966

САМЫЙ СТАРШИЙ:

Сидоров С.П. 1961