[Pascal]Обработка строк
Дана символьная строка.Удалить из неё все кратные рядом стоящие одинаковые символы,оставив по одному.Напирмер,ФЫЫЫЫВВВААПРО=>ФЫВАПРО
- Колядин Максим
- Сообщения: 297
- Зарегистрирован: 16 ноя 2006, 19:09
- Откуда: Seattle, WA
- Контактная информация:
Блин, maxq5, у тебя не хватило ума объеденить все эти элементарные задачи в одну тему?! Пять тем создал, притом что с одинаковым топиком!
Решение: создаёшь цикл по массиву строки S, и если s=s[i+1], улаляешь в строке S 1 символ, начиная с i-го.
Вот код:
Решение: создаёшь цикл по массиву строки S, и если s=s[i+1], улаляешь в строке S 1 символ, начиная с i-го.
Вот код:
Код: Выделить всё
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);
1 <= i <= Length(s)
(s[i+1]) i+1 > length(s)
It's a long way to the top if you wanna rock'n'roll
Обычный краевой эффект.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)
Так как мы сравниваем символы со стоящими справа от них, то, разумеется, "циклить" надо до (длина - 1).
Плюс, так как жлина строки в связи с удалением постоянно уменьшается, то я бы шел не "вперед" по строке, "а назад".
Код: Выделить всё
var i : integer;
for i:= (length(s)-1) downto 1 do
if s[i]=s[i+1] then
delete(s,i,1);
for i:= -1 downto 1 do
и просто ни разу не выполнится.
Все-таки For - подразумевает для меня работу в статике: т.е. конкретно от А до В.
В связи с динамикой Length(S) я бы сделал через While
В связи с динамикой 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;
It's a long way to the top if you wanna rock'n'roll
Боюсь, такой код превратит строку АААА в АА, а не просто в А. Лучше опять же через 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;
while s=s[i+1] do delete(s,i,1);
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Забыл else впихнуть
Код: Выделить всё
if s[i]=s[i+1] then delete(s,i,1)
else inc(i);
It's a long way to the top if you wanna rock'n'roll
Хыиуду писал(а):Боюсь, такой код превратит строку АААА в АА, а не просто в А. Лучше опять же через 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;
Согласен, базара нет - тут уже дело привычки." писал(а):Вот поэтому я и писал, что когда в процессе цикла строка (или вообще некий "объект", тот же динамический список, например) "уменьшается", то лучше проходить его не от начала к концу, а от конца к началу. Логика получается проще.
It's a long way to the top if you wanna rock'n'roll
- Колядин Максим
- Сообщения: 297
- Зарегистрирован: 16 ноя 2006, 19:09
- Откуда: Seattle, WA
- Контактная информация:
Если уж быть совсем "кратким" кодером, тогда можно: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);
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...