IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Работа со строками в Pascal
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


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


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.


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


--------------------
не дня без строчки кода.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Твой цикл должен выглядеть так:
 
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;


Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Оля, а символы, предшествующие четным звездочкам чего не удвоила?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


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



Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


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


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.09.2020 19:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name