[Pascal]Обработка строк
Добавлено: 05 мар 2007, 22:50
Дана символьная строка.Удалить из неё все кратные рядом стоящие одинаковые символы,оставив по одному.Напирмер,ФЫЫЫЫВВВААПРО=>ФЫВАПРО
Код: Выделить всё
uses crt;
var s: string;
i: integer;
begin
clrscr;
readln(s);
writeln('До: ',s);
for i:= 1 to length(s) do if s[i]=s[i+1] then delete(s,i,1);
writeln('После: ',s);
readkey;
end.
" писал(а):for i:= 1 to length(s) do if s=s[i+1] then delete(s,i,1);
Обычный краевой эффект.somewhere писал(а):1 <= i <= Length(s)Сообщение от Колядин МаксимКод: Выделить всё
for i:= 1 to length(s) do if s[i]=s[i+1] then delete(s,i,1);
(s[i+1]) i+1 > length(s)
Код: Выделить всё
var i : integer;
for i:= (length(s)-1) downto 1 do
if s[i]=s[i+1] then
delete(s,i,1);
Код: Выделить всё
i := 1;
While (i < length(s)) do
begin
if s[i]=s[i+1] then delete(s,i,1);
inc(i);
end;
Боюсь, такой код превратит строку АААА в АА, а не просто в А. Лучше опять же через while:somewhere писал(а):Все-таки For - подразумевает для меня работу в статике: т.е. конкретно от А до В.
В связи с динамикой Length(S) я бы сделал через WhileКод: Выделить всё
i := 1; While (i < length(s)) do begin if s[i]=s[i+1] then delete(s,i,1); inc(i); end;
Код: Выделить всё
if s[i]=s[i+1] then delete(s,i,1)
else inc(i);
Хыиуду писал(а):Боюсь, такой код превратит строку АААА в АА, а не просто в А. Лучше опять же через while:
while s=s[i+1] do delete(s,i,1);
Код: Выделить всё
i := length(s) - 1;
While (i > 0) do
begin
if s[i]=s[i+1] then delete(s,i,1);
Dec (i);
end;
Согласен, базара нет - тут уже дело привычки." писал(а):Вот поэтому я и писал, что когда в процессе цикла строка (или вообще некий "объект", тот же динамический список, например) "уменьшается", то лучше проходить его не от начала к концу, а от конца к началу. Логика получается проще.
Если уж быть совсем "кратким" кодером, тогда можно:BBB писал(а):Код: Выделить всё
var i : integer]=s[i+1] then delete(s,i,1);
Код: Выделить всё
for i:= length(s) downto 1 do if s[i]=s[i+1] then delete(s,i,1);