Заменить в тексте все слова, заключенные в кавычки, порядковым номером - Pascal
Формулировка задачи:
Добрый день!Есть такая задачка, она звучит так:
Заменить в тексте все слова, заключенные в кавычки, порядковым номером.
Вот мой код задачи:
Тоесть должно получиться так!Например!
Текст считываем из файла
фыаывап апывап ваыпывап "ваыпвапывап ыпвфап фпп" ерыврвар
Он должен вывести
фыаывап апывап ваыпывап "456" ерыврвар
ВОТ, а у меня выводит тоже самое:фыаывап апывап ваыпывап "ваыпвапывап ыпвфап фпп" ерыврвар
Не знаете в чем проблема?
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.
Решение задачи: «Заменить в тексте все слова, заключенные в кавычки, порядковым номером»
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.
Объяснение кода листинга программы
- Объявляются две переменные типа Text: F1 и F2. Они представляют собой файлы, с которыми работает программа.
- Константы Fn1 и Fn2 используются для обозначения имен двух текстовых файлов, с которыми работает программа.
- В программе используется массив символов D, который содержит все возможные разделители слов, кроме кавычек.
- Переменная K содержит кавычки.
- Переменные StrSrc, StrRes и StrTmp используются для хранения текущей строки, строки результата и временной строки соответственно.
- Переменные i, j и Pw1 используются для отслеживания текущего символа, начала и конца предыдущего слова.
- Переменная Pw2 используется для отслеживания конца текущего слова.
- Переменная Fk используется для отслеживания того, находится ли текущий символ внутри кавычек.
- Цикл while используется для чтения строк из входного файла до тех пор, пока не будет достигнут конец файла.
- Внутри цикла происходит обработка каждой строки:
- Строка записывается в выходной файл.
- Если текущий символ является разделителем, он добавляется в строку результата.
- Если текущий символ находится между кавычками, он заменяется на порядковый номер.
- Если конец слова найден, он обрабатывается в зависимости от того, находится ли слово внутри кавычек или нет.
- Если флаг Fk установлен, то слово внутри кавычек заменяется на порядковый номер.
- Если флаг Fk сброшен, то слово вне кавычек остается без изменений.
- После обработки каждого слова, флаг Pw2 сбрасывается.
- После завершения чтения входного файла программа записывает строку результата в выходной файл и выводит сообщение о завершении работы.
- Программа завершается вызовом функции CloseFile для обоих файлов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д