如何将范围映射到值?

Bar*_*kPL 6 c++ c++11

我实际上想知道在 C++ 中将字母正确分配给范围的最佳方法是什么。

例如,我们有这样的规模:

在此输入图像描述

我们可以用最简单的方式进行赋值:

if(a < 40)
  return 'T';
else if(a < 55)
  return 'D';
else if(a < 70)
  return 'P';
else if(a < 80)
  return 'A';
else if(a < 90)
  return 'E';
else if(a <= 100)
  return 'O';
Run Code Online (Sandbox Code Playgroud)

但是,您有更好的想法吗?

当我们有更大的数字和更多的字母时该怎么办(我认为 if 语句仍然很烦人......)?或者,如果范围之间有空闲空间(例如 30-40 45-55 60-70)怎么办?

Rob*_*aus 5

您可以使用简单数组来排序范围和输出

char getGrade (int grade) {
    int upper[] = { 40, 55, 70, 80, 90, 100 };
    int lower[] = { 0, 40, 55, 70, 80, 90 };
    char grades[] = { 'T', 'D', 'P', 'A', 'E', 'O' };

    for (int i = 0; i< 6; i++) 
        if ((grade< upper[i]) && (grade >= lower[i]))               
            return grades[i];
    return 'X'; // no grade assigned
}
Run Code Online (Sandbox Code Playgroud)

编辑:我正在添加@YSC 的有趣实现并由struct@YSCstd::find_if建议

#include <iostream>
#include <algorithm>
#include <vector>

struct Data{ int lower; int upper; char grade; };

char getGrade (int grade, std::vector<Data> data) {
    auto it = std::find_if(
            data.begin(),
            data.end(), 
            [&grade](Data d) { return (d.lower<= grade) && (d.upper > grade); }
           );
    if (it == data.end())
        return 'X'; // not found
    else
        return it->grade;
}

int main () {
    const std::vector<Data> myData = { { 0, 40, 'T'} , { 40, 55, 'D'}, {55, 70, 'P'}, {70, 80, 'A'}, {80, 90, 'E'}, {90, 101, 'O'} };
    std::cout << getGrade(20, myData) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)