Паскаль-файлы-обьединния-сортировка слиянием

  • Автор темы eva7
  • Дата начала
E

eva7

#1
Приветики ))
мне срочно нужно написать проги..
но никак не могу разобраться - просто много на раз, и уже не соображаю..
нужно написать модуль, в котором три функции (или процедуры)

- создание файла, в котором каждая следуящая цыфра больше предыдущей (количество чисел случайным выбором)
- прочитать из файла
- обьединить два "посортованых" файла в третий методом слияния...

две функции написала.. я решила сначала написать прогу, а потом переработать все в модуль..
но что-то с третей плутаюсь...
помогите пожалуйста..очень надо - ведь еще много сложных задач, а времени мало =\
как-то быстро семестр прошел..


Код:
program losowanie;
uses crt;

var
plik :text;
n,i,l: integer;
adres1,adres2 : string;
a:array[1..100] of Word;

Procedure zapisz(adres:string);
begin
Assign (plik,adres);
Rewrite (plik);
randomize;

Writeln (plik,'LICZBY ZAPISANE DO PLIKU ');
Writeln (plik);
n:= random (100);
Write (plik, ' ilosc liczb: ');
write(plik, n);
writeln(plik);
l:=0;

for i:=1 to n do
begin
a[i]:= random (60);
a[i]:= l + a[i];
l:=a[i];
write (plik, a[i]:5);
end;

close (plik);
end;

procedure wypisz(adres:string);
var
a:char;
begin
assign (plik, adres);
reset (plik);

repeat
read (plik,a);
write (a);
until eof(plik);
close (plik);

readln;
end;

procedure scalanie;

begin




end;



BEGIN
clrscr;
adres1 :='C:\FPC\2.4.0\bin\i386-win32\losowanie1.txt';
adres2 := 'C:\FPC\2.4.0\bin\i386-win32\losowanie2.txt';

writeln ('PLIK 1 ! ');
zapisz(adres1);
wypisz(adres1);
writeln;

Writeln (' PLIK 2 ! ');
zapisz (adres2);
wypisz (adres2);
writeln;

END.
 
E

eva7

#2
Может хотя бы подскажите как лучше решать..
использовать массивы или указатели ?
или алгоритм какой-то...
пожалуйста. :blush:
 
09.11.2009
665
1
#3
Вот это выдрано от сюда :
Рассмотрите фрагмент решения задачи на слияние двух массивов А и В, которые содержат соответственно n1 и n2 элементов. Результирующий массив С будет содержать n1+n2 элементов.
Код:
. . .
i1 := 1;
i2 := 1;
for i := 1 to n1+n2 do
if i1>n1
then
begin
C[i] := B[i2];
i2 := i2+1;
end
else
if i2>n2
then
begin
C[i] := A[i1];
i1 := i1+1;
end
else
if A[i1]<=B[i2]
then
begin
C[i] := A[i1];
i1 := i1+1;
end
else
begin
C[i] := B[i2];
i2 := i2+1;
end;
. . .
 
09.11.2009
665
1
#4
Вот, по идее должно работать(не проверял и код писал прямо тут):
<!--shcode--><pre><code class='Delphi'>var f1,f2,f3:file of real; {f1,f2- файлы(Масивы А и В); f3-файл в который пишем(Масив С)}
f_1,f_2,f_3:real;
i,i1,i2,n1,n2:integer;

. . .

n1:=0;
n2:=0;

reset(f1); {считаем кол-во елементов в первом файле}
while not eof(f1) do
begin
read(f1,f_1);
n1:=n1+1;
end;
close(f1);

reset(f2); {считаем кол-во елементов во втором файле}
while not eof(f2) do
begin
read(f2,f_2);
n2:=n2+1;
end;
close(f2);

i1 := 1;
i2 := 1;
reset(f1);
reset(f2);
rewrite(f3);

for i := 1 to n1+n2 do
begin

seek(f1,i1-1); {получаем елемент А[i1]}
read(f1,f_1);

seek(f2,i2-1); {получаем елемент В[i2]}
read(f2,f_2);

if i1>n1
then
begin
write(f3, f_2);
i2 := i2+1;
end
else
if i2>n2
then
begin
write(f3, f_1);
i1 := i1+1;
end
else
if f_1<=f_2
then
begin
write(f3, f_1);
i1 := i1+1;
end
else
begin
write(f3, f_2);
i2 := i2+1;
end;
end;
close(f1);
close(f2);
close(f3);

