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

Практична робота №7

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

Мета роботи: навчитись створювати прості бази даних за допомогою записів та записів з варіантами.

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

1 Записи

Запис (record) – це структурований тип даних, призначений для обробки даних, що складаються з полів даних різних типів, та збереження їх в оперативній пам'яті. У мові Turbo Pascal розрізняють фіксовані (звичайні) та варіантні записи. Запис описується в розділі типів (можна і в розділі змінних) за допомогою наступної конструкції:

type <ім'я запису>=record

<список імен полів 1> <тип полів 1>;

<список імен полів n> <тип полів 1>;

end;

Доступ до певного поля запису здійснюється за допомогою кваліфікуємих (уточнених) ідентифікаторів (складені імена), в яких вказується весь ланцюг імен від ідентифікатора змінного типу «запис» до ідентифікатора потрібного поля. Імена полів кваліфікує мого ідентифікатора розділяють точками:

<ім'я запису>.<ім'я поля>

Складені імена при великих обробках полів одного запису використовувати незручно.

Це приводить до громіздкого виду програми. У таких випадках використовують оператор приєднання with. Він дозволяє використовувати у відповідному місці програми тільки імена полів запису.

Загальний вид оператора наступний:

with <ім'я змінної типу запис> do <команда>

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

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

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

Розходження може стосуватися як числа компонентів, так і їхніх типів. Запис може містити лише одну варіантну частину. Використання варіантів полів запису веде до мінімізації пам'яті.

Загальний вид запису з варіантами наступний:

type <ім'я запису> record

case <поле вибору> <ім'я типу> of

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

end;

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

Тип поля вибору повинен бути впорядкованим, причому сам тип ніяк не впливає ні на кількість подальших варіантних нулів, ні, навіть, на характер констант вибору.

Об'єднання всіх списків констант вибору повинне збігатися з кількістю констант в описі поля вибору.

Варіантна частина може бути вкладеною тобто вона може сама містити варіанти.

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

Приклад:

Ввести масив записів кожен з яких містить інформацію про прізвище, адресу й номер телефону. Скласти програму, що сортує ці дані за алфавітом по прізвищах та знаходить у масиві введений з клавіатури запис.

program zapisi;

uses crt;

type anketa=record {тип запису}

FIO:string;

Adress:string;

Phone:string;

end;

var

Mas:array[1..10] of anketa {масив запису}

I,j,k,:integer; {параметри циклів}

S:char; {змінна для закінчення введення даних}

Rec:anketa; {запис для пошуку}

procedure vvod;

begin

i:=0; {лічильник кількості записів}

reapit {цикл введення записів у масив запису}

inc[i];

with mas[1] do

begin

write('FIO'); readln(FIO);

write('adress'); readln(adress);

write('tel'); readln(phone);

end;

writeln('continue? (Y/N)');

s:=readkey; {введення із клавіатури відповіді (Y/N)}

until upcase(s)='N'; {при виконанні умови виходить із циклу}

end;

{виведення масиву записів}

procedure vyvod;

begin

writeln(' ---і- --telephone ---і ---і-');

for j:=1 to do {для кожного запису вводяться прізвище, адреса й телефон}

begin

with mas[j] do

begin

write(' ',FIO);

write(' ',adress);

write(' ',phone);

end;

writeln;

end;

end;

{сортування масиву за прізвищем}

procedure sort;

vartmp:anketa; {тимчасова змінна для переборів елементів масиву}

begin

for j:=1 to i-1 do {фіксація елементу масиву}

for k:=j+1 to i do {перегляд інших елементів масиву}

begin

if mas[j].fio>mas[k].fio then {якщо елементи не впорядковані}

begin

tmp:=mas[j]; {перестановка елементів масива}

mas[j]:=mas[k];

mas[k]:=tmp;

end;

end;

end;

{введення запису для пошуку в масиві}

procedure search;

var flag:boolean; {змінна для визначення факту відсутності даних}

begin

writeln('Input record for serch:fio,Adress,tel');

readln(rec fio);

readln(rec adress);

readln(rec phone);

for j:=to i do {пошук запису за введеним значенням}

with mas[j] do

begin

if (fio=rec.fio) and (adress=rec.adress) and (phone=rec.phone)

{якщо запису збігаються}

then begin

flag:=true; {флаг позначення знайденого запису}

writeln (record found:'rec.fio,' 'rec.adress,' 'rec.phone,');

break; {переривання циклу коли знайдений запис}

end;

else flag:=false; {флаг позначає відсутність запису}

end;

if not flag then writeln ('record not found');

end;

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

begin

clrscr;

writeln('rezults of program');

vvod; {введення масиву запису}

writeln('array of input”s records '); {виведення масиву записів}

sort; {сортування}

writeln('array of records after sort');

vyvod; {виведення відсортованого масиву}

search; {пошук необхідного запису}

readkey;

end.

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