Конспект лекций по информатике для специальностей 2102, 2103 Автор доц., к т. н. Каширская Е. Н
Вид материала | Конспект |
Содержание8. КОМБИНИРОВАННЫЕ ТИПЫ 8.1. Описание записей и действия с ними 8.2. Оператор присоединения. |
- Конспект лекций бурлачков в. К., д э. н., проф. Москва, 1213.67kb.
- Конспект лекций по курсу "Начертательная геометрия и инженерная графика" Кемерово 2002, 786.75kb.
- Конспект лекций по дисциплине «Маркетинг», 487.79kb.
- Конспект лекций для студентов всех специальностей дневной и заочной формы обучения, 1439.07kb.
- Конспект лекций для студентов, магистров и аспирантов всех специальностей, 373.35kb.
- Конспект лекций для студентов по специальности i-25 01 08 «Бухгалтерский учет, анализ, 2183.7kb.
- Конспект лекций организация производства и маркетинг для студентов 3 курса специальностей, 2989.73kb.
- Конспект лекций по дисциплине «психология и педагогика» омск 2005, 2020.42kb.
- Конспект лекций по курсу «Организация производства», 2034.84kb.
- Конспект лекций по курсу «Организация производства», 2032.47kb.
8. КОМБИНИРОВАННЫЕ ТИПЫ
8.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.