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

Лабораторна робота 3

Тема: Обробка структурованих даних.

Використання зовнiшнiх файлів

Теоретичні відомості щодо виконання лабораторної роботи

Структурований тип даних. Записи дозволяють об’єднати під одним іменем дані різних типів. Такі дані можуть бути подані таблицями, в яких кожний рядок може містити елементи різних типів.

Запис - це складний тип даних, що складається з фіксованого числа компонент одного або кількох типів. Компоненти запису називаються полями. Кількість полів не обмежена, порядок їх проходження будь-який. Запис може бути визначений у розділах Type або Var й починатися словом Record і закінчуватися словом End, між якими задаються поля (імена полів - ідентифікатор поля), кожне з яких має свій тип (тип компоненти). Найчастіше (і це рекомендується) опис запису починати з визначення типу запису (тобто через розділ Type). Формати типу запису:

Type

<ім’я типу> = Record

<ідентифікатор поля> : <тип компоненти>;

……………………………………………..

<ідентифікатор поля> : <тип компоненти>;

End;

Наприклад, для інформаційно-довідкової таблиці:

ВІДОМОСТІ ПРО РЕЗУЛЬТАТИ ІСПИТІВ

Ф.І.П

Номер залікової

Оцінки

книжки

Матем-ка

Фізика

Прогр-ня

Іванов П.П

99000

5

4

5

Петров І.І.

99001

4

3

5

У найпростішому випадку дані таблиці можуть бути описані так:

Type

Student = Record

Numb : 99000..99500;

FIO : String[40]; {прізвище}

Estimate : Array[1..3] of 2..5; {оцінки}

End;

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

Type

Data = Record {запис дата народження}

Year: 1970..2000; {рік}

Month : 1..12; {місяць}

Day: 1..31; {день}

End;

Type

Student = Record

Numb : 99000..99500;

FIO : String[40]; {прізвище}

Age : Data; {посилання на тип Data}

Estimate : Array[1..3] of 2..5; {оцінки}

End;

Змінні типу "запис" описуються звичайним способом, наприклад:

Var

Poll : Student; {Poll - анкета}

Записи можна об’єднувати в масив, наприклад:

Var

Group : Array[1..30] of Student;

Після визначення імена полів використовуються як імена змінних, що входять у склад запису. Звернення до будь-якого поля здійснюється з допомогою складених імен, що включають у себе ім’я запису та ім’я його поля (компонента), розділених точкою:

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

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

П р и к л а д

Poll.FIO:='Іванов П.П';

Group [1].FIO:='Іванов П.П.';

Якщо, поле в свою чергу, запис, то складене ім’я продовжується, наприклад,

Poll.Data.Year:= 1983;

Group [1].Data.Year:= 1983;

В тому випадку, коли поле - масив, є можливість звернутися до його окремого елемента, наприклад,

Poll.Estimate[2]:=4;

Group [1].Estimate[2]:=4;

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

Для спрощення роботи з елементами запису зручно використовувати оператор приєднання With. Один раз вказавши змінну типу запис в операторі With, можна працювати з іменами полів як із звичайними змінними. Формат оператора:

With <ім’я запису> do <оператор>;

П р и к л а д

……………….

With Poll do

Begin

ReadLn(Numb, FIO);

For i:=1 to 3 do ReadLn(Estimate[i]);

End;

……………….

With Poll do

WriteLn(Numb, ' ':2, FIO, ' ':2, Estimate[1]:3, Estimate[2]:3, Estimate[3]:3);

………………..

або

…………………

For i:=1 to 30 do

With Poll do

Begin

ReadLn(Numb, FIO);

For i:=1 to 3 do ReadLn(Estimate[i]);

End;

……………….

For i:=1 to 30 do

With Poll do

WriteLn(Numb, ' ':2, FIO, ' ':2,Estimate[1]:3,Estimate[2]:3,

Estimate[3]:3);

………………..

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

П р и к л а д. Добавити в інформаційно-довідкову систему Student, інформацію про місце проживання студента: гуртожиток - один варіант інформаційних полів, місцевий - інший.

Type

Student = Record {загальні дані}

{гуртожиток, місцевий}

Type Residence = (Hostel, Town);

Case flag: Residence of

