2013-10-24 3 views
0

Я попытался создать C# программа, которая дает пользователю 3 варианта:C# Console Loop Программа Выпуск

  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). Он продолжает показывать факториал, но продолжает увеличиваться каждый раз, когда я нажимаю кнопку ввода вместо Quiting .. – user2916941

0

Прежде аль установите useroption 0 после выполнения некоторого кода. В противном случае он будет продолжать выполнять его. Во-вторых, ReadKey() перед заявлением while. В противном случае вы не сможете прочитать ввод.

+0

Просьба также привести пример в коде. – Brian

+0

Благодарим за помощь! Похоже, что он ведет себя немного лучше, но все еще не работает правильно, как вы сказали, но как только он возвращается в главное меню, он требует, чтобы пользователь несколько раз нажимал кнопку ввода, не совсем уверен, почему именно. – user2916941

+0

, а затем, когда я попробую Option3 (QUIT), он продолжает отображать факториальный результат и увеличивает его каждый раз, когда я пытаюсь .. – user2916941

0

Проблема в том, что, хотя вы снова показываете topmenu y ou никогда не переустанавливайте значение useroption.

Как сказал gypsyCoder, перемещение дисплея вашего меню внутри блока do {} while() устранит вашу проблему, потому что это вызовет повторное назначение useroption каждый раз по циклу.

+0

Спасибо .. все еще не работает правильно, как только я переместил и добавляет следующие строки в цикле Do ... useroption = 0; useroption = topmenu(); Console.ReadKey(); – user2916941

+0

Вы должны быть более наглядными. «Все еще не работает» недостаточно информации, чтобы помочь решить вашу проблему. – BenCr