Помощь - Поиск - Пользователи - Календарь
Полная версия: Символ разделителя
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Subaru
Задача: написать прогу чтоб она принимала номер и вернула его с запятой в качестве разделителя тысяч, миллионов и т.д.

Например пишем 12547 - результат должен быть 12,547 но если есть 521 чтоб также и осталось (не ,521) ...

Вот что я сделал :
Код

program mishpat;
var
number:string;
i,blipsik:integer;
num:longint;
begin
readln(num);
str(num,number);
blipsik:=Length(number) mod 3;
Write(Copy(number,1,blipsik));
for i:=1 to length(number) div 3 do
Write(',',Copy(number,blipsik+1+(i-1)*3,3));
writeln
end.


но эта прога выдаёт ",521" вместо "521"
и ",15,231" вместо "15,231"

что тут надо добавить или поменять чтоб она заработала ?

:-)
Altair
Прежде чем выводить очередные 3 символа и запятую ,проверь длинну строки и текущий номер I.
Подсказка:
можно обойтись и одним условием....
просто подумай, когда у нас будет при таком алгоритме выводится ненужная запятая, и заблокируй это действие...
GoodWind
не знаю, прав я или нет, но если отсчитывать по три цифры с конца, то будет точнее...
Digitalator
а можно взять выходную строку показанной в первом посте проги, и обрезать запятую спереди smile.gif
Altair
Цитата
но если отсчитывать по три цифры с конца, то будет точнее...

Ээээ, нет!
Если будешь работать с одной строкой, и скажем через 3 символа вставлять запятую, то увеличиваться длинна будет и циклсобъется...
Тут тогда нужна еще одна дополнительная строка.

Цитата
а можно взять выходную строку показанной в первом посте проги, и обрезать запятую спереди 
ТОже верно.
Но проще всего проверить I, т.е. что бы не было начала строки и в таком случае уже выводить с запятой, а иначе вывестти просто часть строки...
xds
Не следует черезмерно увлекаться процедурами работы со строками (Insert, Delete, Copy и т. п.), т. к. за ними, как правило, скрывается цикл. Например, нерационально
Цитата
взять выходную строку показанной в первом посте проги, и обрезать запятую спереди
, т. к. Delete или Copy придется пробежаться по всей строке.


Цитата
Тут тогда нужна еще одна дополнительная строка.
- без указания максимального размера - это еще 256 байт в сегменте данных.

В BP использован несколько "лобовой" подход к обработке строк (строка - статический массив). В Delphi и FP все стало гораздо лучше - строки реализованы как динамические объекты, используется подсчет ссылок и технология "copy-on-write".
Altair
Цитата
Не следует черезмерно увлекаться процедурами работы со строками (Insert, Delete, Copy и т. п.), т. к. за ними, как правило, скрывается цикл.

не согласен, разработчики BP не дураки, все процедуры и функции стандартные оптимизированны на максимальную скорость... к тому-же это наглядно и красиво...
Цитата
В BP использован несколько "лобовой" подход к обработке строк (строка - статический массив).

В BP есть динамические строки.
xds
Цитата
все процедуры и функции стандартные оптимизированны на максимальную скорость...

согласен, но, все же, не стоит делать цикл там, где без него можно "безболезненно" обойтись...

Цитата
В BP есть динамические строки.

говоря о динамических строках Delphi/FP, я акцентировал внимание на механизме подсчета ссылок. В принципе, "динамической" в BP можно сделать любую структуру данных.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.