Ответ 1
Использовать массив структур - либо статически распределенный, либо динамический - и затем простую процедуру для поиска - если его малая просто перебирать, если она большая, вы можете выполнять двоичный поиск.
Как вам известно минимум (0.0) и максимум (1.0), вам нужно только сохранить верхнюю границу диапазона и значения перечисления. Например:
typedef enum {FAIL, POOR, OK, GOOD, EXCELLENT, PERFECT} Rating;
typedef struct
{
float upperBound;
Rating score;
} RatingDivision;
static RatingDivision Divisions[] =
{
{ 0.4, FAIL },
{ 0.6, POOR },
...
{ 0.999, EXCELLENT },
{ 1.0, PERFECT }
};
Теперь sizeof(Divisions)/sizeof(RatingDivision)
сообщит вам количество записей (необходимо для двоичного поиска) или просто повторите попытку до тех пор, пока значение, которое вы ищете, не возвращается <= Divisions[i].upperBound
Divisions[i].score
или upperBound
достигает 1.0
с не совпадают и обрабатывают ошибку.