заявление о переключении - PullRequest
1 голос
/ 14 июня 2009

Я практикую "цикл переключения" в программе. И я делаю код, в котором пользователь может ввести целое число, и после того, как пользователь введет целое число, он также отобразит то, что пользователь только что набрал. Теперь я пытаюсь реализовать, где программа попросит пользователя ввести номер снова, выбрав Y / N.

Я уже включил это здесь в свой код, но если я наберу символы в первый раз, когда программа попросит меня ввести целое число, программа выполнит часть catch. Как я могу сделать так, чтобы, если пользователь наберет символ, он также снова отобразил бы сообщение «введите целое число:»

          int enterYourNumber;
          char shortLetter;

            try
            {
                Console.WriteLine("Please enter the integer: ");
                enterYourNumber = Convert.ToInt32(Console.ReadLine());
                WriteNumber(enterYourNumber);

                Console.WriteLine("Do you still want to enter a number? Y/N");
                shortLetter = Convert.ToChar(Console.ReadLine());

                while (shortLetter == 'y' || shortLetter == 'Y')
                {
                    Console.WriteLine("Please enter the integer: ");
                    enterYourNumber = Convert.ToInt32(Console.ReadLine());
                    WriteNumber(enterYourNumber);

                    Console.WriteLine("Do you still want to enter a number? Y/N");
                    shortLetter = Convert.ToChar(Console.ReadLine());
                }

            }
            catch
            {                                        
                Console.WriteLine("Please enter an integer not a character");
            }
        }

            public static void WriteNumber(int wordValue)
            {

            switch (wordValue)
            {
                case 1:
                    Console.WriteLine("You have entered number one");
                    break;
                case 2:
                    Console.WriteLine("You have entered number two");
                    break;
                case 3:
                    Console.WriteLine("You have entered number three");
                    break;
                default:
                    Console.WriteLine("You have exceeded the range of number 1-3 ");
                    break;
            }

Это то, что я сделал; Я не знаю, почему я получаю ошибку. Кажется, новый метод не работает:

        int enterYourNumber;
        char shortLetter;


          do
        {
            enterYourNumber = GetNumber();
            WriteNumber(enterYourNumber);                
            Console.WriteLine("Do you still want to enter a number? Y/N");
            shortLetter = Convert.ToChar(Console.ReadLine());
         }
       while (shortLetter == 'y' || shortLetter == 'Y')
        {
            Console.WriteLine("Please enter the integer: ");
            enterYourNumber = Convert.ToInt32(Console.ReadLine());
            WriteNumber(enterYourNumber);

            Console.WriteLine("Do you still want to enter a number? Y/N");
            shortLetter = Convert.ToChar(Console.ReadLine());
        }
    }



       public static int GetNumber() 
       {
       bool done = false;
       int value;
       while ( !done ) 
        {
            Console.WriteLine("Please enter the integer: ");
        try 
        {
            value = Convert.ToInt32(Console.ReadLine());
            done = true;
        }
       catch 
        {
            Console.WriteLine("Please enter an integer not a character");
        }
        }
       }

Обновление

Билл, это пример, который вы привели, и кажется, что я все еще получаю сообщение об ошибке:

    public static void Main(string[] args)
    {
        int enterYourNumber;
        char shortLetter;



        do
        {
            enteryourNumber = GetNumber();
            WriteNumber(enteryourNumber);
            Console.WriteLine("Do you still want to enter a number? Y/N");
            shortLetter = Convert.ToChar(Console.ReadLine());
        } 
        while (shortLetter == 'y' || shortLetter == 'Y');
    }


    public static int GetNumber()
    {
        bool done = false;
        int value;
        while (!done)
        {
            Console.WriteLine("Please enter the integer: ");
            try
            {
                value = Convert.ToInt32(Console.ReadLine());
                done = true;
            }
            catch
            {
                Console.WriteLine("Please enter an integer not a character");
            }

            Console.WriteLine("Please enter the integer: ");
            enterYourNumber = Convert.ToInt32(Console.ReadLine());
            WriteNumber(enterYourNumber);
            Console.WriteLine("Do you still want to enter a number? Y/N");
            shortLetter = Convert.ToChar(Console.ReadLine());   
        }
    }

    public static void WriteNumber(int wordValue)
    {

        switch (wordValue)
        {
            case 1:
                Console.WriteLine("You have entered number one");
                break;

            case 2:
                Console.WriteLine("You have entered number two");
                break;

            case 3:
                Console.WriteLine("You have entered number three");
                break;

            default:
                Console.WriteLine("You have exceeded the range of number 1-3 ");
                break;
        }
    }
}
}

Обновление

Этот ответ для Роберта. Это то, что я сделал сейчас, но если я введу «N», программа не выйдет. Он все еще задавал тот же вопрос.

    public static void Main(string[] args)
    {
        int enterYourNumber;
        char shortLetter;
        bool validEntry;



        while (true)
        {
            do
            {
                Console.WriteLine("Please enter an integer: ");
                string numberString = Console.ReadLine();
                validEntry = int.TryParse(numberString, out enterYourNumber);
                WriteNumber(enterYourNumber);
                if (!validEntry)
                {
                    Console.WriteLine("Entry must be an integer");
                }
            } while (!validEntry);

            Console.WriteLine("Do you still want to enter a number? Y/N");
            shortLetter = Convert.ToChar(Console.ReadLine());


        }
     }




    public static void WriteNumber(int wordValue)
    {
        switch (wordValue)
        {
            case 1:
                Console.WriteLine("You have entered number one");
                break;
            case 2:
                Console.WriteLine("You have entered numbered two");
                break;
            case 3:
                Console.WriteLine("You have entered numbered three");
                break;
            default:
                Console.WriteLine("You have exceeded the range of number 1-3");
                break;
        }
    }
}
}

