Задать вопрос
@DoubleSidedTape

Согласование числительного и существительного в С++ (1 пирожок, 2 пирожка...)?

Есть задача - задать угол потенциометром и выводить этот угол на экран (в примере вывод в порт). После значения должно быть слово "градусов", но, увы, оно подходит не ко всем числовым значениям, так уж работает великий и могучий. В примере я создал два массива с исключениями. По окончанию перебора выводится "стандартное" - "градусов".

Вопрос - является ли мое решение правильным, и можно ли его улучшить? (Что делать, если к примеру значение не от 0 до 90, а до 10000, там таких исключений больше)

void setup() {
  Serial.begin(9600);
}

  uint16_t val = analogRead(A0);
  uint16_t angle = map(val, 0, 700, 0, 90);
  Serial.print(constrain(angle, 0, 90));


//  <b>область вопроса:</b>

  uint8_t myArray1[] = { 1, 21, 31, 41, 51, 61, 71, 81 };
  uint8_t myArray2[] = { 2, 3, 4, 12, 13, 14, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84 };

  for (int a = 0; a < 8; a++) {
    for (int b = 0; b < 28; b++) {
      if (angle == myArray1[a]) {
        Serial.println(" градус :)");
      } else if (constrain(angle, 0, 90) == myArray2[b]) {
        Serial.println(" градуса ");
      } else if (a == 7 && b == 27) {
        Serial.println(" градусов");
      }
    }
  }
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
pickHabr
@pickHabr
Костыльных дел мастер
Зачем с этим страдать, почему нельзя сократить или использовать символьное обозначение?

Но если очень хочется
Число кончается на 2, 3, 4 и предпоследняя цифра не 1 - градуса
Число кончается на 1 и предпоследняя цифра не 1 - градус
В остальных случаях - градусов

std::string getAngleRus(int number) {
    int lastDigit = number % 10;
    int secondLastDigit = (number / 10) % 10;

    if (secondLastDigit == 1) {
        return "градусов";
    }
    
    if (lastDigit == 1) {
        return "градус";
    } else if (lastDigit >= 2 && lastDigit <= 4) {
        return "градуса";
    }

    return "градусов";
}
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Держите общий принцип. На плюсы переделывайте самостоятельно.
function plural(value, form1, form2, form5) {
    r100 = value % 100;
    r10 = value % 10;
    if (r100 > 10 && r100 < 20) {
        return form5;
    }
    if (r10 == 1) {
        return form1;
    }
    if (r10 >= 2 && r10 <= 4) {
        return form2;
    }
    return form5;
}

units = plural(degrees, "градус", "градуса", "градусов");
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы