Удалить текст между скобками - Pascal
Формулировка задачи:
Найдите, пожалуйста, ошибку. Эта программа должна удалить все символы, заключенные между круглыми скобками, и вывести результат на экран.
Например,
Ввод:
Я пошел в театр (сказал он тихим голосом), скоро вернусь.Вывод:
Я пошел в театр , скоро вернусь. А у меня такойвывод:
Я пошел в театр То есть то, что находится после скобок на экран не выводится. Найдите ошибку.Program EX_4_STRING;
Uses crt;
Var a: string;
i,m,j: integer;
b: array [1..100] of integer;
Begin
clrscr;
Write(' Vvegite stroku ');
Readln(a);
m:=0;
For i:= 1 to length(a) do
Begin
if a[i]='('
then
begin
for j:= i to length(a) do
begin
if a[j]=')'
then
inc(m);
b[m]:=j;
end;
break;
end;
end;
delete(a,i,b[m]-i+1);
Writeln('');
For i:= 1 to length(a) do
Write(a[i]);
Readln;
end.Решение задачи: «Удалить текст между скобками»
textual
Листинг программы
Var S,s1,s2 : String;
I, B, L : Integer; { I - для цикла, B - скобка открывается, L - длинна фрагмента в скобках }
Begin
//~~~~~~~~~~~~~~~~~~~~~~~~~~
readln(s);
writeln ('убрать ');
readln(s1);
readln(s2);
//~~~~~~~~~~~~~~~~~~~~~~~~~~
B := Pos(s1,S); { Ищем первую скобку }
While B<>0 do { Если скобка найдена... }
Begin
L := 0;
For I := B to Length(S) do { ищем закрытие скобки }
Begin
If S[I]=s2 then break else L := L + 1;
End;
Delete(S,B,L+1); { удаляем фрагмент }
B := Pos(s1,S); { поиск следующей скобки }
End;
WriteLn(S);
End.
Объяснение кода листинга программы
- Объявляются переменные S, s1, s2 типа String, а также переменные I, B, L типа Integer.
- В цикле читаются строки, которые необходимо удалить между скобками.
- Переменная B инициализируется значением, полученным от функции Pos, которая ищет первое вхождение подстроки s1 в строке S.
- Запускается цикл While, который продолжается до тех пор, пока значение переменной B не станет равным нулю. Это происходит, когда встречена первая скобка.
- Внутри цикла While инициализируется переменная L значением 0. Затем запускается вложенный цикл For, который проходит по каждому символу в строке S, начиная с позиции B и до конца строки (включительно).
- Внутри вложенного цикла For проверяется, совпадает ли текущий символ с подстрокой s2. Если да, то цикл прерывается командой break. В противном случае переменная L увеличивается на 1.
- После завершения вложенного цикла For переменная L используется командой Delete для удаления фрагмента строки S, начиная с позиции B и заканчивая позицией L+1.
- Переменная B обновляется значением, полученным от функции Pos, которая ищет следующее вхождение подстроки s1 в строке S.
- Выводится итоговая строка S.
- Программа завершается.