Помогите с программированием формулы!

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Помогите с программированием формулы!

Сообщение LutsenkoDenis » Пт фев 14, 2014 7:17 pm

layet писал(а):Ради такого простого решения библиотеку использовать грешно :D Лишняя трата ресурсов.
Ну это как посмотреть...
Грешно на каждый чих писать новую функцию вместо того, чтобы воспользоваться уже написанной ранее.
Тем более что человек, спрашивая про округление, хотел переводить гектапаскаль в ртутный столб, а данная функция уже написана до него и уже с округлением.

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

offtop: OpenWeather я писал для того, что бы выводить данные о погоде с сайта http://openweathermap.org. И в данной либе есть функции по конвертации давления, направления ветра например из NNE в человекопонятное обозначение и т.д.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
layet
Сообщения: 78
Зарегистрирован: Чт янв 16, 2014 2:47 pm
Благодарил (а): 4 раза
Поблагодарили: 31 раз

Re: Помогите с программированием формулы!

Сообщение layet » Сб фев 15, 2014 6:08 pm

LutsenkoDenis писал(а):
layet писал(а):Ради такого простого решения библиотеку использовать грешно :D Лишняя трата ресурсов.
Ну это как посмотреть...
Грешно на каждый чих писать новую функцию вместо того, чтобы воспользоваться уже написанной ранее.
Тем более что человек, спрашивая про округление, хотел переводить гектапаскаль в ртутный столб, а данная функция уже написана до него и уже с округлением.

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

offtop: OpenWeather я писал для того, что бы выводить данные о погоде с сайта http://openweathermap.org. И в данной либе есть функции по конвертации давления, направления ветра например из NNE в человекопонятное обозначение и т.д.
Да я не хотел вас задеть. Я только рад, что вы развиваете проект. Просто хотел, чтобы человек понял что конкретно и как сделать. А насчёт конвертации - возможно действительно стоит подумать над таким модулем.
Satgate_M
Сообщения: 79
Зарегистрирован: Ср дек 26, 2012 8:20 pm
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Помогите с программированием формулы!

Сообщение Satgate_M » Сб фев 15, 2014 6:48 pm

Не ругайтесь))) Главное, что оба метода отлично работают и кому, что удобнее тот тем и будет пользоваться в зависимости от поставленных задач!
Главное, что все откликаются и готовы помочь!
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Помогите с программированием формулы!

Сообщение LutsenkoDenis » Пн фев 17, 2014 1:26 am

Не мог ответить раньше, т.к. ездил на выходные под Смоленск :)

Собственно никто и не ругается, и не пытается никого задеть. Ну... по крайней мере у меня и в мыслях даже не было кого-либо обидеть или самому обижаться.

Про округление все всё сказали правильно и привели как примеры самого округления, так и ссылку на документацию. В общем, так сказать помогли чем смогли :)

Оpenweathermap я привел в пример, т.к. во первых там уже есть решение задачи, над которой работал автор задавая вопрос про округление.
А во вторых как пример того, что очень часто мы все пишем код, который уже написали за нас другие люди. Причем в 99% случаев делаем это неосознанно, т.к. не известно есть ли такой код в системе.
Взять например этот же перевод давления... ну вот возникла у человека потребность перевести его в ртутные столбы. Вот как можно понять/узнать/догадаться что уже есть такая функция которая это делает? А никак, т.к. не понятно что и где искать. А раз человек не находит нужный ему функционал, то он начинает реализовывать его сам и тем самым дублирует его.

Если говорить о конвертации, хотя это можно отнести и к остальному коду, то на мой взгляд, нужно провести небольшую ревизию кода проекта и выделить функции, которые относятся к переводу различных величин из одной системы в другую в отдельный класс. С комментариями и описанием в вики, так сказать для наглядности. И тогда, при возникновении потребности в переводе, человек будет сначала смотреть, а нет ли нужной функции в данном классе? Это позволит не писать каждый раз свой велосипед, что может уменьшить количество потенциальных ошибок и возможно автоматически снимет некоторые вопросы. Да и если в функции будет ошибка, то её проще исправить один раз в одном месте, чем бегать по коду и справлять.

Но это всего лишь моё мнение, которое может не совпадать с мнением кого-либо ещё.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Controer
Сообщения: 44
Зарегистрирован: Чт апр 09, 2015 8:09 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Помогите с программированием формулы!

Сообщение Controer » Пн май 25, 2015 12:16 pm

Что нужно написать в коде метода, чтобы с поступившего показания счетчика вычиталось предыдущее показание:
В параметрах метода получаю это:{s:8:"PROPERTY"; s:7:"counter"; s:9:"NEW_VALUE"; s:7:"214.0"; s:9:"OLD_VALUE"; s:7:"200.0"; s:21:"ORIGINAL_OBJECT_TITLE"; s:15:"ESP8266009c7f19"; }

Делаю так, но ничего не вычитается, может не правильно называю переменные?

// получаем значение свойства counter
$counter=$this->getProperty("counter");
// вычисляем скорость ветра
//$wind_speed = (($NEW_VALUE - $OLD_VALUE) * 0.33) / 10;
// записываем значение скорости ветра в свойство wind_speed
$this->setProperty("wind_speed", $wind_speed);
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Помогите с программированием формулы!

