@StanislavGO

Как работает код на C# в приведённом примере?

Вот пример кода, который принимает от пользователя числа от 5 до 10.
Используется конструкция do-while. Код работает, но у меня возник вопрос - почему не возникает никакой ошибки в программе, когда пользователь вводит вместо цифр буквы? Ведь while должно возвращать значение "true" в случае если введённое пользователем значение <5 или >10. Что-же происходит когда пользователь вводит буквы?

string? readResult;
int numValue;

Console.Write("Enter an integer value between 5 and 10: ");

do
{
    readResult = Console.ReadLine();
    bool validNumber = false;
    validNumber = int.TryParse(readResult, out numValue);
    
    if(validNumber == true)
    {
       if(numValue <5 || numValue > 10)
       Console.Write ($"You entered {numValue}. Please enter a number between 5 and 10: ");
    }
    else Console.Write("Sorry, you entered an invalid number, please try again: ");

}while (numValue < 5 || numValue > 10 );

Console.WriteLine($"Your input value ({numValue}) has been accepted.");
  • Вопрос задан
  • 237 просмотров
Решения вопроса 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
а еще можно освоить пошаговую отладку, и посмотреть что прилетает в
validNumber = int.TryParse(readResult, out numValue);
после чего и думать ;)
ну или так ))
namespace ConsoleApp4
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string? readResult;
            int numValue;

            Console.Write("Enter an integer value between 5 and 10: ");

            do
            {
                readResult = Console.ReadLine();
                bool validNumber = false;
                validNumber = int.TryParse(readResult, out numValue);
#if DEBUG
                Console.WriteLine($"debug 'numValue='{numValue}");
                Console.WriteLine($"debug 'validNumber='{validNumber}");
#endif
                if (validNumber == true)
                {
                    if (numValue < 5 || numValue > 10)
                        Console.Write($"You entered {numValue}. Please enter a number between 5 and 10: ");
                }
                else Console.Write("Sorry, you entered an invalid number, please try again: ");

            } while (numValue < 5 || numValue > 10);

            Console.WriteLine($"Your input value ({numValue}) has been accepted.");
        }
    }
}
ваш код работает абсолютно корректно, что смутило не понятно вообще ))
2WhBpyZ.png

ps подправил код, еще лайфхак, может понравится ;))
pps и еще по мелочи, может понравится ;)
namespace ConsoleApp4
{
    internal static class Program
    {
        static void Main(string[] args)
        {
            var numValue = 0;
            var inValidValue = false;
            var validNumber = false;
            "Enter an integer value between 5 and 10:".print();
            do
            {
                validNumber = int.TryParse(Console.ReadLine(), out numValue);
                inValidValue = numValue < 5 || numValue > 10;
#if DEBUG
                $".. debug 'numValue={numValue}'".print();
                $".. debug 'validNumber={validNumber}'".print();
                $".. debug 'validValue={inValidValue}'".print();
#endif
                if (validNumber)
                {
                    if (inValidValue)
                        $"You entered {numValue}. Please enter a number between 5 and 10: ".print();
                }
                else "Sorry, you entered an invalid number, please try again: ".print();
            } while (inValidValue);
            $"Your input value ({numValue}) has been accepted.".print();
        }
        static void print(this string s) => Console.WriteLine(s);
    }
}

.. почувствуйте разницу ;)))

