Консольный калькулятор

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

Код консольного калькулятора математических выражений

using System;
using System.Collections.Generic;
using System.Text;

class Program
{
    static void Main()
    {
        Console.OutputEncoding = Encoding.UTF8;
        Console.Write("Введите выражение(пример: \"2 + 3 * 5\"): ");
        var expression = Console.ReadLine();
        Console.WriteLine("{0} = {1}", expression, Calc(expression));
        Console.ReadLine();
    }

    /// <summary>
    /// Калькулятор выражения
    /// </summary>
    /// <param name="mathExpression">Математическое выражение</param>
    /// <returns></returns>
    static double Calc(string mathExpression)
    {
        var parts = mathExpression.Split(' '); //разбиваем выражение на части

        var operands = new List<double>();
        var operations = new List<string>();
        //в цикле разделяем операнды и операции
        for (var i = 0; i < parts.Length; i += 2)
        {
            operands.Add(Convert.ToDouble(parts[i]));
            if (i + 1 < parts.Length)
            {
                operations.Add(parts[i + 1]);
            }
        }

        //передаем в метод операции с одинаковым приоритетом и функции для их вычисления
        Calculate(operands, operations, "*", (a, b) => a * b, "/", (a, b) => a / b);
        Calculate(operands, operations, "+", (a, b) => a + b, "-", (a, b) => a - b);

        return operands[0]; //результат
    }

    /// <summary>
    /// Калькулятор для операций с одинаковым приоритетом
    /// </summary>
    /// <param name="operands">Список операндов</param>
    /// <param name="operations">Список операций</param>
    /// <param name="currentOperation1">Текущая операция 1</param>
    /// <param name="function1">Функция для операции 1</param>
    /// <param name="currentOperation2">Текущая операция 2</param>
    /// <param name="function2">Функция для операции 2</param>
    static void Calculate(List<double> operands, List<string> operations, 
        string currentOperation1, Func<double, double, double> function1, 
        string currentOperation2, Func<double, double, double> function2)
    {
        while (true)
        {
            //ищем индексы текущих операций
            var i1 = operations.IndexOf(currentOperation1);
            var i2 = operations.IndexOf(currentOperation2);

            int index; //индекс операции которую будем вычислять
            if (i1 >= 0 && i2 >= 0)
            {
                index = Math.Min(i1, i2);
            }
            else
            {
                index = Math.Max(i1, i2);
            }

            //если операции нет в списке - выходим из цикла
            if (index < 0)
            {
                break;
            }

            //вычисление текущей операции
            if (index == i1)
            {
                operands[index] = function1(operands[index], operands[index + 1]);
            }
            else
            {
                operands[index] = function2(operands[index], operands[index + 1]);
            }
            //удаление операции
            operations.RemoveAt(index);
            //удаление операнда
            operands.RemoveAt(index + 1);
        }
    }
}

Смотрите также: