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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2011, 20:57   #1
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию Работа с файлами, сравнение двух файлов.

Даны два файла one.txt и two.txt
Нужно написать в третьем файле слова из 2-ого файла, которые не повторялись в 1, т.е.

one.txt:
Привет дядя Вася.

two.txt:
я Привет дядя Витя! пока

three.txt:
я Витя пока.


Работу с файлами совсем не изучал, мне интересно:
1) Как организуется считывание с 1 файла, если по строкам(то как учесть, что строка мах 255 символов)
2) Как провести сравнение со 2 файлом (неужели сортировать строковый массив?)
3) Как учесть знаки препинания после слов(ASII ??), в том смысле, что "Вася,"="Вася!"="Вася" (Цикл удаления знак препинания?)
4) Проблема маленьких и больших букв(upcase??)


Буду не против, если кто-нибудь напишет программу для части решения или всю целиком. Ну или чуть подробнее оратора снизу =).

Последний раз редактировалось zink; 25.10.2011 в 21:09.
zink вне форума Ответить с цитированием
Старый 25.10.2011, 21:01   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

1)
Код:
readln(file,string)
вернет строку в string
2) Разбить строки из файлов на слова, слова запихнуть в множества, сравнить множества.
3) Вариант. Либо при разбивке строки считать ограничителями все, кроме букв.
4) Скорее всего.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 25.10.2011, 21:13   #3
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

Если можно, поподробнее пожалуйста, особенно 2,3 пункт. Особенно пример сравнения.
zink вне форума Ответить с цитированием
Старый 26.10.2011, 02:50   #4
Noor
Участник клуба
 
Аватар для Noor
 
Регистрация: 01.11.2006
Сообщений: 1,051
По умолчанию

Чуть ниже на этой странички есть "Похожие темы" и там уже такое обсуждалось
http://programmersforum.ru/showthread.php?t=95781
Noor вне форума Ответить с цитированием
Старый 26.10.2011, 08:35   #5
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

Допустим, там. есть похожие задачи, но меня интересуют именно мои условия, которые написаны выше. Я просмотрел 2 темы, но ищется там совсем другое.
zink вне форума Ответить с цитированием
Старый 26.10.2011, 18:25   #6
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

И все таки про алгоритм =)
Появилась задумка:
1) Удалить знаки препинания в файлах
2) Все буквы в файлах перевести в строчные(прописные)
while eof(file2) do
3) Во 2 файле считать первое(второе,...) слово(до пробела)
4) Найти позицию слова в 1 файле
5) Удалить с этой позиции символы до пробела включительно.


Между тем встают вопросы

1) Можно ли выполнить эти операции в файле? или нужно создавать строковый массив?
2) Можно ли копировать сам .txt файл через паскаль?
3) Что делать при чтении текста из файла, если символов в тексте >255!


Мне нужен только алгоритм сравнения и решение проблемы с текстом в котором >255 символов(желательно с кодом).
zink вне форума Ответить с цитированием
Старый 26.10.2011, 20:08   #7
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
program zink;

