C Switch语句

时间:2011-06-07 18:35:59

标签: c

快速提问,我正在使用switch语句编写成绩单程序。使用if语句,我可以轻松使用&lt ;,或>指定一定范围。如果用户输入一个数字,如93,我将不得不列出99-90的所有情况,这太多了。我已经编写了程序,它工作正常,但我想摆脱坏代码。有没有更合理的方式来写这个而不列出多个案例?希望这是有道理的......

3 个答案:

答案 0 :(得分:3)

不,switch的要点是列举案例。您可以使用几种不同的情况来执行相同的操作(代码将执行到下一个break),但您必须枚举可能性(或使用default来涵盖所有除了列举为单个案例之外的其他可能性。)

如果您需要涵盖范围 - 请使用if

答案 1 :(得分:3)

Under gcc you can do this

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;
}