【问题标题】:Switch Case and For Loop C++Switch Case 和 For 循环 C++
【发布时间】:2014-06-13 03:58:29
【问题描述】:

您好,我有这段代码,但我似乎无法让它工作。循环循环三次,然后 addCourse 假设添加所有三个选择。问题是 addCourse 函数只为所有三个选择添加最后一位。示例:

如果我选择 1 2 3 那么它应该给出:

  1. 数学
  2. 量子
  3. 现实

相反,它给出了:

  1. 现实
  2. 现实
  3. 现实

(这三个都是最后选择的案例3)

我该如何解决这个问题。谢谢你。下面是代码。

for(int p = 0; p < 3; p++)
{
    cout << "Please select a course:" <<endl;
    cout<<"1. Maths\n";
    cout<<"2. Quantum\n";
    cout<<"3. Reality\n";
    cin >> coursepick;
    switch (coursepick)
    {
    case 1: course= "Maths";
    case 2: course= "Quantum";
    case 3: course= "Reality";
    default: break;
    }
    cout << "Please insert the course mark:" <<endl;
    cin >> mark;
    cin.ignore();
    phys[0]->addCourse(course,mark);
}

【问题讨论】:

  • 如果这个问题得到解决,你应该接受适当的答案

标签: c++ loops switch-statement


【解决方案1】:
switch (coursepick)
{
case 1: course= "Maths"; break;
case 2: course= "Quantum"; break;
case 3: course= "Reality"; break;
default: break;
}

如果您在每个案例结束时不中断,它只会继续下一个,然后是下一个,然后直到案例 3 并默认中断。

【讨论】:

  • 谢谢。完美运行。
【解决方案2】:

在 C++ 中,case 语句会自动移至下一条。您必须在每个case 之后插入break

switch (coursepick)
{
    case 1: course= "Maths"; break;
    case 2: course= "Quantum"; break;
    case 3: course= "Reality"; break;
    default: break;
}

【讨论】:

  • 为什么会这样?对我来说从来没有太多意义。
  • 谢谢。完美工作
  • @Ben:因为 C 深受 Fortran 的影响,Fortran 有 computed GOTOs(或分支表),这与 switch-case 块差不多。
【解决方案3】:

在您的switch 语句中,每个case 都需要一个break 语句。如果没有break 语句,C 将落入下一个案例。你的case语句相当于:

course= "Maths";
course= "Quantum";
course= "Reality";

相反,它必须是:

switch (coursepick)
{
    case 1: course= "Maths"; break;
    case 2: course= "Quantum"; break;
    case 3: course= "Reality"; break;
    default: break;
}

【讨论】:

    【解决方案4】:

    正如其他帖子中提到的,您需要以关键字“break;”结束每个案例。如果您不希望它渗透到下一个案例中。

    switch (coursepick)
    {
        case 1: course= "Maths"; break;
        case 2: course= "Quantum"; break;
        case 3: course= "Reality"; break;
        default: break;
    }
    

    Switch 语句具有这种行为,因为有时您希望它过滤多种情况。当多个案例具有相同的结果时,这使您不必重复代码。以下示例显示了 if case 'a' OR case 'A' 的等价物,请执行此操作。如果 case 'b' OR 'B',请执行此操作。

    switch (input)
    {
        case 'a':
        case 'A': text = "Letter A"; break;
    
        case 'b':
        case 'B': text = "Letter B"; break;
    
        default: text = "Not A or B"; break;
    }
    

    【讨论】:

      【解决方案5】:

      Dude,你能为所有的case语句添加Break标签吗?应该是这样的

      switch (coursepick)
          {
          case 1: course= "Maths";
                  break;
          case 2: course= "Quantum";
                  break;
          case 3: course= "Reality";
                  break;
          default: break;
          }
      

      如果你不提,它将通过所有案例,最后以防三门课程被现实覆盖。

      所以case语句需要break

      【讨论】:

        【解决方案6】:

        正如已经说过的,您必须使用break 来作为任何案例标签。

        switch (coursepick)
        {
        case 1: course= "Maths"; break;
        case 2: course= "Quantum"; break;
        case 3: course= "Reality"; break;
        default: break; 
        }
        

        但在任何情况下,代码都是无效的,因为如果用户输入的数字超出了可接受的范围,变量当然不会被分配。但是,您将在语句中使用这个未分配的变量

        phys[0]->addCourse(course,mark);
        

        也不清楚为什么变量是在循环外定义的。

        我会这样写循环

        enum { Maths = 1, Quantum, Reality };
        
        for ( int p = 0; p < 3; p++ )
        {
            do
            {
                cout << "\nPlease select a course:" <<endl;
                cout<<"1. Maths\n";
                cout<<"2. Quantum\n";
                cout<<"3. Reality\n";
        
                cin >> coursepick;
        
                if ( !( Maths <= coursepick && coursepick <= Reality ) )
                {
                    cout << "Error. Invalid input. Please repeat" << std::endl;
                }
            } while ( !( Maths <= coursepick && coursepick <= Reality ) ); 
        
            switch (coursepick)
            {
                case Maths: course= "Maths"; break;
                case Quantum: course= "Quantum"; break;
                case Reality: course= "Reality"; break;
                default: abort();
            }
        
            cout << "Please insert the course mark:" << endl;
            cin >> mark;
            cin.ignore();
            phys[0]->addCourse( course, mark );
        }
        

        【讨论】:

        • 感谢更优雅的写作方式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        相关资源
        最近更新 更多