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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2012, 18:33   #1
Florence
Новичок
Джуниор
 
Регистрация: 19.04.2012
Сообщений: 1
По умолчанию Осуществить слияние двух файлов в третий, используя два файла с целыми числами (на Паскале)

Есть 2 текстовых файла с целыми числами, допустим в первом записаны числа 1 2 7 9 13, а во втором- 0 1 4 9 16. Нужно осуществить их слияние так, что бы в третий (пустой файл) записалось 0 1 1 2 4 7 9 9 13 16. По сути это сортировка слиянием. Вот то, что сама написала, помогите найти ошибку, если вас это не затруднит)
Вложения
Тип файла: txt SL.txt (1.1 Кб, 140 просмотров)
Florence вне форума Ответить с цитированием
Старый 20.04.2012, 00:23   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Коряво
Но работает более-менее
Код:
uses crt;
var
f1,f2,f3:text;
a,b:integer;
begin
assign(f1,'in1.txt');
assign(f2,'in2.txt');
assign(f3,'out.txt');
reset(f1);
reset(f2);
rewrite(f3);
if not eof(f1) then
   read(f1,a)
   else
   a:=32767;
if not eof(f2) then
   read(f2,b)
   else
   b:=32767;
while (not eof(f1)) and (not eof(f2)) do
begin
     if a<b then
     begin
          write(f3,a,' ');
          read(f1,a);
     end
     else
     begin
          write(f3,b,' ');
          read(f2,b);
     end;
end;
while not eof(f1) do
begin
     if a<b then
     begin
          write(f3,a,' ');
          read(f1,a);
          end
     else
     begin
          write(f3,b,' ');
          b:=32767;
     end;
end;
while not eof(f2) do
begin
     if b<a then
     begin
          write(f3,b,' ');
          read(f2,b);
     end
     else
     begin
          write(f3,a,' ');
          a:=32767;
     end;
end;
if a<>32767 then
   write(f3,a,' ');
if b<>32767 then
   write(f3,b);
close(f1);
close(f2);
close(f3);
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.11.2013, 00:20   #3
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Внезапно было нужно
Чуть поправлю
Код:
program laba;
uses crt;
var
     f1, f2, fo: text;
     a,b:integer;
begin
     assign(f1,'a1.txt');
     assign(f2,'a2.txt');
     assign(fo,'b.txt');
     rewrite(fo);
     reset(f1);
     reset(f2);
if not eof(f1) then
   read(f1,a)

if not eof(f2) then
   read(f2,b)

while (not eof(f1)) and (not eof(f2)) do
begin
     if a<b then
     begin
          write(fo,a,' ');
          read(f1,a);
     end
     else
     begin
          write(fo,b,' ');
          read(f2,b);
     end;
end;

while not eof(f1) do
begin
  write(fo,a,' ');
  read(f1,a);
end;

while not eof(f1) do
begin
  write(fo,b,' ');
  read(f2,b);
end;

close(f1);
close(f2);
close(fo);
end;

Последний раз редактировалось evgn; 24.11.2013 в 00:41.
evgn вне форума Ответить с цитированием
Старый 24.11.2013, 01:23   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evgn, явно опечатка:
Цитата:
Код:
hile not eof(f1) do
begin
  write(fo,a,' ');
  read(f1,a);
end;

while not eof(f1) do
begin
  write(fo,b,' ');
  read(f2,b);
end;

close(f1);
close(f2);
close(fo);
разумеется должно быть:
Код:
while not eof(f2) do

кроме того, не уверен, что логика в вашем "исправленном коде" корректна.
1-е. Чувствую, что может быть неверная работа вашего кода, если после окончания одного из файлов, в переменных a и b будут значения такие, что b<a
2-е. когда Вы прочитали последнее значение значение, eof стало истиной, но ведь переменную надо записать в файл!

возможно, что я и заблуждаюсь.. Это надо тестировать/проверять...