Hostel:(City,Street:string[30];House, Numb:Integer); {варіант 1}

Town:(Avenu:string[30];Bilding,Room:Integer); {варіант 2}

End;{Student}

Var

Poll : Student;

Group: Array[1..30] of Student;

При введенні такого запису треба спочатку ввести значення ознаки, проаналізувати її, а потім вводити одну чи іншу групу полів.

У загальному випадку виділяють два види задач: обробка поодиноких записів та обробка масивів записів. Перший тип задач зустрічається, наприклад, коли вся інформація зберігається в файлі й треба одержати яку-небудь довідку, наприклад, скільки студентів у групі немісцевих. Для розв’язання такої задачі достатньо читати з файлу запис за записом і аналізувати відповідне поле.

Масив записів вживають у тих випадках (хоча це не є економічне використання пам’яті), коли для розв’язання задачі треба мати в пам’яті всі записи, наприклад, при сортуванні записів за якою-небудь ознакою (середній бал успішності тощо).

П р и к л а д

Program GroupStudent;

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

Const n=30;

Type

Student=Record

FIO:String[30];

Estimate:Array[1..3] of 2..5; {оцінки}

Midd:Real; {середній бал}

End;

List=Array[1..n] of Student; {тип записів}

Var

Group:List; {масив записів}

{----------------------------------------------------------------------------------------}

Procedure Input;

{процедура вводу всіх записів}

Var i:Byte; {змінна циклу}

Begin

WriteLn('Введіть інформацію щодо кожного студента');

Writeln;

For i:=1 to n do

With Group [i] do

Begin

Write('Прізвище: ':15);ReadLn(FIO);

Write('Оцінки Мат-ка: ');ReadLn(Estimate[1]);

Write('Фізика : ':15);ReadLn(Estimate[2]);

Write('Прогр.: ':15);ReadLn(Estimate[3]);

End;

End;{Input}

{----------------------------------------------------------------------------------------}

Procedure Middle;

{процедура обчислення середнього балу}

Var i,j,s:Byte;

Begin

For i:=1 to n do

With Group [i] do

Begin

s:=0; {початкове значення суми}

For j:=1 to 3 do s:=s+Estimate[j];

Midd:=s/3

End;

End;{Middle}

{----------------------------------------------------------------------------------------}

{тут може міститися процедура SortZap з наступного прикладу}

{----------------------------------------------------------------------------------------}

Procedure Out;

{процедура виводу всіх записів}

Var i:Byte;

Begin

WriteLn('Список студентів, їх оцінки та середній бал');

WriteLn;

For i:=1 to n do With Group [i] do

WriteLn(FIO:20,' ':2,Estimate[1]:2,' ':2,

Estimate[2]:2,' ':2,Estimate[3]:2,' ':2,Midd:4:2);

End;{Out}

Begin {головна програма}

Input;

Middle;

WriteLn('----------------------------------------------------');

Out; Readln;

End.

У програмі GroupStudent організовано введення інформації (процедура Input), яка є масивом записів, обчислення середнього балу кожного студента (процедура Middle) та вивід повної інформації (процедура Out).

П р и к л а д

Procedure SortZap(Numb:Byte;Var MasZap:List);

{процедура сортування масиву записів за алфавітом

(ознака - прізвище)}

Var

Vrem:Student; {змінна типу запис}

i,j:Byte;

Begin

{сортування за алфавітом}

For i:=1 to Numb do

For j:=1 to Numb-i do

If MasZap[j].FIO>MasZap[j+1].FIO Then

Begin

Vrem:=MasZap[j];

MasZap[j]:=MasZap[j+1];MasZap[j+1]:=Vrem

End;

End;{SortZap}

Ця процедура в головній програмі може бути викликана так: SortZap(n,Group);.

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

Program GroupStudent_2;

{Нова версія програми GroupStudent з розширеними можливостями,

а саме:

  • дані, що введені з клавіатури, зберігаються у файлі NameFileIn;

  • дані, що зберігаються у файлі, можна зчитувати;

  • за зчитаними даними формується вихідна форма - файл NameFileOut.}

Const n=30;

NameFileIn='VT-11.DAT';

NameFileOut='VT-11.VED';

