Вопрос № 42094: Здравствуйте, уважаемые эксперты! Очень нужна ваша помощь. На вход функции подается строка, содерж. целое или действительное число и через пробел кол-во знаков после запятой. На выходе: строка, содерж. это же число, но с разрядным форматированием тыс...
Вопрос № 42.094
Здравствуйте, уважаемые эксперты! Очень нужна ваша помощь. На вход функции подается строка, содерж. целое или действительное число и через пробел кол-во знаков после запятой. На выходе: строка, содерж. это же число, но с разрядным форматированием тысяч и округлением до нужного знака.
С примером все станет понятно:
Вход: 452123,456 2
Выход: 452 123,46
Вход: 1234,44 1
Выход: 1 234,4
Т.е. через три знака влево от запятой вставляем пробел. А вот, как округлить до нужного количества знаков, я не соображаю. Заранее спасибо за помощь!
Отвечает: Евгения
Здравствуйте, Андрющенко Вячеслав Васильевич!
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
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