Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум10.doc
Скачиваний:
52
Добавлен:
14.02.2016
Размер:
296.96 Кб
Скачать

2. Комбинированные типы данных

2.1. Описание записи

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

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

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

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

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

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

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

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

. . .

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

end;

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

type stud=record

fam: string[15];

b1,b2,b3,b4,b5: 2..5;

sb:real;

end;

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

Организация записи stud

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

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

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

Компонент записи определяется (задается) именем записи и именем этого компонента, разделенными точками, например stud.fam, stud.b1, 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.777

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

. . .

var z1, z2:stud;

begin

. . .

z1:=z2;

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

z1.fam:=z2.fam;

z1.b1:=z2.b1;

z1.b2:=z2.b2;

z1.b3:=z2.b3;

z1.b4:=z2.b4;

z1.b5:=z2.b5;

z1.sb:=z2.sb;

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

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

program ball;

type stud=record

fam:string[15];

b1,b2,b3,b4,b5:2..5;

sb:real

end;

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

i:integer;

begin

writeln(‘Введите массив данных из 25 строк’);

for i:=1 to 25 do readln(tbl[i].fam,tbl[i].b1,tbl[i].b2,tbl[i].b3,tbl[i].b4,tbl[i].b5);

for i:=1 to 25 do

begin

tbl[i].sb:=(tbl[i].b1+tbl[i].b2+tbl[i].b3+tbl[i].b4+tbl[i].b5)/5;

writeln(tbl[i].sb)

end

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]