Как определить наибольшее число.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Вот простой в принципе вопрос а правильное решение найти не могу. 

Сформулировать правильный запрос для поисковика тоже не получается.

Имеем две переменные, они имеют определенное значение (допустим тип данных -  int). Каким образом эти переменные получают значения - не суть.

Как максимально просто и грамотно определить , значение какой из переменных больше а какой меньше ?

Единственное что приходит в голову это из первой переменной вычесть вторую (не важно из какой конкретно).

Если получим положительное значение , значит первая переменная была больше второй. Если получим отрицательное  - вторая была больше первой. Если обе переменные равны (результатат вычитания - ноль)  игнорируем данный факт.

Вроде просто , но не нравится мне такой вариант.

maksim
Offline
Зарегистрирован: 12.02.2012

А операторы сравнения <, >, <=, >= чем вас не устраивают? 

uscr
Offline
Зарегистрирован: 17.08.2012

Может быть, про max вопрос? http://arduino.ru/Reference/Max

maksim
Offline
Зарегистрирован: 12.02.2012

Так вы хотите нечто, которое просто вам возвращает максимальное значение перенной, а когда они равны возвращает 0?
Пожалуйста:

int val_1 = 20;
int val_2 = 30;
int val_max = val_1>val_2 ? val_1 : val_2>val_1 ? val_2 : 0;

 

uscr
Offline
Зарегистрирован: 17.08.2012

maksim пишет:

Так вы хотите нечто, которое просто вам возвращает максимальное значение перенной, а когда они равны возвращает 0?
Пожалуйста:

int val_1 = 20;
int val_2 = 30;
int val_max = val_1>val_2 ? val_1 : val_2>val_1 ? val_2 : 0;

 

 

Так а почему не val_max=max(val_1, val_2) ?

maksim
Offline
Зарегистрирован: 12.02.2012

Потому что если val_1 будет равен val_2, то эта деректива вернет  val_2. 
Из Arduino.h:

#define max(a,b) ((a)>(b)?(a):(b))

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

nestandart пишет:

Единственное что приходит в голову это из первой переменной вычесть вторую (не важно из какой конкретно).

Чем не нравится такой вариант? По мне так вполне себе живой вариант. Думаю и оптимизатор с этим согласится. Я бы просто посмотрел листинг ассемблера для этих двух вариантов, но мне придется копаться и искать, может кто-то быстро сможет посмотреть?

Предполагаю, что чуть больше "проблем", если после сранения нужно все три варианта как то обработать, а не просто решить задачу "равны" или "не равны". Хотя оптимизатор должен бы разрулить.

 

usr-bin
Offline
Зарегистрирован: 04.09.2012

Я не давно писал функцию которая определяет какое число больше и указывает его номер. Может тебе это надо?

перечисляешь функции три числа, а она тебе выдает номер той, что больше.


int max_i3(float n1,float n2,float n3)
{
  float max12;
  int i=0;
 if (n1>n2)
{
 i=1;
 max12=n1;
} 
else
{
  max12=n2; // в любом случае
  if (n1<n2)
  {
    i=2;
  }/*
  else
  {
    i=0;
    max12=любому из n1,n2 (ибо они равны друг другу
  }*/
}

if (max12<n3)
{
  i=3; 
// max3=n3;
}/*
else
{
 if (max12==n3)
 {
   i=max12;// и так равно этому.
   
 }
}*/
  return i;
}

Пример работ: При старте мигаем всеми светоиндикаторами столько раз, какой датчик температуры нагрелся больше (для калибровки датчиков):

c=diagnostika(max_i3(sensors.getTempCByIndex(0),sensors.getTempCByIndex(1),sensors.getTempCByIndex(2)));  

 

Можно обсчитать так, что если все они равны нулю, выдавалось бы 0, т.е. никакой номер. Я так задумывал, но потом как-то иначе обошелся.

 

ruslan.kuchma
Offline
Зарегистрирован: 27.11.2015
 
int val_1 = 20;
int val_2 = 30;
int val_max = val_1>val_2 ? val_1 : val_2>val_1 ? val_2 : 0;

Когда 2 переменные всё понятно...

Как сделать когда нужно из 4-х переменных найти максимальное или минимальное значение?

Всё, разобрался

int val_1 = 20;
int val_2 = 30;
int val_3 = 0;
int val_4 = 10;
int val_max1 = val_1>val_2 ? val_1 : val_2>val_1 ? val_2 : 0;
int val_max2 = val_3>val_4 ? val_3 : val_4>val_3 ? val_4 : 0;
int val_max = val_max1>val_max2 ?val_max1 : val_max2>val_max1 ? val_max2 : 0;

 

Logik
Offline
Зарегистрирован: 05.08.2014

Нда... а если 10 переменных?

1. Переменные сложить в массив.

2. Поиск максимума (минимума) - стандартная задача школьного курса информатики, даже гуглить стыдно.

ruslan.kuchma
Offline
Зарегистрирован: 27.11.2015

Скажем не у всех в школе была информатика...

maksim
Offline
Зарегистрирован: 12.02.2012
  int vals[4] = {20, 30, 0, 10};
  int val_max = 0;
  for(int i = 0; i < 4; i++) val_max = max(vals[i], val_max);
  Serial.println(val_max);

 

Smirna
Offline
Зарегистрирован: 06.01.2016

Я конечно не силён ещё в С++, но а РНР для сортировки массива есть команда sort(), так что максимальное и мииимальные значения сразу будт первым и последним в списке массива :)

Hot Rod
Offline
Зарегистрирован: 27.06.2017

Ребят, нужна помощь. Есть некий массив, не суть как он заполняется, в примере просто заполнил значениями. 

