- •Введение в object pascal
- •Лекция 1. Интегрированная Среда и Состав языка Object Pascal
- •1.1 Работа с окнами
- •1.2 Редактирование в Object Pascal
- •1.3 Команды меню
- •1.4 «Горячие» клавиши в Object Pascal
- •1.5 Состав языка
- •1.5.1 Алфавит и ключевые слова
- •1.5.2 Идентификаторы
- •1.5.3 Знаки операций, разделители, выражения и операторы
- •Лекция 2. Описательная часть программы
- •2.1 Структура программы
- •2.2 Описание констант
- •2.3 Описание и использование меток
- •2.4 Комментарии
- •Лекция 3. Описание переменных
- •3.1 Структура раздела описания переменных
- •3.2 Классификация типов данных
- •3.2.1 Целочисленные типы
- •3.2.2 Логический тип
- •3.2.3 Символьный тип
- •3.2.4 Вещественные типы
- •3.3 Описание типов пользователя
- •Лекция4. Выражения
- •4.1 Порядок выполнения операций
- •4.2 Выражения целого типа
- •4.3 Вещественные выражения
- •4.4 Логические выражения
- •Лекция 5. Программы Линейной структуры
- •5.1 Операторы ввода (Read, Readln)
- •5.2 Операторы вывода (Write, Writeln)
- •5.2.1 Форматирование численных значений
- •5.2.2 Вывод строковых, символьных и логических значений
- •5.2.3 Вывод вещественных значений в экспоненциальном формате
- •5.2.4 Расположение данного в поле вывода. Примеры
- •5.3 Оператор присваивания
- •5.4 Составной оператор
- •5.5 Стандартные процедуры и функции
- •5.5.1 Понятие процедуры и функции
- •5.5.2 Описание некоторых стандартных процедур и функций
- •5.5.3 Примеры программ линейной структуры
- •Лекция 6. Операторы ветвления (выбора)
- •6.1 Оператор ветвления if
- •6.2 Оператор множественного выбора (варианта) - case
- •Лекция 7. Операторы организации циклов
- •7.1 Цикл типа for
- •7.1.1 Прямая форма оператора for
- •7.1.2 Обратная форма оператора for
- •7.1.3 Советы для начинающих и примеры
- •7.2 Цикл типа While
- •7.3 Цикл типа Repeat... Until
- •7.4 Дополнительные операторы при программировании циклов
- •7.4.1 Досрочный выход из цикла - break
- •7.4.2 Переход к следующей итерации цикла - continue
- •Лекция 8. Массивы
- •8.1 Одномерные массивы
- •8.2 Сортировка одномерного массива
- •8.3 Массивы с большей размерностью
- •8.4 Констант-массивы
- •8.5 Генератор случайных чисел
- •8.5.1 Описание функции Random
- •8.5.2 Применение случайных чисел при работе с массивами
- •Лекция 9. Строки
- •9.1 Строковый тип
- •9.2 Операции над строками
- •Лекция 10. Записи и множества
- •10.1 Запись
- •10.2 Множества
- •11 Пользовательские процедуры и функции
- •11.1 Описание функции и процедуры
- •11.2 Понятие формальных и фактических параметров
- •11.3 Способы передачи параметров в подпрограмму через заголовок
- •11.4 Область видимости идентификаторов
- •12 Файлы
- •12.1 Основные понятия
- •12.2 Типизированные файлы
- •12.3 Текстовые файлы
Лекция 10. Записи и множества
10.1 Запись
Запись в Object Pascal относится к структурированным типам. Запись – содержит именованные компоненты-поля (часто разного типа), объединенные одним общим именем и идентифицируемые (адресуемые) с помощью, как имени записи, так и имени полей.
Разнотипность компонент записи позволяет использовать ее в качестве набора данных, описывающих некоторый информационный объект. Например, при описании учащихся данного класса школы можно рассмотреть следующие индивидуальные характеристики отдельного ученика: фамилию, имя, месяц и число рождения, вес, рост, номер парты и т. д. Видно, что все данные об ученике разного типа. Действительно, фамилия, имя – строки; месяц, номер парты – целые числа; вес и рост – вещественные числа. Таким образом, для хранения информации об учащихся воспользоваться массивом практически невозможно. Но структурированный тип Record предназначен как раз для этого.
При описании переменной - записи предварительно определяют идентификатор типа Record в разделе описания типов.
type
<идентификатор пользовательского типа> = record
<список 1 идентификаторов полей записи>: <тип полей>;
<список 2 идентификаторов полей записи>: <тип полей>;
………………………………………………………………
<список n идентификаторов полей записи>: <тип полей>;
end;
После описания типа можно использовать его идентификатор при описании любого количества переменных, как мы это делали с идентификаторами стандартных типов.
Данный путь не единственный, можно описать переменную типа Record, при этом не описывая типа.
var
<список идентификаторов переменных>: record
<список 1 идентификаторов полей записи>: <тип полей>;
<список 2 идентификаторов полей записи>: <тип полей>;
………………………………………………………………
<список n идентификаторов полей записи>: <тип полей>;
end;
Примеры:
1)
type
child = record
f, i: String;
m, d, n: integer;
x, v: Real;
end;
var
a, b, c: child;
2)
var
a, b, c: record
f, i: String;
in, d, n: integer;
r, v: Real;
end;
3)
Month = (Jan, Feb, Mar, Apr, May, Jun, Jly,
Aug, Sep, Oct, Nov, Dec);
Date : record
D: 1 . . 31;
M: Month;
Y: 1900 .. 2020;
end;
В примерах 1) и 2) переменные a, b, c – это имена записей. В результате описания они имеют один и тот же тип и структуру. В примере 3) Date – имя записи, а разнотипные поля D, M, Y- имеют пользовательский тип (номер дня, месяц, год).
Доступ к конкретному полю записи в программе осуществляется через идентификатор переменной - записи и идентификатор поля, которые разделяются точкой.
Примеры:
a.f , b.r , a.v, c.m
Переменные типа «запись» (указано только первое имя) могут участвовать в операторах присваивания, но никакие операции над ними выполняться не могут. Арифметические или любые другие операции могут выполняться только над отдельными полями записи.
Примеры:
a . f := 'Иванов’ ;
a . i := 'Иван' ;
а . т := 12;
a . d := 23;
a . n := 6 ;
a . r := 1.78;
a . v := 63.5;
m := m + a. r;
t := а . r / a . v;
С целью облегчить выполнение многократных ссылок к полям одной записи используют оператор присоединения:
with <переменная-запись> do <оператор>;
Внутри оператора, входящего в оператор присоединения, компоненты записи обозначаются с помощью только имён полей (имя переменной-записи перед ними не указывается). Заголовок операторов может содержать список переменных-записей:
with <переменная-запись>[,<переменная-запись>] do <оператор>;
Пример (используем запись из приведённого выше примера):
with a do
begin
f:=’Иванов’ ; n:=6; d:=23; r:=1.78; v:=63.5;
end;
Запись может быть элементом массива. Такой массив называют массивом записей. Пример ниже показывает применение массива записей.
type
Point = record
X, Y: Real;
end;
Vector = array[1.. 3] of Point;
В этом примере Point – это запись, то с двумя полями -координатами точки, а Vector – это массив записей. Программа, использующая массив записей приведена ниже.
program p10_1;
{ программа осуществляет ввод информации об учащихся класса,
выводит на экран введенную информацию и отношение роста ученика
к его массе}
const
n = 30; { количество учеников в классе }
type
child = record { Этот тип – это запись, содержащая
информацию об ученике }
f, i : String;
m, d, n : integer;
r, v : Real ;
end;
TKlass = array[1.. n] of child; { Этот тип является массивом записей, содержащих информацию об учащихся класса }
Var
A: TKlass; { А экземпляр типа TKlass }
i, n : integer;
t : real;
begin
Write('Введите количество учеников – n , 0 < n < 30 ' );
Readln(n);
{ ввод данных об учениках }
for i := 1 to n do
begin
Writeln(' N ' , i) ;
Write('введите фамилию: '); Readln(A[i] . f);
Write('введите имя: '); Readln(A[i] . i);
Write('введите месяц рождения: '); Readln(A[i] . m);
Write('введите день рождения: '); Readln (A [i] .d);
Write('введите рост: '); Readln(A[i].r);
Write('введите вес: '); Readln(A[i].v);
Write('введите номер парты: '}; Readln(A[i].n);
end;
{ вывод на экран списка учеников и их данных }
for i:= 1 to n do
Writeln(i: 2, '/', A[i].f : 10, '/' , A[i].i : 10, '/' , A[i].d : 2,
'/' , A[i].m: 2, '/' , A[i].n : 2, '/ ' , A[i] . r : 4 : 1 , '/' ,
A[i].v: 4 : 1 , '/' , A[i] . r , '/' , A [i] .v : 6: 3) ;
end.