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

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

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

> Работа со строками в Pascal
NEFFboy
сообщение 7.06.2007 21:31
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
Айра
сообщение 7.06.2007 22:12
Сообщение #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;


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


Гость






Оля, а символы, предшествующие четным звездочкам чего не удвоила?
 К началу страницы 
+ Ответить 
Айра
сообщение 7.06.2007 22:22
Сообщение #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;



Сообщение отредактировано: Айра - 7.06.2007 22:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hardcase
сообщение 8.06.2007 0:41
Сообщение #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

 



- Текстовая версия 20.07.2025 6:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"