Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uchebnoe_posobie_Programirovanie.docx
Скачиваний:
5
Добавлен:
08.12.2018
Размер:
217.65 Кб
Скачать

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

Чтобы упростить доступ к полям записи, используется оператор WITH (оператор присоединения). Оператор WITH экономит время и чернила.

WITH <список записей> do <оператор>

<список записей> - список переменных типа <запись>

WITH , doзарезервированные слова

Пример.

With a do

begin

name := ‘Петрова’;

sex := wom;

age := 25;

married := false;

end;

Пример.

with group[4] do

name :=’Васильев’;

Один раз указав var типа запись в операторе with, можно работать с именами полей, как с обычным var.

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

Имена var-записей и полей, указанные в заголовке оператора присоединения, можно опустить при обращении к компонентам записи в области действия оператора with. Транслятор автоматически формирует полные имена. Доступ к каждой записи массива записей осуществляется при помощи индекса.

Пример.

Приведенный фрагмент подсчитывает число мужчин в возрасте 40 лет

-----------------------------------

K:=0;

For i:=1 to 20 do

With group [i] do

If (sex=men) and (age=40) then inc(k);

Writeln (‘Число мужчин в группе =’,k:3);

------------------------------------------------------------

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

Пример.

With a, bd do

Begin

name := ‘Акимов’;

sex := men;

Year : =1900;

Month :=8;

Day :=25;

married := false;

end;

Нельзя использовать в операторах ввода-вывода запись целиком.

Writeln (a); –{ ошибка.}

Присваивать записи можно.

A:=b; { значения полей b в a }

7.3. Записи с вариантами (экономия пространства)

Вариантная запись означает, что разные var, хотя они и относятся к одному типу, могут иметь различные структуры. Записи с вариантами состоят из фиксированной и вариантной частей. Вариантная часть формируется с помощью оператора case .. of и может состоять из нескольких вариантов.

Пример. Анкетные данные содержат информацию о человеке, указав фамилию, дату рождения, а также если это мужчина, то сообщить военнообязанный он или нет, а если женщина – указать семейное положение и количество детей.

Type

Sex (men, wom);

People = record

Fam : string [15]; { array [1…15] of char;}

Dr:birthday;

Case mw : sex of

Men : ( voen:boolen; prof : string [20]);

Wom : ( mar:boolen; childs:integer)

End;

Var

M1,w1 : people;

---------------------------------------------------

With w1,dr do

Begin

Fam := ‘Иванова’;

year := 1980;

month := 12;

day :=1;

Mw:=wom;

mar := true;

childs := 2;

End.

Вариантная часть начинается оператором case и следует за общей частью, после ее окончания в записи не могут появляться никакие другие поля, поэтому case не закрывается служебным словом end.

Ключ выбора (или поле признака, дискриминанта, поле тега (этикетка)) обычно указывает вариант. При определении вариантной записи в стандартном Паскале требуется, чтобы все до одного значения ключа выбора были налицо, т.е. каждому значению был сопоставлен определенный вариант. Следовательно, если описать ключ выбора с типом integer , то пришлось бы описать 65535 вариантов (-32768..32767)

В turbo pascal все иначе.

Пример

Case N: integer of

1,12 : (cartons : integer);

13,144 : (crates : integer);

32000 : (truckboad : integer; datpos : array [1..5] of char)

У N всего пять значений.

Планируя размещение вариантной записи в памяти компьютера, компилятор всегда резервирует пространство, достаточное для самого протяженного из возможных вариантов. Таким образом, все варианты как бы накладываются друг на друга. Поскольку ключ выбора в предложении caseof фактически игнорируется компилятором., требование Паскаля к нему:

  • Ключ должен определять некоторый стандартный или предварительно объявленный порядковый тип.

  • Перед тем как использовать один из вариантов записи переменной выбора варианта (ключу выбора) следует присвоить соответствующее значение.

Пример использования массива записи

Задача. Программа вводит информацию о 30 студентах:

- фамилия;

- год рождения;

- год поступления в институт;

- оценки последней сессии.

Результат программы – список отличников.

Program zap;

Type

Student = record

Fam : string [15];

Yr : 1900.. 2000;

Yp : 2000...2007;

Marks : record

progr,mathem, engl, ist :1..5;

s:real

End

End;

Const

N=25;

Type

Var

Group : array [1..n] of student;

Person:student;

I,j:integer;

Begin

Writeln;

For i:=1 to n do

With group[i], marks do

Begin

Writeln (‘Введите данные’, I,’-го студента’);

Write (‘Введите фамилию’); Readln (fam);

Writeln (‘Введите год рождения, год поступления, оценки по программированию, математике, английскому, истории’);

Readln (yr,yp,progr,mathem, engl,ist);

End;

Writeln (‘Список отличников’);

For I :=1 to n do

With group[i], marks do

If (progr=5) and (mathem=5) and (engl=5) and (ist=5)

then writeln (fam,yr :6, yp:6)

end.

Пример:

Вывести данные о студентах, фамилии которых начинаются на букву «С» и средний балл у которых >4,5.

For I :=1 to n do

With group[i], marks do

begin

S:=(progr+mathem+engl+ist)/4;

(fam[1]=’C’) and (s>4.5) then

Writeln(fam, yr:6,yp:6)

End;

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

For I :=1 to n do

With group[i], marks do

S:=(progr+mathem+engl+ist)/4;

For I :=1 to n-1 do

For J :=i+1 to n do

If group[i].marks.s< group[j].marks.s then

Begin

Person:=group[i];

group[i] :=group[j];

group[j]:= Person

end;

{вывод}

For I :=1 to n do

With group[i], marks do

begin

write(fam);

Writeln(yr,’ ‘, yp,’ ‘, progr,’ ‘,mathem,’ ‘ , engl,’ ‘, ist,’ ‘, s:5:2)

End;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]