плиз, помогите решить, а то чет не получается В строке символов надо везде, где встречается символ "пробел", заменить его на два "пробела"
volvo
17.12.2009 20:43
Что не получается? Что пробовал, можно посмотреть? Вообще все должно получаться, если идти от хвоста строки в ее начало (и НЕ циклом for, естественно)
Unconnected
17.12.2009 20:59
А если встречается два пробела? Это будет отдельный символ "два пробела" или программа должна обработать каджый?
volvo
17.12.2009 21:02
Цитата
В строке символов надо везде, где встречается символ "пробел", заменить его на два "пробела"
Значит, заменить на 4. Но я настоятельно рекомендую не приводить код до тех пор, пока ТС не покажет свои наработки...
Lapp
18.12.2009 7:58
Цитата(volvo @ 17.12.2009 16:43)
идти от хвоста строки в ее начало (и НЕ циклом for, естественно)
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
andriano
18.12.2009 14:02
Цитата(Lapp @ 18.12.2009 3:58)
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
Я тоже об этом подумал. А еще о том, что не суть важно, перебирать от конца к началу или от начала к концу. Но, несмотря на некоторую излишнюю категоричность утверждения, IMHO именно предложенный вариант самый простой в реализации. В сообщениях volvo некедко явно либо неявно проскальзывает мысль, что предложенный им оптимальный вариант является единственно возможным. И, хотя формально это неверно, с дидактической точки зрения он, возможно, прав - нужно учить писать программы сразу оптимально.
PS. А еще неплохо было бы, если бы название темы соответствовало содержанию. Ну нет такого символа "два пробела".
volvo
18.12.2009 14:38
Цитата
А чем так плох for в данном случае? Я бы, думаю, именно с ним сделал..
А зачем тебе лишняя головная боль? Как ты собрался без этой самой головной боли заменить в строке (заметь, не переписать в другую строку, заменяя встреченный пробел на два, а именно заменить) один символ на два? Размер строки меняется, а For-у на это наплевать, он на каждой итерации условие окончания не вычисляет...
andriano
18.12.2009 15:26
Цитата(volvo @ 18.12.2009 10:38)
Размер строки меняется, а For-у на это наплевать, он на каждой итерации условие окончания не вычисляет...
И что с того? Все равно нам надо просмотреть именно ТО количество символов, которое было в первоначальной строке, а добавленные - не просмаривать. Т.е. все условия цикла с наперед известным количеством повторений.
volvo
18.12.2009 15:39
Да? Ну, попробуй:
s := 'вот тебе задачка 123';
Приведи решение с циклом For, я посмотрю, как, используя информацию об ИЗНАЧАЛЬНОЙ длине строки ты обработаешь последние пробелы... Никаких предварительных пробегов по строке, ибо While-вариант обойдется без этого...
Еще раз: НЕ записать в другую строку, а добавить в эту же, по условию...
Цитата
Все равно нам надо просмотреть именно ТО количество символов, которое было в первоначальной строке, а добавленные - не просмаривать.
Ты задание читал внимательно? Нам надо добавлять пробелы не в конец сроки, а в середину...
Lapp
18.12.2009 16:04
Цитата(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.
- ?
Добавлено через 2 мин. Delete я вставил для большей общности (типа замена на два других символа)
Unconnected
18.12.2009 17:15
Я, кстати, вчера по другой задаче задумывался над этим: цикл for единожды берет начальный параметр или при каждой итерации и потом что-то прибавляет/вычитает? Видимо, единожды, т.к. вариант Lapp'а работает, а там в качестве задания начального значения параметру цикла используется меняющаяся длина строки..
Lapp
18.12.2009 17:39
Цитата(Unconnected @ 18.12.2009 13:15)
цикл for единожды берет начальный параметр или при каждой итерации и потом что-то прибавляет/вычитает? Видимо, единожды, т.к. вариант Lapp'а работает, а там в качестве задания начального значения параметру цикла используется меняющаяся длина строки..
В моем коде это прозрачно - первый параметр вроде как очевидно единожды. Второй - менее очевидно, и вопрос вполне законный. Ответ: да, единожды, в начале. Если переменная, использованная для второго предела изменяется во время исполнения, это никак не влияет на реальные пределы.
andriano
18.12.2009 18:17
Цитата(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
18.12.2009 18:45
Цитата(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
18.12.2009 21:11
Цитата(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
19.12.2009 0:40
Цитата(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
19.12.2009 5:43
Цитата(andriano @ 18.12.2009 20:40)
Да, в первом Варианте опечатка. А насчет второго - не понимаю.
Ну и во втором тоже опечатка.. Только она почему-то не попала в твой код.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.