Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка текстов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Amigos3210
Помогите пожалуйста найти ошибку в коде. Задание следующее:

Обработка текстов.
Задан текст, состоящий из строк произвольной длины. Строки разделяются одним или несколькими символами, называемыми разделителями. Разделители одинаковы для всего текста. Текст заканчивается комбинацией двух специальных символов, отличных от разделителя.
Выполнить над текстом последовательность действий, указанную в задании.

а) Определить порядковые номера, считая от начала текста, определенных слогов, которые задаются в исходных данных;
б) сформировать новый текст, в котором каждый такой слог заключен в кавычки.

program strings;
uses
    crt;
const
     n = 20;	{Максимальное количество строк, читаемое из файла}
var
   fin,fout : Text;		{Входной и выходной файлы}
   s : array [1..n] of string; {Текст - массив строк}
   substr : string;		{Искомый слог - подстрока}
   i,c,k,p : integer;
begin
     clrscr;
     assign(fin,'input.txt'); {Открываем входной файл}
     reset(fin);
     assign(fout,'output.txt'); {Открываем выходной файл}
     rewrite(fout);
     k:=0; {Количество строк во входном файле}
     while (not eof(fin) and (k<n)) do
           begin
                k:=k+1;
                readln(fin,s[k]); {Записываем содержимое файла в массив строк}
           end;
     if k = 0 then writeln('Error: file is empty'); {На всякий случай, если входной файл - пустой}

     for i:=1 to k do writeln(s[i]); {Выводим на экран содержимое массива}

     writeln('Enter substring to search:');
     readln(substr);
     p:=0; {Переменная для хранения текущей позиции искомой подстроки, если не найдено подстроки = 0}
     i:=1; {Итератор}
     c:=0; {Курсор относительно текста, нужен чтобы получать абсолютную позицию подстроки}
     repeat
           begin
                p:=pos(substr,s[i]);
                i:=i+1;
           end
     until (p>0) or (i>k); {Проверяем, содержится ли подстрока вообще в тексте}

     if p = 0 then
        begin
             writeln('Error: no substring founded.'); {Если подстроки нет, выводим сообщение}
             for i:=1 to k do writeln(fout,s[i]); {И переписываем содержимое массива в выходной файл}
        end
     else	{Если подстрока содержится в тексте}
         for i:=1 to k do
             begin
                  p:=pos(substr,s[i]);
                  if p = 0 then {Проверяем, содержится ли она в i-ой строке}
                     begin
                          writeln(fout,s[i]); {Если нет, то просто переписываем строку в выходной файл}
                          c:=c+length(s[i]); {Передвигаем курсор на длину строки}
                     end
                  else 
                      begin
                           while p>0 do {Если содержится, то в цикле по всем вхождениям подстроки...}
                                 begin
                                      write(fout,copy(s[i],1,p-1)+'"'+substr+'"'); {записываем в файл начало строки и подстроку в кавычках}
                                      write(c+p,' '); {выводим на экран абсолютную позицию}
                                      c:=c+p+length(substr); {сдвигаем курсор}
                                      delete(s[i],1,p+length(substr)-1); {удаляем из исходной строки начало и подстроку}
                                      p:=pos(substr,s[i]); {ищем новое вхождение подстроки в строке}
                                 end;
                           writeln(fout,s[i]); {дописываем оставшийся кусок строки}
                      end;
             end;
     repeat until keypressed;
     close(fin); {закрываем файлы}
     close(fout); 
end.



смущает то, что ведется несколько кривой подсчет порядковых номеров заданного слога.
Заранее благодарен, если кого-то не затруднит.

М
Теги! Правила Форума, п.5, и правила раздела Задачи, п.2.
Исправлено.
- Lapp

IUnknown
Ну, как-то вот так:

program strings;
uses
   crt;
const
   n = 120; {Максимальное количество строк, читаемое из файла}
var
   fin,fout : Text; {Входной и выходной файлы}
   s : array [1..n] of string; {Текст - массив строк}
   substr : string; {Искомый слог - подстрока}
   i,k,p : integer;
   counter, start, cumulative_len : integer;
begin
   clrscr;
   assign(fin,'input.txt'); {Открываем входной файл}
   reset(fin);
   assign(fout,'output.txt'); {Открываем выходной файл}
   rewrite(fout);
   
   k:=0; {Количество строк во входном файле}
   while (not eof(fin) and (k<n)) do
   begin
      k:=k+1;
      readln(fin,s[k]); {Записываем содержимое файла в массив строк}
   end;
   if k = 0 then writeln('Error: file is empty') {На всякий случай, если входной файл - пустой}
   else
   begin
      for i:=1 to k do writeln(s[i]); {Выводим на экран содержимое массива}
      writeln('Enter substring to search:');
      readln(substr);
      
      start := 0;
      cumulative_len := 0;
      for i := 1 to k do 
      begin
         start := 1; counter := 0;
         repeat
            p := pos(substr, copy(s[i], start + 1, length(s)));
            if p > 0 then
            begin
	       insert('"', s[i], start + p + length(substr));
	       insert('"', s[i], start + p);
	       writeln(cumulative_len, ' ', start, ' ', p, ' ', counter);
	       writeln('=>', cumulative_len + start + p - 2*counter, ' ');
	       inc(start, p + length(substr) + 2);
	       inc(counter);
	    end;
	 until p = 0;
	 inc(cumulative_len, length(s[i]) - 2 * counter);
	 writeln(fout, s[i]);
      end;
   end;
   repeat until keypressed;
   close(fin); {закрываем файлы}
   close(fout);
end.
(первая часть оставлена без изменений, заменил только добавление кавычек и подсчет позиции). На файле
Цитата
items on even addresses are accessed are in one memory cycle.
on odd addresses are accessed in two memory cycles.
(исковерканный мной для нужд тестирования кусок хелпа Турбо-Паскаля) выдало результаты:
Enter substring to search:
are
=>25
=>38
=>79


, что является правильным (если подразумевается позиция в изначальном тексте, без учета добавленных кавычек. Если надо учитывать добавленные кавычки, то, при вычислении накапливающейся длины текста, не надо вычитать 2*counter из длины строки, точно так же - не надо вычитать это же произведение при выводе результатов на экран)... В общем, идея должна быть понятна, разбирайся, как это работает. Как разберешься - скажи. Я задам тебе несколько вопросов (чтобы ты мог понять, действительно ли ты до конца вник в то, что происходит. smile.gif Если тебе это нужно, конечно, а не просто "сдал - забыл")
Amigos3210
Спасибо, вам, большое за то, что так безвозмездно помогаете другим. Обязательно для себя разберусь
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.