Прошу помощи в правильности написания кода.

Тема в разделе "Посоветуйте детальки", создана пользователем Helsing, 7 дек 2016.

  1. Helsing

    Helsing Нуб

    Есть задача сравнить три разных значения: 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;
      }
      }
    }
    Подскажите пожалуста как эту задачу решить правильно
     
    Последнее редактирование: 8 дек 2016
  2. mcureenab

    mcureenab Гуру

    В общем случае следует поместить значения в массив пар { ключ, значение} и отсортировать его по убыванию ключей. Первый элемент будет содержать пару с наибольшим ключем. Значение в паре может указывать на требуемое действие.

    А для трех значений можно на 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

    }
     
  3. ostrov

    ostrov Гуру

    Вывести на экран бОльшее значение? Или какую то надпись в зависимости от того значение какого цвета больше?
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    вариант 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);
     
    Helsing и ostrov нравится это.
  5. ostrov

    ostrov Гуру

    Прикольно, я написал практически такую же функцию:
    Код (C++):
    byte maxColor (int a1, int a2, int a3) {
      byte m = (a1 > a2) ? ((a1 > a3) ? 1 : 3) : ((a2 > a3) ? 2 : 3);
      return m;
    }
    Только возвращает не максимальное значение, а номер переменной с максимальным значением.
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    нее, у меня диапазон от -32768 до 32767 :p и возвращает наибольшее значение, а не номер этого значения.
     
  7. ostrov

    ostrov Гуру

    Так ТС не ответил на простой вопрос: что ему надо - максимальное значение или цвет с максимальным значением?
     
  8. ostrov

    ostrov Гуру

    У меня по второму варианту работает. ))
     
  9. ostrov

    ostrov Гуру

    Без скобок выглядит и правда зловещее:
    Код (C++):
    byte maxColor (int a1, int a2, int a3) {
      return a1 > a2 ? a1 > a3 ? 1 : 3 : a2 > a3 ? 2 : 3;
    }
    :eek:
     
  10. ostrov

    ostrov Гуру

    Внешняя часть кода:
    Код (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;
      }
     
  11. mcureenab

    mcureenab Гуру

    Скорее всего цвет.

    Код (C++):
    //check who team win the base
    if (whiteTime > greenTime > redTime)
    {
    //greenteam wins
    lcd.print(" WHITE TEAM WINS");
    digitalWrite(GREENLED, HIGH);

    {
     
  12. ostrov

    ostrov Гуру

    Значит мой вариант прокатывает. Надеюсь, собрать из двух окон получится?
     
  13. Helsing

    Helsing Нуб

    Спасибо, за замечание. Исправил .пост.
     
  14. Helsing

    Helsing Нуб

    Коллега, а правильно Вас понял : if(whiteTime > greenTime > redTime) вот так сравнивать нельзя? Правильней будет только два значения?
     
  15. mcureenab

    mcureenab Гуру

    Это whiteTime > greenTime > redTime эквивалентно этому (whiteTime > greenTime) > redTime. Иными словами
    (true или false) > redTime. Очевидно, что это совсем не это (whiteTime > greenTime) && (greenTime > redTime). А как "правильнее", вам виднее.
     
  16. Helsing

    Helsing Нуб

    Нужно чтобы в зависимости от того какая из команд набрала наибольшее время то печаталась надпись о том какая это команда.
     
  17. mcureenab

    mcureenab Гуру

    А если результаты равные, что делать?
     
  18. Tomasina

    Tomasina Сушитель лампочек Модератор

    Делить на ноль, очевидно же...
     
  19. Helsing

    Helsing Нуб

    Маловероятно что результаты будут равными, т. к. там сравнение идет на уровне долей секунд.
     
  20. Tomasina

    Tomasina Сушитель лампочек Модератор

    защита от дурака всегда должна быть.