. . .[/CODE]
 
E

eva7

#5
Спасибо ))
Постараюсь єто грамотно подключить в функцию проги
 
E

eva7

#6
у меня что-то не получаеться =(
подскажите плиз где ошибка...

Код:
program losowanie;
uses crt;

var
plik :text;
n,i,l: integer;
adres1,adres2,adres3 : string;
a:array[1..100] of Word;

Procedure zapisz(adres:string);
begin
Assign (plik,adres);
Rewrite (plik);
randomize;

Writeln (plik,'LICZBY ZAPISANE DO PLIKU ');
Writeln (plik);
n:= random (100);
Write (plik, ' ilosc liczb: ');
write(plik, n);
writeln(plik);
l:=0;

for i:=1 to n do
begin
a[i]:= random (60);
a[i]:= l + a[i];
l:=a[i];
write (plik, a[i]:5);
end;

close (plik);
end;

procedure wypisz(adres:string);
var
a:char;
begin
assign (plik, adres);
reset (plik);

repeat
read (plik,a);
write (a);
until eof(plik);
close (plik);

readln;
end;

procedure scalanie (adres:string; var plik : text);

var
plik1,plik2, plik3 : file of Word;
p1,p2,p3 : Word;
i, i1, i2, n1, n2 : integer;

Begin
assign (plik1,adres1);
reset (plik1);
assign (plik2,adres2);
reset (plik2);
assign (plik3, adres3);
rewrite (plik3);

n1:=0;
n2:=0;

while not EOF (plik1) do
begin
read (plik1,p1);
n1:=n1+1;
end;

while not EOF (plik2) do
begin
read (plik2,p2);
n2:=n2+1;
end;

i1:=1;
i2:=1;

for i:=1 to n1+n2 do
begin
seek (plik1,i1-1);
read (plik1,p1);

seek (plik2,i2-1);
read (plik2,p2);

if i1>n1
then
begin
write (plik3,p2);
i2:= i2+1;
end
else
if i2> n2
then
begin
write (plik3,p1);
i1:=i1+1;
end
else
begin
write (plik3,p2);
i2:=i2+1;
end;
end;

close (plik1);
close (plik2);
close(plik3);

end;



BEGIN
clrscr;
adres1 :='C:\FPC\2.4.0\bin\i386-win32\losowanie1.txt';
adres2 := 'C:\FPC\2.4.0\bin\i386-win32\losowanie2.txt';
adres3 := 'C:\FPC\2.4.0\bin\i386-win32\losowanie3.txt';

writeln ('PLIK 1 ! ');
zapisz(adres1);
wypisz(adres1);
writeln;

Writeln (' PLIK 2 ! ');
zapisz (adres2);
wypisz (adres2);
writeln;

writeln (' SCALANIE ');
scalanie (adres3,plik);

Writeln (' PLIK 3 ! ');
wypisz (adres3);
writeln;

END.
 
E

eva7

#7
Уже увидила - я там функцию немного недописала - там где сортировка..но всеравно не работает =((

а еще у меня странный вопрос
почему здесь именно так ? =\

seek(f1,i1-1); {получаем елемент А[i1]}
 
E

eva7

#9
я уже это поняла.. Спасибки ))
просто решила попробовать написать с алгоритмом сортировки на матрицах - что то не то =(
я скину прогу ,еще постараюся подправить - может подскажите ...где я опять вчудила.. мне просто 5 прог до пятницы нужно написать..а еще экзамен трудный параллельно учу + залики.. уже не соображаю =(
 
09.11.2009
665
1
#10
просто решила попробовать написать с алгоритмом сортировки на матрицах - что то не то =(
Рассмотрите фрагмент решения задачи на слияние двух массивов А и В, которые содержат соответственно n1 и n2 элементов. Результирующий массив С будет содержать n1+n2 элементов.
Код:
. . .
i1 := 1;
i2 := 1;
for i := 1 to n1+n2 do
if i1>n1
then
begin
C[i] := B[i2];
i2 := i2+1;
end
else
if i2>n2
then
begin
C[i] := A[i1];
i1 := i1+1;
end
else
if A[i1]<=B[i2]
then
begin
C[i] := A[i1];
i1 := i1+1;
end
else
begin
C[i] := B[i2];
i2 := i2+1;
end;
. . .