2013-10-24 70 views
0

我试图创建一个C#程序,它为用户提供了3个选项:C#控制台程序循环问题

  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; 




    } 
} 

}

+1

请尽量减小样本(查看http://www.sscce.org获取指导)。对于未来的帖子,尽量避免“谢谢你的提示”/“新到这里”以及其他与你的问题没有直接关系的文本(尤其是占用一半的帖子)。 –

回答

3

只要把这些线内做......而

int useroption; 
useroption = topmenu(); 

重新排列如下...

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

      useroption = topmenu(); 

和你的程序将正常工作

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

+0

谢谢..当它循环回选项菜单时仍然有问题。 – user2916941

+0

问题是什么? – gypsyCoder

+0

一旦它循环回来,如果我尝试选项2,它会让我在继续使用阶乘之前多次按下输入,如果使用选项3之后(QUIT),它会继续显示阶乘,但每次按Enter后都会持续增加而不是Quiting .. – user2916941

0

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

+0

请在代码中提供一个示例。 – Brian

+0

谢谢你的帮助!它看起来表现得好一点,但仍然不能正常工作,就像你说的那样,但是一旦它回到主菜单,它需要用户按几次输入才能确定为什么。 – user2916941

+0

然后当我尝试Option3(QUIT)时,它会一直显示阶乘结果,并在每次尝试时增加它。 – user2916941

0

问题是,尽管您再次显示topmenu y你永远不要重新分配有用的价值。

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

+0

谢谢..一旦我移动并在Do循环中添加以下行,仍然不能正确工作... useroption = 0; useroption = topmenu(); Console.ReadKey(); – user2916941

+0

你必须要更具描述性。 “仍然无法工作”是没有足够的信息来帮助解决您的问题。 – BenCr