Сообщение LutsenkoDenis » Пн май 25, 2015 2:07 pm

Есть ряд вопросов...
  • 1. Что такое 0.33?
  • 2. Что такое 10?
  • 3. Вы уверены что переменные $NEW_VALUE и $OLD_VALUE содержат какие-либо значения?
Небольшой пример для тестаПоказать

Код: Выделить всё

/**
 * GetWindSpeedDiff
 * @param double|int $newSpeed Новое значение скорости ветра
 * @param double|int $oldSpeed Предыдущее значение скорости ветра
 * @return double|int
 */
function GetWindSpeedDiff($newSpeed, $oldSpeed)
{
   $diff = ($newSpeed - $oldSpeed) * 0.33 / 10;
   
   return $diff;
}

$newSpeed = "214.0";
$oldSpeed = 200.0;

if (is_numeric($newSpeed) && is_numeric($oldSpeed))
{
   $diff = GetWindSpeedDiff($newSpeed, $oldSpeed); // Результат: 0.462
   echo $diff;
}
else
{
   echo "Некорректно указаны вводные параметры";
}
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Controer
Сообщения: 44
Зарегистрирован: Чт апр 09, 2015 8:09 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Помогите с программированием формулы!

Сообщение Controer » Пн май 25, 2015 3:22 pm

1. Что такое 0.33? Это коэффициент перерасчета импульсов в скорость ветра
2. Что такое 10? Это время 10 секунд, потому что импульсы приходят каждые 10 секунд
3. Вы уверены что переменные $NEW_VALUE и $OLD_VALUE содержат какие-либо значения? Нет не уверен, ипмульсы приходят на переменную $counter, а в параметрах ниже метода получаю такую информацию, я и думал, что "NEW_VALUE" это новые показания переменной $counter которые равны 214.0 импульсам и "OLD_VALUE" которые соответсвенно равно 200.0

В параметрах метода получаю это:{s:8:"PROPERTY"; s:7:"counter"; s:9:"NEW_VALUE"; s:7:"214.0"; s:9:"OLD_VALUE"; s:7:"200.0"; s:21:"ORIGINAL_OBJECT_TITLE"; s:15:"ESP8266009c7f19"; }
Controer
Сообщения: 44
Зарегистрирован: Чт апр 09, 2015 8:09 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Помогите с программированием формулы!

Сообщение Controer » Пн май 25, 2015 3:31 pm

Может мне нужно сделать код так:


// получаем значение свойства counter
$counter=$this->getProperty("counter");
// вычисляем скороcть ветра
$wind = (($NEW_counter - $OLD_counter) * 0.33) / 10;
// записываем значение скорости ветра в свойство wind_speed
$this->setProperty("wind", $wind);
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Помогите с программированием формулы!

Сообщение LutsenkoDenis » Пн май 25, 2015 4:02 pm

Думаю лучше попробовать вот так:
СпойлерПоказать

Код: Выделить всё

/**
 * Вычисляем скорость ветра по импульсам
 * @param double|int $newImpulseValue Новое значение импульса
 * @param double|int $oldImpulseValue Предыдущее значение импульса
 * @return double|int
 */
function GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue)
{
   $secPerImpulse = 10; // приходят каждые 10 секунд
   $impulseToWindSpeedCoeff = 0.33; //коэффициент перерасчета импульсов в скорость ветра
   
   $windSpeed = ($newImpulseValue - $oldImpulseValue) * $impulseToWindSpeedCoeff / $secPerImpulse;
   
   return $windSpeed;
}

/*
 * В параметрах метода получаю это:
 * {s:8:"PROPERTY"; s:7:"counter"; s:9:"NEW_VALUE"; s:7:"214.0"; s:9:"OLD_VALUE"; s:7:"200.0"; s:21:"ORIGINAL_OBJECT_TITLE"; s:15:"ESP8266009c7f19"; } 
 */

// получаем значение свойства counter
$counter = $this->getProperty("counter");

if (is_array($counter))
{
   //проверяем что в $counter есть елементы NEW_VALUE и OLD_VALUE и они числовые, если нет - пишем сообщение об ошибке
   if ((isset($counter["NEW_VALUE"]) && is_numeric($counter["NEW_VALUE"])) && (isset($counter["OLD_VALUE"]) && is_numeric($counter["NEW_VALUE"])))
   {
      $newImpulseValue = $counter["NEW_VALUE"]; //"214.0"; 
      $oldImpulseValue = $counter["OLD_VALUE"]; //200.0;

      $windSpeed = GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue); // Результат: 0.462
      echo $windSpeed;
      
      // записываем значение скорости ветра в свойство wind_speed
      $this->setProperty("wind_speed", $windSpeed);
   }
   else
   {
      echo "Не корректно указаны вводные параметры";
   }
}
else
{
   echo "Некорректные показания счётчика импульсов.";
   print_r($counter);
}
 
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Controer
Сообщения: 44
Зарегистрирован: Чт апр 09, 2015 8:09 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: Помогите с программированием формулы!

Сообщение Controer » Пн май 25, 2015 4:03 pm

Как с переменной $counter, взять новое и старое значение
$NEW_counter и $OLD_counter
или
$NEWcounter и $OLDcounter
Никак не получается!
Ответить