Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа со строками в Pascal
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
NEFFboy
Дана строка. Преобразовать ее, удалив каждый нечетный символ * и повторив каждый символ, предшествующий *.


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;
volvo
Оля, а символы, предшествующие четным звездочкам чего не удвоила?
Айра
Я так по заданию поняла, что это надо делать только с теми, кто перед нечетными звездочками wink.gif сейчас и такой вариант сделаю))


добавлено: тогда будет так:
 
  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;

hardcase
Сложно, однако, и нечитабельно.
Алгоритм - типичный pipeline.
Так зачем его через махинации с текущим индексом делать?
Код

function TransformString(S: string): string;
var res: string; // результат
    i: integer;
    asterCount: integer; //счетчик '*'
    nextChar: Char; // текущий символ
    prevChar: Char; // предыдущий записанный символ
begin
  asterCount := 0;
  prevChar := #0;
  for i := 1 to Length(S) do begin
    // получаем следующий символ
    nextChar := S[i];
    if nextChar = '*' then begin
      inc(asterCount);
      // дублируем предыдущий симовол
      if prevChar <> #0 then
        res := res + prevChar;        
      // пропускаем запись нечетных '*' в результат  
      if (asterCount mod 2) <> 0 then
        Continue;      
    end;
    // записываем следующий символ в результат
    res := res + nextChar;
    prevChar := nextChar;
  end;
  TransformString := res;
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.