Как определить наибольшее число.
- Войдите на сайт для отправки комментариев
Вот простой в принципе вопрос а правильное решение найти не могу.
Сформулировать правильный запрос для поисковика тоже не получается.
Имеем две переменные, они имеют определенное значение (допустим тип данных - int). Каким образом эти переменные получают значения - не суть.
Как максимально просто и грамотно определить , значение какой из переменных больше а какой меньше ?
Единственное что приходит в голову это из первой переменной вычесть вторую (не важно из какой конкретно).
Если получим положительное значение , значит первая переменная была больше второй. Если получим отрицательное - вторая была больше первой. Если обе переменные равны (результатат вычитания - ноль) игнорируем данный факт.
Вроде просто , но не нравится мне такой вариант.
А операторы сравнения <, >, <=, >= чем вас не устраивают?
Может быть, про max вопрос? http://arduino.ru/Reference/Max
Так вы хотите нечто, которое просто вам возвращает максимальное значение перенной, а когда они равны возвращает 0?
Пожалуйста:
Так вы хотите нечто, которое просто вам возвращает максимальное значение перенной, а когда они равны возвращает 0?
Пожалуйста:
Так а почему не val_max=max(val_1, val_2) ?
Потому что если val_1 будет равен val_2, то эта деректива вернет val_2.
Из Arduino.h:
Единственное что приходит в голову это из первой переменной вычесть вторую (не важно из какой конкретно).
Чем не нравится такой вариант? По мне так вполне себе живой вариант. Думаю и оптимизатор с этим согласится. Я бы просто посмотрел листинг ассемблера для этих двух вариантов, но мне придется копаться и искать, может кто-то быстро сможет посмотреть?
Предполагаю, что чуть больше "проблем", если после сранения нужно все три варианта как то обработать, а не просто решить задачу "равны" или "не равны". Хотя оптимизатор должен бы разрулить.
Я не давно писал функцию которая определяет какое число больше и указывает его номер. Может тебе это надо?
перечисляешь функции три числа, а она тебе выдает номер той, что больше.
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; }Пример работ: При старте мигаем всеми светоиндикаторами столько раз, какой датчик температуры нагрелся больше (для калибровки датчиков):
Можно обсчитать так, что если все они равны нулю, выдавалось бы 0, т.е. никакой номер. Я так задумывал, но потом как-то иначе обошелся.
Когда 2 переменные всё понятно...
Как сделать когда нужно из 4-х переменных найти максимальное или минимальное значение?
Всё, разобрался
Нда... а если 10 переменных?
1. Переменные сложить в массив.
2. Поиск максимума (минимума) - стандартная задача школьного курса информатики, даже гуглить стыдно.
Скажем не у всех в школе была информатика...
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);Я конечно не силён ещё в С++, но а РНР для сортировки массива есть команда sort(), так что максимальное и мииимальные значения сразу будт первым и последним в списке массива :)
Ребят, нужна помощь. Есть некий массив, не суть как он заполняется, в примере просто заполнил значениями.
#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, а какая разница, с какой стооны массива идти?
kalapanga, а какая разница, с какой стооны массива идти?
Спасибо за направление, получилось так:
#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, а какая разница, с какой стооны массива идти?
Так чтоб нули последние игнорировать. Я вопрос так понял, что те нули, что в середине встречаются, надо учитывать, а те, что в конце нет. Если все нули нужно игнорить, то без разницы конечно.
да, все верно, вопрос так и стоял: в идеале игнорировать только последние нули, которые подряд
— Как по татарски будет «Вперед»?
За то у нас есть слово ОБРАТНО ! Что бы пойти назад, сначала нужно пойти вперед, а если ты уже прошел вперед, то всегда можно вернуться обратно.
Ребят, подскажите как правильно поступить в моем выражении?
для выбора кроме мин еще и макс значения нам нужна еще одна переменная, чтобы заново в том же массиве не откидывать нули в конце. В принципе у нас освободилась 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);Если не секрет, для чего хранятся данные температуры в массиве?
можно отбор минимума и максимума делать на стадии получения данных с датчмка.
Если не секрет, для чего хранятся данные температуры в массиве?
можно отбор минимума и максимума делать на стадии получения данных с датчмка.
Как вариант - для усреднения показаний на серии выборок.
Если не секрет, для чего хранятся данные температуры в массиве?
можно отбор минимума и максимума делать на стадии получения данных с датчмка.
Как вариант - для усреднения показаний на серии выборок.
Данные в массивах - для получения мин и макс t за последний час / сутки / все время работы.
Отбор при получении с датчика подходят, имхо, только для получения минимума и максимума за все время с момента старта, это у меня так и исполнено.