Конспект лекций по информатике для специальностей 2102, 2103 Автор доц., к т. н. Каширская Е. Н

Вид материалаКонспект

Содержание


8. КОМБИНИРОВАННЫЕ ТИПЫ 8.1. Описание записей и действия с ними
8.2. Оператор присоединения.
Подобный материал:
1   ...   14   15   16   17   18   19   20   21   ...   25

8. КОМБИНИРОВАННЫЕ ТИПЫ

8.1. Описание записей и действия с ними


Для работы с группой данных различного типа введено понятие записи.

В языке программирования Паскаль запись представляет собой совокупность ограниченного числа данных различного типа.

Примеры записей:
  1. Данные о студенте:

Фамилия – массив символов,

Имя – массив символов,

Год рождения – целое число,

Название института – массив символов.
  1. Формуляр книги в библиотеке:

Автор – массив символов,

Название – массив символов,

Год издания – целое число,

Издательство – массив символов,

Количество страниц – целое число,

Цена – действительное число.

Все данные можно объединить в одну группу и считать записью. Запись в целом и отдельные её элементы обозначаются именами.

К каждому элементу записи можно обратиться с помощью уточнённого имени. Оно содержит имя записи, а через точку – имя элемента.

Запись, как и другие данные, объявляется в разделе описаний и используется в разделе операторов.

Описание записи имеет следующий вид:

Type имя_типа = Record

Имя_элемента 1: тип;

Имя_элемента 2: тип;

…………

Имя_элемента n-1: тип;

Имя_элемента n: тип;

End;

Var имя_записи: имя_типа;

Здесь служебное слово Record (запись) выполняет роль открывающей операторной скобки, End – закрывающей операторной скобки. Внутри операторных скобок описываются элементы записи. Допускается вместо имени записи указывать список имён, то есть имена записей, разделённые запятыми.

Элементы записи вместе с их описанием называются полями записи.

Пример.

Список 1 Список 2

No Фамилия Оценки 1 ------------

1 ------------ (4 штучки 2 ------------

2 ------------ у каждого) 3 ------------

3 ------------ ………… 4 ------------

Type T = Record

N: Integer:

Name: Array [1..10] of Char;

Ball: Array [1..4] of Integer;

End;

Var C1, C2: T;

Здесь сначала введён тип записи Т, а затем в разделе переменных указано, что переменные С1 и С2 имеют тип Т.

Каждый элемент записи имеет своё описание:

N – переменная целого типа,

Name – массив из 10 символов (если фамилия содержит меньше 10 букв, то оставшиеся позиции заполняются пробелами),

Ball – массив из 4-х целых чисел (4 оценки за экзамен).

Допускается описание записи непосредственно в разделе переменных:

Var имя_записи: Record

Имя_элемента 1: тип;

Имя_элемента 2: тип;

…………

Имя_элемента n-1: тип;

Имя_элемента n: тип;

End;

Элемент записи используется в программе в том же самом смысле, как и обычная переменная. Таким образом, элемент записи можно указывать как в левой части оператора присваивания, так и в выражениях в правой части. Над элементами записи можно выполнять все действия, которые допустимы для данных его типа. Например, если тип элемента записи – целый, то можно выполнять все операции, допустимые для целых данных. Так, для рассмотренного примера (экзаменационной ведомости) над элементами записи можно, например, выполнить следующие операции:

а) ввести значения порядковых номеров

Read(C1.N);

Read(C2.N);

б) вычислить сумму первых двух оценок

Summa1 := C1.Ball[1] + C1.Ball[2];

Summa2 := C2.Ball[1] + C2.Ball[2];

Обращение к записи в целом, а не только к отдельным её элементам, допускается лишь в операторе присваивания. Слева и справа от знака присваивания при этом должны использоваться имена записей одинакового типа.

8.2. Оператор присоединения.


Мы отметили, что обращение к элементам записи происходит с помощью уточнённого имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения, а в блоке Begin – end используются только имена элементов записи.

Оператор присоединения имеет вид:

With имя_записи do

Begin

Операторы

End;

Пример. Для 1-ой экзаменационной ведомости (списка 1) оператор присоединения можно записать так:

With C1 do

Begin

Read(N);

Summa := Ball[1] + Ball[3];

End;

Пример. Имеется ведомость учащихся с оценками:

Иванов Иван 2

Петров Пётр 2

Сидоров Сидор 3

Составить программу для вычисления среднего балла.

Поскольку в каждой строке ведомости представлены данные различного типа, введём запись с именем СПИСОК, состоящую из двух полей:

Name – фамилия и имя – упакованный массив из 15 символов;

Ball – оценка – целое число.

Для вычисление среднего балла Midball находится сумма всех оценок Summa, которая делится на число студентов N.

Program W123;

Const N = 3; (* число учащихся в списке *)

