0

这是我的代码,我不太喜欢它,我知道它可以改进,但我不知道怎么做。我如何根据每行上的许多std::cin和相互操作来重构这个程序?std::cout是否有任何 STL 库魔法可以改善这一点?谢谢。

#include <iostream>
#include <string>

int main() {

   int grade;

   std::cout << "Enter the grade you recieved: ";
   std::cin >> grade;
   std::cout << grade << "\n\n";

   if (grade == 100) {
      std::cout << "You got a perfect score!\n";
   } else if (grade > 90 && grade < 100) {
      std::cout << "You got an A\n";
   }

   if (grade == 100) {
      std::cout << "Grade: A+";
   } else if (grade > 90 && grade < 100) {
      std::cout << "Grade : A";
   } else if (grade > 80 && grade < 90) {
      std::cout << "Grade: B";
   } else if (grade > 70 && grade < 80) {
      std::cout << "Grade: C";
   } else if (grade > 60 && grade < 70) {
      std::cout << "Grade: D";
   } else if (grade < 60) {
      std::cout << "Grade: F";
   }

}

为了清楚起见,我想改进这段代码,因为使用所有这些 if 语句和打印函数似乎非常不习惯。如何利用 STL 或模板函数/类来重构它?也欢迎 C++11。谢谢。

4

3 回答 3

5

你已经得到了几个答案,但我想我还是会做一些不同的事情:

static char const *grades[] = { "F", "F", "F", "F", "F", "F", "D", "C", "B", "A", "A+"};

std::cout << grades[grade/10];

[我希望我正确地计算了“F”的数量。]

于 2013-01-28T03:19:54.193 回答
3
#include <iostream>
#include <string>
#include <map>

int main() {
    std::map<int,std::string> grades = {
        {10,"A+"}, {9,"A"}, {8,"B"}, {7,"C"}, {6,"D"}, {5,"F"}
    };
    std::cout << "Input a grade: ";
    int grade;
    std::cin >> grade;
    grade /= 10;
    if(grade <= 5)
        grade = 5;
    std::cout << "Your grade is: " << grades[grade];
}

使用查找表。不验证输入或任何东西,但它很短。

于 2013-01-28T02:41:15.877 回答
2
std::string GetGrade(int grade);

cout<<GetGrade(grade);

是清理东西的一种方法。基本上将所有ifs 移入 GetGrade 函数并调用cout一次。

一旦进入 GetGrade,您可以使用下面的数组并取消ifs 以支持循环。

struct Grade{
    int start,end;
    std::string gradeStr;
};
于 2013-01-28T02:25:43.347 回答