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

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

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

> Задача на строки, помогите разобраться
сообщение
Сообщение #1





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

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


В общем задача состоит в следующим: Дана последовательность символов. Заменить все восклицательные знаки на точки, все точки на многоточие, ряды тоящих рядом точек одной точкой.
Например a!!.bc....d..e.! => a.....bc.d.e....

в общем вот что у меня получилось:

var
s: string;
p: integer;

begin
s := 'a!!bc....d..e.!';
repeat
p := pos('!', s);
if p > 0 then begin
delete(s, p, length('!'));
insert('.', s, p);
end;
until p = 0;
writeln(s);
end.


восклицательные знаки заменяются нормально. Но при добавлении такого же цикла для точек он уходит в себя. Как сделать правильно?

Еще вопрос как превратить последовательность рядом стоящих точек в одну. Я нашел только как превращать последовательность ЛЮБЫХ символов в один.

var s:string;
var i:integer;
begin
s:='a!!bc....d..e.!';
for i:=1 to ord(s[0]) do
while (s[i]=s[i+1]) and (I<length(s)) do
delete (s,i,1);
writeln(s);
end.




Помогите решить задачку. Или дайте ссылку на подобную (то что я нашел - написал выше)
Заранее благодарен.

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


Профи
****

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

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


Цитата
Но при добавлении такого же цикла для точек он уходит в себя.

Правильно. Ведь ты точку, не удаляешь, а заменяешь на много точек, а выход из цикла у тебя тогда, когда точек уже не найдено. Поэтому он крутится бесконечно)))

Чтобы нормально заменялись группа точек и одна, предлагаю сделать так: сначала мы все отдельностоящие точки заменяем на '?', потом издеваемся над остальными знаками (сначала над группами точек, потом над '!'), а затем ?-ы меняем на '...'.
выглядит это приблизительно воть так:
uses wincrt;
var
s: string;
p,i,t,z: integer;

begin
s := 'a!!.bc....d..e.!';
writeln(s);
t := 1; {меняем одну точку на '?'}
while t <= length(s) do begin
while (s[t] = '.') and (s[t]<>s[t+1]) and (s[t]<>s[t-1]) and (t<length(s)) do
begin
delete (s,t,1);
insert('?',s,t);
end;
inc(t);
end;

i := 1;
while i <= length(s) do begin { группу точек на одну}
while (s[i] = '.') and (s[i]=s[i+1]) and (I<length(s)) do delete (s,i,1);
inc(i);
end;

repeat
p := pos('!', s); { '!' на '.' }
if p > 0 then begin
delete(s, p, length('!'));
insert('.', s, p);
end;
until p = 0;

repeat
z := pos('?', s); {и конечно '?' на '.'}
if z > 0 then begin
delete(s,z,1);
insert('...', s, z);
end;
until p = z;

writeln(s); {довольствуемся результатом smile.gif }
end.


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

Сообщений в этой теме


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

 





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