【问题标题】:Is there a cleaner way to add an additional switch statement to this code?有没有更简洁的方法可以向此代码添加额外的 switch 语句?
【发布时间】:2021-03-18 18:08:32
【问题描述】:
#include <iostream>
using namespace std;

int main()
{
    char grade;

    cout << "What grade did you earn in Programming I ?" << endl;
    cin >> grade;

    switch (grade)  // This is where the switch statement begins
    {
                              
        case 'A': cout << "an A - excellent work !" << endl;
                  break;
        case 'B': cout << "you got a B - good job" << endl;
                  break;
        case 'C': cout << "earning a C is satisfactory" << endl;
                  break;
        case 'D': cout << "while D is passing, there is a problem" << endl;
                  break;
        case 'F': cout << "you failed - better luck next time" << endl;
                  break;
        default: cout << "You did not enter an A, B, C, D, or F" << endl;
    }

    return 0;
}

我应该添加一个语句,另外打印出“你通过了!”如果用户输入 D 或更高的等级。我知道我可以手动完成:

case 'A': cout << "YOU PASSED!" << endl;
                  cout << "an A - excellent work !" << endl;
                  break;
case 'B': cout << "YOU PASSED!" << endl; 
                  cout << "you got a B - good job" << endl;
                  break;

(等)

但我很好奇是否有办法通过 switch 语句顶部的单个语句来完成它,例如

case 'A' || 'B' || 'C' || 'D': cout << "YOU PASSED!" << endl;

case 'A': case: 'B':(etc): cout << "YOU PASSED!" << endl;

我知道(通过尝试)那些行不通。

【问题讨论】:

  • switch 上方的单独条件检查。 if (grade &gt;= 'A' &amp;&amp; grade &lt;= 'D') std::cout &lt;&lt; "YOU PASSED!\n";
  • 欢迎来到 Stack Overflow!如果你需要帮助改进工作代码,你应该在CodeReview.SE 上发布。如果您决定这样做,请在此处删除问题。
  • 谢谢 sweenish,我试图在现有的 switch 语句中添加额外的检查,而不是在上面添加。 '
  • 另一种选择是添加一个传递给代码的布尔值,或者将其初始化为真,但为 D/F 设置为假,或者初始化为假并为 A-B-C 设置为真。然后在开关下方,输出更多信息。
  • 拥有默认大小写return 0;,然后将cout &lt;&lt; "YOU PASSED!" &lt;&lt; endl;放在switch之后。

标签: c++ switch-statement


【解决方案1】:

如果您必须只使用 switch 而不使用其他任何东西,则可以嵌套它们以分别处理 'A'-'D''F' 情况(以多余的 grade 检查为代价)。

switch (grade)
{
case 'A':
case 'B':
case 'C':
case 'D': cout << "YOU PASSED!" << endl;
          switch(grade)
          {
          case 'A': cout << "an A - excellent work !" << endl;
              break;
          case 'B': cout << "you got a B - good job" << endl;
              break;
          case 'C': cout << "earning a C is satisfactory" << endl;
              break;
          case 'D': cout << "while D is passing, there is a problem" << endl;
              break;
          }
          break;
case 'F': cout << "you failed - better luck next time" << endl;
          break;
default:  cout << "You did not enter an A, B, C, D, or F" << endl;
          break;
}

更经济的编写方法是预先捕获无效值,然后使用grade 字母来索引消息数组。

const char *message[] =
{
    "an A - excellent work !",
    "you got a B - good job",
    "earning a C is satisfactory",
    "while D is passing, there is a problem",
    "You did not enter an A, B, C, D, or F",
    "you failed - better luck next time"
};
if(grade < 'A' || grade > 'F')
    grade = 'E';
else if(grade <= 'D')
    cout << "YOU PASSED!" << endl;
cout << message[grade - 'A'] << endl;

【讨论】:

    【解决方案2】:

    如果您排列其中没有代码且没有任何中断的案例,则该组无代码案例语句之后的一个将在其参数或任何先前参数通过时执行其代码。

    注意:这组case里面可以有代码,所以如果有的话,可以把它看作是用break语句延续到下一个case的代码,但是break-less case里面的代码只有在它的情况下才会运行或任何先前案例的论点都是正确的。也为我难以阅读的文本块感到抱歉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2023-03-08
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多