【问题标题】:Switch statement in C++C++中的switch语句
【发布时间】:2011-11-27 03:37:44
【问题描述】:

考虑:

#include <iostream>

using namespace std;

int main()
{
    int score;
    char grade;
    cout << "Enter your score: " << endl;
    cin >> score;
    if (score >= 90)
        grade = 'a';
    if (score >= 80)
        grade = 'b';
    if (score >= 70)
        grade = 'c';
    if (score >= 60)
        grade = 'd';
    else
        grade = 'f';

    cout << grade << endl;

    switch (grade) {
        case 'a':
            cout << "Good job" << endl;
            break;
        case 'c':
            cout << "Fair job" << endl;
            break;
        case 'f':
            cout << "Failure" << endl;
            break;
        default:
            cout << "invalid" << endl;
    }

    cin.get();
    return 0;
}

为什么当我输入 95 时它会给出我的默认 switch case,而我应该得到 case 'a'?

【问题讨论】:

  • 为什么要将数字转换为字母,然后将字母转换为更长的文字描述?跳过switch 并在你的第一个if 中打印(当然是在你修复它之后)。过度复杂化是我们最大的诅咒,与它作斗争!
  • 因为case 'd': 丢失了您是否注意到正在输出哪个等级?
  • 你在切换开始之前检查过成绩的输出是否返回a
  • @Blindy 可能是因为这是一个家庭作业,说明了嵌套 if-else-if 和 switch 案例之间的差异。

标签: c++ switch-statement conditional-statements


【解决方案1】:

你已经得到了一些答案,但我想我会提出一种稍微不同的可能性,它可以摆脱大部分控制流并用一些数学代替:

char grades[] = "00000012344";

char *messages[] = {
    "Excellent Job",
    "Good job",
    "Average job",
    "Mediocre Job",
    "Failure"
};

if (score < 0 || score > 100)
    std::cout << "Invalid score";
else {
    int grade = grades[score/10];
    std::cout << messages[grade];
}

因此,我们使用score/10 将分数从 0-100 变为 0-10。然后我们查找分数的适当等级,f=0、d=1、c=2、b=3 和 a=4。我们使用它来选择并打印出适当的消息。我已经为您跳过的字母添加了消息(可能是也可能不是您想要的)。

【讨论】:

    【解决方案2】:

    你需要改善你的if条件。

    您正在检查score &gt;= no。输入95 执行所有if 语句,最后执行的语句是d。现在在您的 switch 语句中,case d 不存在,因此它执行 default 之一。

    【讨论】:

      【解决方案3】:

      这是因为您的 if 语句位于顶部。您应该使用 else ifs 而不是单独的 ifs。您的 if 90 正在跟进,然后所有其他人也是如此。您的字母“a”基本上被覆盖了,因为 95 >= 对于所有其他条件。使用 else if 将在找到真正的检查时中断其余检查。

      if (score >= 90)
          grade = 'a';
      else if (score >= 80)
          grade = 'b';
      else if (score >= 70)
          grade = 'c';
      else if (score >= 60)
          grade = 'd';
      else
          grade = 'f';
      

      【讨论】:

        【解决方案4】:

        您已指定它,使您的 95 满足所有的情况:95 大于 90,但也大于 80,大于 70,等等。

        在这种情况下,最后一个获胜。

        您可以通过使用elses 来解决它,或者将其包装在一个函数中并在您知道您需要的成绩后立即返回:

        char grade(int score) {
           if (score >= 90) return 'a';
           if (score >= 80) return 'b';
           ...
        }
        

        【讨论】:

          【解决方案5】:

          我相信你想要

          if (score >= 90)
              grade = 'a';
          else if (score >= 80)
              grade = 'b';
          else if (score >= 70)
              grade = 'c';
          else if (score >= 60)
              grade = 'd';
          else 
              grade = 'f';
          

          除了最后两种情况(60 岁及以上及以下)之外,您所拥有的并不相互排斥。您的代码不会短路;它检查所有 1 到 5。

          if (score >= 90) // 1.
              grade = 'a';
          
          if (score >= 80) // 2.
              grade = 'b';
          
          if (score >= 70) // 4.
              grade = 'c';
          
          if (score >= 60) // 5.
              grade = 'd';
          else 
              grade = 'f';
          

          【讨论】:

            【解决方案6】:

            我认为您想使用“else if”。如果 "score >= 60" 为真,那么它会下降到最后一个,然后等级等于 "d",这会在你的 switch 语句中产生默认情况。

            【讨论】:

              【解决方案7】:

              if 分支的顺序错误(或者您需要像这样提供 else 分支:))。

              在这里现场观看:http://ideone.com/2uSZT

              #include <iostream>
              
              using namespace std;
              
              int main()
              {
                  int score;
                  char grade;
                  cout << "Enter your score:" << endl;
                  cin >> score;
                  if (score >= 90)
                      grade = 'a';
                  else if (score >= 80)
                      grade = 'b';
                  else if (score >= 70)
                      grade = 'c';
                  else if (score >= 60)
                      grade = 'd';
                  else
                      grade = 'f';
              
                  cout << grade << endl;
                  switch (grade)
                  {
                  case 'a':
                      cout << "Good job" << endl;
                      break;
                  case 'c':
                      cout << "Fair job" << endl;
                      break;
                  case 'f':
                      cout << "Failure" << endl;
                      break;
                  default:
                      cout << "invalid" << endl;
                  }
                  cin.get();
                  return 0;
              }
              

              【讨论】:

              • @mat:你一定是看到我最初的反应太快了吧?我以为我忍得够快:)
              • 是的,在我写我的时候看到你的答案弹出来了。也被它弄糊涂了:)
              • @Mat:看,我知道忽略这些弹出窗口对某些事情有好处。唯一让我感到困扰的是,当我终于准备好按“提交”时,结果发现问题已被删除
              【解决方案8】:

              因为所有score 比较都没有与if/else if 条件结合。它们是独立的if 语句。因此grade95 覆盖。

              【讨论】:

                【解决方案9】:

                您错过了一堆elses,或者以错误的顺序进行比较。

                95 大于 90,但也大于 80、70 和 60。所以你会得到一个“d”。

                (而且您没有在 switch 中处理“d”。)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-01-08
                  • 2016-07-12
                  • 2021-07-24
                  • 2018-01-11
                  • 1970-01-01
                  • 2010-10-29
                  相关资源
                  最近更新 更多