Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2011, 17:51   #1
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию Отсортировать файл. Паскаль

Задача: В ООН имеется полный перечень всех стран, который включает в себя: название, континент, столицу, площадь, численность населения, государственный строй. Вывести названия и столицы государств в порядке убывания плотности населения. Применить многопутевое двухфазное естественное сбалансированное слиянеие.
nicklifs вне форума Ответить с цитированием
Старый 10.12.2011, 17:51   #2
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

На реальном примере покажите как это работает?
nicklifs вне форума Ответить с цитированием
Старый 10.12.2011, 17:56   #3
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Пример
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 10.12.2011, 18:18   #4
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

двухфазное? это как?
nicklifs вне форума Ответить с цитированием
Старый 11.12.2011, 21:15   #5
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

В принципе понял весь алгоритм решения. Последний вопрос (многопутевое! слияние подразумевает использование n - временных файлов) : сколько их брать?
Запросить у пользователя, или в зависимости от кол-ва серий в исходном файле или как захочу, например 3.
nicklifs вне форума Ответить с цитированием
Старый 21.12.2011, 13:43   #6
dmgcodevil
 
Регистрация: 21.12.2011
Сообщений: 6
По умолчанию

nicklifs, дружище выручай, такая же задача в принципе и у меня, даже один в один, я слабо шарю во всех этих алгоритмах, помоги пожалуйста. Буду Очень благодарен !
dmgcodevil вне форума Ответить с цитированием
Старый 21.12.2011, 17:33   #7
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

dmgcodevil,
вот пример двухпутевого ..... - частный случай многопутевого

uses crt;
var f0,f1,f2,d1,d2: file of integer;
i,n,prov,x: integer;

procedure firstras(var prov:integer);
var k, i, x,last:integer;
begin
reset(f0);
rewrite(f1);
rewrite(f2);
k:=1; //записывать в k-файл(в первый изначально) в f1
i:=1;

read(f0,last);
write(f1,last);
while not eof(f0) do begin
read(f0,x);

if ((x<last)and(k=1)) then begin
write(f1,x);
last:=x;
end;
if ((x<last)and(k=2)) then begin
write(f2,x);
last:=x;
end;
if (x>last) then begin
if k=1 then begin write(f2,x);last:=x; k:=2 end
else begin write(f1,x);last:=x; k:=1 end;
end;
end;

reset(f2);
if eof(f2) then prov:=1 //файл отсортирован!
else prov:=2;
close(f1);
close(f2);
end; // изначальное распределение

procedure sort(var f1,f2,d1,d2:file of integer; var prov:integer );
var a,alast,b,blast,k,m,last,x,i,n: integer;
fl:boolean;
begin
rewrite(d1);
rewrite(d2);
reset(f1);
reset(f2);

fl:=true;
k:=1; //записываем в файл 1
m:=1; //читаем из файла 1

read(f1,a);
read(f2,b);
if a>b then begin
write(d1,a);
alast:=a;
blast:=a;
end
else begin
write(d1,b);
blast:=b;
alast:=b;
m:=2;
end;
if m=1 then begin read(f1,a); if a>alast then fl:=false end;
if m=2 then begin read(f2,b); if b>blast then fl:=false end;
while (not eof(f1))and(not eof(f2)) do begin

if fl=true then begin

if a>b then begin
if k=1 then write(d1,a)
else write(d2,a);
alast:=a;
m:=1;
read(f1,a);
if a>alast then fl:=false
end
else begin
if k=2 then write(d2,b)
else write(d1,b);
blast:=b;
m:=2;
read(f2,b);
if b>blast then fl:=false
end;

end
else begin
if (m=1) then begin
if k=1 then write(d1,b)
else write(d2,b);
blast:=b;
read(f2,b);
while (b<blast)and((not eof(f1))and(not eof(f2))) do begin
if k=1 then begin write(d1,b);blast:=b; read(f2,b); end
else begin write(d2,b); blast:=b; read(f2,b); end;
end;

end
else begin
if k=1 then write(d1,a)
else write(d2,a);
alast:=a;
read(f1,a);
while (a<alast)and((not eof(f1))and(not eof(f2))) do begin
if k=1 then begin write(d1,a);alast:=a; read(f1,a); end
else begin write(d2,b); blast:=b; read(f1,a); end;
end;