Type

Student=Record

FIO:String[20];

Estimate:Array[1..3] of 2..5;

Midd:Real; {середній бал}

End;

List=Array[1..n] of Student; {тип записів}

Var

Group:List; {масив записів}

f:Text;

Procedure Input(NFile:String);

{Процедура вводу даних з клавіатури та їх запис у файл}

Var i:Byte;

Begin

Assign(f,NFile);Rewrite(f);

WriteLn('Введіть інформацію щодо кожного студента');Writeln;

For i:=1 to n do

With Group[i] do

Begin

{введення даних з клавіатури}

Write('Прізвище: ':15); ReadLn(FIO);

Write('Оцінки Мат-ка: ');ReadLn(Estimate[1]);

Write('Фізика : ':15); ReadLn(Estimate[2]);

Write('Прогр.: ':15); ReadLn(Estimate[3]);

{їх запис у файл}

WriteLn(f,FIO:20,' ',Estimate[1],' ',Estimate[2],' ',Estimate[3])

End;

Close(f)

End;{Input}

{----------------------------------------------------------------------------------------}

Procedure ReadFromFile(NFile:String);

{Процедура, що зчитує інформацію з файлу

NFile та містить її у масив записів }

Var n,k:Byte;

Begin

Assign(f,NFile);

{$I-} Reset(f); {$I+}

If IOResult<>0 Then

Begin

WriteLn('Проблеми з файлом '+NFile+'!');

WriteLn('Робота програми припинена');

Halt {завершити роботу програми}

End

Else

Begin

n:=0;

While Not Eof(f) do

Begin

n:=n+1;

With Group[n] do

Begin

ReadLn(f,FIO,Estimate[1],Estimate[2],Estimate[3]);

{видалення пробілів, що передують прізвищу}

While Pos(' ',FIO)<>0 do Delete(FIO,1,Pos(' ',FIO));

End;

End;{While}

End;{Else}

Close(f)

End;{ReadFromFile}

{----------------------------------------------------------------------------------------}

Procedure Middle;

{Процедура Middle з програми GroupStudent записується тут без змін}

{----------------------------------------------------------------------------------------}

Procedure SortZap(Numb:Byte;Var MasZap:List);

{Процедура SortZap з програми GroupStudent записується тут без змін}

{----------------------------------------------------------------------------------------}

Function Answer(str:String):Boolean;

{діалогова функція, що надає можливість виводу вихідної форми; вибір здійснюється натисненням символів: 'd','D' - на екран, 'f','F' - у файл}

Var ch:Char;

Begin

Repeat

Write(str:40);ReadLn(ch);

Case ch of

'd', 'D': Answer:=True;

'f', 'F': Answer:=False

Else WriteLn('Повторити ввід!');

End;

Until ch in ['d','D','f','F']

End;{Answer}

{----------------------------------------------------------------------------------------}

Procedure Out(NFile:String);

{Процедура формування вихідної форми та вивід її

або на екран (NFile='') або у файл (NFile=NameFileIn) }

Var i:Byte;

Begin

Assign(f,NFile);Rewrite(f);

WriteLn(f,'Список студентів їх оцінки та середный бал');

WriteLn(f);

WriteLn(f,'');

WriteLn(f,'N Ф.І.П.  М.  Ф.  П. Ср.бал');

WriteLn(f,'');

For i:=1 to n do

With Group[i] do

WriteLn(f,'',i:3,'',FIO,' ':20-Length(FIO),

'',Estimate[1]:3,'',Estimate[2]:3,'',Estimate[3]:3,'',Midd:6:2,'');

WriteLn(f,'');

Close(f)

End;{Out}

Begin {головна програма}

{Input(NameFileIn);} {включити для створення файла}

ReadFromFile(NameFileIn); {виключити при створенні файла}

Middle; SortZap(n,Group);

WriteLn('-----------------------------------------');

If Answer('Вивід на екран (d/D) у файл (f/F)?')

Then Out('')

Else Out(NameFileOut);

Readln;

End.

