Сравнение типов данных в операторах "if" в C#? - PullRequest
0 голосов
/ 27 апреля 2020

Итак, я создаю простой калькулятор, начинающий программировать в C#, и у меня до сих пор было две проблемы, которые я не смог решить.

Во-первых, по какой-то причине из всех операторов / символов я не могу добавить оператор / символ "-" рядом со строкой. Это позволяет мне иметь оператор «-» только с моими переменными. (Я попытался использовать double вместо десятичного, но получил ту же ошибку).

Вторым (и более важным) является то, что я пытаюсь получить оператор if, который выдает сообщение (и запускает другой метод), когда пользователь вводит неверный тип данных. Любой способ решить эту проблему (или, по крайней мере, найти обходной путь)?

Спасибо!

Вот пример кода, содержащий обе проблемы:

    static void Calc()
        {
            Console.Write("\n\nPlease enter a number here: ");
            decimal num1 = Convert.ToDecimal(Console.ReadLine());

            Console.Write("Please Specify an operator: ");
            string op = Console.ReadLine();

            Console.Write("Please enter another number: ");
            decimal num2 = Convert.ToDecimal(Console.ReadLine());

            if (op == "+")
            {
                Console.WriteLine("The answer is: " + num1 + num2);
            }
            else if (op == "-")
            {
                Console.WriteLine("The answer is: " + num1 - num2);
            }
            else if (op == "*")
            {
                Console.WriteLine("The answer is: " + num1 * num2);
            }
            else if (op == "/")
            {
                Console.WriteLine("The answer is: " + num1 / num2);
            }
            else
            {
                OpElse();
            }

            if (num1 || num2 != Decimal)
            {
                Console.WriteLine("You must input a number");
                Else();
            }

Ответы [ 4 ]

1 голос
/ 27 апреля 2020

Я пытаюсь получить оператор if, который выдает сообщение (и запускает другой метод), когда пользователь вводит неверный тип данных. Любой способ решить эту проблему (или, по крайней мере, найти обходной путь)?

Вы можете попробовать метод Decimal.TryParse, который попытается проанализировать строку в десятичная дробь, но не будет выбрасывать исключение, если оно терпит неудачу. Это будет выглядеть примерно так:

if (!Decimal.TryParse(Console.ReadLine(), out decimal num1)) 
{
    Console.WriteLine("No no my friend. You have to enter a valid number.");
}

.. всех операторов / символов, это не позволит мне добавить оператор / символ "-" рядом со строкой. Это позволяет мне иметь оператор «-» только с моими переменными. (Я попытался использовать double вместо десятичного, но получил ту же ошибку).

Это связано с приоритет оператора . На самом деле, несмотря на то, что во время компиляции жалуется только минус, добавление дает неверный результат во время выполнения. Проблема только в том, что (первый) + оценивается перед -. Это приводит к добавлению первого числа в строку перед выполнением вычисления. Чтобы это исправить, просто оберните часть вычисления в круглые скобки:

Console.WriteLine("The answer is: " + (num1 - num2));

или переместите вычисление из конкатенации строк:

var result = num1 + num2;
Console.WriteLine("The answer is: " + result);
0 голосов
/ 27 апреля 2020

Вы правильно указали две проблемы:

1. Ошибка оператора

Операторы + - * /. Запомните порядок операций: * / - сначала, + - - вторые, затем слева направо в группах одинакового порядка. Таким образом, в операторах записи * / выполняется перед +. В результате string + decimal, и поскольку существует неявный преобразователь из десятичной в строковую форму, оператор + действует как конкатенация.

В случае - порядок равен string + decimal - decimal, что слева направо означает, что первый + объединяет две строки. Однако - не является оператором в string и поэтому не работает.

Попробуйте использовать синтаксис $"Answer is: {num1 + num2}" для каждого случая (при необходимости измените оператор).

2. Logi c Failure

Вы преобразуете и генерируете исключение времени выполнения в методе Parse перед тестированием и выпуском. Как и предполагалось, используйте TryParse и поместите регистр ошибок вверху.

0 голосов
/ 27 апреля 2020

В строке:

Console.WriteLine("The answer is: " + num1 - num2);

Сначала добавится num1 к string, а затем попытается вычесть число из строки, что недопустимо. Используйте круглые скобки "some string" + (num1 - num2) Та же ошибка произойдет и с дополнением, например: "a" + 5 + 2 приведет к: a52

Чтобы проверить, если введенные данные неверны, можно использовать TryParse или тот же Convert. ToDecimal, но с попыткой catch

    Console.Write("\n\nPlease enter a number here: ");
    decimal num2 = 0; // Assigning default value so compiler doesn't comlain
    try 
    {
        num2 = Convert.ToDecimal(Console.ReadLine());
    }
    catch (FormatException e)
    {
        //do something else
    }
0 голосов
/ 27 апреля 2020

num1 и num2 всегда будут десятичного типа, поэтому нет необходимости проверять, является ли их тип десятичным. Если вы хотите отобразить сообщение при сбое синтаксического анализа, посмотрите на использование decimal#TryParse(), которое вернет true, если оно было проанализировано правильно, и false, если нет.

Что касается вашего - подписать вопрос. Я не совсем уверен, что вы имеете в виду, но я предполагаю, что вы пытаетесь сделать что-то вроде -"some string", что является недействительным кодом C#. Десятичные могут преобразовывать отрицательные числа просто отлично при вводе, если вы не ставите пробел между минусом и самим числом.

Или если вы пытаетесь сделать что-то вроде "num1 - num2", что не будет работать, если вы не используете строковую интерполяцию $"{num1+num2}" для примера

...