快速提问,我正在使用switch语句编写成绩单程序。使用if语句,我可以轻松使用&lt ;,或>指定一定范围。如果用户输入一个数字,如93,我将不得不列出99-90的所有情况,这太多了。我已经编写了程序,它工作正常,但我想摆脱坏代码。有没有更合理的方式来写这个而不列出多个案例?希望这是有道理的......
答案 0 :(得分:3)
不,switch
的要点是列举案例。您可以使用几种不同的情况来执行相同的操作(代码将执行到下一个break
),但您必须枚举可能性(或使用default
来涵盖所有除了列举为单个案例之外的其他可能性。)
如果您需要涵盖范围 - 请使用if
。
答案 1 :(得分:3)
switch (value)
{
case 1...3:
//Do Something
break;
case 4...6:
//Do Something
break;
default:
//Do the Default
break;
}
但代码(显然)不能移植到其他C编译器。
答案 2 :(得分:2)
您不希望使用switch语句来确定值在一组范围内的位置。
如果要概括一点,并避免使用硬编码条件的多个if / else语句,则可以创建一个映射。即你基本上是将一组整数映射到一组成绩。
下面是一个使用表格查找将分数映射到成绩的简单示例。您还可以创建一个封闭的数学公式,将分数映射到成绩,并直接从分数计算成绩,而不是通过表格查找。例如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;
}