У програмі GroupStudent_2 демонструються різні (найпростіші) можливості щодо обробки інформації, що зберігається у текстовому файлі. Щоб організувати роботу з файлами, доцільно розглянуті процедури (та подібні до них) об’єднати за допомогою керуючої програми, передбачивши в ній меню для вибору потрібних режимів роботи. Крім того, у наведеній програмі ім’я файлу зафіксовано в програмі, а це іноді небажано. У таких випадках програма має запитувати ім’я файлу в користувача. У відповідь на запит ім’я вводиться з клавіатури.

Щодо коригування файлу, то тут можливі різні види:

  • розширення файлу за рахунок добавлення нових компонентів;

  • повна заміна вмісту файлу або довільного компонента;

  • коригування полів окремих записів.

Ці дії застосовуються до файлів послідовного і довільного доступу.

Файли довільного доступу використовуються в процесі розв’язування задач, які вимагають оперативного доступу до інформації, що зберігається. Послідовний доступ у цих випадках неефективний.

Файл із довільним доступом можна організувати різними способами:

  1. Створити послідовний файл, але звертатися до його компонентів за порядковим номером.

  2. Створити файл фіктивних записів, а потім завантажити його за ключем фактичними даними, використовуючи процедуру Seek.

Перший спосіб проводиться за схемою, яка вказана раніше. Нижче наведено приклад нової (простої) версії програми GroupStudent_3, в якій реалізовано другий спосіб роботи з файлами довільного доступу. Програма дозволяє створити файл, що складається з фіксованого числа записів, значення полів яких мають фіктивний характер (нулі і пробіли). Формат компонентів такий самий, як і в програмі GroupStudent_2, за винятком нового поля Num, та типу елементів поля Estimate, що пов’язано з введенням фіктивних значень. Крім того, змінено тип файлової змінної f.

П р и к л а д

Program GroupStudent_3;

{приклад роботи з типізованим файлом}

Const n=30; {кількість записів у файлі}

Type

Student=Record

Num:Integer; {порядковий номер}

FIO:String[20];

Estimate:Array[1..3] of 0..5;

Midd:Real; {середній бал}

End;

Var

Group:Student;

f:File of Student;

NameFile: String[15];

ans:Integer;

{----------------------------------------------------------------------------------------}

Procedure Creation;

{Процедура створення фіктивних записів}

Var i: Integer;

Begin

Write('Задайте ім’я файлу: ');ReadLn(NameFile);

Assign(f, NameFile);Rewrite(f);

With Group do

Begin

For i:=1 to n do

Begin

Num:=i;FIO:=' ';

Estimate[1]:=0;Estimate[2]:=0;Estimate[3]:=0;

Write(f,Group);

End;

WriteLn('Створення ',n,' фіктивних записів завершено!')

End;

Close(f)

End;{Creation}

{----------------------------------------------------------------------------------------}

Procedure Input;

{Процедура вводу з клавіатури всіх

фактичних записів із заданими номерами}

Var i,k,m:Integer;

Begin

Write('Укажіть ім’я файлу: ');ReadLn(NameFile);

Assign(f,NameFile);

{$I-} Reset(f); {$I+}

If IOResult<>0 Then

Begin

WriteLn('Проблеми з файлом '+NameFile+'!');

WriteLn('Робота програми припинена');

Halt

End

Else

Begin

Write('Скільки записів будете вводити?: ');ReadLn(k);

With Group do

For i:=1 to k do

Begin

Write('Номер запису: ':15);ReadLn(Num);

m:=Num;

Write('ФИП: ':15);ReadLn(FIO);

Write('Оцінки Мат-ка: ');ReadLn(Estimate[1]);

Write('Фізика: ':15);ReadLn(Estimate[2]);

Write('Програм.: ':15);ReadLn(Estimate[3]);

Seek(f,m-1);

Write(f,Group);

End;

End;

Close(f)

End;{Input}

{----------------------------------------------------------------------------------------}

Procedure Correction;

{Процедура коригування окремих записів}

Var

NewFIO:String[20];

NewEstimate:Array[1..3] of 2..5;

i,k,m:Integer;

Begin

WriteLn('КОРИГУВАННЯ ЗАПИСІВ');

Write('Укажіть ім’я файлу: ');ReadLn(NameFile);

Assign(f,NameFile);

{$I-} Reset(f); {$I+}

If IOResult<>0 Then

Begin

