Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
№___230105__ МУ_лаб и пр_ОАиП_часть первая.docx
Скачиваний:
7
Добавлен:
26.04.2019
Размер:
383.97 Кб
Скачать

Оператор with

Этот оператор используется для удобства работы с переменными типа

RECORD (запись).

Общий вид:

WITH A DO ST;

Здесь А - имя переменной типа RECORD,ST - оператор.

В операторе ST при ссылках на компоненты записи имя А можно

опускать.

Пример. Для занесения даты рождения в предыдущем примере достаточно

выполнить операторы:

WITH BIRTHDAY[MOTHER] DO

BEGIN

MONTH:=5;

DAY:=1;

YEAR:=1950;

END.;

Запись с вариантами

Общий вид:

TYPE V=RECORD

A:TYPE1;

B:TYPE2;

.................

CASE N:TYPEN OF

C1: (T11:TYPE11; T12:TYPE12; ,,,);

C2: (T21:TYPE21; T22:TYPE22; ,,,);

...............................

CK: (T1K:TYPE1K; T2K:TYPE2K; ,,,);

END;

VAR Z:V;

Здесь Z - переменная типа V; N - переменная, называемая переключателем;

TYPEN - тип переменной N.

Этому же типу должны принадлежать метки С1, С2,...,СК.

Каждой метке соответствует набор полей Т11,Т12,.... Эти поля являются

компонентами варианта.

Переменную N называют также тэгом (тагом), ярлыком, признаком,

дискриминантом.

Если какой-либо метке CL вообще не соответствует поля, то пишут CL:();

Замечания.

Любая запись (record) может иметь только одну вариантную часть

(CASE).

Вариантная часть должна помещаться после постоянной части.

Среди идентификаторов полей не должно быть одинаковых. Обращение к компоненте Z.Tij записи Z происходит так:

Присваивается соответствующее значение (Ci) переключателю N. В

зависимости от значения N переменная Z, помимо полей А,В,..., содержит те поля, которые соответствуют той метке Ci, с какой совпадает значение N.

Выполняется операция с компонентой Z.Tij.

Пример записи с вариантами. Пусть необходимо собрать следующие

сведения о сотрудниках института: фамилию, дату рождения и, если есть семья, то фамилию и дату рождения супруги или супруга.

Эта информация моет быть описана, например, записью PERSON.

Пусть переменная KIND может иметь одно из значений (<женат>, <холост>).

KIND=(MARRIED, SINGLE);

PERSON=RECORD

NAME:STRING;

DATEBIRTH:DATE;

CASE YESNO:KIND OF

MARRIED: (NAME1:STRING; DATE1:DATE);

SINGLE: ();

END;

Здесь NAME - строка символов (например, 'ROGOV '); DATEBIRTH - запись, описанная выше, содержит дату рождения (например, 15.02.62);

YESNO -переключатель типа KIND, который может принимать одно из двух значений: MARRIER либо SINGLE; NAME1 - строка символов, содержащая фамилию супруги (супруга) (например 'ROGOVA'); DATE1 - запись, содержащая дату рождения супруги (супруга). SINGLE - пустое поле.

Если ROGOV женат, то присутствует поле MARRIED, если холост - поле SINGLE, а поле MARRIED отсутствует. Паскаль допускает вложение

вариантов в типе RECORD.

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

KIND=(MARRIED, SINGLE, DEVORCED, NO);

Тогда PERSON=RECORD

NAME:STRING;

DATEBIRTH:DATE;

CASE YESNO:KIND OF

MARRIED: (NAME1:STRING; DATE1:DATE);

SINGLE: (CASE YN:KIND OF DEVORCED: (DATEDV:DATE));

NO: ();

END;

Здесь для варианта SINGLE имеется вложенная запись с вариантами

DEVORCED (разведен) и NO.

Если сотрудник состоит в браке, то в записях информации отсутствует

поле SINGLE; если разведен, то отсутствует MARRIED; если в браке не состоял, то запись содержит лишь поле NAME, DATEBIRTH и пустое поле

NO. Замечание.

Перед засылкой информации в запись программист должен

присвоить переключателю соответствующее значение. В противном случае

информация (например, MARRIED) в поле заслана не будет, и система никакой

диагностики не выдаст.

Пример засылки информации о сотруднике РОГОВЕ, родившемся 1.12.32, женатом на РОГОВОЙ, родившейся 15.3.30. PROGRAM LT3;

