![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
WOoHOo |
|
||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 30.11.2010 Репутация: нет Всего: нет |
Пишу программку, которая должна генерировать километражи поездок и высчитывать для них расход топлива.
Пользователь вводит число поездок, для которых необходимо сгенерировать километражи, средний расход топлива для всех поездок, сколько всего литров было потрачено на все поездки. На основе этих данных все и расчитывается. Проблема заключается в том, что не совпадают сгенерированные километражи и общий реальный (высчитанный: всего километров = (Литров всего потрачено * 100 км) / Расход топлива машины). Хотя нюансы были учтены. Всего скорее проблема с типами в функции CalcLiters(), но я в упор не вижу что там не так >_< Скриншот программы: http://gyazo.com/634bbecd03541507c46fdff7478901f2 Код ниже (приложение WPF).
Также принимается критика по коду, предложения по улучшению и прочее. ![]() |
||||
|
|||||
CosmoMan |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 12.7.2005 Где: Харьков Репутация: нет Всего: 0 |
Честно, не понял где у вас "сгенерированные километражи" и "общий реальный" и чем он отличается.
Подозрительная строка где может быть потеря точности.
По коду лучше все константы вроде "Километраж" или "Расход" выносить в переменные. И имя переменных не очень информативно. CalcLiters() лучше назвать CalcFuelSpend() |
|||
|
||||
WOoHOo |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 30.11.2010 Репутация: нет Всего: нет |
Общий реальный километраж (сколько действительно проехали все машины, если на них всех выдать N литров бензина). Расчитывается исходя из веденных данных пользователем. Формула: общий километраж = (Литров всего потрачено * 100 км) / Расход топлива машины Код:
Частный сгенерированный километраж (на каждую поездку). После определения общего километража возникает вопрос: а сколько в каждую машну вливать бензина? Для того, чтобы понять сколько на машину выделить бензина, для этого необходим километраж. Делим общий километраж на количество поездок - получаем сколько в среднем проезжает машина. Для того, чтобы данные не были "палевными" высчитываем дисперсию (разницу) в +-10% от среднего значения поездки. И в этом интервале генерируем значение километража Генерируется стандартной функцией Random() . Естественно рэндом не может нам нагенерировать значение километражей, чтобы их сумма в тютельку совпадала с реальным. Сумма нагенерированных значений будет либо > либо < реального значения. Поэтому переходим к следующему пункту. Код:
Общий сгенерированный километраж. Здесь проверяем сумму нагенерированных значений. Получается, что сумма = общий нагенерированный километраж всех поездок. Эту сумму сравниваем с реальным километражом. Если нагенерировали больше - надо отнять N число от каждого километража поездок, если нагенерировали меньше - соответственно прибавить недостающие километры. После того, как реальный и сгенерированный выправленный километражи совпадут - можно высчитывать расход бензина.
Проблема, как раз и заключается в том, что не смотря на все корректировки общего сгенерированного километража, он не совпадает с реальным. В результате неправильно высчитываются и литры (расход).
По мне тут все ровно. Полные километражи full_km - всегда в дабл были, я их не округлял. full_gen_km - int. Random генерирует только целые. Тут потери нет. Число поездок тоже целое - textBox_Count, 1.5 поездки не может быть. Далее add используется вроде правильно... |
||||||||||
|
|||||||||||
CosmoMan |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 12.7.2005 Где: Харьков Репутация: нет Всего: 0 |
Я вижу тут две проблемы.
1. У вас сумма в столбике "Километры" = 834. Это всего на 1 л больше, чем расчетная величина. Видимо потому, что ф-ция Math.Round округляет по правилам округления в большую сторону от 0.5. Т.к. вы округляете литры до целого везде, где только можно, у вас накапливается ошибка, которая может увеличиваться по мере роста числа поездок. Я в своих расчетах не использовал округление вовсе и у меня сумма в столбике "Километры" точно равна 833.33. 2. Вы вычисляете Расход по формуле = км. пройдено / расход топлива (л/км). Но расход топлива это величина Литров / 100 км. Эта формула выдаст вам Расход топливи в литрах на км. пройдено. Т.е. если расход 9.6 на 100 км, то вы получите для первого 13.12 литров на 126 км = 9.6 л на 100 км. В этой величине нет смысла. Это просто отношение = расходу на 100 км. Если вам нужно почитать величину в ЛИТРАХ, которую потратил автомобиль за каждую поездку, нужно использовать пропорцию. потрачено литров = км. пройдено * расход / 100 Тогда сумма расхода в литрах будет точно совпадать с суммарным числом потраченных литров (80 в примере) Я прикрепил эксель документ с моими расчетами, может быть это что то прояснит. Это сообщение отредактировал(а) CosmoMan - 1.8.2013, 14:02 Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
WOoHOo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 30.11.2010 Репутация: нет Всего: нет |
CosmoMan, приветствую.
Спасибо за советы, пригодились. В итоге проблема побеждена: решил расчитывать и выводить километры в double (как у вас в файлике), чтобы не было расхождений по десятым, которые как и сказали - сыграли свою роль (разницу в 1-2 километра), убрал Math.Round; и таки да - проблема была в переменной add, с ее прибавлением и округлением; поправил генерацию чисел - перевел на double. Еще раз спасибо, что отважились влезть в математические дебри. [РЕШЕНО] |
|||
|
||||
CosmoMan |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 12.7.2005 Где: Харьков Репутация: нет Всего: 0 |
||||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |