From 5ecef5f01437eaf0789b61112f8bdf22a4283798 Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Thu, 1 Apr 2021 22:34:17 +0300 Subject: [PATCH 1/8] add TreeParse, and Operands --- hw4ParseTree/hw4ParseTree.sln | 25 +++++++ hw4ParseTree/hw4ParseTree/Addition.cs | 21 ++++++ hw4ParseTree/hw4ParseTree/Division.cs | 27 ++++++++ hw4ParseTree/hw4ParseTree/INode.cs | 20 ++++++ .../InvalidExpressionException.cs | 18 +++++ hw4ParseTree/hw4ParseTree/Multiplication.cs | 21 ++++++ hw4ParseTree/hw4ParseTree/Operand.cs | 24 +++++++ hw4ParseTree/hw4ParseTree/Operator.cs | 26 +++++++ hw4ParseTree/hw4ParseTree/ParseTree.cs | 69 +++++++++++++++++++ hw4ParseTree/hw4ParseTree/Program.cs | 29 ++++++++ hw4ParseTree/hw4ParseTree/Subtraction.cs | 21 ++++++ hw4ParseTree/hw4ParseTree/hw4ParseTree.csproj | 8 +++ 12 files changed, 309 insertions(+) create mode 100644 hw4ParseTree/hw4ParseTree.sln create mode 100644 hw4ParseTree/hw4ParseTree/Addition.cs create mode 100644 hw4ParseTree/hw4ParseTree/Division.cs create mode 100644 hw4ParseTree/hw4ParseTree/INode.cs create mode 100644 hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs create mode 100644 hw4ParseTree/hw4ParseTree/Multiplication.cs create mode 100644 hw4ParseTree/hw4ParseTree/Operand.cs create mode 100644 hw4ParseTree/hw4ParseTree/Operator.cs create mode 100644 hw4ParseTree/hw4ParseTree/ParseTree.cs create mode 100644 hw4ParseTree/hw4ParseTree/Program.cs create mode 100644 hw4ParseTree/hw4ParseTree/Subtraction.cs create mode 100644 hw4ParseTree/hw4ParseTree/hw4ParseTree.csproj diff --git a/hw4ParseTree/hw4ParseTree.sln b/hw4ParseTree/hw4ParseTree.sln new file mode 100644 index 0000000..8889107 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31005.135 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "hw4ParseTree", "hw4ParseTree\hw4ParseTree.csproj", "{70C27B8B-C63D-4F52-B8C7-B9561C911D17}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {70C27B8B-C63D-4F52-B8C7-B9561C911D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70C27B8B-C63D-4F52-B8C7-B9561C911D17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70C27B8B-C63D-4F52-B8C7-B9561C911D17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70C27B8B-C63D-4F52-B8C7-B9561C911D17}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E315057C-F86D-4CC5-95B3-11FF0F5A2F77} + EndGlobalSection +EndGlobal diff --git a/hw4ParseTree/hw4ParseTree/Addition.cs b/hw4ParseTree/hw4ParseTree/Addition.cs new file mode 100644 index 0000000..ab04e36 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Addition.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + public class Addition : Operator + { + public override string Sign { get; } + + public Addition(string sign, INode leftChild, INode rightChild) + { + Sign = sign; + LeftChild = leftChild; + RightChild = rightChild; + } + + public override double Calculate() + => LeftChild.Calculate() + RightChild.Calculate(); + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/Division.cs b/hw4ParseTree/hw4ParseTree/Division.cs new file mode 100644 index 0000000..e840938 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Division.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + public class Division : Operator + { + public override string Sign { get; } + + public Division(string sign, INode leftChild, INode rightChild) + { + Sign = sign; + LeftChild = leftChild; + RightChild = rightChild; + } + + public override double Calculate() + { + if (Math.Abs(RightChild.Calculate()) < 0.000001) + { + throw new DivideByZeroException(); + } + return LeftChild.Calculate() / RightChild.Calculate(); + } + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/INode.cs b/hw4ParseTree/hw4ParseTree/INode.cs new file mode 100644 index 0000000..532d023 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/INode.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + public interface INode + { + /// + /// + /// + public void Print(); + + /// + /// + /// + /// + public double Calculate(); + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs b/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs new file mode 100644 index 0000000..43eb389 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + public class InvalidExpressionException : Exception + { + public InvalidExpressionException() + { + } + + public InvalidExpressionException(string message) + : base(message) + { + } + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/Multiplication.cs b/hw4ParseTree/hw4ParseTree/Multiplication.cs new file mode 100644 index 0000000..20b1109 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Multiplication.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + public class Multiplication : Operator + { + public override string Sign { get; } + + public Multiplication(string sign, INode leftChild, INode rightChild) + { + Sign = sign; + LeftChild = leftChild; + RightChild = rightChild; + } + + public override double Calculate() + => LeftChild.Calculate() * RightChild.Calculate(); + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/Operand.cs b/hw4ParseTree/hw4ParseTree/Operand.cs new file mode 100644 index 0000000..dae7264 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Operand.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + class Operand : INode + { + public double Number { get; set; } + + public Operand(double number) + { + Number = number; + } + + public void Print() + { + Console.Write($" {Number} "); + } + + public double Calculate() + => Number; + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/Operator.cs b/hw4ParseTree/hw4ParseTree/Operator.cs new file mode 100644 index 0000000..33b1170 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Operator.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + public abstract class Operator : INode + { + public INode LeftChild { get; set; } + + public INode RightChild { get; set; } + + public virtual string Sign { get; } + + public void Print() + { + Console.Write("("); + LeftChild.Print(); + Console.Write(Sign); + RightChild.Print(); + Console.Write(")"); + } + public abstract double Calculate(); + + } +} diff --git a/hw4ParseTree/hw4ParseTree/ParseTree.cs b/hw4ParseTree/hw4ParseTree/ParseTree.cs new file mode 100644 index 0000000..a92254b --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/ParseTree.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + class ParseTree + { + private INode root; + + public void BuildTree(string expression) + { + var line = expression.Split(' ', StringSplitOptions.RemoveEmptyEntries); + var index = 0; + if (IsCorrect(line[0])) + { + root = Build(line, ref index); + } + else + { + throw new InvalidExpressionException(); + } + } + + private bool IsCorrectSymbol(string symbol) + => symbol == "(" || symbol == ")"; + + private bool IsCorrect(string symbol) + => symbol == "(" || IsOperator(symbol); + + private INode Build(string[] line, ref int index) + { + for (; index < line.Length; ++index) + { + if (IsOperator(line[index])) + { + index++; + return line[index - 1] switch + { + "+" => new Addition(line[index - 1], Build(line, ref index), Build(line, ref index)), + "-" => new Subtraction(line[index - 1], Build(line, ref index), Build(line, ref index)), + "/" => new Division(line[index - 1], Build(line, ref index), Build(line, ref index)), + "*" => new Multiplication(line[index - 1], Build(line, ref index), Build(line, ref index)), + _ => throw new Exception(), + }; + } + else if (double.TryParse(line[index], out var value)) + { + index++; + return new Operand(value); + } + else if (!IsCorrectSymbol(line[index])) + { + throw new InvalidExpressionException(); + } + } + return root; + } + + private bool IsOperator(string symbol) + => symbol == "+" || symbol == "-" || symbol == "*" || symbol == "/"; + + public void PrintTree() + => root.Print(); + + public double Calculate() + => root.Calculate(); + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/Program.cs b/hw4ParseTree/hw4ParseTree/Program.cs new file mode 100644 index 0000000..ebf36b3 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Program.cs @@ -0,0 +1,29 @@ +using System; + +namespace hw4ParseTree +{ + class Program + { + static void Main(string[] args) + { + var tree = new ParseTree(); + + Console.WriteLine("Введите выражение -"); + var expression = Console.ReadLine(); + + try + { + tree.BuildTree(expression); + } + catch (InvalidExpressionException) + { + Console.WriteLine("Ошибка! Некоректный ввод выражения!"); + return; + } + + Console.Write("Печать выражения: "); + tree.PrintTree(); + Console.WriteLine($"\nОтвет = {tree.Calculate()}"); + } + } +} diff --git a/hw4ParseTree/hw4ParseTree/Subtraction.cs b/hw4ParseTree/hw4ParseTree/Subtraction.cs new file mode 100644 index 0000000..65cf0a2 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Subtraction.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace hw4ParseTree +{ + public class Subtraction : Operator + { + public override string Sign { get; } + + public Subtraction(string sign, INode leftChild, INode rightChild) + { + Sign = sign; + LeftChild = leftChild; + RightChild = rightChild; + } + + public override double Calculate() + => LeftChild.Calculate() - RightChild.Calculate(); + } +} diff --git a/hw4ParseTree/hw4ParseTree/hw4ParseTree.csproj b/hw4ParseTree/hw4ParseTree/hw4ParseTree.csproj new file mode 100644 index 0000000..c73e0d1 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/hw4ParseTree.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + From 405e26be290b79f096b7eb07b13356f2d754f99c Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Fri, 2 Apr 2021 01:52:23 +0300 Subject: [PATCH 2/8] add NUint test, but find some bags in BuildTree --- .../hw4ParseTree.Test.csproj | 19 +++++ .../hw4ParseTree.Test/hw4ParseTreeTest.cs | 80 +++++++++++++++++++ hw4ParseTree/hw4ParseTree.sln | 8 +- hw4ParseTree/hw4ParseTree/ParseTree.cs | 2 +- 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj create mode 100644 hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs diff --git a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj new file mode 100644 index 0000000..993702d --- /dev/null +++ b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp3.1 + + false + + + + + + + + + + + + + diff --git a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs new file mode 100644 index 0000000..d80a2d6 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs @@ -0,0 +1,80 @@ +using NUnit.Framework; +using System; + +namespace hw4ParseTree.Test +{ + public class Tests + { + private ParseTree tree; + + [SetUp] + public void Setup() + { + tree = new ParseTree(); + } + + [TestCase] + public void TestAddition() + { + var str = "( + 2 3 )"; + tree.BuildTree(str); + Assert.AreEqual(5, tree.Calculate()); + } + + [TestCase] + public void TestSubstraction() + { + var str = "( - 2 3 )"; + tree.BuildTree(str); + Assert.AreEqual(-1, tree.Calculate()); + } + + [TestCase] + public void TestMultiplacation() + { + var str = "( * 2 3 )"; + tree.BuildTree(str); + Assert.AreEqual(6, tree.Calculate()); + } + + [TestCase] + public void TestDivision() + { + var str = "( / 8 4 )"; + tree.BuildTree(str); + Assert.AreEqual(2, tree.Calculate()); + } + + [TestCase] + public void TestDoubleDivision() + { + var str = "( / 3 2 )"; + tree.BuildTree(str); + Assert.AreEqual(1.5, tree.Calculate()); + } + + [TestCase] + public void TestDivisionByZero() + { + var str = "( / 8 0 )"; + tree.BuildTree(str); + Assert.Throws(() => tree.Calculate()); + } + + [TestCase] + public void TestNotCorrectExpression() + { + var str = "( / 8 )"; + tree.BuildTree(str); + Assert.Throws(() => tree.BuildTree(str)); + } + + [TestCase] + public void TestTaskExpression() + { + var str = "( * ( + 1 1 ) 2 )"; + tree.BuildTree(str); + Assert.AreEqual(4, tree.Calculate()); + } + } +} \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree.sln b/hw4ParseTree/hw4ParseTree.sln index 8889107..0dea7e0 100644 --- a/hw4ParseTree/hw4ParseTree.sln +++ b/hw4ParseTree/hw4ParseTree.sln @@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.31005.135 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "hw4ParseTree", "hw4ParseTree\hw4ParseTree.csproj", "{70C27B8B-C63D-4F52-B8C7-B9561C911D17}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "hw4ParseTree", "hw4ParseTree\hw4ParseTree.csproj", "{70C27B8B-C63D-4F52-B8C7-B9561C911D17}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "hw4ParseTree.Test", "hw4ParseTree.Test\hw4ParseTree.Test.csproj", "{E5953ED4-DAAC-461D-AF86-3DE600136A14}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +17,10 @@ Global {70C27B8B-C63D-4F52-B8C7-B9561C911D17}.Debug|Any CPU.Build.0 = Debug|Any CPU {70C27B8B-C63D-4F52-B8C7-B9561C911D17}.Release|Any CPU.ActiveCfg = Release|Any CPU {70C27B8B-C63D-4F52-B8C7-B9561C911D17}.Release|Any CPU.Build.0 = Release|Any CPU + {E5953ED4-DAAC-461D-AF86-3DE600136A14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5953ED4-DAAC-461D-AF86-3DE600136A14}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5953ED4-DAAC-461D-AF86-3DE600136A14}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5953ED4-DAAC-461D-AF86-3DE600136A14}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/hw4ParseTree/hw4ParseTree/ParseTree.cs b/hw4ParseTree/hw4ParseTree/ParseTree.cs index a92254b..3351794 100644 --- a/hw4ParseTree/hw4ParseTree/ParseTree.cs +++ b/hw4ParseTree/hw4ParseTree/ParseTree.cs @@ -4,7 +4,7 @@ namespace hw4ParseTree { - class ParseTree + public class ParseTree { private INode root; From a2af7bf8025bc9bb5df3926abd45ab38313c4dc5 Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Fri, 2 Apr 2021 18:49:05 +0300 Subject: [PATCH 3/8] fix Test, add CheckExpression and fix BuildTree --- .../hw4ParseTree.Test/hw4ParseTreeTest.cs | 9 +- hw4ParseTree/hw4ParseTree/Addition.cs | 4 +- hw4ParseTree/hw4ParseTree/Division.cs | 4 +- hw4ParseTree/hw4ParseTree/Multiplication.cs | 4 +- hw4ParseTree/hw4ParseTree/Operator.cs | 2 +- hw4ParseTree/hw4ParseTree/ParseTree.cs | 104 ++++++++++++++---- hw4ParseTree/hw4ParseTree/Subtraction.cs | 4 +- 7 files changed, 101 insertions(+), 30 deletions(-) diff --git a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs index d80a2d6..7053fcb 100644 --- a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs +++ b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs @@ -54,6 +54,14 @@ public void TestDoubleDivision() } [TestCase] + public void TestWithNegativeNumber() + { + var str = "( + 3 -2 )"; + tree.BuildTree(str); + Assert.AreEqual(1, tree.Calculate()); + } + + [TestCase] public void TestDivisionByZero() { var str = "( / 8 0 )"; @@ -65,7 +73,6 @@ public void TestDivisionByZero() public void TestNotCorrectExpression() { var str = "( / 8 )"; - tree.BuildTree(str); Assert.Throws(() => tree.BuildTree(str)); } diff --git a/hw4ParseTree/hw4ParseTree/Addition.cs b/hw4ParseTree/hw4ParseTree/Addition.cs index ab04e36..8e2401a 100644 --- a/hw4ParseTree/hw4ParseTree/Addition.cs +++ b/hw4ParseTree/hw4ParseTree/Addition.cs @@ -6,9 +6,9 @@ namespace hw4ParseTree { public class Addition : Operator { - public override string Sign { get; } + public override char Sign { get; } - public Addition(string sign, INode leftChild, INode rightChild) + public Addition(char sign, INode leftChild, INode rightChild) { Sign = sign; LeftChild = leftChild; diff --git a/hw4ParseTree/hw4ParseTree/Division.cs b/hw4ParseTree/hw4ParseTree/Division.cs index e840938..50e5b1e 100644 --- a/hw4ParseTree/hw4ParseTree/Division.cs +++ b/hw4ParseTree/hw4ParseTree/Division.cs @@ -6,9 +6,9 @@ namespace hw4ParseTree { public class Division : Operator { - public override string Sign { get; } + public override char Sign { get; } - public Division(string sign, INode leftChild, INode rightChild) + public Division(char sign, INode leftChild, INode rightChild) { Sign = sign; LeftChild = leftChild; diff --git a/hw4ParseTree/hw4ParseTree/Multiplication.cs b/hw4ParseTree/hw4ParseTree/Multiplication.cs index 20b1109..dbd09d2 100644 --- a/hw4ParseTree/hw4ParseTree/Multiplication.cs +++ b/hw4ParseTree/hw4ParseTree/Multiplication.cs @@ -6,9 +6,9 @@ namespace hw4ParseTree { public class Multiplication : Operator { - public override string Sign { get; } + public override char Sign { get; } - public Multiplication(string sign, INode leftChild, INode rightChild) + public Multiplication(char sign, INode leftChild, INode rightChild) { Sign = sign; LeftChild = leftChild; diff --git a/hw4ParseTree/hw4ParseTree/Operator.cs b/hw4ParseTree/hw4ParseTree/Operator.cs index 33b1170..71d7a4c 100644 --- a/hw4ParseTree/hw4ParseTree/Operator.cs +++ b/hw4ParseTree/hw4ParseTree/Operator.cs @@ -10,7 +10,7 @@ public abstract class Operator : INode public INode RightChild { get; set; } - public virtual string Sign { get; } + public virtual char Sign { get; } public void Print() { diff --git a/hw4ParseTree/hw4ParseTree/ParseTree.cs b/hw4ParseTree/hw4ParseTree/ParseTree.cs index 3351794..fd18bf5 100644 --- a/hw4ParseTree/hw4ParseTree/ParseTree.cs +++ b/hw4ParseTree/hw4ParseTree/ParseTree.cs @@ -10,11 +10,10 @@ public class ParseTree public void BuildTree(string expression) { - var line = expression.Split(' ', StringSplitOptions.RemoveEmptyEntries); var index = 0; - if (IsCorrect(line[0])) + if (CheckExpression(expression)) { - root = Build(line, ref index); + root = Build(expression, ref index); } else { @@ -22,33 +21,100 @@ public void BuildTree(string expression) } } - private bool IsCorrectSymbol(string symbol) - => symbol == "(" || symbol == ")"; + private bool IsCorrectSymbol(char symbol) + => symbol == '(' || symbol == ')'; - private bool IsCorrect(string symbol) - => symbol == "(" || IsOperator(symbol); + private bool IsCorrect(char symbol) + => symbol == '(' || IsOperator(symbol); + + private bool IsOperator(char symbol) + => symbol == '+' || symbol == '-' || symbol == '*' || symbol == '/'; - private INode Build(string[] line, ref int index) + private double ReadNumber(string line, ref int index) + { + var number = ""; + if (line[index] == '-') + { + number += line[index]; + index++; + } + while (char.IsDigit(line[index])) + { + number += line[index]; + index++; + } + if (!double.TryParse(number, out var value)) + { + throw new InvalidExpressionException(); + } + return value; + } + + private bool CheckExpression(string line) + { + int index = 0; + int countNumber = 0; + int countBrackets = 0; + while (index != line.Length) + { + if (line[index] == '(') + { + countBrackets++; + index++; + } + else if (line[index] == ' ') + { + index++; + } + else if (line[index] == ')') + { + countBrackets--; + index++; + } + else if (line[index] == '-' && char.IsDigit(line[index + 1]) || char.IsDigit(line[index])) + { + var value = ReadNumber(line, ref index); + index++; + countNumber++; + } + else if (IsOperator(line[index])) + { + countNumber--; + index++; + } + else + { + return false; + } + } + return countBrackets == 0 && countNumber == 1; + } + + private INode Build(string line, ref int index) { for (; index < line.Length; ++index) { - if (IsOperator(line[index])) + if (line[index] == ' ') + { + continue; + } + if (line[index] == '-' && char.IsDigit(line[index + 1]) || char.IsDigit(line[index])) + { + var value = ReadNumber(line, ref index); + return new Operand(value); + } + else if (IsOperator(line[index])) { index++; return line[index - 1] switch { - "+" => new Addition(line[index - 1], Build(line, ref index), Build(line, ref index)), - "-" => new Subtraction(line[index - 1], Build(line, ref index), Build(line, ref index)), - "/" => new Division(line[index - 1], Build(line, ref index), Build(line, ref index)), - "*" => new Multiplication(line[index - 1], Build(line, ref index), Build(line, ref index)), + '+' => new Addition(line[index - 1], Build(line, ref index), Build(line, ref index)), + '-' => new Subtraction(line[index - 1], Build(line, ref index), Build(line, ref index)), + '/' => new Division(line[index - 1], Build(line, ref index), Build(line, ref index)), + '*' => new Multiplication(line[index - 1], Build(line, ref index), Build(line, ref index)), _ => throw new Exception(), }; } - else if (double.TryParse(line[index], out var value)) - { - index++; - return new Operand(value); - } else if (!IsCorrectSymbol(line[index])) { throw new InvalidExpressionException(); @@ -57,8 +123,6 @@ private INode Build(string[] line, ref int index) return root; } - private bool IsOperator(string symbol) - => symbol == "+" || symbol == "-" || symbol == "*" || symbol == "/"; public void PrintTree() => root.Print(); diff --git a/hw4ParseTree/hw4ParseTree/Subtraction.cs b/hw4ParseTree/hw4ParseTree/Subtraction.cs index 65cf0a2..22e3f5c 100644 --- a/hw4ParseTree/hw4ParseTree/Subtraction.cs +++ b/hw4ParseTree/hw4ParseTree/Subtraction.cs @@ -6,9 +6,9 @@ namespace hw4ParseTree { public class Subtraction : Operator { - public override string Sign { get; } + public override char Sign { get; } - public Subtraction(string sign, INode leftChild, INode rightChild) + public Subtraction(char sign, INode leftChild, INode rightChild) { Sign = sign; LeftChild = leftChild; From d31b3e5cb9d7c8d75f55113184ee6fa69348f255 Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Sat, 3 Apr 2021 00:16:01 +0300 Subject: [PATCH 4/8] add comments --- hw4ParseTree/hw4ParseTree/INode.cs | 5 ++--- hw4ParseTree/hw4ParseTree/ParseTree.cs | 10 ++++++++++ hw4ParseTree/hw4ParseTree/Program.cs | 2 -- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/hw4ParseTree/hw4ParseTree/INode.cs b/hw4ParseTree/hw4ParseTree/INode.cs index 532d023..0528726 100644 --- a/hw4ParseTree/hw4ParseTree/INode.cs +++ b/hw4ParseTree/hw4ParseTree/INode.cs @@ -7,14 +7,13 @@ namespace hw4ParseTree public interface INode { /// - /// + /// печатает, что находиться в узле /// public void Print(); /// - /// + /// возвращает значение элемента, лежащего в узле /// - /// public double Calculate(); } } \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/ParseTree.cs b/hw4ParseTree/hw4ParseTree/ParseTree.cs index fd18bf5..1509cf4 100644 --- a/hw4ParseTree/hw4ParseTree/ParseTree.cs +++ b/hw4ParseTree/hw4ParseTree/ParseTree.cs @@ -8,6 +8,9 @@ public class ParseTree { private INode root; + /// + /// Функция потсроения дерева разбора + /// public void BuildTree(string expression) { var index = 0; @@ -124,9 +127,16 @@ private INode Build(string line, ref int index) } + /// + /// функция печати дерева + /// public void PrintTree() => root.Print(); + /// + /// Считает значение выражения + /// + /// возвращает ответ public double Calculate() => root.Calculate(); } diff --git a/hw4ParseTree/hw4ParseTree/Program.cs b/hw4ParseTree/hw4ParseTree/Program.cs index ebf36b3..9f553a6 100644 --- a/hw4ParseTree/hw4ParseTree/Program.cs +++ b/hw4ParseTree/hw4ParseTree/Program.cs @@ -7,10 +7,8 @@ class Program static void Main(string[] args) { var tree = new ParseTree(); - Console.WriteLine("Введите выражение -"); var expression = Console.ReadLine(); - try { tree.BuildTree(expression); From 5bf6254c95c12cb2d3f7784d8a137f4e2a68c93c Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Sun, 4 Apr 2021 16:34:22 +0300 Subject: [PATCH 5/8] appveyor --- appveyor.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..e7e7cb3 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,6 @@ +image: Visual Studio 2019 + +build_script: + - For /R %%I in (*.sln) do dotnet test %%I + +test: off \ No newline at end of file From ac9a649cb412d0cbc6a6b659d82db216a2cd1bf8 Mon Sep 17 00:00:00 2001 From: MikePuzanov <89803250877@mail.ru> Date: Thu, 13 May 2021 01:34:51 +0300 Subject: [PATCH 6/8] fix mistakes --- .../hw4ParseTree.Test.csproj | 2 +- .../hw4ParseTree.Test/hw4ParseTreeTest.cs | 8 +++--- hw4ParseTree/hw4ParseTree.sln | 4 +-- hw4ParseTree/hw4ParseTree/Addition.cs | 9 ++++--- hw4ParseTree/hw4ParseTree/Division.cs | 9 ++++--- hw4ParseTree/hw4ParseTree/Expression.txt | 1 + hw4ParseTree/hw4ParseTree/INode.cs | 7 ++++-- .../InvalidExpressionException.cs | 5 +++- hw4ParseTree/hw4ParseTree/Multiplication.cs | 9 ++++--- hw4ParseTree/hw4ParseTree/Operand.cs | 2 +- hw4ParseTree/hw4ParseTree/Operator.cs | 2 +- hw4ParseTree/hw4ParseTree/ParseTree.cs | 25 +++++++++++-------- hw4ParseTree/hw4ParseTree/Program.cs | 8 +++--- hw4ParseTree/hw4ParseTree/Subtraction.cs | 9 ++++--- 14 files changed, 62 insertions(+), 38 deletions(-) create mode 100644 hw4ParseTree/hw4ParseTree/Expression.txt diff --git a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj index 993702d..3c475f6 100644 --- a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj +++ b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTree.Test.csproj @@ -13,7 +13,7 @@ - + diff --git a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs index 7053fcb..f69b549 100644 --- a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs +++ b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using System; -namespace hw4ParseTree.Test +namespace Hw4ParseTree.Test { public class Tests { @@ -22,7 +22,7 @@ public void TestAddition() } [TestCase] - public void TestSubstraction() + public void TestSubtraction() { var str = "( - 2 3 )"; tree.BuildTree(str); @@ -30,7 +30,7 @@ public void TestSubstraction() } [TestCase] - public void TestMultiplacation() + public void TestMultiplication() { var str = "( * 2 3 )"; tree.BuildTree(str); @@ -61,7 +61,7 @@ public void TestWithNegativeNumber() Assert.AreEqual(1, tree.Calculate()); } - [TestCase] + [TestCase] public void TestDivisionByZero() { var str = "( / 8 0 )"; diff --git a/hw4ParseTree/hw4ParseTree.sln b/hw4ParseTree/hw4ParseTree.sln index 0dea7e0..adf64c1 100644 --- a/hw4ParseTree/hw4ParseTree.sln +++ b/hw4ParseTree/hw4ParseTree.sln @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.31005.135 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "hw4ParseTree", "hw4ParseTree\hw4ParseTree.csproj", "{70C27B8B-C63D-4F52-B8C7-B9561C911D17}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hw4ParseTree", "hw4ParseTree\Hw4ParseTree.csproj", "{70C27B8B-C63D-4F52-B8C7-B9561C911D17}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "hw4ParseTree.Test", "hw4ParseTree.Test\hw4ParseTree.Test.csproj", "{E5953ED4-DAAC-461D-AF86-3DE600136A14}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "hw4ParseTree.Test", "hw4ParseTree.Test\hw4ParseTree.Test.csproj", "{E5953ED4-DAAC-461D-AF86-3DE600136A14}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/hw4ParseTree/hw4ParseTree/Addition.cs b/hw4ParseTree/hw4ParseTree/Addition.cs index 8e2401a..b31a580 100644 --- a/hw4ParseTree/hw4ParseTree/Addition.cs +++ b/hw4ParseTree/hw4ParseTree/Addition.cs @@ -2,15 +2,18 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { + /// + /// класс для сложения + /// public class Addition : Operator { public override char Sign { get; } - public Addition(char sign, INode leftChild, INode rightChild) + public Addition(INode leftChild, INode rightChild) { - Sign = sign; + Sign = '+'; LeftChild = leftChild; RightChild = rightChild; } diff --git a/hw4ParseTree/hw4ParseTree/Division.cs b/hw4ParseTree/hw4ParseTree/Division.cs index 50e5b1e..5de1bd3 100644 --- a/hw4ParseTree/hw4ParseTree/Division.cs +++ b/hw4ParseTree/hw4ParseTree/Division.cs @@ -2,15 +2,18 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { + /// + /// класс для деления + /// public class Division : Operator { public override char Sign { get; } - public Division(char sign, INode leftChild, INode rightChild) + public Division(INode leftChild, INode rightChild) { - Sign = sign; + Sign = '/'; LeftChild = leftChild; RightChild = rightChild; } diff --git a/hw4ParseTree/hw4ParseTree/Expression.txt b/hw4ParseTree/hw4ParseTree/Expression.txt new file mode 100644 index 0000000..c45d6d9 --- /dev/null +++ b/hw4ParseTree/hw4ParseTree/Expression.txt @@ -0,0 +1 @@ +(* (+ 1 1) 2) \ No newline at end of file diff --git a/hw4ParseTree/hw4ParseTree/INode.cs b/hw4ParseTree/hw4ParseTree/INode.cs index 0528726..c766d19 100644 --- a/hw4ParseTree/hw4ParseTree/INode.cs +++ b/hw4ParseTree/hw4ParseTree/INode.cs @@ -2,12 +2,15 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { + /// + /// интерфейс узла в дереве разбора + /// public interface INode { /// - /// печатает, что находиться в узле + /// печатает, что находится в узле /// public void Print(); diff --git a/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs b/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs index 43eb389..68a95e2 100644 --- a/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs +++ b/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs @@ -2,8 +2,11 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { + /// + /// исключение для неправильных выражений6 + /// public class InvalidExpressionException : Exception { public InvalidExpressionException() diff --git a/hw4ParseTree/hw4ParseTree/Multiplication.cs b/hw4ParseTree/hw4ParseTree/Multiplication.cs index dbd09d2..4b0c8ca 100644 --- a/hw4ParseTree/hw4ParseTree/Multiplication.cs +++ b/hw4ParseTree/hw4ParseTree/Multiplication.cs @@ -2,15 +2,18 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { + /// + /// класс для умножения + /// public class Multiplication : Operator { public override char Sign { get; } - public Multiplication(char sign, INode leftChild, INode rightChild) + public Multiplication(INode leftChild, INode rightChild) { - Sign = sign; + Sign = '*'; LeftChild = leftChild; RightChild = rightChild; } diff --git a/hw4ParseTree/hw4ParseTree/Operand.cs b/hw4ParseTree/hw4ParseTree/Operand.cs index dae7264..4d40e9a 100644 --- a/hw4ParseTree/hw4ParseTree/Operand.cs +++ b/hw4ParseTree/hw4ParseTree/Operand.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { class Operand : INode { diff --git a/hw4ParseTree/hw4ParseTree/Operator.cs b/hw4ParseTree/hw4ParseTree/Operator.cs index 71d7a4c..9e8aa37 100644 --- a/hw4ParseTree/hw4ParseTree/Operator.cs +++ b/hw4ParseTree/hw4ParseTree/Operator.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { public abstract class Operator : INode { diff --git a/hw4ParseTree/hw4ParseTree/ParseTree.cs b/hw4ParseTree/hw4ParseTree/ParseTree.cs index 1509cf4..f6b9c17 100644 --- a/hw4ParseTree/hw4ParseTree/ParseTree.cs +++ b/hw4ParseTree/hw4ParseTree/ParseTree.cs @@ -2,14 +2,14 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { public class ParseTree { private INode root; /// - /// Функция потсроения дерева разбора + /// Функция построения дерева разбора /// public void BuildTree(string expression) { @@ -63,32 +63,35 @@ private bool CheckExpression(string line) if (line[index] == '(') { countBrackets++; - index++; } else if (line[index] == ' ') { index++; + continue; } else if (line[index] == ')') { countBrackets--; - index++; + if (countBrackets < 0) + { + return false; + } } else if (line[index] == '-' && char.IsDigit(line[index + 1]) || char.IsDigit(line[index])) { var value = ReadNumber(line, ref index); - index++; countNumber++; + continue; } else if (IsOperator(line[index])) { countNumber--; - index++; } else { return false; } + index++; } return countBrackets == 0 && countNumber == 1; } @@ -111,10 +114,10 @@ private INode Build(string line, ref int index) index++; return line[index - 1] switch { - '+' => new Addition(line[index - 1], Build(line, ref index), Build(line, ref index)), - '-' => new Subtraction(line[index - 1], Build(line, ref index), Build(line, ref index)), - '/' => new Division(line[index - 1], Build(line, ref index), Build(line, ref index)), - '*' => new Multiplication(line[index - 1], Build(line, ref index), Build(line, ref index)), + '+' => new Addition(Build(line, ref index), Build(line, ref index)), + '-' => new Subtraction(Build(line, ref index), Build(line, ref index)), + '/' => new Division(Build(line, ref index), Build(line, ref index)), + '*' => new Multiplication(Build(line, ref index), Build(line, ref index)), _ => throw new Exception(), }; } @@ -123,7 +126,7 @@ private INode Build(string line, ref int index) throw new InvalidExpressionException(); } } - return root; + return root; } diff --git a/hw4ParseTree/hw4ParseTree/Program.cs b/hw4ParseTree/hw4ParseTree/Program.cs index 9f553a6..b19ba91 100644 --- a/hw4ParseTree/hw4ParseTree/Program.cs +++ b/hw4ParseTree/hw4ParseTree/Program.cs @@ -1,14 +1,16 @@ using System; +using System.IO; -namespace hw4ParseTree +namespace Hw4ParseTree { class Program { static void Main(string[] args) { var tree = new ParseTree(); - Console.WriteLine("Введите выражение -"); - var expression = Console.ReadLine(); + var file = new StreamReader("..\\..\\..\\Expression.txt"); + var expression = file.ReadLine(); + Console.WriteLine($"Выражение - {expression}"); try { tree.BuildTree(expression); diff --git a/hw4ParseTree/hw4ParseTree/Subtraction.cs b/hw4ParseTree/hw4ParseTree/Subtraction.cs index 22e3f5c..3933cd8 100644 --- a/hw4ParseTree/hw4ParseTree/Subtraction.cs +++ b/hw4ParseTree/hw4ParseTree/Subtraction.cs @@ -2,15 +2,18 @@ using System.Collections.Generic; using System.Text; -namespace hw4ParseTree +namespace Hw4ParseTree { + /// + /// класс для вычитания + /// public class Subtraction : Operator { public override char Sign { get; } - public Subtraction(char sign, INode leftChild, INode rightChild) + public Subtraction(INode leftChild, INode rightChild) { - Sign = sign; + Sign = '-'; LeftChild = leftChild; RightChild = rightChild; } From 7768ced960727ee3f70079319c141e8176bbfe74 Mon Sep 17 00:00:00 2001 From: MikePuzanov <89803250877@mail.ru> Date: Fri, 4 Jun 2021 02:35:56 +0300 Subject: [PATCH 7/8] fix bugs --- .../hw4ParseTree.Test/hw4ParseTreeTest.cs | 2 +- hw4ParseTree/hw4ParseTree/Addition.cs | 3 +-- hw4ParseTree/hw4ParseTree/Division.cs | 3 +-- .../InvalidExpressionException.cs | 2 +- hw4ParseTree/hw4ParseTree/Multiplication.cs | 3 +-- hw4ParseTree/hw4ParseTree/Operand.cs | 19 ++++++++++++------- hw4ParseTree/hw4ParseTree/Operator.cs | 5 ++++- hw4ParseTree/hw4ParseTree/ParseTree.cs | 5 ++++- hw4ParseTree/hw4ParseTree/Subtraction.cs | 3 +-- 9 files changed, 26 insertions(+), 19 deletions(-) diff --git a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs index f69b549..cdbd808 100644 --- a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs +++ b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs @@ -50,7 +50,7 @@ public void TestDoubleDivision() { var str = "( / 3 2 )"; tree.BuildTree(str); - Assert.AreEqual(1.5, tree.Calculate()); + Assert.AreEqual(1.5, tree.Calculate(), double.PositiveInfinity); } [TestCase] diff --git a/hw4ParseTree/hw4ParseTree/Addition.cs b/hw4ParseTree/hw4ParseTree/Addition.cs index b31a580..6d51dce 100644 --- a/hw4ParseTree/hw4ParseTree/Addition.cs +++ b/hw4ParseTree/hw4ParseTree/Addition.cs @@ -9,11 +9,10 @@ namespace Hw4ParseTree /// public class Addition : Operator { - public override char Sign { get; } + public override char Sign => '+'; public Addition(INode leftChild, INode rightChild) { - Sign = '+'; LeftChild = leftChild; RightChild = rightChild; } diff --git a/hw4ParseTree/hw4ParseTree/Division.cs b/hw4ParseTree/hw4ParseTree/Division.cs index 5de1bd3..78239d9 100644 --- a/hw4ParseTree/hw4ParseTree/Division.cs +++ b/hw4ParseTree/hw4ParseTree/Division.cs @@ -9,11 +9,10 @@ namespace Hw4ParseTree /// public class Division : Operator { - public override char Sign { get; } + public override char Sign => '/'; public Division(INode leftChild, INode rightChild) { - Sign = '/'; LeftChild = leftChild; RightChild = rightChild; } diff --git a/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs b/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs index 68a95e2..4007e9c 100644 --- a/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs +++ b/hw4ParseTree/hw4ParseTree/InvalidExpressionException.cs @@ -5,7 +5,7 @@ namespace Hw4ParseTree { /// - /// исключение для неправильных выражений6 + /// исключение для неправильных выражений. /// public class InvalidExpressionException : Exception { diff --git a/hw4ParseTree/hw4ParseTree/Multiplication.cs b/hw4ParseTree/hw4ParseTree/Multiplication.cs index 4b0c8ca..2a80ced 100644 --- a/hw4ParseTree/hw4ParseTree/Multiplication.cs +++ b/hw4ParseTree/hw4ParseTree/Multiplication.cs @@ -9,11 +9,10 @@ namespace Hw4ParseTree /// public class Multiplication : Operator { - public override char Sign { get; } + public override char Sign => '*'; public Multiplication(INode leftChild, INode rightChild) { - Sign = '*'; LeftChild = leftChild; RightChild = rightChild; } diff --git a/hw4ParseTree/hw4ParseTree/Operand.cs b/hw4ParseTree/hw4ParseTree/Operand.cs index 4d40e9a..be06e3f 100644 --- a/hw4ParseTree/hw4ParseTree/Operand.cs +++ b/hw4ParseTree/hw4ParseTree/Operand.cs @@ -4,20 +4,25 @@ namespace Hw4ParseTree { + /// + /// класс синтаксического дерева, который представляет число + /// class Operand : INode { - public double Number { get; set; } + private double Number { get; } public Operand(double number) - { - Number = number; - } + => Number = number; + /// + /// выводит число + /// public void Print() - { - Console.Write($" {Number} "); - } + => Console.Write($" {Number} "); + /// + /// считает значение + /// public double Calculate() => Number; } diff --git a/hw4ParseTree/hw4ParseTree/Operator.cs b/hw4ParseTree/hw4ParseTree/Operator.cs index 9e8aa37..5db8ef0 100644 --- a/hw4ParseTree/hw4ParseTree/Operator.cs +++ b/hw4ParseTree/hw4ParseTree/Operator.cs @@ -4,6 +4,9 @@ namespace Hw4ParseTree { + /// + /// Класс синтаксического дерва который представляет оператор + /// public abstract class Operator : INode { public INode LeftChild { get; set; } @@ -20,7 +23,7 @@ public void Print() RightChild.Print(); Console.Write(")"); } - public abstract double Calculate(); + public abstract double Calculate(); } } diff --git a/hw4ParseTree/hw4ParseTree/ParseTree.cs b/hw4ParseTree/hw4ParseTree/ParseTree.cs index f6b9c17..f100340 100644 --- a/hw4ParseTree/hw4ParseTree/ParseTree.cs +++ b/hw4ParseTree/hw4ParseTree/ParseTree.cs @@ -4,6 +4,9 @@ namespace Hw4ParseTree { + /// + /// дерево разбора + /// public class ParseTree { private INode root; @@ -118,7 +121,7 @@ private INode Build(string line, ref int index) '-' => new Subtraction(Build(line, ref index), Build(line, ref index)), '/' => new Division(Build(line, ref index), Build(line, ref index)), '*' => new Multiplication(Build(line, ref index), Build(line, ref index)), - _ => throw new Exception(), + _ => throw new InvalidExpressionException(), }; } else if (!IsCorrectSymbol(line[index])) diff --git a/hw4ParseTree/hw4ParseTree/Subtraction.cs b/hw4ParseTree/hw4ParseTree/Subtraction.cs index 3933cd8..329f910 100644 --- a/hw4ParseTree/hw4ParseTree/Subtraction.cs +++ b/hw4ParseTree/hw4ParseTree/Subtraction.cs @@ -9,11 +9,10 @@ namespace Hw4ParseTree /// public class Subtraction : Operator { - public override char Sign { get; } + public override char Sign => '-'; public Subtraction(INode leftChild, INode rightChild) { - Sign = '-'; LeftChild = leftChild; RightChild = rightChild; } From 22908a50a0c3498510d1748f7c3cfa3467875b58 Mon Sep 17 00:00:00 2001 From: MikePuzanov <89803250877@mail.ru> Date: Fri, 4 Jun 2021 16:30:40 +0300 Subject: [PATCH 8/8] fix --- hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs | 2 +- hw4ParseTree/hw4ParseTree/Operand.cs | 2 +- hw4ParseTree/hw4ParseTree/Operator.cs | 6 ++++++ hw4ParseTree/hw4ParseTree/ParseTree.cs | 1 - 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs index cdbd808..9a56c96 100644 --- a/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs +++ b/hw4ParseTree/hw4ParseTree.Test/hw4ParseTreeTest.cs @@ -50,7 +50,7 @@ public void TestDoubleDivision() { var str = "( / 3 2 )"; tree.BuildTree(str); - Assert.AreEqual(1.5, tree.Calculate(), double.PositiveInfinity); + Assert.AreEqual(1.5, tree.Calculate(), 0.000001); } [TestCase] diff --git a/hw4ParseTree/hw4ParseTree/Operand.cs b/hw4ParseTree/hw4ParseTree/Operand.cs index be06e3f..0d54399 100644 --- a/hw4ParseTree/hw4ParseTree/Operand.cs +++ b/hw4ParseTree/hw4ParseTree/Operand.cs @@ -9,7 +9,7 @@ namespace Hw4ParseTree /// class Operand : INode { - private double Number { get; } + private double Number; public Operand(double number) => Number = number; diff --git a/hw4ParseTree/hw4ParseTree/Operator.cs b/hw4ParseTree/hw4ParseTree/Operator.cs index 5db8ef0..643611a 100644 --- a/hw4ParseTree/hw4ParseTree/Operator.cs +++ b/hw4ParseTree/hw4ParseTree/Operator.cs @@ -15,6 +15,9 @@ public abstract class Operator : INode public virtual char Sign { get; } + /// + /// выводит участок выражения + /// public void Print() { Console.Write("("); @@ -24,6 +27,9 @@ public void Print() Console.Write(")"); } + /// + /// считает значение + /// public abstract double Calculate(); } } diff --git a/hw4ParseTree/hw4ParseTree/ParseTree.cs b/hw4ParseTree/hw4ParseTree/ParseTree.cs index f100340..09e324d 100644 --- a/hw4ParseTree/hw4ParseTree/ParseTree.cs +++ b/hw4ParseTree/hw4ParseTree/ParseTree.cs @@ -132,7 +132,6 @@ private INode Build(string line, ref int index) return root; } - /// /// функция печати дерева ///