【问题标题】:How do I loop through a switch-case statement that asks for input again in c++?如何循环通过在 c++ 中再次要求输入的 switch-case 语句?
【发布时间】:2013-02-26 14:34:34
【问题描述】:

首先,我向用户显示一个菜单,他们可以从中进行选择。 一旦他们做出选择,就会执行一些代码,我想再次向他们展示相同的菜单,以便他们做出不同的选择。

这是我目前的代码:

//call the menu function and put it in a variable which will be used in the switch case statements
menu_selection = main_menu();

condition_main = true;

while (condition_main) {    
    switch (menu_selection) {
        case 1: display(primes);
                menu_selection = main_menu();

        case 2: display(fibos);
                menu_selection = main_menu();

        case 3: display(primes_and_fibos);
                menu_selection = main_menu();

        case 4: display(primes_not_fibos);
                 menu_selection = main_menu();

        case 5: display(fibos_not_primes);
                 menu_selection = main_menu();

        case 6: search();
                 menu_selection = main_menu();

        case 7: condition_main = false;
                             return 0; //this exits the program
        default: cout << "\nThat is an invalid option. Please try again.\n\n";

    } 
}

但是,当我运行程序时,似乎正在发生的事情是,如果我选择选项 1,它将执行代码并再次显示菜单,但如果我再次选择选项 1,它将运行为选项 2 设计的代码.我也尝试过do while循环,根本不使用循环,似乎没有任何效果。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 您缺少break 语句。

标签: c++ while-loop switch-statement


【解决方案1】:

我同意,没有休息时间。你可能想考虑一个更像这样的代码结构:(我的格式不太好,因为我想要紧凑)

do {
   menu_selection = main_menu();
   switch (menu_selection) {
   case 1 : display(primes);            break;
   case 2 : display(fibos);             break;
   case 3 : display(primes_and_fibos);  break;
   case 4 : display(primes_not_fibos);  break;
   case 5 : display(fibos_not_primes);  break;
   case 6 : search();                   break;
   case 7 : break;
   default: cout << "\nThat is an invalid option. Please try again.\n\n";
} while (condition_main != 7);
return 0;

(当然,按照您喜欢的方式格式化。)这只需一次调用菜单功能,使维护更加容易。 return 也在函数的末尾,大多数人都希望找到它。

【讨论】:

    【解决方案2】:

    每个案例都需要休息,除非您希望将一个条件转移到下一个:

    switch (menu_selection) {
        case 1: display(primes);
                menu_selection = main_menu();
                break ;
    
        case 2: display(fibos);
                menu_selection = main_menu();
                break ;
    
        case 3: display(primes_and_fibos);
                menu_selection = main_menu();
                break ;
    
        case 4: display(primes_not_fibos);
                 menu_selection = main_menu();
                break ;
    
        case 5: display(fibos_not_primes);
                 menu_selection = main_menu();
                break ;
    
        case 6: search();
                 menu_selection = main_menu();
                break ;
    
        case 7: condition_main = false;
                             return 0; //this exits the program
        default: cout << "\nThat is an invalid option. Please try again.\n\n";
                break ;
    } 
    

    这个reference 有更多的switch 示例,并且还涵盖了跌落案例。

    正如史蒂夫建议的那样,在while 语句之后加上return 可能更有意义。这将是预期的控制流,并且很可能也更容易维护。将 main_menu 调用从 switch 移到循环中也会使您的代码在以后更容易更改。

    【讨论】:

    • 将 main_menu 移动到循环中是很好的建议,谢谢。它也帮助我解决了类似的问题。而我在案例 7 中返回 0 的原因是我可以告诉程序关闭或者让 condition_main = false 达到同样的效果?
    • @John 是的,如果您将return 0 替换为break,那么当它返回到while 循环的顶部时,condition_main 将是false,并且循环将退出.
    【解决方案3】:

    添加breaks 将“解决”问题。

    但是,最好将代码分离出来以便于测试。那时你可能已经意识到了这个问题。

    分离你的输入和你的处理代码:

    bool handleSelection(int menu_selection) {
        switch (menu_selection) {
            case 1: display(primes);
            case 2: display(fibos);
            case 3: display(primes_and_fibos);
            case 4: display(primes_not_fibos);
            case 5: display(fibos_not_primes);
            case 6: search();
            case 7: return false;
            default: cout << "\nThat is an invalid option. Please try again.\n\n";
        }
        return true;
    }
    
    void pump() {
        int menu_selection = main_menu();
        while(handleSelection(menu_selection)) {    
            menu_selection = main_menu();
        }
    }
    
    int main() {
        //pump();
        handleSelection(3);    
    }
    

    您也应该将输出代码分开(“这是一个无效的选项。请重试”),但我认为我没有这样做就说明了我的观点。

    【讨论】:

      【解决方案4】:
      boolean condition = true;
      while(condition==true){
      System.out.println("Press Number \n 1 for check prime \n 2 for exit");
      Scanner scannerOption = new Scanner(System.in);
          int option = scannerOption.nextInt();
      
          switch (option){
              case 1:
                  checkPrime();
                  break;
              case 2:
                  condition = false;
                  break;
              default:
                  System.out.println("Wrong Enter plz try again");
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多