在C中使用一长串"if/else if"语句的更好的替代方法?

HB-*_*HB- 7 c if-statement

最初我使用了switch/case,但条件必须是变量匹配的常量值,而变量是否在范围内的布尔值.

相反,我有这种怪异:

    if ( data[y] > 91 ) {
       grades[9] = grades[9] + 1;
    }
    else if ( data[y] > 88 && data[y] < 92 ) {
        grades[8] = grades[8] + 1;
    }
    else if ( data[y] > 84 && data[y] < 89 ) {
        grades[7] = grades[7] + 1;
    }
    else if ( data[y] > 81 && data[y] < 85) {
        grades[6] = grades[6] + 1;
    }
    else if ( data[y] > 79 && data[y] < 82) {
        grades[5] = grades[5] + 1;
    }
    else if ( data[y] > 74 && data[y] < 79 ) {
        grades[4] = grades[4] + 1;
    }
    else if ( data[y] > 71 && data[y] < 75 ) {
        grades[3] = grades[3] + 1;
    }
    else if ( data[y] > 68 && data[y] < 72 ) {
        grades[2] = grades[2] + 1;
    }
    else if ( data[y] > 59 && data[y] < 69 ) {
        grades[1] = grades[1] + 1;
    else {
        //data[y] < 60:
        grades[0] = grades[0] + 1;
    }
Run Code Online (Sandbox Code Playgroud)

有没有人知道处理这段代码的更好方法,因为我的开关/案例想法不适用?当然必须有更好的方法来做到这一点.

oog*_*oga 15

缩短代码最明显的就是摆脱不必要的第二次测试:

if      (data[y] >= 92) ++grades[9];
else if (data[y] >= 89) ++grades[8];
else if (data[y] >= 85) ++grades[7];
else if (data[y] >= 82) ++grades[6];
else if (data[y] >= 80) ++grades[5];
else if (data[y] >= 75) ++grades[4];
else if (data[y] >= 72) ++grades[3];
else if (data[y] >= 69) ++grades[2];
else if (data[y] >= 60) ++grades[1];
else                    ++grades[0];
Run Code Online (Sandbox Code Playgroud)


hob*_*bbs 6

这似乎是一种明智的数据驱动方法:

int grade_cutoff[] = { 59, 68, 71, 74, 79, 81, 84, 88, 91, INT_MAX };
int grade_bucket;

for (grade_bucket = 0; data[y] > grade_cutoff[grade_bucket]; grade_bucket++) {
  /* nothing */
}

grades[grade_bucket]++;
Run Code Online (Sandbox Code Playgroud)


sho*_*zer 5

使用循环.您还需要每个等级的最小数据值数组.以下是一些未经测试的代码示例:

for (int i = 9; i >= 0; i--)
{
    if (data[y] >= minDataValueForGrade[i])
    {
        grades[i]++;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

它简短易读,可以很容易地更改与每个等级相对应的值.