菜单选项未显示正确的输出

时间:2014-11-11 15:48:27

标签: c++ menu output menuitem

我遇到了这个菜单驱动程序的问题,该程序是我创建的链接列表类。我创建了一个抽象类,并成功地将它链接到这个菜单驱动的程序。我怎么遇到问题呢。

首先,我使用选项1成功填充链接列表,但是当我完成并尝试选择另一个菜单选项以显示我的列表时,它不会显示任何内容,就好像它是空的一样。

有人可以指出我正确的方向,如何使用这个菜单驱动程序来解决这个问题。

我对此计划的意图

  1. 选择选项1以填充我的链接列表

  2. 我想返回原始菜单选择其他选项 例如:从我的列表中删除一个数字,或者只显示我当前的列表

    // This program demonstrates the displayList member function.
    #include <iostream>
    #include "NumberList.h"
    using namespace std;
    
    int main()
    {
       double user_input = 0;
       int menu_choice = 0;
       int num = 0;
       NumberList list;// Define a NumberList object.
    
    
    
       //display for the user 
       cout << "                             Your Menu Options   \n\t\t\t\t  ";
    
       cout << "\n\n\n 1.   This Option Will Allow You To Add Numbers To The Link Class ";
    
       cout << "\n\n 2.   This Option Will Allow You To Insert A Number To The Middle Of The List ";
    
       cout << "\n\n 3.   This Option Will Allow You To Delete A Number From The List ";
    
       cout << "\n\n 4.   This Option Will Allow You To View The List Created ";
    
       cout << "\n\n                          Your Menu Choice Is : ";
       cin >> menu_choice;
    
       switch ( menu_choice)
       {
          case 1:
             // Get the number of days.
             cout << "\n\n                   HOW MANY NUMBERS WILL YOU LIKE TO ENTER : ";
             cin >> num;
    
             // Get the sales for each day and accumulate a total.
             for (int count = 1; count <= num; count++)
             {
                double list_number;
                cout << " Please Enter Number ( " << count << " ): ";
                cin >> list_number;// accept list number to ass to the list
                list.appendNode(list_number); // sends number to list class
             }
             main();
             break;
    
          case 2:
             // Insert a node in the middle of the list.
             list.insertNode(user_input);
             main(); // this is here for me to return to my menu
             break; // this will be a break for the class
    
          case 3:
             // Delete the middle node.
             list.deleteNode(user_input);
             main();
             break;
    
          case 4:
             // Display the values in the list.
             list.displayList();
             main();
             break;
    
          defualt:
             cout << " INVALID ENTRY PLEASE CHOOSE NUMBERS 1-4 ";// invalid menu option message
             break;
       }
    
       system("pause");
       return 0;
    }
    

2 个答案:

答案 0 :(得分:1)

当你递归调用main时,你正在执行main的另一个副本,它有自己的局部变量:特别是它自己的列表。

你应该在初始化之后将main的部分包裹起来(你只想做一次)(你可能需要一个菜单​​选择来结束程序)。

答案 1 :(得分:1)

您的代码无法按预期工作的原因是因为您对main()的递归调用每次都会创建一个不同的NumberList对象。你的递归概念原则上可以,你需要理解一些事情:

  1. 绝不要将main()用作递归函数。这可能会导致未定义的行为,通常被认为是错误的编码。
  2. 当你的程序递归调用相同的函数时,变量不一样。您可能认为它们是相同的,但实际上它们是从头开始创建的,这意味着每次都会以空list结束。
  3. 这样做的一种方法是定义另一个函数,它执行相同的操作,并确保通过(i)将它们作为函数中的引用传递来访问相同的变量。 s参数列表,或者(ii)使它们静态,但在大多数情况下不建议这样做,因为您可以轻松地忽略函数的输入和输出。我会选择(i)。
  4. 但是,此处不需要递归 。正确的解决方案是定义while循环并将case放在那里。仅在提供更高效率或性能时才使用递归。