示例#1
0
        static void Main(string[] args)
        {
            var mathOperationsContainer = new MathOperationsContainer();
            var parser            = new Parser();
            var notationConverter = new NotationConverter();
            var mathProcessor     = new MathProcessor();

            var calculator = new MathCalculator(parser, notationConverter, mathProcessor, mathOperationsContainer);

            Console.WriteLine("Calculator");
            Console.WriteLine("To complete the work, type exit.");
            while (true)
            {
                Console.Write("Enter a math expression: ");
                var expression = Console.ReadLine();

                if (expression == "exit")
                {
                    Console.WriteLine("Work completed.");
                    break;
                }

                var result = calculator.Calculate(expression);
                Console.WriteLine("Result: {0}", result);
            }
        }
示例#2
0
        public void Run()
        {
            string expression;

            ShowHelp();

            while ((expression = AskForInput()) != "")
            {
                try
                {
                    NotationConverter converter = new NotationConverter(expression);
                    converter.Convert();
                    calculator.Calculate(converter.PolishNotation);
                    ShowResult();
                }
                catch (InvalidExpressionException ex)
                {
                    Console.WriteLine(ex.Message);
                }
                catch (DivideByZeroException ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
        public void ConvertToPostfix_StringExpression_ArrayOfStringsPostfixExpression(string input, string expected)
        {
            // Act
            string result = string.Join("", NotationConverter.ConvertToPostfix(input, _operators));

            // Assert
            Assert.AreEqual(result, expected);
        }
        private float GetExpressionResult(string infix)
        {
            NotationConverter converter = new NotationConverter(infix);

            converter.Convert();
            calc.Calculate(converter.PolishNotation);

            return(calc.Result);
        }
        public void CorrectWorkWithDifferentPriorities()
        {
            NotationConverter converter = new NotationConverter("-4+5*6+1/2*3+7");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "4", "_", "5", "6", "*", "+", "1", "2", "/", "3", "*", "+", "7", "+" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectUnaryMinus()
        {
            NotationConverter converter = new NotationConverter("-4");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "4", "_" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectDivisionOf2Numbers()
        {
            NotationConverter converter = new NotationConverter("4/31");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "4", "31", "/" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectDifferenceOf2Numbers()
        {
            NotationConverter converter = new NotationConverter("41-5");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "41", "5", "-" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectSumOf2Digits()
        {
            NotationConverter converter = new NotationConverter("4+5");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "4", "5", "+" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectCommaProcessing()
        {
            NotationConverter converter = new NotationConverter("pow((3    )   ,(3))");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "3", "3", "pow" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectWorkWithMultiplyFunctionsAndOperatorsInPow()
        {
            NotationConverter converter = new NotationConverter("pow(cos(1) + pow(2 + 3, 2), sin(5))");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "1", "cos", "2", "3", "+", "2", "pow", "+", "5", "sin", "pow" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectWorkIfMultiplyFunctions()
        {
            NotationConverter converter = new NotationConverter("sin(pow(5, -cos(3)))");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "5", "3", "cos", "_", "pow", "sin" });

            CollectionAssert.AreEqual(result, expected);
        }
        public void CorrectSumOfManyNumbers()
        {
            NotationConverter converter = new NotationConverter("4+5+6+1+2+3+7");

            converter.Convert();
            var result   = converter.PolishNotation;
            var expected = PushToStack(new string[] { "4", "5", "+", "6", "+", "1", "+", "2", "+", "3", "+", "7", "+" });

            CollectionAssert.AreEqual(result, expected);
        }
示例#14
0
        public string Calculate()
        {
            IExpressionValidator expressionValidator = Factory.CreateExpressionValidator();

            expressionValidator.Expression = string.Join("", InfixNotationValue);

            if (expressionValidator.Validate())
            {
                PostfixNotationValue = NotationConverter.ConvertToPostfix(string.Join("", InfixNotationValue), _operators);

                foreach (var item in PostfixNotationValue)
                {
                    if (_operators.Contains(item))
                    {
                        B = double.Parse(Stack.Pop());
                        A = double.Parse(Stack.Pop());

                        if (item == "/")
                        {
                            State = ExpressionSubjectState.Division;
                            this.Notify();
                        }
                        else if (item == "*")
                        {
                            State = ExpressionSubjectState.Multiplication;
                            this.Notify();
                        }
                        else if (item == "+")
                        {
                            State = ExpressionSubjectState.Addition;
                            this.Notify();
                        }
                        else if (item == "-")
                        {
                            State = ExpressionSubjectState.Subtraction;
                            this.Notify();
                        }
                    }
                    else
                    {
                        Stack.Push(item);
                    }
                }

                return(Result = Stack.Pop());
            }
            else
            {
                return(Result);
            }
        }
        public void NotationConverter_converts_one_digit_to_RPN()
        {
            var notationConverter = new NotationConverter();
            var inputValue        = new List <ExpressionUnit>
            {
                new NumberExpressionUnit("2.00")
            };

            var result = notationConverter.ConvertToReversePolishNotation(inputValue, _mathOperationsContainer);

            var expectedItem = new NumberExpressionUnit("2.00");

            Assert.Collection(result, item => AssertExpressionUnit.Equal(expectedItem, item));
        }
        public void NotationConverter_converts_digit_with_unary_minus_to_RPN()
        {
            var notationConverter = new NotationConverter();
            var inputValue        = new List <ExpressionUnit>()
            {
                new OperationExpressionUnit("-", "~"),
                new NumberExpressionUnit("8.00")
            };

            var result = notationConverter.ConvertToReversePolishNotation(inputValue, _mathOperationsContainer);

            Assert.Collection(result,
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("8.00"), item),
                              item => AssertExpressionUnit.Equal(new OperationExpressionUnit("-", "~"), item));
        }
        public void NotationConverter_throws_custom_exception_for_unsupported_operation()
        {
            var notationConverter = new NotationConverter();
            var inputValue        = new List <ExpressionUnit>()
            {
                new NumberExpressionUnit("3.00"),
                new OperationExpressionUnit("&"),
                new NumberExpressionUnit("2.00")
            };

            Action action = () => notationConverter.ConvertToReversePolishNotation(inputValue, _mathOperationsContainer);

            var exception = Assert.Throws <ArgumentException>(action);

            Assert.Equal("Invalid mathematical expression or unsupported operation.", exception.Message);
        }
        public void NotationConverter_converts_higher_priority_unary_operation_and_lower_priority_binary_operation_to_RPN()
        {
            var notationConverter = new NotationConverter();
            var inputValue        = new List <ExpressionUnit>()
            {
                new OperationExpressionUnit("-", "~"),
                new NumberExpressionUnit("8.00"),
                new OperationExpressionUnit("+"),
                new NumberExpressionUnit("2.00"),
            };

            var result = notationConverter.ConvertToReversePolishNotation(inputValue, _mathOperationsContainer);

            Assert.Collection(result,
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("8.00"), item),
                              item => AssertExpressionUnit.Equal(new OperationExpressionUnit("-", "~"), item),
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("2.00"), item),
                              item => AssertExpressionUnit.Equal(new OperationExpressionUnit("+"), item));
        }
        public void NotationConverter_converts_two_digit_and_operation_with_brackets_to_RPN()
        {
            var notationConverter = new NotationConverter();
            var inputValue        = new List <ExpressionUnit>()
            {
                new LeftBracketExpressionUnit(),
                new NumberExpressionUnit("3.00"),
                new OperationExpressionUnit("+"),
                new NumberExpressionUnit("2.00"),
                new RightBracketExpressionUnit()
            };

            var result = notationConverter.ConvertToReversePolishNotation(inputValue, _mathOperationsContainer);

            Assert.Collection(result,
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("3.00"), item),
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("2.00"), item),
                              item => AssertExpressionUnit.Equal(new OperationExpressionUnit("+"), item));
        }
        public void NotationConverter_converts_expression_with_first_priority_operation_to_RPN()
        {
            var notationConverter = new NotationConverter();
            var inputValue        = new List <ExpressionUnit>()
            {
                new NumberExpressionUnit("4.00"),
                new OperationExpressionUnit("+"),
                new NumberExpressionUnit("2.00"),
                new OperationExpressionUnit("*"),
                new NumberExpressionUnit("3.00")
            };

            var result = notationConverter.ConvertToReversePolishNotation(inputValue, _mathOperationsContainer);

            Assert.Collection(result,
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("4.00"), item),
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("2.00"), item),
                              item => AssertExpressionUnit.Equal(new NumberExpressionUnit("3.00"), item),
                              item => AssertExpressionUnit.Equal(new OperationExpressionUnit("*"), item),
                              item => AssertExpressionUnit.Equal(new OperationExpressionUnit("+"), item));
        }
 public void NotationConverter_should_be()
 {
     var notationConverter = new NotationConverter();
 }
        public void ThrowsExeptionIfIncorrectBracket2()
        {
            NotationConverter converter = new NotationConverter("()(");

            converter.Convert();
        }