Дана строка. Преобразовать ее, удалив каждый нечетный символ * и повторив каждый символ, предшествующий *.
var
s: string;
k, i: integer;
f, h: text;
begin
assign(f,'input.txt');
reset(f);
readln(s);
k:=0;
i:=0;
while i<>Length(s) do
begin
if s[i]='*' then
begin
inc(k);
if k mod 2<>0 then
begin
delete(s,i,1);
dec(i);
end;
end;
inc(i);
end;
assign(h,'out.txt');
rewrite(h);
writeln(h,s);
close(h);
end.
Твой цикл должен выглядеть так:
i:=1; //начинаем с 1
while i<=Length(s) do //i может равняться последнему символу
begin
if s[i]='*' then
begin
inc(k);
if k mod 2<>0 then
begin
st:=copy(s,i-1,1); //копировали
delete(s,i,1); //удалили
insert(st,s,i); //вставили, теперь значение i тут монижать не надо
end;
end;
inc(i); //изменяем i только здесь
end;
Оля, а символы, предшествующие четным звездочкам чего не удвоила?
Я так по заданию поняла, что это надо делать только с теми, кто перед нечетными звездочками сейчас и такой вариант сделаю))
добавлено: тогда будет так:
i:=1;
while i<=Length(s) do
begin
if s[i]='*' then
begin
st:=copy(s,i-1,1);
inc(k);
insert(st,s,i);
inc(i);
if k mod 2<>0 then delete(s,i,1);
end;
inc(i);
end;
Сложно, однако, и нечитабельно.
Алгоритм - типичный pipeline.
Так зачем его через махинации с текущим индексом делать?