2013-01-13 129 views
-1

我试图创建下面的结构在终端C++程序:混淆C++循环

Menu: 
    [1] Add Number 
    [2] View Numbers 
    [3] View Average 

[CHOICE 1] 
    - Add a Number to array 
    - Once finished, show Menu again so user can select another action 
[CHOICE 2] 
    - View all numbers in array 
    - Once finished, show Menu again so user can select another action 
[CHOICE 3] 
    - View average of all numbers in array 
    - Once finished, show Menu again so user can select another action 

我不知道究竟该如何设置的。当用户输入每个菜单项的相应号码时,出现相应的信息。这很容易,使用if语句来查找用户输入的数字。

但是,当我尝试再次显示菜单以便用户可以选择另一个操作时,出现问题。我认识到某种循环在这里是必要的,但我不知道如何去做。

你能帮我建立一个如何开始的基本结构吗?我真的很感激它。

+1

这应该是比较简单的。你有什么尝试? – Rapptz

+3

查看教科书中的基本流量控制。因为,虽然,如果,如果,其他,切换等,你应该能够找到最适合你的需求的东西。 –

+0

添加一个选择“[4]退出”,然后,把所有的主代码放在一边(选择!= 4){你的主代码在这里} –

回答

0

打破你的菜单项进入的功能,以保持干净的一切,并容易掌握(现在)。

这可以被扩大了许多,建立某种菜单的处理等,但我只是坚持这样的事情:

void mainmenu() { 
    int choice; 
    do { 
     std::cout << "Menu\n[1] -> Add Number\n[2] -> View Numbers\n[3] -> View Average\n[0] -> Quit" << std::endl; 
     std::cin >> choice; 
     // now perform actions based on the choice 
     switch (choice) { 
     case 1: 
      addanumber(); 
      break; 
     case 2: 
      printnumbers(); 
      break; 
     case 3: 
      printaverage(); 
      break; 
     } 
    } while (choice); // loop as long as the choice isn't 0 (i.e. user wants to exit) 
} 

由于Kerrek在评论中提到,这并不能真正检查用户是否真的选择了任何整数值。这使得代码有点复杂,但总体上是很好的做法(如件事扫描变得肮脏,如果你忽略了这样的事情):

更换cin >> choice;以上这样的:

if (!(std::cin >> choice)) { 
    choice = -1; // if input provide an invalid choice so the menu just shows again 
    // also clear the input buffer of leftovers 
    std::cin.clear(); // clear the buffer 
    std::cin.ignore(1000, '\n'); // read any leftover chars till a line break (user hit return key) 
} 
+0

这是否会在案件“完成”后再次显示菜单? – codedude

+0

此代码已损坏。如果输入操作没有成功,则读取“choice”就是UB。同样的思维错误是所有C++ SO问题中90%的核心问题:-(现在你刚刚教过另一个可怜的shlub同样的错误。 –

+0

'do ... while()'会使菜单重新出现,就像Kerrek的for()一样。选择你已经学过的任何循环。 – Mario

4

因子代码为单独的功能:

enum Action { AddNumber, ViewNumbers, ViewAverage, Quit, Error }; 

Action show_menu_and_read_user_input(); // write this! 

int main() 
{ 
    std::vector<int> numbers; 

    for (bool again = true; again;) 
    { 
     switch (show_menu_and_read_user_input()) 
     { 
      case Error: 
       std::cout << "Sorry, I did not understand.\n"; 
       break; 

      case Quit: 
       std::cout << "Goodbye!\n"; 
       again = false; 
       break; 

      // ... 
     } 
    } 
} 
+0

这显然是一个初学者的问题,所以我想这可能有点矫枉过正,用'enum'等来处理这个问题。 – Mario

+0

yeeaaahhh ...我还没有结束枚举。 – codedude

+0

这只是一个“列表”,您可以随时用数字/整数替换enum元素,例如用'1'代替'Error'并用'0'代替'退出'(并跳过'enum'行)。 – Mario

3

在很基本水平...

for(;;) 
{ 
    // Display the menu 
    cout << "Menu:\n" 
      " [1] Add Number\n" 
      " [2] View Numbers\n" 
      " [3] View Average\n"; 

    // Ask user for input 
    int choice; 
    cin >> choice; 

    // Take action 
    if(choice == 1) { 
     // ... 
    } else if(choice == 2) { 
     // ... 
    } else if(choice == 3) { 
     // ... 
    } else { 
     cout << "Invalid choice\n"; 
    } 
} 

这是一个无限循环,因为您的菜单似乎没有“退出”选项。我已经用if陈述来代替switch,因为作为初学者,很容易被switch弄糊涂,并且意外地以问题结束。

一步一个脚印=)

+0

当输入操作失败时,这是未定义的行为。 –