2013-02-18 3 views
0

переполнение стека сообщество.Консольное приложение, разбивающее/не отвечающее

Я пишу программу, которая конвертирует температуру Фаренгейта в цельном Цельсе и по Цельсию в Фаренгейт. Программа имеет простое меню и вводит пользовательский ввод для выбора опции. Я реализовал небольшой цикл do-while, если пользователь вводит недопустимый параметр. Если пользователь выбирает 1, 2 или 3 (которые являются тремя действительными параметрами), программа запускает оператор if, выполняет в нем блок-код и прерывает цикл. Однако, если пользователь вводит что-либо еще (недопустимый вариант), программа будет выполнять блок-код в другом месте, а затем он вернется к началу цикла (выберите параметр), замораживая или сбой в процессе.

Вот код:

// James Archbold 
// Convert.cs 
// A program to convert fahrenheit to celsius or celsius to fahrenheit 
//16 February 2013 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Convert_Temperature 
{ 
class Convert 
{ 
    static void Main(string[] args) 
    { 
     float F, C; 
     string option; 

     do 
     { 
      Console.WriteLine("\nWelcome to 'Convert' program!"); 
      Console.WriteLine("***********************Menu**********************************"); 
      Console.WriteLine("1. Fahrenheit to Celsius"); 
      Console.WriteLine("2. Celsius to Fahrenheit"); 
      Console.WriteLine("3. Goodbye"); 

      Console.Write("\nPlease enter an option: "); 
      option = Console.ReadLine(); 

      switch (option) 
      { 
       case "1": 
        Console.Write("Please enter your Fahrenheit temperature: "); 
        F = int.Parse(Console.ReadLine()); 
        C = (5f/9f) * (F - 32); 
        Console.WriteLine("The temperature is {0} degrees Celsius.", C); 
        Console.ReadKey(); 
        break; 


       case "2": 
        Console.Write("Please enter your Celsius temperature: "); 
        C = int.Parse(Console.ReadLine()); 

        F = 5f/9f * C - 32; 

        Console.WriteLine("The temperature is {0} degrees Fahrenheit.", F); 

        Console.ReadKey(); 
        break; 


       case "3": 
        Console.WriteLine("Goodbye!"); 
        Console.ReadKey(); 
        break; 


       default: 
        Console.WriteLine("That is not a valid option!"); 
        break; 
      } 

      Console.WriteLine("Please press Enter to continue..."); 
      Console.ReadLine(); 
      Console.WriteLine(); 

     } while (option != "3"); 

    } 

} 

}

+0

Я не владеет в C#, но я бы ожидать, что ваша программа умереть с исключением брошенной 'int.Parse (Console.ReadLine())'. Так что же происходит? сбой или замораживание? Что произойдет, если вы выполните свою программу в отладчике? – Axel

+0

Когда я запускаю программу в Visual C# express, она замерзает и возвращает меня к тому, что я предполагаю, отладчик. С другой стороны, когда я компилирую программу в windows cmd, программа сбой и бросает мне «необработанное исключение». – Jameslat

+0

Программа отлично работает для меня, помимо брошенного «FormatException». Посмотрите на второй ответ. – jAC

ответ

3

Ваша линия, option = int.Parse(Console.ReadLine());, будет сгенерировано исключение, если введенный текст не может быть проанализирован. Рассмотрите возможность использования метода TryParse вместо:

if (!int.TryParse(Console.ReadLine(), out option) { 
    option = -1; // Set option to represent an invalid option. 
} 
+0

Должен ли я изменить оператор присваивания переменной этому? – Jameslat

+1

Сделав это, я получил аналогичный результат для объявления переменной как int, программа отобразит «Пожалуйста, введите опцию: этот параметр недействителен» после ввода любого другого номера, отличного от 1,2 или 3. – Jameslat

1

Jameslat - Как FlsZen предложил в комментарии выше

Заменить

option = int.Parse(Console.ReadLine()); // Original code 

с

if (!int.TryParse(Console.ReadLine(), out option)) 
{ 
    option = -1; 
} 

Использование TryParse позволяет проверить если операция выполнена успешно или нет, путем изучения возвращаемого значения, которое булевого типа. Значение ложного возврата указывает на то, что синтаксический анализ не увенчался успехом, который в фрагменте кода присваивает значение -1 переменной с именем «option».

http://msdn.microsoft.com/en-us/library/system.int32.tryparse.aspx

Смежные вопросы