Обновление

Роберт и Билл, вот что я получил сейчас. Как я могу улучшить это?

     public static void Main(string[] args)
     {
        int intEnterYourNumber;
        char charShortLetter;
        string strUserInput;

        do
        {
            do
            {
                Console.WriteLine("Please enter the integer: ");
                strUserInput = Console.ReadLine();
            } while (!int.TryParse(strUserInput, out intEnterYourNumber));
            WriteNumber(intEnterYourNumber);
            Console.WriteLine("Do you still want to enter a number? Y/N");
            charShortLetter = Convert.ToChar(Console.ReadLine().ToUpper());
        } while (charShortLetter == 'Y');
    }



    public static void WriteNumber(int wordValue)
    {
        switch (wordValue)
        {
            case 1:
                Console.WriteLine("You have entered number one");
                break;
            case 2:
                Console.WriteLine("You have entered numbered two");
                break;
            case 3:
                Console.WriteLine("You have entered numbered three");
                break;
            default:
                Console.WriteLine("You have exceeded the range of number 1-3");
                break;
        }
    }

Ответы [ 5 ]

8 голосов
/ 14 июня 2009

Я думаю, что ваш код было бы легче выучить и понять, если бы вы не использовали исключения для проверки своих чисел . Попробуйте вместо этого использовать int.TryParse () ( TryParse () в MSDN). TryParse () возвращает true (или false ) в зависимости от того, был ли введенный номер действительным:

int number;
bool validEntry = int.TryParse(enterYourNumber, out number);
if (!validEntry)
{
    Console.WriteLine("Entry must be an integer.");
}

Также, узнайте о цикле do ... while ( link ). Цикл do.. while похож на обычный цикл while, за исключением того, что цикл do-while выполняется один раз перед вычислением условного выражения.

bool validEntry;
int enteredNumber;
do
{
    Console.Write("Please enter the integer: ");
    string numberString = Console.ReadLine();
    validEntry = int.TryParse(numberString, out enteredNumber);
    if (!validEntry)
    {
        Console.WriteLine("Entry must be an integer.");
    }
} while (!validEntry);

Оберните все это в другой цикл while («Вы все еще хотите ввести число (Y / N)?»), И все готово.

2 голосов
/ 14 июня 2009
do
{
    Console.WriteLine("Please enter the integer: ");                
    enterYourNumber = Convert.ToInt32(Console.ReadLine());                
    WriteNumber(enterYourNumber);                
    Console.WriteLine("Do you still want to enter a number? Y/N");                    
    shortLetter = Convert.ToChar(Console.ReadLine());
}                
while (shortLetter == 'y' || shortLetter == 'Y')
1 голос
/ 14 июня 2009

Поскольку вы учитесь, вы можете также рассмотреть возможность обработки ошибки по-другому.
Взгляните на вопрос SO: В C # следует ли использовать try-catch для тестирования числовых значений?

1 голос
/ 14 июня 2009

Робертс - это начало, но, возможно, мы все еще хотим попробовать поймать ...

Замените свою основную функцию на:

do
{
    enterYourNumber = GetNumber();
    WriteNumber(enterYourNumber);                
    Console.WriteLine("Do you still want to enter a number? Y/N");
    shortLetter = Convert.ToChar(Console.ReadLine());
}
while (shortLetter == 'y' || shortLetter == 'Y')

и добавьте эту функцию:

public static int GetNumber() {
    boolean done = false;
    int value;
    while ( !done ) {
        Console.WriteLine("Please enter the integer: ");
        try {
            value = Convert.ToInt32(Console.ReadLine());
            done = true;
        }
        catch {
            Console.WriteLine("Please enter an integer not a character");
        }
    }
}

Затем удалите свой пробный улов в основной функции.

0 голосов
/ 14 июня 2009

Переместить блок try / catch внутри цикла. Предложение Роберта Харви о цикле do / while тоже хорошо.

 int enterYourNumber;
 char shortLetter;

 do
 {
      try
      {
          Console.WriteLine("Please enter the integer: ");                
          enterYourNumber = Convert.ToInt32(Console.ReadLine());                
          WriteNumber(enterYourNumber); 
      }
      catch( FormatException )
      {                                        
          Console.WriteLine("Please enter an integer not a character");
      }  

      shortLetter = '\0';
      do
      {
          try
          {
              Console.WriteLine("Do you still want to enter a number? Y/N");                    
              shortLetter = Convert.ToChar(Console.ReadLine());
          }
          catch( FormatException ) 
         {
              Console.WriteLine("Please enter a single character");
         }
      }     
      while ( shortLetter == '\0' )      
 }                
 while (shortLetter == 'y' || shortLetter == 'Y')

 }

        public static void WriteNumber(int wordValue)
        {

        switch (wordValue)
        {
            case 1:
                Console.WriteLine("You have entered number one");
                break;
            case 2:
                Console.WriteLine("You have entered number two");
                break;
            case 3:
                Console.WriteLine("You have entered number three");
                break;
            default:
                Console.WriteLine("You have exceeded the range of number 1-3 ");
                break;
        }
...