function _Trim(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  while (I <= L) and (S[I] <= ' ') do Inc(I);
  if I > L then Result := '' else
  begin
    while S[L] <= ' ' do Dec(L);
    Result := Copy(S, I, L - I + 1);
  end;
end;

 procedure _UpperCase(var Value : string);
 var i,p : integer;
 const uRus = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯІЇЄЁ';
      sRus = 'абвгдежзийклмнопрстуфхцчшщъыьэюяіїєё';
 begin
   for i:=1 to LenGth(Value) do
   if (Value[i] >= 'a') and (Value[i] <= 'z') then
       Dec(Value[i], 32) else
   begin
    p:=Pos(Value[i], sRus);
    if p>0 then Value[i]:=uRus[p];
   end;
 end;

 procedure _UpdateSeparator(var Value : string);
 var i : integer;
 const
   separators = '.,:-!?';
 begin
   // готовим файл как набор слов
   for i:=1 to LenGth(Value) do
   if Pos(Value[i], separators)>0 then
   Value[i] := ' ';
 end;

var
  F      : TextFile;
  dump,S : string;
  ss,R,_x   : string;
  i : integer;
begin

  AssignFile(F,'C:\Downloads\one.txt');
  Reset(F);
  dump:=' ';
  while not Eof(f) do
  begin
   readln(F,S);
   _uppercase(S);
   dump:=dump+' '+S;
  end;
  dump:=dump+' ';
  CloseFile(F);
  // dump - содержит весь файл
  _UpdateSeparator(dump);

  AssignFile(F,'C:\Downloads\two.txt');
  Reset(F);

  R:='';
  while not Eof(f) do
  begin
    readln(F,S);
    S:=_Trim(S);
   _UpdateSeparator(S);
   S:=S+' ';
   while pos(' ',S)>0 do
   begin
    _x:=_Trim(copy(s,1,Pos(' ',S)-1));
    delete(s,1,Pos(' ',S));
    ss:=_x;
    _uppercase(ss);

    if Pos(' '+ss+' ', dump)<1 then
    R:=R+_x+' ';
   end;
  end;
  CloseFile(F);

  AssignFile(F,'C:\Downloads\three.txt');
  rewrite(F);
  write(F,R);

  CloseFile(F);
  dump:='';
  R:='';
end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 01.11.2011, 08:09   #8
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

Не работает ваша программа, если даже задать для все переменных тип.
Решил эту задачу:

Код:
var
      txt1,txt2,txt3: array[1..83] of string;
      data,w: string;
      len: integer;
      q1,q2: integer;
      rep1,rep2: integer;
      d,t: integer;
      i,q,k,j: integer;
      F:text;
begin

{Работа с первым файлом}
 Assign(F,'one.txt');
 Reset(F);
   data:='';
     while not Eof(F) do
       begin
         readln(F,w);
         data:=data+' '+w;
       end;
 Close(F);  {Считывание всего текста из первого файла в переменную data}

 delete(data,1,1); {Удаление лишнего пробела в начале текста}
 writeln;
 writeln('1.        Text iz pervogo faila:');
 writeln(data);

len:=length(data);
i:=1;

 while i <= len do
   if data[i] in ['a'..'z','A'..'Z'] then {Вводим условие на непринадлежность символов}
     begin
       w:=upcase(data[i]);
       inc(i);
       while (i <= len) and (data[i] in ['a'..'z','A'..'Z']) do
         begin
           w:=w+upcase(data[i]);
           inc(i);
         end;
       inc(q); {Счетчик слов в массиве}
       txt1[q]:=w; {Вносим слово в ячейку массива}
     end
   else
     inc(i);

q1:=q; {Размерность первого массива}
 writeln('          Massiv slov iz pervogo faila:');
 for i := 1 to q do
   write(txt1[i],' ');

{Работа со вторым файлом}
 Assign(F,'two.txt');
 Reset(F);
   data:='';
     while not Eof(F) do
       begin
         readln(F,w);
   	 data:=data+' '+w;
       end;
 Close(F);

 delete(data,1,1);
 writeln;writeln;writeln;
 writeln('2.        Text iz vtorogo faila:');
 writeln(data);

len:=length(data);
i:=1;
q:=0;

 while i <= len do
   if (data[i] in ['a'..'z','A'..'Z']) then
     begin
       w:=upcase(data[i]);
       inc(i);
       while (i <= len) and (data[i] in ['a'..'z','A'..'Z']) do
         begin
           w:=w+upcase(data[i]);
           inc(i);
         end;
       inc(q);
       txt2[q]:=w;
     end
   else
     inc(i);

q2:=q;
 writeln('          Massiv slov iz vtorogo faila:');
 for i := 1 to q do
   write(txt2[i],' ');
 writeln;writeln;

{Сравнение двух массивов}
data:='';
for i:=1 to q1 do
  begin
    d:=0;
    t:=0;
    j:=0;
    rep1:=0;
    rep2:=0;
  
{Первая строка}
for k:=1 to i do
  if txt1[i] = txt1[k] then
    inc(rep1); {Счетчик повторяющихся слов до i-ого включительно в 1 строке}

    if rep1 < 2 then
      begin
        for k:=1 to q1 do
          if txt1[i] = txt1[k] then
            inc(d); {Счетчик совпадения i-того слова с другими в 1 строке}
      end;

{Вторая строка}
for k:=1 to i do
  if txt1[i] = txt2[k] then
    inc(rep2); {Счетчик повторяющихся слов до i-ого включительно во 2 строке}

    if rep2 < 2 then
      begin
        for k:=1 to q2 do
          if txt1[i] = txt2[k] then
            inc(t); {Счетчик совпадения i-того слова с другими во 2 строке}
        j:=d-t; {Разница повторения слов в 1 и 2 строках}
      end;

    if j > 0 then
       for k:=1 to j do
         data:=data+' '+txt1[i]; {Записываем слово которое не встречается во 2 строке j раз}
 end;
delete(data,1,1); {Удаляем лишний пробел}
writeln;
writeln('3.        Text tret`ego faila:');
writeln(data);readln;
  assign(f,'three.txt');
  rewrite(f);
  write(f, data);
  close(f); {Запись получивщегося текста в 3 файл}
end.

1. Вопрос, массивы txt1,txt2,txt3 не делает больше 83 ( Видимо 255/3=85)
Как можно доработать? Вдруг слов в файле будет > 83
zink вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение двух документов 30gb Microsoft Office Excel 7 13.09.2010 14:14
Сравнение двух произвольных файлов rem2010 Общие вопросы Delphi 2 03.05.2010 13:21
Сравнение двух файлов Excel (поячеечно) для выявления отличий IEEE Microsoft Office Excel 8 21.04.2010 15:45
Работа с файлами. Удаление открытых файлов Diakon Общие вопросы Delphi 4 14.08.2009 17:58
Работа с файлами в Турбо Паскале и Delphi. Сравнение!!!! viksa Помощь студентам 5 21.05.2009 21:32