Цикл С# требует ввода дважды

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

Вот часть кода, с которой у меня проблемы:

{
Console.WriteLine("Enter the temperature in Fahrenheit: ");


            int fahrenheit = int.Parse(Console.ReadLine());
            int celsius = FahrToCels(fahrenheit);

            do
            {
                fahrenheit = int.Parse(Console.ReadLine());
                celsius = FahrToCels(fahrenheit);

                if (celsius < 73)
                {
                    Console.WriteLine(celsius);
                    Console.WriteLine("It's too cold, raise the temperature.");
                }

Думаю, вы понимаете, что я имею в виду. Единственный способ, которым я мог вообще заставить цикл работать, - это повторить int.Parse(Console.ReadLine(), но, возможно, есть другое исправление, которое решит эту проблему, связанную с необходимостью дважды вводить температуру?

Очень надеюсь, что кто-то может помочь мне с этим.


person Emma Andersson    schedule 17.09.2016    source источник
comment
Я решил проблему, спасибо всем за помощь!   -  person Emma Andersson    schedule 19.09.2016


Ответы (3)


Если проблема в том, что вам нужно получить доступ к переменным за пределами цикла, вы можете объявить их, не назначая.

{
Console.WriteLine("Enter the temperature in Fahrenheit: ");

        int fahrenheit;
        int celsius;

        do
        {
            fahrenheit = int.Parse(Console.ReadLine());
            celsius = FahrToCels(fahrenheit);

            if (celsius < 73)
            {
                Console.WriteLine(celsius);
                Console.WriteLine("It's too cold, raise the temperature.");
            }
person LittleDebugger    schedule 17.09.2016

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

          do
        {
            int farenheight = getTemp();
            celsius = FahrToCels(fahrenheit);

            if (celsius < 73)
            {
                Console.WriteLine(celsius);
                Console.WriteLine("It's too cold, raise the temperature.");
            }
       }
 public int getTemp(){
     return int.Parse(Console.ReadLine());
 }
person Shannon Holsinger    schedule 17.09.2016
comment
Почему вы используете функцию для инкапсуляции одной строки кода, которая встречается во фрагменте кода только один раз? На мой взгляд, это просто чрезмерная инженерия. Однако, если бы функция выполняла какую-то обработку ошибок, то есть перехватывала любые исключения, возникающие при разборе нецелочисленных входных данных, это могла бы быть совсем другая история. - person Striezel; 17.09.2016
comment
Вот почему я сказал, что в вашем коде больше, чем показано. Да - как однострочный, это не имеет особого смысла, но я предполагаю, что OP сократился до минимума - опубликованный код выглядит так, как будто он был нарезан. - person Shannon Holsinger; 18.09.2016

Дело в том, что всякий раз, когда вы выполняете Console.ReadLine(), программа ожидает какого-либо ввода с консоли. Поскольку вы встречаете один Console.ReadLine() перед циклом и один внутри цикла, вам нужно ввести значение дважды, чтобы «запустить» цикл.

Более того: цикл do-while выполняется хотя бы один раз, потому что условие проверяется только после итерации цикла. Если вы измените это на цикл while, где условие проверяется перед каждой итерацией цикла, вы можете получить то, что ожидаете:

int fahrenheit = int.Parse(Console.ReadLine());
int celsius = FahrToCels(fahrenheit);

while (celsius < 73)
{
    Console.WriteLine(celsius);
    Console.WriteLine("It's too cold, raise the temperature.");

    Console.WriteLine("Enter the temperature in Fahrenheit: ");
    fahrenheit = int.Parse(Console.ReadLine());
    celsius = FahrToCels(fahrenheit);
}

Я также хотел бы отметить, что код в том виде, в каком он есть сейчас, вызовет исключение, если пользователь введет что-то, что не может быть проанализировано в int. Это обычно приводит к завершению программы, если только исключение не перехвачено блоком try-catch.

person Striezel    schedule 17.09.2016
comment
Или используйте int.TryParse вместо блока try-catch. Также, вероятно, было бы более разумно объявить температуры как двойные/поплавковые/десятичные, поскольку градусы Фаренгейта и Цельсия не преобразуются точно в целые числа. - person ekolis; 18.09.2016
comment
Да, блок try-catch является частью задания, и я добавил его в свой код. Спасибо за помощь! - person Emma Andersson; 19.09.2016