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

    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, по тому и без юзингов )) .. но каждая версия из ответа и каментов, испытана в студии, абсолютно рабочая, и все идентичны по поведению исходному коду вопроса ))
    Ответ написан
  • Как работает код на C# в приведённом примере?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Вместо числа int.TryParse получит строку
    2. Вернет false
    3. В numValue будет 0
    4. Условие не выполнится
    Ответ написан
    Комментировать