0

我试图创建一个 C# 程序,为用户提供 3 个选项:

  1. 创建名称(让用户输入他们的名字和姓氏并将其显示为 J.Blogg)

  2. 一个数字的阶乘(输出例如 5x4x3x2x1 =120,它是 5 的阶乘

  3. 退出

我的程序工作正常,但是当我尝试选择选项 1(创建名称)然后选择选项 2 时,它转到选项 1,然后它不允许我退出(选项 3)。我是编程新手,所以它可能很简单,但我看不出我哪里出错了,任何帮助都会非常有用。我想保持相同的布局,我认为我的问题可能是循环,但任何帮助和改进都会很棒。

    static void Main(string[] args)
    {

        //The value returned from the topmenu method is stored in a variable called useroption
        int useroption;
        useroption = topmenu();

        // excute while loop untill option is not 1-3
        do
        {


            if (useroption == 1)
            {
                Console.Clear();
                Createname();
                //break;
            }

            if (useroption == 2)
            {
                Console.Clear();
                factorial();
               // break;
            }

            if (useroption == 3)
            {
                Console.Clear();
                Console.WriteLine("Thank you for using my program, Good bye !!!");
               // break;
            }

            //topmenu();
             } 
        while (useroption != 3);




        Console.ReadKey();


    }

    //This method present the user with an menu which the user has a choice of 3 options
    static int topmenu()
    {
        int option;
        string option_str;

        Console.Clear();
        Console.WriteLine("********************************************************************************");
        Console.WriteLine("********************************************************************************");
        Console.WriteLine("*********      OPTION 1 : Enter your name                              *********");
        Console.WriteLine("*********      OPTION 2 : Enter the number you want to factorise       *********");
        Console.WriteLine("*********      OPTION 3 : Quit                                         *********");
        Console.WriteLine("********************************************************************************");
        Console.WriteLine("********************************************************************************");
        option_str = Console.ReadLine();

        option = Convert.ToInt32(option_str);
        Console.Clear();

        if (option < 0 || option > 3)
        {
            Console.WriteLine("You have enter an invald option,");
            Console.WriteLine("Please chose a option between 1-3 (Please press any key to return to main menu)");
            Console.ReadLine();
            Console.Clear();
            topmenu();
        }
        else
        {
            Console.WriteLine("You have chosen option: " + option + " (Please press any key continue)");
        }
        Console.ReadKey();
        return option;




    }
    //this method asks user to enter their name (1st name then surname) and presents it back to the user as their intial(1st name) and surname
    static void Createname()
    {
        string firstname, surname, firstname_str, surname_str, userfullname;

        Console.Clear();
        Console.WriteLine("Please enter your first name ");
        firstname_str = Console.ReadLine();
        firstname = Convert.ToString(firstname_str);
        Console.Clear();
        Console.WriteLine("Please enter your surname name ");
        surname_str = Console.ReadLine();
        surname = Convert.ToString(surname_str);
        Console.Clear();
        userfullname = firstname + surname;

        Console.WriteLine("You have entered your name as " + firstname[0] + "." + surname);
        Console.WriteLine("(Please press any key to return to main menu)");
        Console.ReadKey();
        topmenu();

    }

    //this method asks the user to enter a number and returns the factorial of that number
    static double factorial()
    {


        string number_str;
        double factorial = 1;



        Console.WriteLine("Please enter number");
        number_str = Console.ReadLine();

        int num = Convert.ToInt32(number_str);


        // If statement is used so when the user inputs 0, INVALID is outputed

        if (num <= 0)
        {
            Console.WriteLine("You have enter an invald option");
            Console.WriteLine("Please enter number");
            number_str = Console.ReadLine();
            Console.Clear();


            num = Convert.ToInt32(number_str);
            //Console.Clear();
            //topmenu();
            //number_str = Console.ReadLine();
        }

        if (num >= 0)
        {

            while (num != 0) 
            {
                for (int i = num; i >= 1; i--)
                {
                    factorial = factorial * i;
                    Console.Write(i + " * ");

                }


                    Console.WriteLine("= "+factorial+ " which is factorial of " + number_str.ToString() );
                    Console.WriteLine("(please any key to return to main menu)");
                    Console.ReadKey();
                    Console.Clear();
                    topmenu();

            }

        }


        return factorial;




    }
}

}

4

3 回答 3

3

只需将这些行放入 do...while

int useroption;
useroption = topmenu();

重新排列如下...

int useroption;
        // excute while loop untill option is not 1-3
        do
        {

            useroption = topmenu();

你的程序会正常工作

完整代码在这里: http: //pastebin.com/fCh0ttUY

于 2013-10-24T23:37:15.697 回答
0

问题是,尽管您再次显示 topmenu,但您永远不会重新分配 useroption 的值。

正如 gypsyCoder 所说,在 do{}while() 块内移动菜单的显示将解决您的问题,因为它会导致每次循环都重新分配 useroption。

于 2013-10-24T23:42:36.440 回答
0

首先,在执行一些代码后将 useroption 设置为 0。否则它将继续执行它。其次,ReadKey() 就在您的 while 语句之前。否则您将无法读取输入。

于 2013-10-24T23:33:25.900 回答