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

maxg5
Сообщения: 10
Зарегистрирован: 06 фев 2007, 21:54

Дана символьная строка.Удалить из неё все кратные рядом стоящие одинаковые символы,оставив по одному.Напирмер,ФЫЫЫЫВВВААПРО=>ФЫВАПРО
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Блин, 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.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&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)
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

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
и просто ни разу не выполнится.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Все-таки 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;
It's a long way to the top if you wanna rock'n'roll
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

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);
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Забыл 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
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Хыиуду писал(а):Боюсь, такой код превратит строку АААА в АА, а не просто в А. Лучше опять же через 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;
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Вот поэтому я и писал, что когда в процессе цикла строка (или вообще некий "объект", тот же динамический список, например) "уменьшается", то лучше проходить его не от начала к концу, а от конца к началу. Логика получается проще.
Согласен, базара нет - тут уже дело привычки.
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);
(Без -1)
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Ответить