Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Програмування.doc
Скачиваний:
7
Добавлен:
19.11.2019
Размер:
742.91 Кб
Скачать

2.3. Записи з варіантами

2.3.1. Теоретичні відомості

Запис з варіантами - це запис, що має довільне число варіантів структур. Вони складаються з необов'язково фіксованої та варіантної частин. Варіантна частина формується за допомогою оператора CASE, який задає особливе поле ознаки, що визначає, який варіант на даний момент буде активізованим. Значенням ознаки в кожний поточний момент виконання програми повинна бути константа, що задає варіант запису і зветься константою вибору.

Формат. TYPE ім'я_типу_запис =RECORD

CASE <поле ознаки>:<Ім'я_типу> OF

<константа вибору 1>:(<поле...:гип>;…);

……………….

<константа вибору М>:(<поле...:тип>;...);

END;

var iм'я_змiнної: Ім'я_типу_запис;

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

Приклад запису з фіксованою та варіантною частинами:

TYPE ZAP=RECORD (тип даних - запис)

Number:byte; {фіксована частина}

Articul:integer;

CASE (варіантна частина}

Flag:boolean OF ( поле ознаки варіантів)

true: (price1:integer); (варіант 1: true- константа вибору)

false: (price2:real); (варіант 2: false - константа вибору)

END;

VAR tovar:array(1..10] of zap; (масив записів )

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

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

for і:=1 to 10 do

with tovar[j] do

case flag of ( вибір варіантів запису}

true: writeln('Номep: ',number,' артикул ',articul,' ціна ',ргісе1);

false : wrіteln('фірмa: ',firma,' кількість товару: ', kol);

end;

2.3.2. Приклад програми

Умова задачі: Створити масив записів із структурою

Каталог

Книги

Журнали

Газети

Автор

Назва

Ціна

Назва

Рік

Автор

Назва

Дата

Автор

Стаття

1) Визначити кількість робіт кожного автора.

2) Визначити журнали, що видавались за вказаний рік

uses crt;

type zap=record

author,title:string;

case tag:Integer of

1:(price:Integer);

2:(year:Integer;journal:string);

3:(date:string;news:string);

end;

var katalog:array[1..20]of zap;

i,j,k,l:byte;

ch:char;

procedure vvod;

begin clrscr;

repeat

i:=i+1;

with katalog[i] do

begin

write('lnput type of editions: 1-book,2-journal,3-newspaper');

readln(tag);

case tag of

1:begin

write('author of book: '); readln(author);

write('title of book: '); readln(title);

write('price of book: '); readln(price);

end;

2:begin

write('author of article In journal:'); readln(author);

write('tltle of article:'); readln(title);

write('name of journal: '); readln(journal);

write('year :'); readln(year);

end;

3:begin

write('author of article In newspaper: '); readln(author);

write('tltle of article In newspaper: '); readln(title);

write('name of newspaper: '); readln(news);

write('date :'); readln(date);

end;

end;

end;

writeln('continue?Y/N');

ch:=readkey;

until ch=upcase('N');

end;

procedure vyvod;

{var tag:integer;}

begin

clrscr;

for j:=1 to i do

with katalog[j] do

case tag of

1: begin

writeln('books: ',author,' ',title,' ',price); readln;

end;

2:begin

writeln('|ournals:',journal,' ',year,' ',author,' ',title); readln;

end;

3:begin

writeln('newspaper: ',news,' ',date,' ',author,' ',title); readln;

end;

end;

end;

procedure task1;

var kol:integer;

fl:boolean;

begin clrscr;

for j:=1 to I do begin

kol:=1;

fl:=false;

for k:=1 to j-1 do

if katalog[j].author=katalog[k].author then fl:=true;

If fl=false then begin

for l:=j+1 to i do

if katalog[l].author=katalog[j].author then kol:=kol+1;

writeln('author',katalog[i].author,'has works= ',kol);

end;

end;

readln;

end;

procedure task2;

var tmp:integer;

flag:boolean;

begin clrscr;

writeln('lnput journal"s edition year');

readln(tmp);

clrscr;

flag:=false;

writeln('journals In ',tmp, ' year');

for j:=1 to I do begin

if katalog[j].year=tmp then

begin

writeln(katalog[j].journal);flag:=true;

end;

end;

if flag=false then

writeln('journals not exist In katalog In year ',Tmp);

readln;

end;

procedure endprog;

begin clrscr;

gotoxy(15,10); writeln('Do you want to exit from program? y/n');

ch:=readkey; If ch='y' then halt(0);

end;

procedure menu;

begin

repeat

cLrscr;

gotoxy(21,3); writeln('MENU');

gotoxy(15,5); writeln('1. Input database');

gotoxy(15,7); writeln('2. Show database');

gotoxy(15,9); writeln('3. Number of author"s works .');

gotoxy(15,11); writeln('4. Journals In current year.');

gotoxy(15,13); writeln('5. Exit');

ch:=readkey;

case ch of

'1':vvod;

'2':vyvod;

'3':task1;

'4':task2;

'5':endprog;

end;

until ch='5';

end;

begin

clrscr;

i:=0;

menu;

end.