WriteLn('Проблеми з файлом '+NameFile+'!');

WriteLn('Робота програми припинена');

Halt

End

Else

Begin

Write('Скільки записів будете коректувати?: ');ReadLn(k);

With Group do

For i:=1 to k do

Begin

Write('Номер запису, що коригується: ');ReadLn(m);

Write('Нова Ф.І.П: ':15);ReadLn(NewFIO);

Write('Нові оцінки: Мат-ка: ');ReadLn(NewEstimate[1]);

Write('Фізика: ':15);ReadLn(NewEstimate[2]);

Write('Програм.: ':15);ReadLn(NewEstimate[3]);

Seek(f,m-1);

Read(f,Group);

FIO:=NewFIO;

Estimate[1]:=NewEstimate[1]; Estimate[2]:=NewEstimate[2];

Estimate[3]:=NewEstimate[3];

Seek(f,m-1);

Write(f,Group);

End;

End;

Close(f)

End;{Correction}

Begin {головна програма}

Creation;

Input;

Correction;

Readln;

End.

Пояснення щодо організації довільного доступу до компонентів файлу (процедура Creation). Щоб організувати, використовують процедуру Seek. Звичайно довільний доступ організовують за ключем, значення якого дорівнює порядковому номеру потрібного компонента у файлі. Ключ повинен мати цілочислове значення, що не перевищує числа компонентів. У цьому разі порядок дій такий:

  • у відповідність файловій змінній поставити ім’я зовнішнього файлу (процедура Assign);

  • відкрити файл (процедура Reset) і запитати ключ;

  • перевести покажчик файлу за ключем до потрібного компонента (процедура Seek);

  • зчитати потрібний компонент (процедура Read);

  • закрити файл (процедура Close).

Пояснення щодо корегування файлу (процедура Correction). Корегування файлу полягає в зміні значень полів компонентів у цілому або частково чи в розширені файлу. Щоб скоригувати поля компонентів файлу, потрібно:

  • у відповідність файловій змінній поставити ім’я зовнішнього файлу (процедура Assign);

  • відкрити файл (процедура Reset), що корегується;

  • перевести покажчик файлу за ключем до потрібного компонента (процедура Seek);

  • зчитати компонент, що коригується (процедура Read);

  • скоригувати потрібні поля;

  • повторити процедуру переведення покажчика файлу (це потрібно тому, що після зчитування запису покажчик файлу переміститься до наступного компонента. Тому, щоб скоригований запис зберегти на старому місці, покажчик потрібно перемістити на один компонент назад);

  • записати скоригований компонент (процедура Write);

  • закрити файл (процедура Close).

Контрольні питання

  1. Що являє собою тип даних запис?

  2. Як здійснюється опис записів у програмі? Його особливості?

  3. Що являє собою запис з варіантом?

  4. Як здійснити доступ до полів запису? Складне ім’я. Оператор приєднання With.

  5. Особливості обробки інформації, що зберігається у файлі, компонентами якого є записи?

Завдання та пояснення щодо виконання до лабораторної роботи

Розробити схему, опис алгоритму і програму для обробки інформації відповідно до варіанту завдання.

Програма повинна містити:

  1. Підпрограми для:

а) виводу шапки таблиці;

б) виводу даних одного рядка таблиці;

в) вводу і виводу масиву записів й визначення суми значень елементів одного стовпця масиву записів;

г) пошуку (або сортування) і виводу потрібних компонентів масиву записів (рядків таблиці) згідно з варіантом пошуку; можливі варіанти пошуку:

  • пошук за заданою пошуковою ознакою;

  • універсальний пошук: за будь-яким сполученням декількох заданих пошукових ознак.

  1. Фільтрацію рядкових даних за допомогою підпрограми для знищення пробілів з початку або кінця рядка.

  2. Корегування компонентів запису.

Кожне завдання може бути виконано у два етапи: перший - без використання зовнішніх файлів; другий (є розвитком першого) - з використанням зовнішніх файлів. При використанні зовнішніх файлів вхідна інформація може зберігатися як у текстовому, так і в типізованому файлах, а вихідна (результати або вихідна форма) у текстовому.