#define BUFFER_HOUR_TEMP  6
int minTempHour1[BUFFER_HOUR_TEMP]  = {45, 0, 14, 38, 0, 0}; 

unsigned char i;
for (i = 0; i < BUFFER_HOUR_TEMP; i++) minTemp1 = min(minTempHour1[i], minTemp1);   // выбираем минимальное значение из массива
Serial.print(minTemp1);

Нужно выбрать минимальное значение, не учитывая нулевые. В идеале не учитывая только все последние нулевые (все подряд последние, которые равны 0, их может быть и три и пять).

Заранее благодарю за помощь.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Так и идите с конца Вашего массива, найдите первый не ноль. А дальше продолжайте цикл с поиском минимума.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kalapanga, а какая разница, с какой стооны массива идти?

Клапауций 089
Клапауций 089 аватар
Offline
Зарегистрирован: 14.01.2018

andriano пишет:

kalapanga, а какая разница, с какой стооны массива идти?

— Как по татарски будет «Вперед»? 
— Алга. 
— А «Назад»? 
— У татар нет слова «Назад»… Если нам надо, то мы разворачиваемся и Алга…)))
Hot Rod
Offline
Зарегистрирован: 27.06.2017

Спасибо за направление, получилось так:



#define BUFFER_HOUR_TEMP  6
int tempHour1[BUFFER_HOUR_TEMP]  = { 33, 0, 24, -2, 0, 0};
int minTemp1;

  int t = 0, i = 0;
  for (i = (BUFFER_HOUR_TEMP - 1); i >= 0; i--)  {
    t = tempHour1[i];
    if (t != 0) {
      break;
    }
  }
  minTemp1 = tempHour1[i];
  for (i; i >= 0; i--) {
    minTemp1 = min(tempHour1[i], minTemp1);
  }

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

andriano пишет:

kalapanga, а какая разница, с какой стооны массива идти?

Так чтоб нули последние игнорировать. Я вопрос так понял, что те нули, что в середине встречаются, надо учитывать, а те, что в конце нет. Если все нули нужно игнорить, то без разницы конечно.

Hot Rod
Offline
Зарегистрирован: 27.06.2017

да, все верно, вопрос так и стоял: в идеале игнорировать только последние нули, которые подряд

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Клапауций 089 пишет:

— Как по татарски будет «Вперед»? 

— Алга. 
— А «Назад»? 
— У татар нет слова «Назад»… Если нам надо, то мы разворачиваемся и Алга…)))

За то у нас есть слово ОБРАТНО ! Что бы пойти назад, сначала нужно пойти вперед, а если ты уже прошел вперед, то всегда можно вернуться обратно.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

brokly пишет:
За то у нас есть слово ОБРАТНО ! Что бы пойти назад, сначала нужно пойти вперед, а если ты уже прошел вперед, то всегда можно вернуться обратно.
А потом , если понравилось можно снова обратно вперед и затем обратно назад. 

Hot Rod
Offline
Зарегистрирован: 27.06.2017

Ребят, подскажите как правильно поступить в моем выражении?

для выбора кроме мин еще и макс значения нам нужна еще одна переменная, чтобы заново в том же массиве не откидывать нули в конце. В принципе у нас освободилась t и можно задействовать ее (строка 12), чтобы не занимать место под новую переменную.

#define BUFFER_HOUR_TEMP  6
int tempHour1[BUFFER_HOUR_TEMP]  = { 4, 88, 14, 16, 0, 0};
int minTemp1;
int maxTemp1;

  int t = 0, i = 0;

  for (i = (BUFFER_HOUR_TEMP - 1); i > 0; i--)  { 
    t = tempHour1[i];
    if (t != 0) break;
  }
  t = i;
  minTemp1 = tempHour1[i];
  maxTemp1 = tempHour1[t];
  for (i; i >= 0; i--)  minTemp1 = min(tempHour1[i], minTemp1);
  for (t; t >= 0; t--)  maxTemp1 = max(tempHour1[t], maxTemp1);

Но что-то мне подсказывает, что в одной функции не нужно использовать одну и ту же переменную для разных целей. И более правильным решением будет объявить еще одну переменную

#define BUFFER_HOUR_TEMP  6
int tempHour1[BUFFER_HOUR_TEMP]  = { 4, 88, 14, 16, 0, 0};
int minTemp1;
int maxTemp1;

  int t = 0, i = 0, j = 0;

  for (i = (BUFFER_HOUR_TEMP - 1); i > 0; i--)  {
    t = tempHour1[i];
    if (t != 0) break;
  }
  j = i;
  minTemp1 = tempHour1[i];
  maxTemp1 = tempHour1[j];
  for (i; i >= 0; i--)  minTemp1 = min(tempHour1[i], minTemp1);
  for (j; j >= 0; j--)  maxTemp1 = max(tempHour1[j], maxTemp1);

 

AntonHT
Offline
Зарегистрирован: 29.12.2017

Если не секрет, для чего хранятся данные температуры в массиве?

можно отбор минимума и максимума делать на стадии получения данных с датчмка.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

AntonHT пишет:

Если не секрет, для чего хранятся данные температуры в массиве?

можно отбор минимума и максимума делать на стадии получения данных с датчмка.

Как вариант - для усреднения показаний на серии выборок.

Hot Rod
Offline
Зарегистрирован: 27.06.2017

AntonHT пишет:

Если не секрет, для чего хранятся данные температуры в массиве?

можно отбор минимума и максимума делать на стадии получения данных с датчмка.

DIYMan пишет:

Как вариант - для усреднения показаний на серии выборок.

Данные в массивах - для получения мин и макс t за последний час / сутки / все время работы.

Отбор при получении с датчика подходят, имхо, только для получения минимума и максимума за все время с момента старта, это у меня так и исполнено.