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

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

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

 
 Ответить  Открыть новую тему 
> замена символа в строке на другой символ, замена символа в строке на другой символ
marwell
сообщение 17.12.2009 16:22
Сообщение #1


Бывалый
***

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

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


плиз, помогите решить, а то чет не получается dry.gif В строке символов надо везде, где встречается символ "пробел", заменить его на два "пробела"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.12.2009 16:43
Сообщение #2


Гость






Что не получается? Что пробовал, можно посмотреть? Вообще все должно получаться, если идти от хвоста строки в ее начало (и НЕ циклом for, естественно)
 К началу страницы 
+ Ответить 
Unconnected
сообщение 17.12.2009 16:59
Сообщение #3


mea culpa
*****

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

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


А если встречается два пробела? Это будет отдельный символ "два пробела" или программа должна обработать каджый?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.12.2009 17:02
Сообщение #4


Гость






Цитата
В строке символов надо везде, где встречается символ "пробел", заменить его на два "пробела"
Значит, заменить на 4. Но я настоятельно рекомендую не приводить код до тех пор, пока ТС не покажет свои наработки...
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2009 3:58
Сообщение #5


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(volvo @ 17.12.2009 16:43) *
идти от хвоста строки в ее начало (и НЕ циклом for, естественно)
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 18.12.2009 10:02
Сообщение #6


Гуру
*****

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

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


Цитата(Lapp @ 18.12.2009 3:58) *
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
Я тоже об этом подумал.
А еще о том, что не суть важно, перебирать от конца к началу или от начала к концу.
Но, несмотря на некоторую излишнюю категоричность утверждения, IMHO именно предложенный вариант самый простой в реализации.
В сообщениях volvo некедко явно либо неявно проскальзывает мысль, что предложенный им оптимальный вариант является единственно возможным. И, хотя формально это неверно, с дидактической точки зрения он, возможно, прав - нужно учить писать программы сразу оптимально.

PS. А еще неплохо было бы, если бы название темы соответствовало содержанию. Ну нет такого символа "два пробела".

Сообщение отредактировано: andriano - 18.12.2009 10:05
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.12.2009 10:38
Сообщение #7


Гость






Цитата
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
А зачем тебе лишняя головная боль? Как ты собрался без этой самой головной боли заменить в строке (заметь, не переписать в другую строку, заменяя встреченный пробел на два, а именно заменить) один символ на два? Размер строки меняется, а For-у на это наплевать, он на каждой итерации условие окончания не вычисляет...
 К началу страницы 
+ Ответить 
andriano
сообщение 18.12.2009 11:26
Сообщение #8


Гуру
*****

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

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


Цитата(volvo @ 18.12.2009 10:38) *
Размер строки меняется, а For-у на это наплевать, он на каждой итерации условие окончания не вычисляет...
И что с того?
Все равно нам надо просмотреть именно ТО количество символов, которое было в первоначальной строке, а добавленные - не просмаривать.
Т.е. все условия цикла с наперед известным количеством повторений.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.12.2009 11:39
Сообщение #9


Гость






Да? Ну, попробуй:
s := 'вот  тебе  задачка    123';
Приведи решение с циклом For, я посмотрю, как, используя информацию об ИЗНАЧАЛЬНОЙ длине строки ты обработаешь последние пробелы... Никаких предварительных пробегов по строке, ибо While-вариант обойдется без этого...

Еще раз: НЕ записать в другую строку, а добавить в эту же, по условию...

Цитата
Все равно нам надо просмотреть именно ТО количество символов, которое было в первоначальной строке, а добавленные - не просмаривать.
Ты задание читал внимательно? Нам надо добавлять пробелы не в конец сроки, а в середину...
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2009 12:04
Сообщение #10


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(volvo @ 18.12.2009 11:39) *
Ты задание читал внимательно? Нам надо добавлять пробелы не в конец сроки, а в середину...
volvo, я что-то совсем перестал тебя понимать.. Я так туплю?
Что тут плохого:
var
s: string;
i: integer;

begin
s := 'вот тебе задачка 123';
for i:=Length(s) downto 1 do if s[i]=' ' then begin
Delete(s,i,1);
Insert(' ',s,i)
end;
WriteLn(s);
ReadLn
end.
- ? blink.gif