Последний раз редактировалось Serge_Bliznykov; 24.11.2013 в 01:28.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.11.2013, 01:29   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Serge_Bliznykov, и не единственная. После последнего end точка с запятой. Честно говоря, запускать код и проверять на наличие логических ошибок некогда, но выбрасывание проверок, которые были в моем коде, приведет к тому (предположительно), что последние элементы файлов запишутся не в том порядке или "потеряются" вовсе.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.11.2013, 01:35   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
приведет к тому (предположительно), что последние элементы файлов запишутся не в том порядке или "потеряются" вовсе.
угу.
согласен.

нет, нам такие "поправки" не нужны!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.11.2013, 18:47   #7
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Я с вами полностью согласен товарищи... Было поздно, спать хотелось.
Но... свой код я тестировал в delphi, а там как не странно все работает. Там eof работает несколько по-другому.

Но первоначальный код также не удовлетворяет всем требованиям, я легко приведу ряды которые он не правильно обработает. Хотя бы если использовать последнее число 32767.
Тогда, такой вариант (вроде бы все проверил):
Код:
program laba; 
uses crt;    
var
     f1, f2, fo: text; 
     a,b,l:integer;      
     b1,b2,aw,bw:boolean;
begin
     assign(f1,'a1.txt');
     assign(f2,'a2.txt');
     assign(fo,'b.txt');
     rewrite(fo); 
     reset(f1); 
     reset(f2);
     b1:=not eof(f1); 
     b2:=not eof(f2);
if b1 then  
   read(f1,a);
if b2 then
   read(f2,b);
aw:=false; 
bw:=false;
while b1 or b2 do 
begin
     if a<b then
     begin
          write(fo,a,' ');
          if b1 then begin
          read(f1,a);    
          b1:=not eof(f1); 
          end
          else begin a:=32767; aw:=true; end;
     end
     else
     begin

          write(fo,b,' ');
          if b2 then begin 
          read(f2,b);     
          b2:=not eof(f2);
          end
          else  begin b:=32767; bw:=true; end;
     end;

end;

if a < b then begin
   if not aw then write(fo, a, ' '); 
   if not bw then write(fo, b, ' ');
end
else
begin
   if not bw then write(fo, b, ' ');
   if not aw then write(fo, a, ' ');
end;

close(f1);
close(f2);
close(fo);
end.
evgn вне форума Ответить с цитированием
Старый 24.11.2013, 19:27   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А LongInt а паскале я надеюсь 4 байта? Тогда можно избежать проблемки с 32767 и сделать одним циклом и покороче. Паскаля нет, проверил в дельфи
Код:
var f1,f2,f3:text;
    a,b:LongInt;

begin

assign(f1,'in1.txt');
assign(f2,'in2.txt');
assign(f3,'out.txt');
reset(f1);
reset(f2);
rewrite(f3);
if not eof(f1) then read(f1,a) else a:=32768;
if not eof(f2) then read(f2,b) else b:=32768;
while (a<32768) or (b<32768) do begin
  if (a<=b) and (a<32768) then begin
    write(f3,a,' ');
    if not eof(f1) then read(f1,a) else a:=32768;
  end
  else if b<a then begin
    write(f3,b,' ');
    if not eof(f2) then read(f2,b) else b:=32768;
  end;
end;
close(f1);
close(f2);
close(f3);
end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция обьединения двух посортованых файлов в третий методом слияния.. eva.t Паскаль, Turbo Pascal, PascalABC.NET 0 06.06.2010 02:39
Слияние двух бинарных файлов kakawkin Помощь студентам 7 29.03.2010 21:12
Слияние двух файлов в один hen Общие вопросы C/C++ 1 07.10.2009 22:59
дано два файла. получить третий,содержащий поочередно строки исходных двух файлов. HyvAchoK Паскаль, Turbo Pascal, PascalABC.NET 1 18.12.2008 10:51
Слияние двух текстовых файлов nataly_ukr Общие вопросы Delphi 5 26.12.2007 16:45