Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
57
Добавлен:
10.05.2014
Размер:
6.22 Кб
Скачать
{$R+}
{$M 64000,0,600000}
program mega_file_sort;
uses dos;
(*
(c) 2005 Dima Zolotukhin aka 'Zlogic' <zlogic@gmail.com>
Redistributable under GNU GPL license
*)

const
MAX_PATH = 79;
FILE_LENGTH = 2000;
MAX_FILES = 10;
type
str_path = string[MAX_PATH];
str_message = string[70];
str2 = string[2];
type_file_array = array[1..MAX_FILES]of text;
type_temp_files = record
files:type_file_array;
count:byte;
closed:byte;
closed_files:array[1..MAX_FILES]of boolean;
end;
type_number = longint;
type_data = record
number:type_number;
needs_refresh:boolean;
end;
type_data_array = record
data:array[1..FILE_LENGTH]of type_data;
count:integer;
end;

function get_string(m:str_message):str_path;
var
temp_str:str_path;
begin
write(m,'> ');
readln(temp_str);
get_string:=temp_str;
end;

function open_file_read(path:str_path;var file_in:text):boolean;
begin
assign(file_in,path);
{$I-}
reset(file_in);
{$I+}
open_file_read:=ioresult=0;
end;

function open_temp_file(var temp_file:text):boolean;
var
i:byte;
success:boolean;
s2:str2;
sr:searchrec;
name:str_path;
begin
success:=false;
i:=0;
while(not success)and(i<100)do{Їлв Ґ¬бп ᤥ« вм д ©«, Ї®Є  ­Ґ Ї®«гзЁвбп}
begin
str(i,s2);
name:=s2+'.tmp';
findfirst(name,ANYFILE,sr);{ЁйҐ¬ д ©«}
success:=doserror<>0;
if(success)then{Ґб«Ё ­Ґвг, ᮧ¤ с¬}
assign(temp_file,name);
i:=i+1;
end;
open_temp_file:=success;
end;

procedure clear_temp_files(var temp_files:type_temp_files);
var
i:byte;
begin
for i:=1 to temp_files.count do
begin
close(temp_files.files[i]);
erase(temp_files.files[i]);
end;
temp_files.count:=0;
end;
procedure read_data(var file_in:text;var data:type_data_array);
begin
data.count:=0;
while not(eof(file_in))and(data.count<FILE_LENGTH)do
begin
data.count:=data.count+1;
readln(file_in,data.data[data.count].number);
end;
end;

function find_min(arr:type_data_array;start:integer):integer;
var
i,min:integer;
begin
min:=start;
for i:=start+1 to arr.count do
begin
if(arr.data[i].number<arr.data[min].number)then
min:=i;
end;
find_min:=min;
end;

function find_min_refresh(arr:type_data_array):integer;
var
i,min:integer;
begin
min:=0;
for i:=1 to arr.count do
begin
if(min=0)and(not arr.data[i].needs_refresh)then
min:=i;
if(min<>0)and(not arr.data[i].needs_refresh)then
begin
if(arr.data[i].number<arr.data[min].number)then
min:=i;
end;
end;
find_min_refresh:=min;
end;

procedure swap(var x:type_number;var y:type_number);
var
t:type_number;
begin
t:=x;
x:=y;
y:=t;
end;
procedure sort_data(var data:type_data_array);
var
i,min:integer;
begin
for i:=1 to data.count-1 do
begin
min:=find_min(data,i);
if(min<>i)then
swap(data.data[min].number,data.data[i].number);
end;
end;

procedure read_files_series(var temp_files:type_temp_files;var data:type_data_array);
var
i:integer;
begin
for i:=1 to temp_files.count do
begin
if (data.data[i].needs_refresh)then
begin
if(eof(temp_files.files[i]))then{Ґб«Ё д ©« § Є®­зЁ«бп,­® Ґйс ­Ґ ®в¬ҐзҐ­}
begin
if(not temp_files.closed_files[i])then
begin
temp_files.closed:=temp_files.closed+1;{®в¬Ґз Ґ¬}
temp_files.closed_files[i]:=true;
end;
end
else{Ґб«Ё ­Ґ Є®­Ґж д ©«  Ё ­г¦­® Їа®зЁв вм бва®Єг}
begin
readln(temp_files.files[i],data.data[i].number);{зЁв Ґ¬}
data.data[i].needs_refresh:=false;
end;
end;
end;
end;

procedure open_temp_files(var files:type_temp_files;var data:type_data_array);
var
i:integer;
begin
for i:=1 to files.count do
begin
reset(files.files[i]);
files.closed_files[i]:=false;
data.data[i].needs_refresh:=true;
end;
end;

procedure combine_files(var temp_files:type_temp_files;var file_out:text);
var
data:type_data_array;
min_data:integer;
begin
temp_files.closed:=0;
open_temp_files(temp_files,data);{®вЄалў Ґ¬ д ©«л}
data.count:=temp_files.count;
while(temp_files.count<>temp_files.closed)do{Ї®Є  Ґбвм е®вп Ўл ®¤Ё­ ®вЄалвл© д ©«}
begin
read_files_series(temp_files,data);{зЁв Ґ¬ Ї® бва®зЄҐ Ё§ д ©« }
min_data:=find_min_refresh(data);{ЁйҐ¬ ¬Ё­Ё¬г¬}
if(min_data<>0)then
begin
writeln(file_out,data.data[min_data].number:0);{ўлў®¤Ё¬}
data.data[min_data].needs_refresh:=true;{г¤ «пҐ¬}
end;
end;
end;

procedure output_data(var file_out:text;data:type_data_array);
var
i:integer;
begin
rewrite(file_out);
for i:=1 to data.count do
writeln(file_out,data.data[i].number:0);
close(file_out);
end;

var
file_in_name:str_path;
file_in:text;
file_out_name:str_path;
file_out:text;
temp_files:type_temp_files;
current_data:type_data_array;
begin
temp_files.count:=0;
file_in_name:=get_string('‚ўҐ¤ЁвҐ Ё¬п ўе®¤­®Ј® д ©«  ¤«п б®авЁа®ўЄЁ');{Ї®«гз Ґ¬ Ё¬п д ©« }
if(open_file_read(file_in_name,file_in))then{®вЄалў Ґ¬ ўе®¤­®© д ©«}
begin
file_out_name:=get_string('‚ўҐ¤ЁвҐ Ё¬п д ©«  ¤«п ўлў®¤ ');{®вЄалў Ґ¬ ўл室­®© д ©«}
assign(file_out,file_out_name);
rewrite(file_out);
while not eof(file_in)do{Ї®Є  ­Ґ Є®­Ґж д ©« }
begin
read_data(file_in,current_data);{зЁв Ґ¬ ¤ ­­лҐ}
sort_data(current_data);{c®авЁа㥬}
temp_files.count:=temp_files.count+1;
open_temp_file(temp_files.files[temp_files.count]);{ўлў®¤Ё¬}
output_data(temp_files.files[temp_files.count],current_data);
end;
close(file_in);
combine_files(temp_files,file_out);{Є®¬ЎЁ­Ёа㥬}
close(file_out);
writeln('ЋЉ, ­ ¦¬Ё ENTER ¤«п ўл室 ');
readln;
clear_temp_files(temp_files);{зЁбвЁ¬}
end
else
begin
writeln('’ Є®Ј® д ©«  ­Ґ бгйҐбвўгҐв!');
readln;
end;
end.
Соседние файлы в папке 09