Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
R8_Зап_12.doc
Скачиваний:
4
Добавлен:
21.12.2018
Размер:
182.27 Кб
Скачать

Особливості обробки у мові Pascal

Більшість мов програмування підтримують тільки деякі операції, що працюють із записом (структурою), як цілісною структурою. Це операції присвоєння одному запису значення іншого однотипного запису і порівняння двох однотипних записів на рівність/нерівність. У тих же випадках, коли такі операції не підтримуються мовою явно (наприклад, мова C), вони можуть виконуватися над окремими полями записів або ж записи можуть копіюватися і порівнюватися як неструктуровані області пам'яті.

У мовах програмуання комбіновані дані, як цілісні структури, можна тільки присвоювати. Всі інші дії виконуються з полями відповідно до їх типу.

Поля, як самостійні програмні об'єкти, поза записом не існують, хоча доступ до них здійснюється саме по іменах. Для звертання до компоненти запису використовується часткова змінна вигляду

ім'я змінної . ім'я поля.

Тут конструкція

. ім'я поля

є селектором компоненти запису (селектором компоненти масиву був її індекс). При цьому операція селектування практично у всіх мовах програмування позначається як “.”.

Так, для запису stud конструкція stud.group буде забезпечувати звертання до поля group.

Якщо запис має ієрархічну структуру, то у звертанні до полів нижнього рівня такого запису вказується весь ланцюжок імен від ідентифікатора змінної типу запису до ідентифікатора необхідного поля (через селектор “.”):

ім'я змінної .ім'я поля 1-го рівня . ... . ім'я поля n-го рівня.

Наприклад,

stud. marks. VT := 5.

Звертання до полів складних структур має, зазвичай, громіздкий вигляд. Для його спрощення служить оператор приєднання WITH, який дозволяє, один раз вказавши ідентифікатор змінної типу запис у своєму заголовку, далі в тілі даного оператора звертатися до полів запису безпосередньо за їх іменами.

БНФ-нотація оператора приєднання:

<оператор приєднання>::= with <список змінних-записів> do <оператор>

<список змінних-записів>::= <змінна-запис> {,<змінна-запис>}

Спрощений формат даного оператора:

with <змінна-запис> do <оператор>.

Наприклад,

with stud do

begin

FIO := 'Сидоров'; s. FIO := 'Сидоров';

group := VL-61; s.group := VL-61;

year := 1980; <=> s.year := 1980;

adres := 'общ. 20'; s.adres := ’общ. 20’;

end;

При вкладеності записів (поле запису - запис) оператор WITH також може бути вкладеним:

with V1 do

with V2 do

. . .

with Vn do <оператор>;

що еквівалентно

with V1, V2, V3, ..., Vn do <оператор>.

 Рівень вкладеності не повинен перевищувати дев'яти.

Наприклад,

with stud, marks do

begin

matem := 4;

VT := 5;

physic:= 5;

end;

Якщо запис є компонентою масиву, то для звернення до конкретного його поля необхідно зпозиціонуватися на елементі масиву, який є записом, та вказати ім'я відповідного поля. Наприклад,

group[i]. FIO:= ‘Петров Іван Іванович’; {FIO конкретного студента}

Щоб ввести або вивести запис, треба ввести (вивести) відповідні поля. Для введення (виведення) масиву записів використовують цикл.

Приклад. Заданий масив записів, що містить відомості про студентів: їх прізвища, дату народження, стать. Визначити студентів-чоловіків, народжених у вказаному році

program record_prim;

type TDate = record

day : 1..31;

month : 1..12;

year : 1980..1989

end;

TStudent = record

fio : string[30];

date : TDate;

pol : (man, woman)

end;

const n = 25;

var group : array [1..n] of TStudent; { група студентів}

d : string[10]; { змінна для введення дати народження}

s : string[4]; { допоміжна змінна }

i, p, k, god, cod : integer; { допоміжні змінні }

{ ------------- процедура введення інформації про студентів групи ------------- }

procedure input;

begin

for i:=1 to n do

with group [i] do

begin

write ('vvod fio: '); readln (fio); { введення ПІБ студента }

write ('vvod pol (man-1,women-0): '); readln (p); { введення признака статі студента }

case p of

0 : pol := woman;

1 : pol := man

end;

write ('vvod date /day.month.year/: '); readln (d); {введення дати народження студента }

with date do

begin

s := copy (d, 1, 2); val (s, p, cod);

day := p; { ініціалізація дня народження студента }

s := copy (d, 4, 2); val (s, p, cod);

month := p; { ініціалізація місяця народження студента }

s :=copy (d, 7, 4); val (s, p, cod);

year := p; { ініціалізація року народження студента }

end

end

end;

{ ------------- основна програма ------------- }

begin

write (input year: '); readln (god); { введення шуканого року }

for i:=1 to n do

with group[i] do

if (date.year = god) and (pol = man) then k := k + 1;

writeln (k, 'man');

readln

end.

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