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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2015, 20:34   #11
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Пожалуйста, помогите(((( Не знаю как разбить файлы на строки, и потом каждую из строк сравнивать по отдельности. Как это сделать?
Maray вне форума Ответить с цитированием
Старый 03.01.2015, 20:40   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну раз это фришка то загрузить файл можно так:
Код:
var a:array of string; f:textfile;
...
 while not eof(f) do begin
  SetLength(a,Length(a)+1);
  Readln(f,a[High(a)]);
 end;
...
И так в два массива.
Потом работать уже с массивами:
Код:
for i:=Low(a) to High(a) do
 for j:=Low(b) to High(b) do begin
  if a[i]=b[j] then найшли совпадение.
 end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.01.2015, 18:51   #13
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Спасибо) Вот только ещё подскажите, дошла в программе до момента, когда в файлах нет одинаковых строк, и нужно строки из файлов f и g записать чередуя их начиная с первой из файла f в файл h. Я попробовала вот так(вот моя программа). Но здесь сначала записывается первая строка из файла f а затем весь файл g, потом вторая строка из файла f, а затем весь файл g и т.д. Подскажите, как правильно сделать(

Код:
Program File;
var a, b:array of string;
    f, g, h: textfile;
    i, j: byte;
    Flag: boolean;
begin
  Flag:=false;
  Assign(f, 'f.txt');
  Assign(g, 'g.txt');
  Assign(h, 'h.txt');
  Reset(f);
 while not eof(f) do begin
  SetLength(a,Length(a)+1);
  Readln(f,a[High(a)]);
 end;

 Reset(g);
 while not eof(g) do begin
  SetLength(b,Length(b)+1);
  Readln(g, b[High(b)]);
 end;

 Rewrite(h);
 for i:=Low(a) to High(a) do
 for j:=Low(b) to High(b) do begin
  if a[i]=b[j] then
  begin
  Writeln(h, a[i]);
  Flag:=true;
  end;
 end;
 Close(h);
 if flag=false then
 begin
 Rewrite(h);
 begin
 for i:=Low(a) to High(a) do begin
  Writeln(h, a[i]);
  for j:=Low(b) to High(b) do
  writeln(h, b[j]);
  end;
  end;
  end;
 end.

Последний раз редактировалось Maray; 04.01.2015 в 19:51.
Maray вне форума Ответить с цитированием
Старый 04.01.2015, 19:59   #14
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
Восклицание Файлы

Добрый вечер=) Подскажите пожалуйста, было задание:

Даны файлы f и g. Записать в файл h все совпадающие строки файлов f и g, если таких строк нет, то в файл h записать строки из файлов f и g, чередуя их, начиная с первой из файла f

Так вот, дошла в программе до момента, когда в файлах нет одинаковых строк, и нужно строки из файлов f и g записать чередуя их начиная с первой из файла f в файл h. Я попробовала вот так(вот моя программа). Но здесь сначала записывается первая строка из файла f а затем весь файл g, потом вторая строка из файла f, а затем весь файл g и т.д. Подскажите, как правильно сделать(

Код:
Program File;
var a, b:array of string;
    f, g, h: textfile;
    i, j: byte;
    Flag: boolean;
begin
  Flag:=false;
  Assign(f, 'f.txt');
  Assign(g, 'g.txt');
  Assign(h, 'h.txt');
  Reset(f);
 while not eof(f) do begin
  SetLength(a,Length(a)+1);
  Readln(f,a[High(a)]);
 end;
 
 Reset(g);
 while not eof(g) do begin
  SetLength(b,Length(b)+1);
  Readln(g, b[High(b)]);
 end;
 
 Rewrite(h);
 for i:=Low(a) to High(a) do
 for j:=Low(b) to High(b) do begin
  if a[i]=b[j] then
  begin
  Writeln(h, a[i]);
  Flag:=true;
  end;
 end;
 Close(h);
 if flag=false then
 begin
 Rewrite(h);
 begin
 for i:=Low(a) to High(a) do begin
  Writeln(h, a[i]);
  for j:=Low(b) to High(b) do
  writeln(h, b[j]);
  end;
  end;
  end;
 end.
Maray вне форума Ответить с цитированием
Старый 05.01.2015, 12:21   #15
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Добрый день)

Помогите пожалуйста, почти дописала программу. Остался последний момент, когда в файлах f и g нет одинаковых строк. И нужно записать в файл h строки из файлов f и g чередуя их начиная с первой из файла f. То что написала я, работает только в том случае, когда количество строк в файлах f и g одинаковое. В остальных случаях программа не работает. Помогите, пожалуйста правильно сделать.

Код:
var a, b:array of string;
    f, g, h: textfile;
    i, j: byte;
    Flag: boolean;
begin
Assign(f, 'f.txt');
Assign(g, 'g.txt');
Assign(h, 'h.txt');
Reset(f);
while not eof(f) do
 begin
  SetLength(a,Length(a)+1);
  Readln(f,a[High(a)]);
 end;
Reset(g);
while not eof(g) do
 begin
  SetLength(b,Length(b)+1);
  Readln(g, b[High(b)]);
 end;
Rewrite(h);
Flag:=false;
for i:=Low(a) to High(a) do
for j:=Low(b) to High(b) do
if a[i]=b[j] then
 begin
  Writeln(h, a[i]);
  Flag:=true;
 end;
Close(h);
if flag=false then
  begin
  Rewrite(h);
  for i:=Low(a) to High(a) do
   begin
    Writeln(h, a[i]);
    writeln(h, b[i]);
   end;
   end;
close(h);
end.
Maray вне форума Ответить с цитированием
Старый 05.01.2015, 12:54   #16
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Первое что пришло в голову.
Код:
//если в А больше строк то пишем до конца В, потом дописываем оставшиеся из А
if length(a) > length(b) then
Begin
   len := Length(b)
   for i:=Low(b) to High(b) do
   begin
    Writeln(h, a[i]);
    writeln(h, b[i]);
   end;
   for i := len+1 to high(a) then writeln(h,a[i])
end
else
//если В больше чем А, то пишем весь А, потом дописываем В
if length(a) < length(b) then
Begin
   len := Length(a)
   for i:=Low(a) to High(a) do
   begin
    Writeln(h, a[i]);
    writeln(h, b[i]);
   end;
   for i := len+1 to high(b) then writeln(h,b[i])
end
else
//массивы равной длины
Begin
   for i:=Low(a) to High(a) do
   begin
    Writeln(h, a[i]);
    writeln(h, b[i]);
   end;
end
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 05.01.2015, 16:32   #17
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Во вложении вариант с использованием списка (динамическая память).
Для записи поочередно строк из двух файлов можно воспользоваться тем условием, что при контроле конца файла перемещения по файлу не происходит.
Т.е.
Код:
...
if NOT eof(fha) then
   writeln(fhh, sa);
if NOT eof(fhb) then
   writeln(fhh, sb);
if eof(fha)  AND eof(fhb) then
begin
   close(fhh);
   exit;
end;
...
В этом случае строки будут писаться поочередно, а оставшиеся - запишутся в конце.

PS: В программе сделано так, что если есть совпадающие строки, то только такие строки пишутся в третий файл.
Если совпадающих строк нет, то строки файлов поочередно пишутся в третий файл.

Как-то так, ...
Вложения
Тип файла: rar tt.rar (1,009 байт, 13 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.01.2015, 16:37   #18
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Спасибо за помощь) Но к сожалению программа вообще не работает. Я даже не могу узнать где ошибка. Начинаю пошагово выполнять программу, и уже на строке Reset(f) выходит из программы. Кто-нибудь, помогите пожалуйста домучить эту программу.

Задание: Даны файлы f и g. Записать в файл h все совпадающие строки файлов f и g, если таких строк нет, то в файл h записать строки из файлов f и g, чередуя их, начиная с первой из файла f

Вот мой код. Помогите найти и исправить ошибки, пожалуйста:

Код:
var a, b:array of string;
    f, g, h: textfile;
    len, i, j: byte;
    Flag: boolean;
begin
Assign(f, 'f.txt');
Assign(g, 'g.txt');
Assign(h, 'h.txt');
Reset(f);
while not eof(f) do
 begin
  SetLength(a,Length(a)+1);
  Readln(f,a[High(a)]);
 end;
Reset(g);
while not eof(g) do
 begin
  SetLength(b,Length(b)+1);
  Readln(g, b[High(b)]);
 end;
Rewrite(h);
Flag:=false;
for i:=Low(a) to High(a) do
for j:=Low(b) to High(b) do
if a[i]=b[j] then
 begin
  Writeln(h, a[i]);
  Flag:=true;
 end;
Close(h);
if flag=false then
  if length(a) > length(b) then
Begin
   len:= Length(b);
   for i:=Low(b) to High(b) do
   begin
    Writeln(h, a[i]);
    writeln(h, b[i]);
   end;
   for i:= len+1 to high(a) do
    writeln(h,a[i])
 end
else
  if length(a) < length(b) then
 Begin
   len:= Length(a);
   for i:=Low(a) to High(a) do
   begin
    Writeln(h, a[i]);
    writeln(h, b[i]);
   end;
   for i := len+1 to high(b) do
   writeln(h,b[i])
 end
else
  Begin
   for i:=Low(a) to High(a) do
   begin
    Writeln(h, a[i]);
    writeln(h, b[i]);
   end;
end;

end.
Maray вне форума Ответить с цитированием
Старый 05.01.2015, 18:21   #19
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

1. Есть готовое решение, см. пост выше.

2. Файлы f.txt, g.txt существуют? Где они размещены?

В той версии, что в посте выше, путь к таким файлам указан явно.
Сами файлы приложены. Легко их скорректировать и проверить работу программы.
Общая идея, реализованная в программе:
а). Создаем два списка: п/п для этого взяты из учебника Т.А. Павловская (см. список литературы в теме "Паскаль").
add() - формирование списка;
find() - поиск строки в списке.
б). Читаем файлы и записываем в списки, соответственно: beg_a, beg_b.
в). В цикле, пока не достигнут конец первого списка ищем строку во втором списке.
Если находим, то пишем в третий файл и устанавливаем флажок (признак того, что есть совпадающие строки).
г). Если после выхода из цикла флажок не установился, то, в цикле, читаем строки из списков, по очереди,
и пишем строки в третий файл. Если достигнут конец одного из списков, то строки из него не читаются.
д). Признаком завершения цикла будет ситуация, когда достигнут конец у обоих списков.
е). Закрываем третий файл. Все.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
Работа с файлами as1212 Помощь студентам 0 13.11.2011 21:34
Работа с файлами Maksi Фриланс 4 07.06.2008 11:38