Заменить в тексте все слова, заключенные в кавычки, порядковым номером - Pascal

Узнай цену своей работы

Формулировка задачи:

Добрый день!Есть такая задачка, она звучит так: Заменить в тексте все слова, заключенные в кавычки, порядковым номером. Вот мой код задачи:
Program z1;
const rz=[' ','.',',',';',':','?','!'];
var f,g:text;
i,k:byte;
nf,ng,s,s1:string;
begin
writeln('Vvedite imya faila dlya 4teniya');
readln(nf);
assign(f,nf);
writeln('Vvedite imya faila dlya zapisi: ');
readln(ng);
assign(g,ng);
rewrite(g);
while not eof(f) do
begin
readln(f,s);
k:=1;
i:=1;
while i<length(s) do
if ((s[i] in rz)and not(s[i+1] in rz)) or((i=1)and (s[i] in rz)) then
begin
k:=k+1;
if s[i]='"' then
begin
i:=i+1;
str(k,s1);
insert(s1,s,i);
i:=i+length(s1);
while s[i]<>'"' do
delete(s,i,1);
i:=i+1;
k:=k+1;
end;
end
else i:=i+1;
writeln(g,s);
end;
close(f);
close(g);
write('Ishodnui fail',’ ’,nf,’ ’,'Perepisan I poly4ilis',’ ’,ng);
readln;
end.
Тоесть должно получиться так!Например! Текст считываем из файла фыаывап апывап ваыпывап "ваыпвапывап ыпвфап фпп" ерыврвар Он должен вывести фыаывап апывап ваыпывап "456" ерыврвар ВОТ, а у меня выводит тоже самое:фыаывап апывап ваыпывап "ваыпвапывап ыпвфап фпп" ерыврвар Не знаете в чем проблема?

Решение задачи: «Заменить в тексте все слова, заключенные в кавычки, порядковым номером»

textual
Листинг программы
program Project1;
 
const
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  (*Кавычка*)
  K = ['"'];
  (*Разделители слов.*)
  D = [',', '.', '!', '?', ' ', #9, #10, #13] + K;
 
var
  F1, F2 : Text;
  StrSrc, StrRes, StrTmp : String;
  i, j, Pw1, Pw2 : Integer;
  Fk : Boolean;
begin
  AssignFile(F1, Fn1);
  {$I-}
  Reset(F1);
  {$I+}
  if IOResult <> 0 then begin
    Writeln('Ошибка. Входной файл с именем: "', Fn1, '" не удалось открыть.');
    Writeln('Возможно, файла с таким именем не существует.');
    Writeln('Действие отменено. Программа прервана.');
    Readln;
    Exit;
  end;
 
  AssignFile(F2, Fn2);
  Rewrite(F2);
 
  Pw1 := 0;
  Pw2 := 0;
  Fk := False;
  j := 0;
  while not Eof(F1) do begin
    (*Читаем очередную строку из входного файла.*)
    Read(F1, StrSrc);
    (*Строка результата.*)
    StrRes := '';
    (*Обработка строки, прочитанной из входного файла и формирование строки результата.*)
    for i := 1 to Length(StrSrc) do begin
 
      (*Наблюдения и перепись разделителей.*)
 
      (*Отслеживание слов и разделителей слов.*)
      if not ( StrSrc[i] in D ) then begin
        (*Очередной символ не является разделителем.*)
        (*Отслеживаем начало слова.*)
        if i = 1 then
          Pw1 := i
        else if StrSrc[i - 1] in D then
          Pw1 := i
        ;
        (*Отслеживаем конец слова.*)
        if i = Length(StrSrc) then
          Pw2 := i
        else if StrSrc[i + 1] in D then
          Pw2 := i
        ;
      end else begin
        (*Очередной символ является разделителем, переписываем его в результирующую
        строку.*)
        StrRes := StrRes + StrSrc[i];
      end;
 
      (*Отслеживание кавычек.*)
      if StrSrc[i] in K then
        Fk := not Fk
      ;
 
      (*Обработка результатов наблюдения и перепись слов.*)
 
      (*Если конец слова найден - обрабатываем его.*)
      if Pw2 > 0 then begin
        Inc(j);
        (*В зависимости от положения слова относительно кавычек.*)
        if Fk then begin
          (*Слово внутри кавычек.
          Заменяем слово на его порядковый номер.*)
          Str(j, StrTmp);
          StrRes := StrRes + StrTmp;
        end else begin
          (*Слово вне кавычек.
          Переписываем слово как есть.*)
          StrRes := StrRes + Copy(StrSrc, Pw1, Pw2 - Pw1 + 1);
        end;
        (*Сбрасываем флаг-позицию конца слова.*)
        Pw2 := 0;
      end; (*if Pw2 > 0 then*)
    end; (*for i := 1 to Length(StrSrc) do*)
 
    (*Записываем строку результата в выходной файл.*)
    Write(F2, StrRes);
    if not Eof(F1) then begin
      Readln(F1);
      Writeln(F2);
    end;
  end; (*while not Eof(F1) do*)
 
  CloseFile(F1);
  CloseFile(F2);
 
  Writeln('Выходной файл сформирован.');
  Readln;
end.

Объяснение кода листинга программы

  1. Объявляются две переменные типа Text: F1 и F2. Они представляют собой файлы, с которыми работает программа.
  2. Константы Fn1 и Fn2 используются для обозначения имен двух текстовых файлов, с которыми работает программа.
  3. В программе используется массив символов D, который содержит все возможные разделители слов, кроме кавычек.
  4. Переменная K содержит кавычки.
  5. Переменные StrSrc, StrRes и StrTmp используются для хранения текущей строки, строки результата и временной строки соответственно.
  6. Переменные i, j и Pw1 используются для отслеживания текущего символа, начала и конца предыдущего слова.
  7. Переменная Pw2 используется для отслеживания конца текущего слова.
  8. Переменная Fk используется для отслеживания того, находится ли текущий символ внутри кавычек.
  9. Цикл while используется для чтения строк из входного файла до тех пор, пока не будет достигнут конец файла.
  10. Внутри цикла происходит обработка каждой строки:
    • Строка записывается в выходной файл.
    • Если текущий символ является разделителем, он добавляется в строку результата.
    • Если текущий символ находится между кавычками, он заменяется на порядковый номер.
    • Если конец слова найден, он обрабатывается в зависимости от того, находится ли слово внутри кавычек или нет.
    • Если флаг Fk установлен, то слово внутри кавычек заменяется на порядковый номер.
    • Если флаг Fk сброшен, то слово вне кавычек остается без изменений.
    • После обработки каждого слова, флаг Pw2 сбрасывается.
  11. После завершения чтения входного файла программа записывает строку результата в выходной файл и выводит сообщение о завершении работы.
  12. Программа завершается вызовом функции CloseFile для обоих файлов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.125 из 5
Похожие ответы