Чтобы не было простыней при большом количестве вариантов:
Например, если все значения, с которыми сравниваем - последовательный ряд вида х, х+50, х+50*2, х+50*3...
Код:
|
#define x_base 550
#define x_increment 50
uint8_t test (uint16_t x)
{
uint8_t result = 1;
if (x ‹ x_base) return 0;
x -= x_base;
while (x › x_increment)
{
x -= x_increment;
result++;
}
return result;
}
///somewhere in code
switch (test(x))
{
case 0:
//group 0;
break;
case 1:
//group 1
break;
case 2:
//group 2
break;
...
default:
//group default
} |
Если же ряд имеет неравномерные приращения, то test(x) немного усложняется, но не сильно: все так же задаем минимальное значение, а вместо константы приращения задаем массив констант, и в цикле while используем на каждой итерации очередное значение из этого массива. Или просто задаем массив констант значений и сравниваем с ними.
Работает всё это ничуть не лучше (строго говоря, даже чуть-чуть, на единицы тактов медленней)) просто "монструозной" портянки if-ов, но управляться с таким кодом не в пример легче, и когда все значения приращений в одном месте и перед глазами - ввести в каком-то из значений 540 вместо 450, и не заметить это вероятность куда меньше, чем в длиннющей простыне кода.
Но лично моя практика показывает, что "монструозную портянку" люди почти всегда используют просто для того, чтоб получить выходное значение в зависимости от входного по некоей нелинейной функции (был тут яркий пример)))). И вот тут лучше забыть про все эти ифы и свитчи, и таки написать полиномиальную функцию, которая будет выдавать результат расчета - причем делать это плавно, а не грубыми скачками.
Благо в наше время для этого и математику учить не надо, вбил точки в CurveExpert, оно и расписало требуемый полином