Добавил:
sofyvits@ya.ru на позитиве Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
481
Добавлен:
10.01.2016
Размер:
919.04 Кб
Скачать

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

Чтобы упростить доступ к полям записи, в Паскале введен специальный оператор присоединения, который записывается следующим образом:

with <переменная>do <оператор>

Здесь with,do – зарезервированные слова (с, делать);

<переменная> – имя переменной типа запись, за которой может следовать список вложенных полей;

<оператор> – любой оператор Паскаля.

Оператор withслужит для упрощения формы записи: в операторе, стоящем послеdo, можно использовать имена полей в качестве обычных переменных, при этом имя переменной-записи присоединяется автоматически. Например,

with pers do name := ‘Иванов’;

with pers.birthday do

begin day := 12; month := 6; year := 1967 end;

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

Решение.Для наглядности введем дополнительный тип данных, представляющий дату и включающий три поля: число, месяц, год (в рамках данной задачи это, строго говоря, необязательно). Тогда основной тип данных будет представлять собой запись со следующими полями: фамилия (строка символов длиной до 20), дата рождения (запись типа дата) и место рождения (строка символов длиной до 20). Фактическое количество записей в массиве будем вводить с клавиатуры. Программа логически делится на две части – ввод и вывод данных. Ввод трудностей не представляет, достаточно попросить пользователя ввести по очереди все поля каждой записи. Для этого подходит циклическая структура типаfor. Вывод реализовать немного сложнее, поскольку последовательный вывод значений полей не образует таблицу. Здесь возможны два варианта – использовать сложный форматный вывод данных с учетом фактической длины строк типаstring, либо позиционирование курсора с помощью процедур и функций модуляCRT. Второй путь проще и дает больше возможностей. Действительно, можно очистить экран, а затем перед выводом очередного поля позиционировать курсор в нужную позицию текущей строки. Чтобы таблица выглядела красиво, нужно еще вывести ее заголовок (шапку) перед циклом вывода данных, а также правильно рассчитать позиции на экране. Текст программы с использованием модуляCRTприведен ниже.

programtest_rec;

{ Программа иллюстрирует работу с данными типа запись }

Uses Crt;

type { объявление типа date }

date = record

day: 1..31;

month: 1..12;

year: word

end;

person = record { объявление типа person }

name: string[20];

birthday: date;

city: string[20];

end;

var

pers: array[1..5] of person; { переменная pers – массив из 5-ти записей типа person }

n,i: integer;

begin

ClrScr; { очистка экрана }

writeln('Введите количество записей - до 5');

readln(n);

fori:=1tondo{ цикл ввода записей по полям }

begin

writeln('ввод записи номер ',i);

with pers[i] do

begin

write('Фамилия ');

readln(name);

write('дата рождения - число, месяц, год ');

readln(birthday.day,birthday.month,birthday.year);

write('Место рождения - город ');

readln(city);

end

end;

{ вывод записей на экран с использованием позиционирования }

Clrscr; { очистка экрана }

writeln(' Фамилия Дата рождения Место рождения');

for i:=1 to 60 do write('-'); { вывод строки из «-» }

writeln;

fori:=1tondo { цикл по количеству записей }

with pers[i] do

begin

write(name); {вывод имени }

GotoXY(21,WhereY); { позиционирование курсора на 21 поз-ю текущей строки}

with birthday do

write(day:2,'.',month:2,'.', year:4); { вывод даты рождения }

GotoXY(40,WhereY); { позиционирование курсора на 40 поз-ю текущей строки}

writeln(city); { вывод места рождения }

end;

readln

end.

Соседние файлы в папке Лекции Информатика и программирование