
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.220.97.0] |
![]() |
|
Сообщ.
#1
,
|
|
|
Задача: Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.
![]() ![]() program Lab9; {Разработать программу для сортировки текстового файла, используя сортировку прямым слиянием и естественным слиянием. Измерить время, требуемое для сортировки файла разными способами. Подпрограммы сортировки реализовать в отдельном модуле.} uses UnitRealization; var F, F1, F2: TextFile; begin if(ParamCount <> 3) then Writeln('Недостаточно параметров.') else begin try Assign(F, ParamStr(1)); Assign(F1, ParamStr(2)); Assign(F2, ParamStr(3)); Reset(F); if(SeekEOF(F)) then begin CloseFile(F); Writeln('Файл пуст.'); exit; end; except on System.IO.IOException do begin Writeln('Невозможно открыть файл ', ParamStr(1)); Exit; end; end; CloseFile(F); NaturalMerge(F, F1, F2); end; end. ![]() ![]() Unit UnitRealization; Interface Procedure NaturalMerge(const F, F1, F2: TextFile); Implementation Procedure NaturalMerge(const F, F1, F2: TextFile); var a, b, save_to, swap, subgroup_1, subgroup_2: Integer; flag, flag_1, flag_2: Boolean; begin subgroup_1 := 10000; subgroup_2 := 10000; flag := False; while(not(flag)) do //(subgroup_1 <> 1) or (subgroup_2 <> 1) begin save_to := 1; subgroup_1 := 0; subgroup_2 := 0; Reset(F); Rewrite(F1); Rewrite(F2); Read(F, a); Write(F1, a, ' '); while(not(SeekEOF(F))) do begin Read(F, b); if(a > b) then begin case save_to of 1: begin save_to := 2; subgroup_1 += 1; end; 2: begin save_to := 1; subgroup_2 += 1; end; end; end; case save_to of 1: Write(F1, b, ' '); 2: Write(F2, b, ' '); end; a := b; end; if(save_to = 2) then subgroup_2 += 1 else subgroup_1 += 1; CloseFile(F); CloseFile(F1); CloseFile(F2); Rewrite(F); Reset(F1); Reset(F2); Read(F1, a); Read(F2, b); while(not(SeekEOF(F1)) and not(SeekEOF(F2))) do begin if(a <= b) then begin Write(F, a, ' '); Read(F1, a); end else begin Write(F, b, ' '); Read(F2, b); end; end; while(not(SeekEOF(F1))) do begin swap := a; Read(F1, a); if(not(SeekEOF(F1))) then Write(F, swap, ' ') else Write(F, swap); end; while(not(SeekEOF(F2))) do begin swap := b; Read(F2, b); if(not(SeekEOF(F2))) then Write(F, swap, ' ') else Write(F, swap); end; CloseFile(F); CloseFile(F1); CloseFile(F2); if(subgroup_1 = 1) then flag := True; end; Erase(F1); Erase(F2); end; end. Сортировка естественным слиянием почему-то не работает, и я не понимаю, почему. Возможно, проблема в условии while на число подгрупп, относящихся к файлам F1 и F2. По идее, так как первый элемент записывается всегда в файл F1, то признаком конца сортировки является число подгрупп, относящихся к файлу F1, равное единице, но даже тут неведомое творится. Помогите, эксперты. В дополнение ко всему этому очень часто возникает ошибка о том, что я вышёл за пределы файла, и считать ничего нельзя. Почему не считываются последние числа файлов F1 и F2? Например, если дана последовательность {5, 6, 7, 1, 2, 3}, то результатом подпрограммы будет {1, 2, 5, 6}. Как сделать так, чтобы последние числа не игнорировались? Подрограмма написана в среде PascalABC.NET |