Варіанти завдань

              1. Літаки. Можливі назви полів: назва, прізвище конструктора, рік випуску, кількість крісел, вантажопідіймальність (т).

              2. Розрахунок руху. Можливі назви полів: назва повітряної лінії, тип літака, кількість рейсів, наліт (тис.км), пасажирообіг.

              3. Перевози. Можливі назви полів: тип літака, номер борту, кількість рейсів, наліт у годинах, наліт (тис.км).

              4. Розклад. Можливі назви полів: номер рейсу, назва рейсу, тип літака, вартість білета, довжина лінії.

              5. Споруди аеропорту. Можливі назви полів: назва, площа, етажність, рік споруди, вартість (грн).

              6. Ремонт аеродромних споруд. Можливі назви полів: назва, шифр, тип ремонту, вартість ремонту, підрядчики.

              7. Каси авіабілетів. Можливі назви полів: номер каси, П.І.П. касира, кількість проданих білетів, сумарна виручка.

              8. Характеристики ПК. Можливі назви полів: тип процесора, тактова частота, ємність ОП (Мбайт), ємність ЖМД (Гбай), тип монітору.

              9. Міста. Можливі назви полів: назва, кількість жителів, площа (кв.м.), рік основи, кількість вузів.

              10. Автобусні рейси. Можливі назви полів: номер, маршрут, протяжність (км), кількість автобусів.

              11. Приміські автобусні рейси. Можливі назви полів: номер (якщо є), маршрут, розклад, основні зупинки (якщо є), протяжність (км).

              12. Легкові автомобілі. Можливі назви полів: марка, номер, колір, рік виготовлення, вартість.

              13. Продаж програмних продуктів. Можливі назви полів: назва, фірма-виробник, вартість ($), курс залежно від курсу обчислюється значення поля вартість у грн., кількість у належності.

              14. Продаж програмних оргтехніки. Можливі назви полів: назва, фірма-виробник, вартість ($), курс залежно від курсу обчислюється значення поля вартість у грн., кількість на складі.

              15. Абонентна плата за телефон. Можливі назви полів: П.І.П. абонента, телефон, рік встановлення, плата.

              16. Дитячі садки. Можливі назви полів: назва, номер, кількість робітників, кількість дітей, район міста, плата за місяць.

              17. Співробітники. Можливі назви полів: П.І.П., табельний номер, рік народження, оклад, стаж.

              18. Відомість зарплатні за поточний місяць. Можливі назви полів: П.І.П., номер відділу, табельний номер, кількість робочих годин, розмір платні.

              19. Книга-поштою. Можливі назви полів: назва, П.І.П. автора, номер за каталогом, видавництво, вартість.

              20. Квартири. Можливі назви полів: адреса, площа (кв.м.), вартість 1 кв.м., поверх, кількість кімнат.

              21. Склад товарів. Можливі назви полів: номер магазину, назва товару, артикул, ціна одиниці товару, кількість товару.

              22. Відомості про гравців хокейних команд. Можливі назви полів: назва клубу, прізвище, кількість закинутих шайб, кількість гольових передач, штрафний час, показник: кількість закинутих шайб + кількість гольових передач.

              23. Відомості про пацієнтів поліклініки. Можливі назви полів: прізвище пацієнта, стать, вік, діагноз, номер телефону, домашня адреса.

              24. Характеристики транспортних засобів підприємства. Можливі назви полів: марка транспортного засобу, держномер, рік випуску, пробіг (тис. км).

              25. Характеристики транспортних засобів підприємства за групами: автобуси, вантажні та легкові автомобілі. Можливі назви полів: марка транспортного засобу, держномер, рік випуску, пробіг (тис. км).

              26. Формування груп у туристичному агентстві. Можливі назви полів: П.І.П., рік народження, номер паспорту, назва бажаної країни.

              27. Експорт товарів. Можливі назви полів: назва товару, країна (що імпортує товар), об’єм партії (штук), що постачається).

              28. Екскурсії. Можливі назви полів: назва, країна, вартість, тривалість, транспорт.

              29. Асортимент телевізорів. Можливі назви полів: назва, фірма-виробник, розмір екрану, ціна, кількість.

              30. Асортимент холодильників. Можливі назви полів: назва, фірма-виробник, ємність камери, ціна, кількість.