M = 15; (* максимальная длина Name *)

Type T = Record

Name: Packed Array [1..M] of Char;

Ball: Integer;

End;

Var Spisok: T;

I, K: Integer; (* параметры цикла *)

Midball: Real; (* средний балл *)

Summa: Integer; (* сумма оценок *)

Begin

Summa := 0;

Writeln(‘ введите таблицу ‘);

For I := 1 to N do

Begin

For K := 1 to M do

Read(Spisok.Name[K]);

Read(Spisok.Ball);

Summa := Summa + Spisok.Ball;

End;

Midball := Summa / N;

Writeln(‘----------------------------‘);

Writeln(‘ средний балл = ‘, Midball: 5: 2);

End.

Описание записи сделано в разделе Type, где Т – имя типа. В разделе переменных Var указано, что переменная СПИСОК тип Т.

Раздел операторов состоит из двух циклов: один вложен в другой. Внешний цикл с параметром I выполняется столько раз, сколько имеется фамилий в ведомости (в данном случае N = 3). Внутренний цикл с параметром К предназначен для ввода фамилии и имени. На фамилию и имя отводится поле из 15 позиций. Лишние позиции поля заполняются пробелами. Внутри поля фамилию и имя можно располагать свободно, например:

_ _ _ _ Иванов _ Иван

или _ _Иванов _ Иван_ _

или _ _ _Иванов _ Иван_

или _ Иванов_ _ Иван_ _

После имени следует оценка.

Пример. Присвоить звание “отличник” тем, у кого по всем предметам пятёрки.

Из исходного списка С1, в котором содержатся фамилии и оценки, нужно сформировать другой список С2, состоящий из отличников. Для формирования списков используется массив массивов.

Program otl;

Const K = 5; (* количество человек *)

Type Tip = Record

Name: Array [1..K, 1..15] of Char;

Math: Array [1..K] of Integer;

Phis: Array [1..K] of Integer;

Chem: Array [1..K] of Integer;

End;

Var C1, C2: Tip; (* списки *)

I, J, N: Integer; (* параметры циклов *)

Begin

J := 0;

Writeln(‘ введите фамилию и оценки: ‘);

For I := 1 to K do

Begin

For N := 1 to 15 do Read(C1.Name[I, N]);

Read(C1.math[I], C1.Phis[I], C1.Chem[I]);

If (C1.Math[I] = 5) And

(C1.Phis[I] = 5) And

(C1.Chem[I] = 5) then

Begin

J := J + 1;

C2.Name[J] := C1.Name[I];

End;

End;

If J = 0 then Writeln(‘нет отличников ‘)

else Begin

Writeln(‘-----------------------‘);

Writeln(‘отличники:‘);

For I := 1 to J do

Writeln(C2.Name[I]);

End;

End.

Пример. Дан многочлен 4А + 5В – 8С + 16А – 3А + 9К – 1А

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

Введём обозначения:

М1 – элемент многочлена (запись),

М2 – результирующий элемент (запись),

Coef – коэффициент (элемент записи),

Buk – буква (элемент записи),

Elem – тип записи,

Sum – сумму коэффициентов.

Program Ex4;

Type Elem = Record (* тип элемента *)

Coef: Integer; (* коэффициент *)

Buk: Char; (* буква *)

End;

Var M1: Elem; (* входной элемент *)

M2: Elem; (* выходной элемент *)

Sum: Integer; (* сумма коэффициентов *)

Begin

Sum := 0;

Writeln(‘ введите многочлен ‘);

While Not EOLN do (* end of line *)

Begin

Read(M1.Coef, M1.Buk);

If M1.Buk = ‘A’ then Sum := Sum + M1.Coef;

End;

M2.Coef := Sum;

M2.Buk := ‘A’;

Writeln(‘подобный член = ‘, M2.Coef: 3, M2.Buk);

End.

Запись - это комбинированный тип, сложная переменная с несколькими компонентами. В отличие от массивов компоненты записи (поля) могут иметь разные типы, и доступ к ним осуществляется не по индексу, а по имени поля.

Записи могут входить в качестве компонентов в другие переменные, например, можно сформировать массив записей.

К каждому компоненту записи можно обратиться, используя имя переменной типа записи и имя поля, разделённых точкой.

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

Пример. Определить число студентов 1974 г. рождения.

Type Student = Record

Name: Array [1..15] of Char;

Date: Integer;

End; { of record }

Var Grope: Array [1..30] of Student;

K, I: Integer;

Begin

K := 0;

For I := 1 to 30 do

With Grope[I].Date do

If Date = 1974 then K := K + 1;

Writeln(K);

End.

В данном примере в заголовке оператора With стоит Grope[I] – элемент массива, зависящий от параметра I, поэтому оператор присоединения вставлен внутрь цикла по I.