Как адаптировать мой калькулятор с одной цифрой для работы с любыми числами любой длины (real)

#c# #console-application #calculator

#c# #консольное приложение #калькулятор

Вопрос:

Итак, у меня есть этот код, и я пытался адаптировать его для работы с любым количеством действительных чисел, похоже, что изучение веб-сайта MSFT не сработало, поэтому я здесь как последнее средство.

 char operation;
String calculation;
double num1, num2, ans;

Console.WriteLine("Place your calculation in the form (x'symbol'y)");
calculation = Console.ReadLine();
num1 = double.Parse(calculation[0].ToString());
num2 = double.Parse(calculation[2].ToString());
operation = calculation[1];

switch (operation)
{
    case ' ':
        ans = num1   num2;
        Console.WriteLine(num1   num2);
        break;
    case '-':
        ans = num1 - num2;
        Console.WriteLine(num1 - num2);
        break;
    case '/':
        ans = num1 / num2;
        Console.WriteLine(num1 / num2);
        break;
    case '*':
        ans = num1 * num2;
        Console.WriteLine(num1 * num2);
        break;
}
  

Комментарии:

1. Просто подсказка: строка. Метод Split() должен хорошо подходить для вашей проблемы…

2. Просто: decimal result = (decimal)(new DataTable().Compute(Console.ReadLine(), null)) . 😉

3. При преобразовании вывода, введенного объектом, в double или decimal возникает исключение, результат должен быть проанализирован из строки: double result = double.Parse(new DataTable().Compute(Console.ReadLine(), null).ToString()); @Tim Schmelter

4. @Innat3: тогда гораздо лучше использовать Convert.ToDecimal(....) вместо преобразования строк, которые менее эффективны и также могут вызвать проблемы с локализацией. Поэтому сохраните Compute -result в object переменной, а затем используйте Convert.ToDecimal .

5. @Tim Schmelter да, это тоже работает! Я не знал, что это более эффективно

Ответ №1:

Вот пример того, как заставить его работать с числами любой длины, используя регулярное выражение и следуя указанному вами формату. Как указано в комментариях, Compute() — гораздо более простой способ заставить его работать!

         char operation;
        string calculation;
        double num1, num2, ans;
        Regex validcheck = new Regex(@"^d ([ ]|[-]|[/]|[*])d $");
        Regex findnumber = new Regex(@"d ");
        Regex findoperation = new Regex(@"([ ]|[-]|[/]|[*])");

        Console.WriteLine("Place your calculation in the form (x'symbol'y)");

        calculation = Console.ReadLine();

        if (validcheck.IsMatch(calculation))
        {
            num1 = double.Parse(findnumber.Matches(calculation)[0].Value);
            num2 = double.Parse(findnumber.Matches(calculation)[1].Value);
            operation = char.Parse(findoperation.Match(calculation).Value);

            switch (operation)
            {
                case ' ':
                    ans = num1   num2;
                    Console.WriteLine(num1   num2);
                    break;
                case '-':
                    ans = num1 - num2;
                    Console.WriteLine(num1 - num2);
                    break;
                case '/':
                    ans = num1 / num2;
                    Console.WriteLine(num1 / num2);
                    break;
                case '*':
                    ans = num1 * num2;
                    Console.WriteLine(num1 * num2);
                    break;
            }
        }
        else
        {
            Console.WriteLine("The operation you inserted has an invalid format");
        }
        Console.Read();
  

Ответ №2:

На седьмой строке кода num2 = double.Parse(calculation[0].ToString()); вы должны были написать num2 = double.Parse(calculation[2].ToString()); вторую часть, которую я все еще пытаюсь проработать. Редактировать: вы изменили его, когда я опубликовал это.

Комментарии:

1. Да, спасибо, я тоже получил это всего секунду назад 🙂

2. @innat3 разве вы не можете использовать строковые методы, такие как Substring и indexOf ?

Ответ №3:

Сделал что-то подобное, за исключением того, что я использую только одно регулярное выражение, а затем индексирую групповые записи для чисел и операторов.

         char operation;
        String calculation;
        double num1, num2, ans;

        Console.WriteLine("Place your calculation in the form (x'symbol'y)");
        calculation = Console.ReadLine();
        Regex testRegex = new Regex(@"([0-9]*)([ -/*])([0-9]*)");
        var match = testRegex.Match(calculation);

        if (!match.Success)
        {
            Console.WriteLine("Invalid syntax");
            return;
        }

        num1 = double.Parse(match.Groups[1].Value);
        num2 = double.Parse(match.Groups[3].Value);
        operation = match.Groups[2].Value[0];

        switch (operation)
        {
            case ' ':
                ans = num1   num2;
                Console.WriteLine(num1   num2);
                break;
            case '-':
                ans = num1 - num2;
                Console.WriteLine(num1 - num2);
                break;
            case '/':
                ans = num1 / num2;
                Console.WriteLine(num1 / num2);
                break;
            case '*':
                ans = num1 * num2;
                Console.WriteLine(num1 * num2);
                break;
        }
  

Комментарии:

1. Ваш лучше, я просто новичок в регулярных выражениях :/