Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 168
от 10.05.2006, 02:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 180, Экспертов: 38
В номере:Вопросов: 1, Ответов: 4


Вопрос № 42094: Здравствуйте, уважаемые эксперты! Очень нужна ваша помощь. На вход функции подается строка, содерж. целое или действительное число и через пробел кол-во знаков после запятой. На выходе: строка, содерж. это же число, но с разрядным форматированием тыс...

Вопрос № 42.094
Здравствуйте, уважаемые эксперты! Очень нужна ваша помощь. На вход функции подается строка, содерж. целое или действительное число и через пробел кол-во знаков после запятой. На выходе: строка, содерж. это же число, но с разрядным форматированием тысяч и округлением до нужного знака.
С примером все станет понятно:
Вход: 452123,456 2
Выход: 452 123,46
Вход: 1234,44 1
Выход: 1 234,4
Т.е. через три знака влево от запятой вставляем пробел. А вот, как округлить до нужного количества знаков, я не соображаю. Заранее спасибо за помощь!
Отправлен: 05.05.2006, 02:12
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгения
Здравствуйте, Андрющенко Вячеслав Васильевич!
1. Узнаем до какого количества знаков после запятой нам надо округлить число.

452123,456 2
до двух

2. Узнаем длину строки, которая будет результатом, например Н, т.е. считаем сколько знаков до запятой + запятая + данное нам после запятой

в данном примере 10.

3. Смотрим цифру на Н+1 месте, если она от 0 до 4, или если это пробел, то вырезаем число от начала, до Н - это и будет ответ.
Если она от 5 и до 9 то сложнее, тогда увеличивам цифру на месте Н на единицу, здесь такая заковырка, если цифра на месте Н=9, то она станет нулем, и надо будет увеличивать предыдущую цифру на 1. В самом неудачном варианте например: 999,999 2 будет так, что нам будет надо заменять 9 на 0 до начала числа. если мы дошли до начала и нам все еще надо повысить разряд, то добавляем вначале "1".
Т.е.
999,999 2 - число 2, длина результата на данный момент 6
меняем:
"999,00"
"990,00" - не забываем неучитывать запятую, но и не терять ее.
"900,00"
"000,00" - до конца дошли, но 1 "в уме".
"1"+"000,00"
т.е. результат 1000,00
Попробуйте реализовать этот алгоритм.

---------
Я не волшебник, я только учусь... А разве кто-то обещал, что будет легко?
Ответ отправила: Евгения (статус: 4-ый класс)
Ответ отправлен: 05.05.2006, 02:29

Отвечает: Coupler
Здравствуйте, Андрющенко Вячеслав Васильевич!
В приложении программа, получающая строку и выводяшая округленное значение.

Приложение:

Ответ отправил: Coupler (статус: 9-ый класс)
Ответ отправлен: 05.05.2006, 06:41

Отвечает: Sergijj
Здравствуйте, Андрющенко Вячеслав Васильевич!

1. Ищешь посредством char *strchr(char *строка_в_которой_искать, char символ_который_искать) символ запятой (на выходе процедуры - указатель на него).
2. Отсчитываешь циклом типа

for (unsigned i = 0; i < roundCount; i++) commaPos++;

нужное количество символов.
3. Смотришь символ, следующий за указателем: если >= 5, то символ, на который указывает указатель - инкрементируешь, типа так:

if ((commaPos[1] - 0x30) >= 5) *(commaPos++)++;// Здесь после операции инкрементируется и указатель!

С переходом на 0 - разберёшься сам.

4. Ставишь 0 на символ, следующий за указателем.

*(commaPos) = 0x00;

Удачи!
---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 3-ий класс)
Ответ отправлен: 05.05.2006, 09:30

Отвечает: Kazakh
Здравствуйте, Андрющенко Вячеслав Васильевич!
Примерно так
Допустим вход это S (тип string), выход это G (тип string)
1. сначала находим до скольки знаков надо округлить
val(S[length(s)],Okr,Code);
теперь в Okr (типа Integer) у нас последняя цифра из S
это будет работать если округление задано одной цифрой от 0 - 9,
если округление задается двузначным или :-) трёхзначным числом,
то надо другое придумать

2. находим запятую в S
j:=Pos(',',s);

3. теперь обрезаем S в соответствии с Okr и результат запихиваем в G
G:=copy(s,1,j+1+okr);

х. Всё
---------
Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 7-ой класс)
Ответ отправлен: 05.05.2006, 09:58


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.32 от 03.05.2006
Яндекс Rambler's Top100

В избранное