Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Есть 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 Кб, 51 просмотров)
Florence вне форума   Ответить с цитированием
Старый 20.04.2012, 00:23   #2
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,406
Репутация: 2502

icq: 438888048
По умолчанию

Коряво
Но работает более-менее
Код:
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
Репутация: 21
По умолчанию

Внезапно было нужно
Чуть поправлю
Код:
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
Сообщений: 25,718
Репутация: 5617
По умолчанию

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
Адрес: RF Moscow
Сообщений: 5,406
Репутация: 2502

icq: 438888048
По умолчанию

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

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

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

Я с вами полностью согласен товарищи... Было поздно, спать хотелось.
Но... свой код я тестировал в 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
Адрес: Северодонецк.ua
Сообщений: 18,873
Репутация: 6688
По умолчанию

А 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.
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


18:15.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.