TYPE KIND=(MARRIED,SINGLE);

DATE=RECORD

DAY:1..31;

MONTH:1..12;

YEAR:INTEGER;

END;

PERSON=RECORD

NAME:STRING;

DATEBIRTH:DATE;

CASE YESNO:KIND OF

MARRIED: (NAME1:STRING; DATE1:DATE);

SINGLE: (NAMESING:STRING);

END;

VAR P:PERSON;

BEGIN

WITH P DO

YESNO:=MARRIED;

NAME:='ROGOV';

WITH DATEBIRTH DO

BEGIN

DAY:=1;

MONTH:=12;

YEAR:=1932;

END;

CASE YESNO OF

MARRIED: BEGIN

NAME1:='ROGOVA';

WITH DATE1 DO

BEGIN

DAY:=15;

MONTH:=3;

YEAR:=1930;

END;

END; (*MARRIED*)

SINGLE:NAMESING:='SINGLE';

END;(*CASE YESNO OF*)

END;(*WITH P DO*)

WITH P DO

WRITE (' ',NAME);

WITH P.DATEBIRTH DO

WRITE (' ',DAY,'/',MONTH,'/',YEAR);

WITH P DO

WRITE (' ' , NAME1);

WITH P.DATE1 DO

WRITELN (' ',DAY,'/',MONTH,'/',YEAR);

END.

Лабораторная работа №13(2 часа)

Тема: Компиляция и тестирование программы (См. лаб. раб. №12) с использованием записей.

Цель: Приобрести навыки проведения компиляции и тестирования программы.

Задание: Провести компиляцию и тестирование программы, разработанной в ходе выполнения лабораторной работы №12.

Практическая работа №9 (2 часа)

Тема: Использование стандартных процедур и функций для работы с файлами. Разработка алгоритмов заполнения и редактирования файлов данных.

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

Задание: Разработать алгоритм решения задачи согласно варианту, представить его в виде инструкции.

Вариант 1. В файл f записать целые числа в следующем порядке: десять положительных, десять отрицательных, десять положительных, и т.д. Переписать компоненты файла f в файл g в следующем порядке: пять положительных, пять отрицательных, пять положительных и т.д. (предполагается, что число компонент файл f делится на 20)

Вариант 2. В файл f записать целые числа в следующем порядке: десять положительных, десять отрицательных, десять положительных, и т.д. Переписать компоненты файла f в файл g в следующем порядке: двадцать положительных, двадцать отрицательных, двадцать положительных и т.д. (предполагается, что число компонент файл f делится на 40)

Вариант 3. Дан файл h компонентами которого массивы целых чисел a0, a1, …, a7, каждый по10 элементов. Записать в файл f последовательность массивов, получающихся преобразованием исходных массивов: a0a1, a1a2, …, a7a0.

Вариант 4. Дан файл h компонентами которого массивы целых чисел a0, a1, …, a7. Записать в файл f последовательность массивов, получающихся преобразованием исходных массивов: a0 + a1, a1 + a2, …, a6 + a7.

Вариант 5. Даны символьные файлы f и g. Определить, совпадают ли компоненты файла f с компонентами файла g. Если нет, то получить номер первой компоненты, в которой файлы f и g отличаются между собой.

Вариант 6. Дан файл h1, компонентами которого являются целочисленные массивы a1, …, a10, каждый по 5 элементов. Преобразовать каждый из массивов следующим образом: заменить отрицательные элементы на -1, положительные – на 1, а нулевые оставить без изменения. Записать полученные массивы в файл h2.

Вариант 7. Дан файл f, компонентами которого являются целочисленные массивы a0, a1, …, a8. Требуется преобразовать каждый из массивов, заменив элементы с наибольшем значением нулем. Полученные массивы должны быть записаны в тот же самый файл f. Разрешается использовать вспомогательный файл g.

Вариант 8. Разработать программу, которая формирует файл F1, содержащий целые числа, и переписывает этот файл в другой файл – F2, помещая в него из F1 только положительные числа.

Вариант 9. Разработать программу сортировки (упорядочивания по возрастанию значений элементов) файла, содержащего целые числа.

Вариант 10. Разработать алгоритм слияния двух отсортированных по убыванию значений элементов файлов F1 и F2. Результатом слияния должен быть файл F3, элементы которого упорядочены по возрастанию.