Помощь - Поиск - Пользователи - Календарь
Полная версия: замена символа в строке на другой символ
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
плиз, помогите решить, а то чет не получается dry.gif В строке символов надо везде, где встречается символ "пробел", заменить его на два "пробела"
volvo
Что не получается? Что пробовал, можно посмотреть? Вообще все должно получаться, если идти от хвоста строки в ее начало (и НЕ циклом for, естественно)
Unconnected
А если встречается два пробела? Это будет отдельный символ "два пробела" или программа должна обработать каджый?
volvo
Цитата
В строке символов надо везде, где встречается символ "пробел", заменить его на два "пробела"
Значит, заменить на 4. Но я настоятельно рекомендую не приводить код до тех пор, пока ТС не покажет свои наработки...
Lapp
Цитата(volvo @ 17.12.2009 16:43) *
идти от хвоста строки в ее начало (и НЕ циклом for, естественно)
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
andriano
Цитата(Lapp @ 18.12.2009 3:58) *
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
Я тоже об этом подумал.
А еще о том, что не суть важно, перебирать от конца к началу или от начала к концу.
Но, несмотря на некоторую излишнюю категоричность утверждения, IMHO именно предложенный вариант самый простой в реализации.
В сообщениях volvo некедко явно либо неявно проскальзывает мысль, что предложенный им оптимальный вариант является единственно возможным. И, хотя формально это неверно, с дидактической точки зрения он, возможно, прав - нужно учить писать программы сразу оптимально.

PS. А еще неплохо было бы, если бы название темы соответствовало содержанию. Ну нет такого символа "два пробела".
volvo
Цитата
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
А зачем тебе лишняя головная боль? Как ты собрался без этой самой головной боли заменить в строке (заметь, не переписать в другую строку, заменяя встреченный пробел на два, а именно заменить) один символ на два? Размер строки меняется, а For-у на это наплевать, он на каждой итерации условие окончания не вычисляет...
andriano
Цитата(volvo @ 18.12.2009 10:38) *
Размер строки меняется, а For-у на это наплевать, он на каждой итерации условие окончания не вычисляет...
И что с того?
Все равно нам надо просмотреть именно ТО количество символов, которое было в первоначальной строке, а добавленные - не просмаривать.
Т.е. все условия цикла с наперед известным количеством повторений.
volvo
Да? Ну, попробуй:
s := 'вот  тебе  задачка    123';
Приведи решение с циклом For, я посмотрю, как, используя информацию об ИЗНАЧАЛЬНОЙ длине строки ты обработаешь последние пробелы... Никаких предварительных пробегов по строке, ибо While-вариант обойдется без этого...

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

Цитата
Все равно нам надо просмотреть именно ТО количество символов, которое было в первоначальной строке, а добавленные - не просмаривать.
Ты задание читал внимательно? Нам надо добавлять пробелы не в конец сроки, а в середину...
Lapp
Цитата(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 я вставил для большей общности (типа замена на два других символа)
Unconnected
Я, кстати, вчера по другой задаче задумывался над этим: цикл for единожды берет начальный параметр или при каждой итерации и потом что-то прибавляет/вычитает? Видимо, единожды, т.к. вариант Lapp'а работает, а там в качестве задания начального значения параметру цикла используется меняющаяся длина строки..
Lapp
Цитата(Unconnected @ 18.12.2009 13:15) *
цикл for единожды берет начальный параметр или при каждой итерации и потом что-то прибавляет/вычитает? Видимо, единожды, т.к. вариант Lapp'а работает, а там в качестве задания начального значения параметру цикла используется меняющаяся длина строки..
В моем коде это прозрачно - первый параметр вроде как очевидно единожды. Второй - менее очевидно, и вопрос вполне законный. Ответ: да, единожды, в начале. Если переменная, использованная для второго предела изменяется во время исполнения, это никак не влияет на реальные пределы.
andriano
Цитата(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);

Правка: исправлена опечатка.
Lapp
Цитата(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
Впрочем, как и второй..
marwell
Цитата(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];

andriano
Цитата(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>
Lapp
Цитата(andriano @ 18.12.2009 20:40) *
Да, в первом Варианте опечатка. А насчет второго - не понимаю.
Ну и во втором тоже опечатка.. Только она почему-то не попала в твой код.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.