Есть задача сравнить три разных значения: Green Time, RedTime, WhiteTime. Из них нужно выбрать наибольше значение (У какой из команды самое большее время нахождение в зоне , и соответственнно какая из них является победителем) и выполнить код (вывести надпись на экран. Вот пример того что пробовал сделать: Код (C++): void gameOver() { if (team == 1)greenTime += millis() - iZoneTime; if (team == 2)redTime += millis() - iZoneTime; if (team == 3)whiteTime += millis() - iZoneTime; digitalWrite(GREENLED, LOW); digitalWrite(REDLED, LOW); while (!defusing) { keypad.getKey(); if (defusing) { keypad.getKey(); break; } lcd.clear(); lcd.setCursor(3, 0); lcd.print("TIME OVER!"); lcd.setCursor(0, 1); //check who team win the base if (whiteTime > greenTime > redTime) { //whiteteam wins lcd.print(" WHITE TEAM WINS"); digitalWrite(GREENLED, HIGH); } else { if (greenTime > whiteTime > redTime) { //whiteteam wins lcd.print(" GREEN TEAM WINS"); digitalWrite(GREENLED, HIGH); } else { if (redTime > whiteTime > greenTime) //redteam wins lcd.print(" RED TEAM WINS"); digitalWrite(REDLED, HIGH); } } delay(3000); keypad.getKey(); if (defusing) { keypad.getKey(); break; } cls(); lcd.print("Red Time:"); lcd.setCursor(5, 1); printTimeDom(redTime, false); delay(3000); keypad.getKey(); if (defusing) { break; } cls(); lcd.print("Green Time:"); lcd.setCursor(5, 1); printTimeDom(greenTime, false); delay(3000); keypad.getKey(); if (defusing) { keypad.getKey(); break; } cls(); lcd.print("White Time:"); lcd.setCursor(5, 1); printTimeDom(whiteTime, false); delay(3000); keypad.getKey(); if (defusing) { keypad.getKey(); break; } } cls(); delay(100); lcd.print("Play Again?"); lcd.setCursor(0, 1); lcd.print("A : Yes B : No"); while (1) { var = keypad.waitForKey(); if (var == 'a' ) { tone(tonepin, 2400, 30); cls(); domination(); break; } if (var == 'b' ) { tone(tonepin, 2400, 30); menuPrincipal(); break; } } } Подскажите пожалуста как эту задачу решить правильно
В общем случае следует поместить значения в массив пар { ключ, значение} и отсортировать его по убыванию ключей. Первый элемент будет содержать пару с наибольшим ключем. Значение в паре может указывать на требуемое действие. А для трех значений можно на if все сделать. Только сравнивать нужно попарно и соединять результаты логическими операторами. Просто цепочки из неравенств дадут вам неожиданный результат. Код (C++): boolean a12 = a1 > a2; boolean a23 = a2 > a3; boolean a31 = a3 > a1; if ( a12 && a23 ) { // a1 - max } else if ( a23 && a31 ) { // a2 - max } else /* -- не a1 и не a2, значит... if ( a31 && a12 ) */ { // a3 - max }
Вывести на экран бОльшее значение? Или какую то надпись в зависимости от того значение какого цвета больше?
вариант 1: Код (C++): int max3 ( int a , int b , int c ) { int maximum1 = 0; int maximum2 = 0; int maximum3 = 0; if (a > b) maximum1 = a; else maximum1 = b; if (b > c) maximum2 = b; else maximum2 = c; if (maximum1 > maximum2) maximum3 = maximum1; else maximum3 = maximum2; return maximum3; } Вариант 2 (по сути то же самое, но в сокращенной записи): Код (C++): int max3 ( int a , int b , int c ) { return a > b ? a > c ? a : c : b > c ? b : c ; } Пример использования: Код (C++): int maxValue = max3 (RedTime, GreenTime, WhiteTime); Serial.println(maxValue);
Прикольно, я написал практически такую же функцию: Код (C++): byte maxColor (int a1, int a2, int a3) { byte m = (a1 > a2) ? ((a1 > a3) ? 1 : 3) : ((a2 > a3) ? 2 : 3); return m; } Только возвращает не максимальное значение, а номер переменной с максимальным значением.
Так ТС не ответил на простой вопрос: что ему надо - максимальное значение или цвет с максимальным значением?
Без скобок выглядит и правда зловещее: Код (C++): byte maxColor (int a1, int a2, int a3) { return a1 > a2 ? a1 > a3 ? 1 : 3 : a2 > a3 ? 2 : 3; }
Внешняя часть кода: Код (C++): Serial.begin(9600); int g = 21; int r = 100; int w = 150; byte mc = maxColor(g, r, w); switch (mc) { case 1: Serial.println("1"); break; case 2: Serial.println("2"); break; case 3: Serial.println("3"); break; }
Скорее всего цвет. Код (C++): //check who team win the base if (whiteTime > greenTime > redTime) { //greenteam wins lcd.print(" WHITE TEAM WINS"); digitalWrite(GREENLED, HIGH); {
Коллега, а правильно Вас понял : if(whiteTime > greenTime > redTime) вот так сравнивать нельзя? Правильней будет только два значения?
Это whiteTime > greenTime > redTime эквивалентно этому (whiteTime > greenTime) > redTime. Иными словами (true или false) > redTime. Очевидно, что это совсем не это (whiteTime > greenTime) && (greenTime > redTime). А как "правильнее", вам виднее.
Нужно чтобы в зависимости от того какая из команд набрала наибольшее время то печаталась надпись о том какая это команда.