Цель Ввести понятие структурированных типов. Познакомить учащихся с записями и их реализацией на Pascal.
Выделяют четыре основные разновидности структурированных типов:
Во многих экономических и информационных задачах обрабатываются ведомости, документы, каталоги, списки. При этом появляется необходимость объединять данные различного типа в одну группу. Для работы с группой данных в языке программирования Паскаль введено понятие запись. Запись представляет собой совокупность ограниченного числа данных различного типа. Понятие записи рассмотрим на примере ведомости списка учащихся с их оценками
N п/п
|
Фамилия, имя
|
Оценка
|
1
|
Антонов Саша
|
5 4 4 4 4
|
2
|
Озеров Коля
|
5 3 4 4 3
|
3
|
Хлебников
|
4 5 5 2 4
|
Каждая строка в этой ведомости состоит из отдельных элементов - данных различного типа:
а) порядковый номер - целое десятичное число;
б) Фамилия имя. - массив символов;
в) Оценки - массив целых чисел.
Эти данные можно объединить в одну группу и считать записью.
Для представления такой разнородной, но логически связанной информации удобно использовать комбинированный тип. Необходимо отметить, что в данном случае отдельные компоненты комбинированного типа, ввиду их различной природы, не могут идентифицироваться порядковыми номерами (индексами), как в массивах; поэтому для обозначения компонент используются индикаторы. Таким образом, описание комбинированного типа представляет собой список описаний его элементов (которые называются также полями записи); каждое описание похоже на описание простой переменной. Список полей начинается служебным словом record и должен завершаться служебным словом end. Объявление записи в разделе переменных VAR имеет следующий вид:
VAR имя записи: RECORD
имя элемента 1: тип;
имя элемента 2: тип;
....................
имя элемента n: тип;
END;
Для примера, приведенного выше, описание комбинированного типа может выглядеть следующим образом:
VAR B: RECORD
N: INTEGER;
FIO: PACKED ARRAY[1..20] OF CHAR;
OCENKA: ARRAY[1..3] OF INTEGER;
END;
Рассмотрим более универсальную форму объявления записи - с использованием раздела типов TYPE.
TYPE имя типа = RECORD
имя элемента 1: тип;
имя элемента 2: тип;
...................
имя элемента n: тип;
END;
VAR имя записи: имя типа;
TYPE BEDOM=RECORD
N: INTEGER;
FIO: PACKED ARRAY[1..20] OF CHAR;
OCENKA: ARRAY[1..3] OF INTEGER;
END;
VAR B:BEDOM;
Доступ к элементам (полям) записей производится с помощью конструкции, называемой селектором записи и имеющей следующий общий вид: R.F, где R - переменная комбинированного типа; F - идентификатор поля.
Примеры. Порядковому номеру N записи B присвоить значение 2: B.N:=2; Найти сумму 3 оценок S:=b.ocenka[1]+b.ocenka[2]+b.ocenka[3]
ЗАДАЧА 1. Для каждого ученика вводяться: фамилия и оценка по 5 дисциплинам. Вычислить средний балл для каждого.
Решение. При вводе данных необходимо помнить, что под фамилию отводится 15 символов, следовательно, оценки необходимо вводить, начиная с 16 позиции. Например, Антонов Саша. 4 3 5 5 4
program bal;
type str=record
fam:string[15] ;
b1, b2, b3, b4, b5:2..5;
sb:real;
end;
var tbl: array[1..25] of str;
i: integer;
begin
for i:=1 to 5 do
begin
read(tbl[i].fam);
read(tbl[i].b1,tbl[i].b2,tbl[i].b3,tbl[i].b4,tbl[i].b5);
readln;
end;
for i:=1 to 5 do
begin
tbl[i].sb:=(tbl[i].b1+tbl[i].b2+tbl[i].b3+tbl[i].b4+tbl[i].b5)/5;
write(tbl[i].fam,tbl[i].sb);
writeln;
end;
end.
Для более компактной записи селекторов Pascal имеет специальный оператор присоединения, позволяющий в ряде случаев опускать левые части секторов. Обращение к элементам записи происходит с помощью уточненного имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения, а в блоке используются только имена элементов записи. Общая форма оператора присоединения:
WITH имя записи DO
begin
операторы, содержащие имена элементов записи
end;
WITH B DO
begin
N:=2;
S:=ocenka[1]+ocenka[2]+ocenka[3];
read(n);
end;
РЕШЕНИЕ задачи с оператором присоединения:
program sbal;
type str=record
fam:string[15];
b1,b2,b3,b4,b5:2..5;
sb:real;
end;
var
tbl:array[1..25] of str;
i,j,k,m:integer;
x:real;
begin
readln(m);
for i:=1 to m do
with tbl[i] do
begin
read(fam,b1,b2,b3,b4,b5);
readln;
end;
for i:=1 to m do
with tbl[i] do
begin
sb:=(b1+b2+b3+b4+b5)/5;
write(fam,sb);
writeln;
end;
end.
Отладка программы
Обратить внимание на ввод записей и проанализировать результаты вывода.