Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгор_ТХТК_пособие.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.6 Mб
Скачать

Глава 9 Записи

9.1 Описание записи

При использовании массивов основное ограничение заключается в том, что каждый элемент должен иметь один и тот же тип. Однако при решении задач обработки информации возникает необходимость хранить и обрабатывать совокупности данных различных типов, что требует создания отдельных массивов для каждого типа данных, а для установления соответствия между ними - введения соответствующих индексов. Это можно проиллюстрировать на простой задаче по вычислению среднего балла для группы студентов.

Пример 9.1 Для каждого студента указаны фамилия и оценки (в баллах), полученные на экзаменах по пяти дисциплинам. Требуется вычислить средний балл для каждого студента и упорядочить список студентов по убыванию среднего балла.

Предположим, что в группе 25 студентов. Для хранения одной фами­лии студента требуется массив из 15 символов, тогда для хранения всех фамилий необходим двумерный массив размера 15x25. Для хранения ин­формации о баллах, полученных студентами, потребовался бы еще один массив размера 5x25, а для хранения вычисленного среднего балла - тре­тий массив из 25 элементов. Соответствие между фамилиями, получен­ными баллами и средним определяется индексами соответствующих мас­сивов.

Совокупность данных в приведенном примере можно рассматривать как запись (комбинированный тип данных). В общем случае запись пред­ставляет собой совокупность ограниченного числа логически связанных компонентов, принадлежащих к разным типам. Например, фамилии сту­дентов представляются данными символьного типа; оценка, полученная на экзамене, интерпретируется как отрезок целочисленного типа (2...5), а средний балл имеет вещественное значение.

Определение записи включает указание ее имени, имен отдельных компонентов и соответствующих типов данных:

Туре

<имя-записи> = record

<имя-компонента-1>: <тип>; <имя-компонента-2>: <тип>;

<имя-компонента-п>: <тип> end;

Данные в примере 9.1 можно описать следующим образом:

Туре

stud = record

fam: string[15]; b1,b2, bЗ, b4, b5:2..5; sb: real;

end;

Здесь переменная sb имеет смысл среднего балла; b1, b2, bЗ, b4, b5 обозначают баллы по соответствующим дисциплинам; идентификатор fam обозначает строку символов для хранения фамилии студента. Пере­менная stud в программе на языке Паскаль будет иметь смысл структуры, содержащей информацию об одном студенте.

Организация этой записи показана на рис. 9.1.

Рисунок 9.1 - Организация записи Stud

Если информацию по всем 25 студентам необходимо хранить в памя­ти ЭВМ, то вводится массив TBL, представляющий собой массив записей:

Var

tbl: array [1. .25] of stud;

Селектор записи

Компонент записи определяется (задается) именем записи и именем этого компонента, разделенными точками, например stud.fam, stud.bl, tbl[3].sb. В программах подобные составные имена называются селекто­рами записи и используются так же, как и переменные других типов. Для нахождения значения среднего балла может быть использован оператор присваивания:

tbl[i].sb := (tbl[i].b1+tbl[i].b2+tbl[i].b3+tbl[i].b4+tbl[i].b5)/5 ; Возможны и такие операторы присваивания:

tbl[3].fam := 'Иванов'; tbl[20].b2 := 5;

tbl[k+1].sb := 4.666;

Имена компонентов внутри записи не должны повторяться. В языке Паскаль нет ни одной операции, которая воспринимала бы запись как не­что целое. Однако значение записи можно пересылать в другие переменные - записи с помощью операторов присваивания. Возвращаясь к рассматриваемому примеру, можно написать:

Var

z1,z2 : stud ;

begin

z1 := z2 ;

Последний оператор присваивания эквивалентен следующей группе операторов:

zi.fam :=z2.fam ;

zl.bl :=z2.bl ;

Zl.b2:=z2.b2;

Zl.b3:=z2.b3;

zl.b4:=z2.b4;

zl.b5:=z2.b5;

zlsb :=z2.sb;

Запись можно передавать в качестве параметра процедуры или функ­ции, но значением функции запись быть не может.

Пример 9.1 может быть записана в следующем виде (без упорядочения списка по убыванию среднего балла):

{Определение среднего балла}

Program Ball;

Type

Stud = record

fam : string[15]; b1,b2, bЗ, b4, b5:2..5; sb: real end;

Var

tbl:array[1..25]of stud;