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

11.8. Основні задачі обробки файлів

Специфіка файлового типу, яка пов’язана з послідовним доступом до компонент і розташуванням файлів на зовнішніх носіях, накладає жорсткі обмеження на засоби розв’язку задач обробки файлів. Розглянемо деякі такі задачі. Для визначеності будемо вважати, що всі файли мають тип OurFile із приклада 11.3 і впорядковані за значенням ключового поля Key (ключу).

Задача 11.1. Доповнення файла новим елементом. Дано файл F і елемент Х типу Component. Розширити F, включивши в нього компоненту Х з збереженням упорядкованості.

Ось, напевно, єдиний можливий розв’язок:

  • Переписувати покомпонентно F у новий файл G до тих пір, поки F^.Key < X.Key ;

  • Записати Х у G;

  • Переписати “хвіст” файла F і G;

  • Перейменувати G у F .

Задача 11.2. Вилучення елемента з файла. Дано файл F і число К - значення ключа елементів, що вилучаються. Скоротити F, вилучивши із нього всі компоненти з ключем К.

Розв’язок аналогічний розв’язку задачі 1:

  • Переписувати покомпонентно F у новий файл G до тих пір, поки F^.Key < X.Key;

  • Поки F^.Key= К читати F;

  • Переписати “хвіст” файла F у G;

  • Перейменувати G у F.

Відмітимо, що:

  • Розв’язки цих задач потребують послідовного пошуку міста елемента Х як компоненти файла. Ефективний розв’язок задачі пошуку (наприклад, бінарний пошук) неможливий.

  • У якості вихідного використовується новий файл, оскільки читання/запис в один і той же файл неможливі!

Наступні задачі присвячені обробці двох файлів.

Задача 11.3. Злиття (об’єднання) файлів. Дано файли F і G. Треба сформувати файл Н, який містить всі компоненти як F, так і G.

Алгоритм полягає у послідовному і почерговому перегляді файлів F і G і запису чергової компоненти в Н. Почерговість визначається порівнянням значень ключів компонент F і G. Оформимо алгоритм у виді процедури:

Procedure FileMerge(var F, G, H: OurFile);

Var

X, Y : Component;

Flag : Boolean;

Procedure Step(var U:OurFile; var A, B:Component);

begin

Write(H, A);

If Eof(U)

then begin

Write(H, B);

Flag := False

end

else Read(U, A)

end;

Procedure AppendTail(var U: Ourfile);

Var

A: Component;

Begin

While not(Eof(U)) do begin

Read(U, A);

Write(H, A)

end

end;

Begin

Reset(F);

Reset(G);

Rewrite(H);

Flag := True;

Read(F, X);

Read(G, Y);

While Flag do

If X.Key < Y.Key

then Step(F, X, Y)

else Step(G, Y, X);

AppendTail(F);

AppendTail(G);

Close(H)

End;

Задача 11.4. Перетин файлів. Дано файли F і G. Треба сформувати файл Н, який містить всі компоненти, що входять як у F, так і в G.

Задача 11.5. Віднімання файлів. Дано файли F і G. Треба сформувати файл Н, який містить всі компоненти, що входять у F, але не входять у G.

Розв’язок цих задач аналогічний розв’язку задачі злиття файлів.

11.9. Сортування файлів

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

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

Так, наприклад, алгоритм сортування простими обмінами потребує N прогонів файла, що сортується (N – кількість компонент файла). Алгоритм швидкого сортування взагалі не має сенсу розглядати, оскільки при його реалізації необхідно було би читати файл від кінця до початку!

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