13.05.2010, 01:17 | #1 (permalink) |
Member
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Два вопроса по С++ Builder 6
Пишу программу на С++ Builder 6? и возникло 2 проблемы... №1 Не могу найти функцию округления чисел. Мне нужно округлить число формата "float" до одного знака после запятой. Читал форумы, но чего-то конкретного и общепризнанного не нашел... №2 Есть два массива чисел(одинаковых по размеру). Нужно построить график по точкам, образованным пересечением чисел из массивов(пересечение первых чисел из массивов - это первая точка, вторых - вторая, и так далее). Есть ли какая-нибудь функция позволяющая это реализовать... Пытался инструментом "Chart" из вкладки "Additional", но что-то так и не получилось... Подскажите пожалуйста...заранее благодарен!!! |
13.05.2010, 01:17 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
По данной тематике есть и другие темы Три вопроса: PLC, capacitors, литература? Помогите-не идет программа в C++Builder 6. Два вопроса от дилетанта Программирование в среде C++Builder не могу понять где ошибка |
13.05.2010, 03:04 | #2 (permalink) |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
Давайте уточним: вам нужно округлить float и продолжить вычисления, или вам нужно округлить и вывести результат в виде текста?
Далее, давайте без загадочного термина "пересечение двух массивов". Опишите проще - у вас в одном массиве X, в другом - Y? |
13.05.2010, 10:20 | #3 (permalink) |
Member
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Нужно округлить "float" в первую очередь для дальнейших вычислений, но вывод на экран тоже будет, кстати эти округленные значения и будут в одном из массивов. У меня в качестве округляемого параметра время в часах, просто не очень разумно, если будет выводиться например 3.433245 часа))))), поэтому хочу округлить до одного знака после запятой.
А по поводу массивов, совершенно верно, в одном массиве значения по оси X, а в другом значения по оси Y, как уже писал выше, количество значений в каждом массиве одинаково. |
13.05.2010, 12:53 | #4 (permalink) |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
Округление значений во время вычислений приводит к возникновению погрешности.
Получить строку, состоящую из округленного значения можно так: Код:
char buf[16]; float val; sprintf(buf,"%.1f",val); Код:
Form1.Canvas.MoveTo() Form1.Canvas.LineTo() Последний раз редактировалось Long Cat; 13.05.2010 в 12:57 |
13.05.2010, 13:51 | #5 (permalink) |
Member
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Извиняюсь за назойливость, просто я начинающий в программировании...
Как я понял, моё округленное число записалось в массив "buf", в первые ячейки массива... как теперь можно заменить, в приведенном Вами примере, значение переменной "val" на округленное значение, находящееся в массиве...? там же символы в формате "char"... |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
13.05.2010, 15:05 | #6 (permalink) | |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
Цитата:
Округление осуществляется с помощью функций ceil (потолок) и floor (пол). Но это округление заключается в простом отбрасывании дробной доли числа. Чтобы округлять на один знак после запятой, нужно домножить на 10 (все "нужные" знаки передвинуться в целую часть), после этого округлить, а затем задвинуть знаки обратно в дробную часть - разделить на 10. Код:
k=floor(k*10)/10; |
|
13.05.2010, 15:31 | #7 (permalink) |
Member
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Да да, именно так я и пробовал прежде чем в форум написать... в консольном режиме все работает точно...
А вот когда я пытаюсь вывести в текстовое поле формы, уже якобы округленное значение, у меня опять появляются числа после запятой.... даже не знаю почему так происходит пробовал и ceil и floor и умножал на 10, 100,1000 до миллиона...но к примеру округляя число 2,71428561210632, умножая его на десять, затем округляя через floor и разделив опять на 10 получается число 2,70000004768372, а та же операция только используя не 10 а 100 уже получается 2,71000003814697, а с 1000 уже 2,71399998664856, даже не видно закономерности после тысячи...как будто за разряд выходит.... А по поводу погрешностей это ничего страшного, в данной задаче эта погрешность не имеет значения, а вот если до целых округлять, то уже имела бы... Последний раз редактировалось walthermil; 13.05.2010 в 15:38 |
13.05.2010, 15:49 | #8 (permalink) |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
Проблема в том, что вы поступаете не совсем верно, округляя значение в процессе вычислений. А также в особенности представления чисел с плавающей запятой.
Именно: ПК не может записать во float значение 27000.0, поэтому, выбирает ближайшее. Подробное объяснение - лекция на час. Решение: Используйте целочисленное значение, домножив его на 10. И помня, что у вас не 270005, а 27000.5 |
14.05.2010, 00:08 | #10 (permalink) |
Member
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Еще раз Вас побеспокою...
Я покопался в С++ Builder, и насколько я понял функции "canvas" в нем нет... Она вроде бы в Delphi только есть.... Или я ошибаюсь...? Подскажите пожалуйста.. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|