ppps .. кхм.. думал извращения закончились )))
namespace fanc_minimal
{
    internal static class Program
    {
        static void Main(string[] args)
        {
            string checkValue(bool goodValue, bool correctNumber, int Value) => (goodValue, correctNumber) switch
            {
                (true, true) => $"Your input value ({Value}) has been accepted.",
                (false, true) => $"You entered {Value}. Please enter a number between 5 and 10:",
                _ => "Sorry, you entered an invalid number, please try again:"
            };

            Console.WriteLine("Enter an integer value between 5 and 10:");
            for (var validValue = false; !validValue; )
            {
                var validNumber = int.TryParse(Console.ReadLine(), out var numValue);
                Console.WriteLine(checkValue(validValue = numValue >= 5 && numValue <= 10, validNumber, numValue));
            }
        }
    }
}
но это пример оголтелого минимализма строк ))
читаемость уже резко страдает... зато в одном флаконе много фишек, которых в книгах не найти. всем успехов в кодировании ))
.. продолжаем издеваться над стереотипами ;))
namespace func_next
{
    internal static class Program
    {
        static void Main(string[] args)
        {
            const int min = 5;
            const int max = 10;
            var value = min - 1;
            var stop = false;

            bool success() => value >= min && value <= max;

            string check() => (int.TryParse(Console.ReadLine(), out value), stop = success()) switch
            {
                (true, true) => $"Your input value ({value}) has been accepted. Press Enter to Exit )))",
                (true, false) => $"You entered {value}. Please enter a number between 5 and 10:",
                _ => "Sorry, you entered an invalid number, please try again:"
            };

            for ("Enter an integer value between 5 and 10:".print(); !stop; check().print()) ;
        }
        static void print(this string s) => Console.WriteLine(s);
    }
}
.. и снова.. лишь пример перфекционизма.. но код содержит взаимозависмости, не допустимые в большом проекте ))
.. но уж сильно захотелось уйти от вложенных if .. ну и показать мощь сишныхfor )))
... тут уже скорее ретушь.. чуть поближе к продашен стилю
namespace func_next
{
    internal static class Program
    {
        static void Main(string[] args)
        {
            const string welcome = "Enter an integer value between 5 and 10:";
            const int min = 5;
            const int max = 10;
            var value = min - 1;
            var stop = false;

            bool success() => value >= min && value <= max;
            bool valid() => int.TryParse(Console.ReadLine(), out value);

            string check() => (valid(), stop = success()) switch
            {
                (true, true) => $"Your input value ({value}) has been accepted.",
                (true, false) => $"You entered {value}. Please enter a number between 5 and 10:",
                _ => "Sorry, you entered an invalid number, please try again:"
            };

            for (welcome.print(); !stop; check().print()) ;
        }
        static void print(this string s) => Console.WriteLine(s);
    }
}
.. кхи.. перфекционизм цветет.. но сам не ожидал некоторых вещей )) .. но тут уже и логика прозрачная и читаемая ))
namespace func_next
{
    internal static class Program
    {
        static void print(this string s) => Console.WriteLine(s);
        static void Main(string[] args)
        {
            const int min = 5;
            const int max = 10;
            var value = min - 1;

            string welcome() => $"Enter an integer value between {min} and {max}:";
            string accepted() => $"Your input value ({value}) has been accepted.";
            string repeat() => $"You entered {value}. Please enter a number between {min} and {max}:";
            const string ups = "Sorry, you entered an invalid number, please try again:";

            bool valid() => int.TryParse(Console.ReadLine(), out value);
            bool success() => value >= min && value <= max;

            var stop = false;

            string check() => (valid(), stop = success()) switch
            {
                (true, true) => accepted(),
                (true, false) => repeat(),
                _ => ups
            };

            for (welcome().print(); !stop; check().print()) ;
        }
    }
}
шарм ситуации в том, что тушка программы сводится к строкеfor (welcome.print(); !stop; check().print()) ; а все остальное - лишь определение "понятий"... обожаю функциональный стиль ))
..чем дальше в лес, тем веселее ))
namespace func_next
{
    internal static class Program
    {
        static void print(this string s) => Console.WriteLine(s);
        static void Main(string[] args)
        {
            var min = 5;
            var max = 10;
            var value = min - 1;

            string welcome() => $"Enter an integer value between {min} and {max}:";
            string accepted() => $"Your input value ({value}) has been accepted.";
            string repeat() => $"You entered {value}. Please enter a number between {min} and {max}:";
            const string ups = "Sorry, you entered an invalid number, please try again:";

            var valid = false;
            bool get() => valid = int.TryParse(Console.ReadLine(), out value);
            bool success() => value >= min && value <= max && valid;

            var stop = false;

            string check() => (get(), stop = success()) switch
            {
                (true, true) => accepted(),
                (true, false) => repeat(),
                _ => ups
            };

            for (welcome().print(); !stop; check().print()) ;
        }
    }
}
.. тут уже полшага до модификации min/max на ходу ;))
... как и было обещано.. но см в каментах.. ответ превысил 10к символов ;))
uznwPSD.png

(примеры реализованы в vs 2022, dotnet 8, по тому и без юзингов )) .. но каждая версия из ответа и каментов, испытана в студии, абсолютно рабочая, и все идентичны по поведению исходному коду вопроса ))
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
1. Вместо числа int.TryParse получит строку
2. Вернет false
3. В numValue будет 0
4. Условие не выполнится
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы