#c
#c
Вопрос:
Небольшой вопрос, я пишу программу для написания оценок, используя только инструкции switch. С помощью операторов if я могу легко использовать <, или > для обозначения определенного диапазона. Если пользователь вводит число, такое как 93, мне пришлось бы перечислить все случаи из 99-90, что слишком избыточно. Я уже написал программу, и она отлично работает, но я хочу уйти от плохого кода. Есть ли более разумный способ написать это без перечисления нескольких случаев? Надеюсь, это имеет смысл…
Комментарии:
1. Что не так с
if
утверждениями?2. разделите оценку на десять, например: 73/10 = 7 (целочисленная арифметика)
3. Используете ли вы значение по умолчанию: case в конструкции switch …case? Пожалуйста, приведите мне пример того, что именно делает ваш код…
4. ответ Джима может сработать, но
switch
это действительно неправильный подход к вашей проблеме.5. У меня было задание, которое я выполнял некоторое время назад, которое включало использование операторов if, но мне было интересно посмотреть, есть ли способ использовать switch вместо этого. Проблема заключалась в том, что, поступая таким образом, вы ограничиваете себя написанием каждой отдельной возможности, что нелепо. Просто хотел провести хорошее обсуждение этой проблемы. Спасибо за информацию, ребята!
Ответ №1:
Нет, смысл switch
в том, чтобы перечислять случаи. Вы можете использовать несколько разных вариантов для выполнения одного и того же действия (код будет выполняться до следующего break
), но вам придется перечислять возможности (или использовать, default
чтобы охватить все возможности, отличные от перечисленных, в одном случае).
Если вам нужно охватить диапазоны — используйте if
.
Комментарии:
1. Это именно то, что я обнаружил. Просто не имело смысла перечислять все возможные случаи от 0-100. Я просто хотел бы, чтобы вы могли использовать операторы <, > в операторах switch, чтобы охватить полный диапазон.
Ответ №2:
В gcc
разделе вы можете сделать это:
switch (value)
{
case 1...3:
//Do Something
break;
case 4...6:
//Do Something
break;
default:
//Do the Default
break;
}
но код (очевидно) не переносим для других компиляторов C.
Ответ №3:
Вы бы не хотели использовать инструкцию switch для определения того, куда попадает значение в наборе диапазонов.
Если вы хотите немного обобщить и избежать нескольких операторов if / else с жестко закодированными условиями, вы могли бы создать map . т. Е. вы, по сути, сопоставляете набор целых чисел с набором оценок.
Ниже приведен простой пример, в котором используется поиск по таблице для сопоставления баллов с оценками. Вы также могли бы создать замкнутую математическую формулу, которая сопоставляет оценки с оценками, и просто вычислять оценку непосредственно из оценки, вместо того, чтобы искать ее через таблицу. например, f (x) = floor (2 * (x-50) / 20) сопоставил бы оценки из [0,100] в целочисленные оценки в диапазоне [0,5]
typedef struct
{
int rangeLow;
char grade;
} RangeToGradeMap;
RangeToGradeMap[] scoreToGradeMapping =
{
{ 90, 'A' }
{ 85, 'B' },
{ 70, 'C' },
{ 60, 'D' },
{ 0, 'F' },
};
char GradeLookup(int score)
{
size_t N = sizeof(scoreToGradeMapping)/sizeof(RangeToGradeMap);
for (size_t i = 0; i < N; i)
{
if (score >= scoreToGradeMapping[i].rangeLow)
{
return scoreToGradeMapping[i].grade;
}
}
// If we got here, there was an error - we didn't find the range
return '?';
}
int main(int argc, char** argv)
{
char grade = GradeLookup(87);
return 0;
}
Комментарии:
1. Ну, очевидно, что он / она действительно хочет! (И на самом деле, было бы неплохо иметь возможность переключать диапазоны.) Вы имеете в виду, «вы не можете»…
2. Возвращение к этому через два года действительно имеет значение. Отличная работа, теперь я могу придумать что-то очень похожее и реализовать свое собственное решение 🙂