Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Работа со строками в Pascal

Автор: NEFFboy 8.06.2007 1:31

Дана строка. Преобразовать ее, удалив каждый нечетный символ * и повторив каждый символ, предшествующий *.


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.


у меня только удаляет каждый нечетный символ *, киньте исодник, как повторить каждый символ, предшествующий *.
Заранее спасибо!

Автор: Айра 8.06.2007 2:12

Твой цикл должен выглядеть так:

 
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 8.06.2007 2:14

Оля, а символы, предшествующие четным звездочкам чего не удвоила?

Автор: Айра 8.06.2007 2:22

Я так по заданию поняла, что это надо делать только с теми, кто перед нечетными звездочками 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 8.06.2007 4:41

Сложно, однако, и нечитабельно.
Алгоритм - типичный 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;