Страница 1 из 3

[Pascal]Обработка строк

Добавлено: 05 мар 2007, 22:50
maxg5
Дана символьная строка.Удалить из неё все кратные рядом стоящие одинаковые символы,оставив по одному.Напирмер,ФЫЫЫЫВВВААПРО=>ФЫВАПРО

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 02:15
Колядин Максим
Блин, maxq5, у тебя не хватило ума объеденить все эти элементарные задачи в одну тему?! Пять тем создал, притом что с одинаковым топиком!
Решение: создаёшь цикл по массиву строки 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.

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 09:04
somewhere
&quot писал(а):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)

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 09:48
BBB
somewhere писал(а):
Сообщение от Колядин Максим

Код: Выделить всё

for i:= 1 to length(s) do if s[i]=s[i+1] then delete(s,i,1);
1 <= i <= Length(s)
(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
и просто ни разу не выполнится.

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 10:24
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;

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 13:41
Хыиуду
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:
while s=s[i+1] do delete(s,i,1);

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 14:38
somewhere
Забыл else впихнуть

Код: Выделить всё

if s[i]=s[i+1] then delete(s,i,1)
                    else inc(i);

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 16:04
BBB
Хыиуду писал(а):Боюсь, такой код превратит строку АААА в АА, а не просто в А. Лучше опять же через 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;

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 17:09
somewhere
&quot писал(а):Вот поэтому я и писал, что когда в процессе цикла строка (или вообще некий "объект", тот же динамический список, например) "уменьшается", то лучше проходить его не от начала к концу, а от конца к началу. Логика получается проще.
Согласен, базара нет - тут уже дело привычки.

Re: [Pascal]Обработка строк

Добавлено: 06 мар 2007, 17:16
Колядин Максим
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);
(Без -1)