Добавлено через 2 мин.
Delete я вставил для большей общности (типа замена на два других символа)


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 18.12.2009 13:15
Сообщение #11


mea culpa
*****

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

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


Я, кстати, вчера по другой задаче задумывался над этим: цикл for единожды берет начальный параметр или при каждой итерации и потом что-то прибавляет/вычитает? Видимо, единожды, т.к. вариант Lapp'а работает, а там в качестве задания начального значения параметру цикла используется меняющаяся длина строки..


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2009 13:39
Сообщение #12


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Unconnected @ 18.12.2009 13:15) *
цикл for единожды берет начальный параметр или при каждой итерации и потом что-то прибавляет/вычитает? Видимо, единожды, т.к. вариант Lapp'а работает, а там в качестве задания начального значения параметру цикла используется меняющаяся длина строки..
В моем коде это прозрачно - первый параметр вроде как очевидно единожды. Второй - менее очевидно, и вопрос вполне законный. Ответ: да, единожды, в начале. Если переменная, использованная для второго предела изменяется во время исполнения, это никак не влияет на реальные пределы.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 18.12.2009 14:17
Сообщение #13


Гуру
*****

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

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


Цитата(volvo @ 18.12.2009 11:39) *
Еще раз: НЕ записать в другую строку, а добавить в эту же, по условию...

Ты задание читал внимательно? Нам надо добавлять пробелы не в конец сроки, а в середину...
Два вари анта на выбор:
  j := 1;
for i := 1 to length(s) do begin
if s[j] = ' ' then begin
insert(' ',s,j);
inc(j);
end;
inc(j);
end;

for i := length(s) downto 1 do
if s[i] = ' ' then
insert(' ',s,j);

Правка: исправлена опечатка.

Сообщение отредактировано: andriano - 18.12.2009 20:43
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 18.12.2009 14:45
Сообщение #14


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(andriano @ 18.12.2009 14:17) *

Два вари анта на выбор:
  j := 1;
for i := 1 to length(s) do begin
if s[i] = ' ' then begin
insert(' ',s,j);
inc(j);
end;
inc(j);
end;

for i := length(s) downto 1 do
if s[i] = ' ' then
insert(' ',s,j);



Боюсь, первый вариант пролетает...
вот т е бе зад а ч к а 1 23
Впрочем, как и второй..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
marwell
сообщение 18.12.2009 17:11
Сообщение #15


Бывалый
***

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

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


Цитата(volvo @ 17.12.2009 16:43) *

Что не получается? Что пробовал, можно посмотреть? Вообще все должно получаться, если идти от хвоста строки в ее начало (и НЕ циклом for, естественно)


s,s1:string;
s1:='';
s:='blablabla--текст';
i:integer;
for i:=0 to length(s) do
if s[i]=' ' then
s1:=s1+' ' else s1:=s1+s[i];

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 18.12.2009 20:40
Сообщение #16


Гуру
*****

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

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


Цитата(Lapp @ 18.12.2009 14:45) *

Боюсь, первый вариант пролетает...
вот т е бе зад а ч к а 1 23
Впрочем, как и второй..

Да, в первом Варианте опечатка. А насчет второго - не понимаю.
Специально поставил на комп компилятор паскаля.
Полностью программа:
var
s : string;
i,j : longint;
begin
s := 'вот т е бе зад а ч к а 1 23';
writeln('<',s,'>');
j := 1;
for i := 1 to length(s) do begin
if s[j] = ' ' then begin
insert(' ',s,j);
inc(j);
end;
inc(j);
end;
writeln('<',s,'>');
s := 'вот т е бе зад а ч к а 1 23';
writeln('<',s,'>');

for i := length(s) downto 1 do
if s[i] = ' ' then
insert(' ',s,i);
writeln('<',s,'>');
end.

Результат работы:
Код
<вот т е бе зад а ч к а 1 23>
<вот  т  е  бе  зад  а  ч  к  а  1  23>
<вот т е бе зад а ч к а 1 23>
<вот  т  е  бе  зад  а  ч  к  а  1  23>


Сообщение отредактировано: andriano - 18.12.2009 20:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 19.12.2009 1:43
Сообщение #17


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(andriano @ 18.12.2009 20:40) *
Да, в первом Варианте опечатка. А насчет второго - не понимаю.
Ну и во втором тоже опечатка.. Только она почему-то не попала в твой код.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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