Паскаль Бесконечный цикл пока - PullRequest
0 голосов
/ 23 ноября 2018

Я внедряю программу на FreePascal в Win10 (64-битная версия).Состояние проблемы:

'Для заданной строки заменить всю подстроку 'child' на 'childhood''

или

'Заменитьвсе 'child' с 'childhood' '

Я пробую эту программу

uses crt;
var s, newS : string;
    tmp, tmp2, tmp3 : int64;
    tmpstr, tmpstr2 : string;
    step, step2, step3 : longint;
    position : longint;

begin
        clrscr;
        write('Nhap xau : '); readln(s);
        //main mechanism

        while pos('child',s) <> 0 do begin
                position := pos('child', s);
                delete(s, pos('child',1), 5);
                insert('childhood',s,position);
                inc(position, 9);
                newS := '';
                for step:=position to length(s) do begin
                        newS := newS + s[step];
                end;
                s := newS;
        end;
        writeln(s);

        readkey;
end.

Вы можете видеть, что эта часть:

inc(position, 9);
newS := '';
for step:=position to length(s) do begin
        newS := newS + s[step];
end;
s := newS;

использовалась дляпопробуйте отрезать цикл while, но это не сработает.Есть идеи?

Спасибо большое и хорошего дня!Спасибо за чтение этой ветки вопросов!=) * * Тысяча двадцать пять

1 Ответ

0 голосов
/ 23 декабря 2018

Это всего лишь одна из возможностей, не оптимизированная, но, пожалуй, самая простая для понимания:

oldstr := 'original child string';
newstr := '';

while oldstr<>'' do begin
  // analyze the string from left to right
  if copy(oldstr, 1 5)='child' then begin
    // match found, perform substitution
    newstr := newstr+'childhood';
    delete(oldstr, 1, 5)
  end else begin
    // does not match, go ahead to the next possibility
    newstr := newstr+oldstr[1];
    delete(oldstr, 1, 1)
  end
end
// now newstr is the desired result

Уловка здесь заключалась в том, чтобы больше не анализировать то, что было добавлено на предыдущем шаге (ребенок-> детство),Приведенный выше алгоритм ( предупреждение , я его не проверял) гарантирует, что любой отдельный символ из исходной строки проверяется только один раз.

...