Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборник заданий по T-Pascal.doc
Скачиваний:
65
Добавлен:
18.03.2015
Размер:
3.03 Mб
Скачать

6.2 Оператор присоединения With ... Do

Обращение к конкретным полям записи связано с некоторыми

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

При совместной обработке ряда полей одной записи длину идентификаторов

можно сократить.

Чтобы упростить доступ к полям записи, используется оператор

присоединения With:

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

Здесь with, do - ключевые слова (с, делать); <переменная> - имя

переменной типа запись, за которым, возможно, следует список вложенных полей; <оператор> - любой оператор Турбо Паскаля.

Оператор присоединения with ... do открывает запись. В поле его действия имена полей записи сокращаются. Например:

with c.bd do month := 9;

Это эквивалентно :

with с do with bd do month := 9;

или c.bd.month := 9.

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

with. Когда обрабатываются все поля записи, оператор with ... do дает

существенную экономию в размере программы.

Задача. Составить программу формирования архива данных по

изданным книгам. Данные включают: автора, название, год издания, город, где издана, и цену книги.

Предположим, что в архив необходимо занести данные о 50 книгах. Данные будут представлять собой массив записей. Каждая запись состоит из:

1) фамилии И. О. автора (author);

2) названия книги (title);

3) названия города, в котором книга выпущена, (city);

4) года издания (year);

5) цены (cost).

Данные author, title, city - символьного типа. Year - может быть переменной интервального типа. Цена (cost) должна быть переменной вещественного типа. Объявление нового типа данных entry как записного будет выглядеть

следующим образом:

entry = record

author, title, city : string;

year : 1..9999;

cost: real;

end;

Далее следует объявить массив из 50 элементов, име­ющих тип entry. Ввод элемен­тов записи (рис. 16) организу­ем в цикле, причем окончание цикла зафиксируем вспомога­тельной переменной ch. Перед вводом содержимого очеред­ной записи сделаем запрос на продолжение пополнения архи­ва.

Для ввода компонентов за­писи используем оператор readln.

Компоненты записи в программе имеют составные

имена: m[i]. author, m[i]. title, m[i].city, m[i].year, m[i].cost.

Программа:

program archives;

uses crt;

label 10;

type

entry = record {Выходные данные по книге} author, title, city : string;

year : 1..9999;

cost : real;

end;

var m : array[1..50] of entry;

{Архив не превышает 50 книг}

{Массив, элементами которого являются записи}

i: integer;

ch : char;

begin i := 0;

{Блок формирования архива данных по книгам}

writein ('Пополняешь архив? - Да - [Y]');

ch := readkey;

if upcase(ch) = 'Y' then repeat i :=i+1;

writeln ('Автор книги '); readln(m[i].author);

writeln ('Название книги '); readln(m[i].title);

writeln ('Город издания '); readln(m[i].city);

writeln ('Год издания '); readln(m[i].year);

writeln ('Цена книги '); readtn(m[i].cost);

writeln ('Пополняешь архив? - Да - [Y]');

ch := readkey

until upcase(ch) <> 'Y'

else

begin write ('Вы передумали? До cвидания!');

goto 10 end;

repeat until keypressed;

10:end.

Задача. Усложним предыдущую задачу. Составить программу подборки книг по указанному автору из сформированного массива записей.

Для формирования архива используем предыдущую программу. Введем переменную символьного типа ss - фамилию автора, список книг которого необходимо вывести. Размер архива запомним в переменной k. Для более компактного представления используемых переменных, воспользуемся оператором присоединения with ... do. При этом имена полей записи могут фигурировать как имена обычных переменных. Для возможности вывода нескольких списков организуем внешний цикл с признаком окончания ch = ‘Y'.

Программа:

program archives2;

uses crt;

label 10;

type

entry = record {Выходные данные по книге}

author, title, city : string;

year : 1..9999;

cost : real;

end;

var m : array[1..50] of entry;

{Архив не превышает 50 книг}

{Массив, элементами которого являются записи}

i, i, k : integer;

ss : string; {Фамилия для поиска} ch : char;

begin i :=0;

{Блок формирования архива данных по книгам}

writein ('Пополняешь архив? - Да - [Y]');

ch := readkey;

if upcase(ch) = 'Y' then

repeat

i := i+1;

with m[i] do begin

writeln('Автор книги');readln(author);

writeln('Название книги'); readln(title);

writeIn(‘ Город издания'); readln(city);

writeln('Год издания '); readln(year);

writeln('Цена книги '); readln(cost);

end;

writein ('Пополняешь архив? - Да - [Y]);

ch := readkey

until upcase(ch) <> 'Y'

else

begin

write ('Вы передумали? До свидания!');

goto 10;

end;

k:=i;

{Блок подборки всех книг по указанному автору}

repeat writeln('Укажите фамилию автора'); readln(ss);

writeln('Cnиcoк книг, автор которых ', ss : 15);

for i := 1 to k do with m[i] do begin if ss = author then

begin

writeln(title);

writeln(‘Город '.city);

writeln(‘Год издания '.year);

writeln('Цена ",cost:8:2);

writein end end;

writeln( "Нужно еще выдавать авторский список? - Да -[Y]');

ch := readkey;

until upcase(ch) <> 'Y';

repeat until keypressed;

end.

После объявления в программе типа «запись» к каждому ее полю можно обратиться, указав сначала идентификатор переменной-записи, а затем через точку – имя поля.

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

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

Для облегчения работы с полями записей в языке вводится оператор присоединения:

WITH Имя Переменной _Записи DO Оператор;

Внутри оператора (он может быть и составным) обращение к полям записи производится без указания имени самой (полной) переменной.

program lec9_0;

Type complex=Record

re, im : Real

End;

Var x,y,u,v,v1: complex;

BEGIN

{ввод исходных данных}

write('x.re='); readln(x.re);

write('x.im='); readln(x.im);

write('y.re='); readln(y.re);

write('y.im='); readln(y.im);

{вычисление разности}

u.re:=x.re-y.re;

u.im:=x.im-y.im;

{вывод разности}

writeln('x-y=',u.re:6:2,'+',u.im:6:2,'*i');

{вычисление произведения}

v.re:=x.re*y.re-x.im*y.im;

v.im:=x.re*y.im+x.im*y.re;

{вывод произведения}

writeln('x*y=',v.re:6:2,'+',v.im:6:2,'*i');

{присвоения полной переменной}

v1:=v;

writeln('v1=',v1.re:6:2,'+',v1.im:6:2,'*i');

END.

Записи могут быть вложенными. Если поле В записи А есть в свою очередь запись, то по отношению к этому полю А.В есть полная переменная: если в этой записи есть поле С, то для ссылки на это поле используют тот же прием: А.В.С. Если же некоторое поле С является массивом, то для ссылки на компоненты этого массива используется переменная с индексами А.В.С[i].

Если же элементами массива являются записи, то обозначение должно быть следующим: R[i].Поле Записи.