0

Впервые пытаюсь сделать калькульятор на C#. Как предотвратить присваивание пользователем строкового значения переменным a и b в начале, при вводе чисел для последующих операций. Ломал голову час, не доломал. Сразу извиняюсь за глупый вопрос, я новичок.

        double a;
        double b;
    Console.WriteLine("Первое число");
    a = double.Parse(Console.ReadLine());
    Console.WriteLine("Второе число");
    b = double.Parse(Console.ReadLine());

    Console.WriteLine("Выберите операцию '+' '-' '/' '*'");
    ConsoleKey key = Console.ReadKey().Key;

    switch (key)
    {
        case ConsoleKey.Subtract:
            Console.WriteLine(a - b);
            break;

        case ConsoleKey.Multiply:
            Console.WriteLine(a * b);
            break;

        case ConsoleKey.Divide:
            if (b == 0)
                Console.WriteLine("Ответа нет");
            else
                Console.WriteLine(a / b);   
            break;

        case ConsoleKey.Add:
            {
                Console.WriteLine(a + b);
            }
                break;

        default:
            Console.WriteLine("Нажми хоть что-то нормальное, будь человеком!!");
            break;
    }
    Console.ReadKey();

1 Answers1

1

Вместо

a = double.Parse(Console.ReadLine());

нужно написать

while (!double.TryParse(Console.ReadLine(), out a))
    Console.WriteLine("Не число, повторите ввод");
aepot
  • 49,560
rotabor
  • 4,251
  • А как здесь работает out? Почему он с ридлайном находится в параметрах к трай парсу? Обьясните пожалуйста, я не очень понимаю – Ruslan Sabitov Oct 14 '22 at 13:35
  • 1
    Вот тут всё подробно рассказано https://learn.microsoft.com/en-us/dotnet/api/system.double.tryparse?view=net-6.0#system-double-tryparse(system-string-system-double@). Ридлайн выдаёт трайпарсу первый аргумент - строку, которую нужно попробовать преобразовать в число. 'out' - это просто модификатор, который означает, что этот аргумент (здесь a) является выходным - в теле метода (TryParse в данном случае) ему обязательно должно быть присвоено значение. – rotabor Oct 14 '22 at 14:47
  • https://www.tutorialspoint.com/csharp/csharp_quick_guide.htm https://qna.habr.com/q/20841 https://learn.microsoft.com/en-us/dotnet/csharp/ – rotabor Oct 14 '22 at 14:50
  • Очень интересный ход. Можно последний вопрос, а !(не равно) относится только к double, или ко всему методу(double.TryParse())? – Ruslan Sabitov Oct 14 '22 at 20:52
  • @aepot добрый ты – rotabor Oct 15 '22 at 08:54
  • @RuslanSabitov это зависит от приоритета опреаций https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/. У '!' приоритет ниже, чем у '.' и '()', и поэтому операция отрицания выполняется последней и относится, соответственно, ко всему выражению 'double.TryParse(Console.ReadLine(), out a)' – rotabor Oct 15 '22 at 09:00
  • @rotabor я сам с этих водосов начинал шарп учить. Там всё по делу, для новичка самое то. – aepot Oct 15 '22 at 09:07
  • @aepot Название неподходящее, особенно если другим рекомендовать – rotabor Oct 15 '22 at 09:25
  • @rotabor вам показалось, но не настаиваю – aepot Oct 15 '22 at 09:39