Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 13.05.2010, 01:17   #1 (permalink)
walthermil
Member
 
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Два вопроса по С++ Builder 6

Здравствуйте!!!
Пишу программу на С++ Builder 6? и возникло 2 проблемы...

№1 Не могу найти функцию округления чисел. Мне нужно округлить число формата "float" до одного знака после запятой. Читал форумы, но чего-то конкретного и общепризнанного не нашел...

№2 Есть два массива чисел(одинаковых по размеру). Нужно построить график по точкам, образованным пересечением чисел из массивов(пересечение первых чисел из массивов - это первая точка, вторых - вторая, и так далее). Есть ли какая-нибудь функция позволяющая это реализовать... Пытался инструментом "Chart" из вкладки "Additional", но что-то так и не получилось...

Подскажите пожалуйста...заранее благодарен!!!
walthermil вне форума   Ответить с цитированием

Старый 13.05.2010, 01:17
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

По данной тематике есть и другие темы

Три вопроса: PLC, capacitors, литература?
Помогите-не идет программа в C++Builder 6.
Два вопроса от дилетанта
Программирование в среде C++Builder не могу понять где ошибка

Старый 13.05.2010, 03:04   #2 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Давайте уточним: вам нужно округлить float и продолжить вычисления, или вам нужно округлить и вывести результат в виде текста?

Далее, давайте без загадочного термина "пересечение двух массивов". Опишите проще - у вас в одном массиве X, в другом - Y?
Long Cat вне форума   Ответить с цитированием
Старый 13.05.2010, 10:20   #3 (permalink)
walthermil
Member
 
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Нужно округлить "float" в первую очередь для дальнейших вычислений, но вывод на экран тоже будет, кстати эти округленные значения и будут в одном из массивов. У меня в качестве округляемого параметра время в часах, просто не очень разумно, если будет выводиться например 3.433245 часа))))), поэтому хочу округлить до одного знака после запятой.
А по поводу массивов, совершенно верно, в одном массиве значения по оси X, а в другом значения по оси Y, как уже писал выше, количество значений в каждом массиве одинаково.
walthermil вне форума   Ответить с цитированием
Старый 13.05.2010, 12:53   #4 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Округление значений во время вычислений приводит к возникновению погрешности.
Получить строку, состоящую из округленного значения можно так:
Код:
char buf[16];
float val;
sprintf(buf,"%.1f",val);
Для рисования используйте поле canvas вашей формы:
Код:
Form1.Canvas.MoveTo()
Form1.Canvas.LineTo()

Последний раз редактировалось Long Cat; 13.05.2010 в 12:57
Long Cat вне форума   Ответить с цитированием
Старый 13.05.2010, 13:51   #5 (permalink)
walthermil
Member
 
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Извиняюсь за назойливость, просто я начинающий в программировании...
Как я понял, моё округленное число записалось в массив "buf", в первые ячейки массива...
как теперь можно заменить, в приведенном Вами примере, значение переменной "val" на округленное значение, находящееся в массиве...? там же символы в формате "char"...
walthermil вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 13.05.2010, 15:05   #6 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Цитата:
Сообщение от walthermil Посмотреть сообщение
Извиняюсь за назойливость, просто я начинающий в программировании...
Как я понял, моё округленное число записалось в массив "buf", в первые ячейки массива...
как теперь можно заменить, в приведенном Вами примере, значение переменной "val" на округленное значение, находящееся в массиве...? там же символы в формате "char"...
В этом массиве находится текстовое представление числа, но преобразовывать число в текст, а затем снова в число не рационально.
Округление осуществляется с помощью функций ceil (потолок) и floor (пол).
Но это округление заключается в простом отбрасывании дробной доли числа.
Чтобы округлять на один знак после запятой, нужно домножить на 10 (все "нужные" знаки передвинуться в целую часть), после этого округлить, а затем задвинуть знаки обратно в дробную часть - разделить на 10.
Код:
k=floor(k*10)/10;
Еще раз должен предупредить, что это приводит к дополнительной погрешности - все округления должны происходить при выводе результатов.
Long Cat вне форума   Ответить с цитированием
Старый 13.05.2010, 15:31   #7 (permalink)
walthermil
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
walthermil вне форума   Ответить с цитированием
Старый 13.05.2010, 15:49   #8 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Проблема в том, что вы поступаете не совсем верно, округляя значение в процессе вычислений. А также в особенности представления чисел с плавающей запятой.
Именно: ПК не может записать во float значение 27000.0, поэтому, выбирает ближайшее. Подробное объяснение - лекция на час.

Решение: Используйте целочисленное значение, домножив его на 10. И помня, что у вас не 270005, а 27000.5
Long Cat вне форума   Ответить с цитированием
Старый 13.05.2010, 16:42   #9 (permalink)
walthermil
Member
 
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Хорошо, попробую так... спасибо...
walthermil вне форума   Ответить с цитированием
Старый 14.05.2010, 00:08   #10 (permalink)
walthermil
Member
 
Регистрация: 25.03.2010
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Еще раз Вас побеспокою...
Я покопался в С++ Builder, и насколько я понял функции "canvas" в нем нет...
Она вроде бы в Delphi только есть....
Или я ошибаюсь...? Подскажите пожалуйста..
walthermil вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 03:25.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.