end;

if k=1 then k:=2
else k:=1;
fl:=true;
end;

end; //while 85

if not eof(f1) then begin

while not eof(f1) do begin
if k=1 then write(d1,a)
else write(d2,a);

alast:=a;
read(f1,a);
if a>alast then
if k=1 then k:=2
else k:=1;
end;

if k=1 then begin
if a<b then begin write(d1,b); write(d1,a); end
else begin write(d1,a); write(d1,b); end
end
else begin
if a<b then begin write(d2,b); write(d2,a) end
else begin write(d2,b); write(d2,a) end;
end;
end;
if not eof(f2) then begin

while not eof(f2) do begin
if k=1 then write(d1,b)
else write(d2,b);

blast:=b;
read(f2,b);
if b>blast then
if k=1 then k:=2
else k:=1;
end;

if k=1 then begin
if a<b then begin write(d1,b); write(d1,a) end
else begin write(d1,a); write(d1,b); end;
end
else begin
if a<b then begin write(d2,b); write(d2,a); end
else begin write(d2,a); write(d2,b) end;
end;
end;
close(d2);
reset(d2);
if eof(d2) then prov:=1 //файл d1 отсортирован!
else prov:=2;
close(d1); close(d2);
close(f1); rewrite(f1); close(f1);
close(f2); rewrite(f2); close(f2);
end;
nicklifs вне форума Ответить с цитированием
Старый 21.12.2011, 17:33   #8
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

Begin
assign(f0,'f0.dat');
assign(f1,'f1.dat');
assign(f2,'f2.dat');
assign(d1,'d1.dat');
assign(d2,'d2.dat');
rewrite(f1); close(f1);
rewrite(f2); close(f2);
rewrite(d1); close(d1);
rewrite(d2); close(d2);

write('Введите кол-во элементов иcходного файла: ');
readln(n);
rewrite(f0);
for i:=1 to n do write(f0,random(201)-100);
write('Исходный файл: ');
reset(f0);
while not eof(f0) do begin
read(f0,x);
write(x,' ');
end;
writeln;

firstras(prov);
while(prov<>1) do begin
sort(f1,f2,d1,d2,prov);
if prov<>1 then sort(d1,d2,f1,f2,prov);
end;

reset(d1);
reset(f1);
rewrite(f0);
if not eof(d1) then begin
while not eof(d1) do begin
read(d1,x);
write(f0,x);
end;
end;
if not eof(f1)then begin
while not eof(f1) do begin
read(f1,x);
write(f0,x);
end;
end;
close(f1);
close(d1);
close(f0);

write('Результат: ');
reset(f0);
while not eof(f0) do begin
read(f0,x);
write(x,' ');
end;
writeln;
close(f0);
erase(f1); erase(f2);
erase(d1); erase(d2);
End.
nicklifs вне форума Ответить с цитированием
Старый 22.12.2011, 10:39   #9
dmgcodevil
 
Регистрация: 21.12.2011
Сообщений: 6
По умолчанию

Спасибо nicklifs, а у тебя того примера со странами не осталось? Или как это можно поправить, я просто паскаля совсем не знаю.
dmgcodevil вне форума Ответить с цитированием
Старый 22.12.2011, 11:40   #10
dmgcodevil
 
Регистрация: 21.12.2011
Сообщений: 6
По умолчанию

Спасибо nicklifs, а у тебя того примера со странами не осталось? Или как это можно поправить, я просто паскаля совсем не знаю.
dmgcodevil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсортировать файл с ростом первых букв предложений.. dragon_pb_ Общие вопросы C/C++ 0 01.12.2011 22:40
Отсортировать структуры (Паскаль) Traus Помощь студентам 0 04.10.2011 00:31
Добавить элемент в типизированный файл и его с отсортировать Valja Паскаль, Turbo Pascal, PascalABC.NET 5 09.05.2011 19:21
Найти наибольший и наименьший элемент в каждой строке матрицы. Отсортировать... (Паскаль) Tifa Помощь студентам 0 27.01.2011 23:07
Тестовый файл. Найти сумму всех чисел, входящих в этот файл. (Паскаль) Homeros Помощь студентам 1 26.01.2011 14:05