From 56c2cdaabbeddaf91cc1c8292dcd1b82d3c8ff3d Mon Sep 17 00:00:00 2001 From: Boudi Date: Fri, 25 Sep 2026 17:46:21 +0200 Subject: [PATCH 1/4] Calculator console app following Part1 --- CodeReviews.Console.Calculator.csproj | 10 +++ Operand.cs | 46 ++++++++++++++ Program.cs | 9 +++ UserInterface.cs | 88 +++++++++++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 CodeReviews.Console.Calculator.csproj create mode 100644 Operand.cs create mode 100644 Program.cs create mode 100644 UserInterface.cs diff --git a/CodeReviews.Console.Calculator.csproj b/CodeReviews.Console.Calculator.csproj new file mode 100644 index 00000000..ed9781c2 --- /dev/null +++ b/CodeReviews.Console.Calculator.csproj @@ -0,0 +1,10 @@ + + + + Exe + net10.0 + enable + enable + + + diff --git a/Operand.cs b/Operand.cs new file mode 100644 index 00000000..c70726cb --- /dev/null +++ b/Operand.cs @@ -0,0 +1,46 @@ +using System.ComponentModel; +namespace CodeReviews.Console.Calculator; + +public enum Operand +{ + Addition, + Subtraction, + Multiplication, + Division +} + +public class Operator(string? input) +{ + private Operand _operand = input?.ToUpper().Trim() switch + { + "+" => Operand.Addition, + "-" => Operand.Subtraction, + "*" => Operand.Multiplication, + "/" => Operand.Division, + _ => default + }; + + public double Result(double a, double b) => _operand switch + { + Operand.Addition => a + b, + Operand.Subtraction => a - b, + Operand.Multiplication => a * b, + Operand.Division => b != 0 ? a / b : throw new DivideByZeroException("Can't divide by zero"), + _ => throw new InvalidEnumArgumentException("Operand not recognized") + }; + + public string GetSymbol() => _operand switch + { + Operand.Addition => "+", + Operand.Subtraction => "-", + Operand.Multiplication => "*", + Operand.Division => "/", + _ => throw new InvalidEnumArgumentException("Operand not recognized") + }; + + public void Randomize(Random rnd) + { + var values = Enum.GetValues(); + _operand = values[rnd.Next(values.Length - 1)]; + } +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 00000000..726e6f5c --- /dev/null +++ b/Program.cs @@ -0,0 +1,9 @@ +namespace CodeReviews.Console.Calculator; + +class Program +{ + static void Main(string[] args) + { + UserInterface.Start(); + } +} \ No newline at end of file diff --git a/UserInterface.cs b/UserInterface.cs new file mode 100644 index 00000000..f51e43a7 --- /dev/null +++ b/UserInterface.cs @@ -0,0 +1,88 @@ +namespace CodeReviews.Console.Calculator; +using Console = System.Console; + +public static class UserInterface +{ + private static double _num1; + private static double _num2; + public static void Start() + { + bool endApp = false; + Intro(); + + while (!endApp) + { + _num1 = AskUserANumber(); + _num2 = AskUserANumber("second"); + Operator op = AskUserOperand(); + + PrintResult(op); + + endApp = AskCloseApp(); + } + } + + private static void Intro() + { + // Display title as the C# console calculator app. + Console.WriteLine("Console Calculator in C#\r"); + Console.WriteLine("------------------------\n"); + } + + private static double AskUserANumber(string amount = "first") + { + double num; + bool isInvalidInput = false; + do + { + if (isInvalidInput) + { + Console.WriteLine("This is not a valid input. Entre a double"); + } + Console.WriteLine($"Type the {amount} number, and press ENTER"); + isInvalidInput = !double.TryParse(Console.ReadLine(), out num); + } while (isInvalidInput); + + return num; + } + + private static Operator AskUserOperand() + { + string? choice; + bool isInvalidOption = false; + do + { + if (isInvalidOption) + { + Console.WriteLine("Choose a correct option"); + } + Console.WriteLine("Choose an option from the following list"); + Console.WriteLine("\t+ - Add"); + Console.WriteLine("\t- - Subtract"); + Console.WriteLine("\t* - Multiply"); + Console.WriteLine("\t/ - Divide"); + + choice = Console.ReadLine(); + isInvalidOption = !new[] { "+", "-", "*", "/" }.Contains(choice); + } while (isInvalidOption); + + if (choice == "/" && _num2 == 0) + { + Console.WriteLine("Cannot divide by zero"); + _num2 = AskUserANumber("second"); + } + + return new Operator(choice); + } + + private static void PrintResult(Operator op) + { + Console.WriteLine($"Your result: {_num1} {op.GetSymbol()} {_num2} = {op.Result(_num1, _num2)}"); + } + + private static bool AskCloseApp() + { + Console.WriteLine("Press 'n' and Enter to close the app, or press any other key and Enter to continue: "); + return (Console.ReadLine() == "n"); + } +} \ No newline at end of file From d343a99e4fd7b877f839cc0f8b841fd1b52ad885 Mon Sep 17 00:00:00 2001 From: Boudi Date: Sat, 26 Sep 2026 15:34:46 +0200 Subject: [PATCH 2/4] Implement a generic AskUser --- AskUser.cs | 29 ++++++++++++++++++++++++ Operand.cs | 42 +++++++++++++++++++++++++---------- UserInterface.cs | 57 ++++++++++++++---------------------------------- 3 files changed, 76 insertions(+), 52 deletions(-) create mode 100644 AskUser.cs diff --git a/AskUser.cs b/AskUser.cs new file mode 100644 index 00000000..d3312591 --- /dev/null +++ b/AskUser.cs @@ -0,0 +1,29 @@ +namespace CodeReviews.Console.Calculator; +using Console = System.Console; + +public static class AskUser +{ + public static T Ask(string[] optionTexts) where T : IParsable + { + bool isValidOption = true; + T? result; + do + { + if (!isValidOption) + { + Console.WriteLine("Choose a correct option"); + } + + foreach (var optionText in optionTexts) + { + Console.WriteLine(optionText); + } + + isValidOption = T.TryParse(Console.ReadLine(), null, out result); + } while (!isValidOption); + + // isValidOption is true when result get correctly parsed so != null + return result; + } + +} \ No newline at end of file diff --git a/Operand.cs b/Operand.cs index c70726cb..0ac84739 100644 --- a/Operand.cs +++ b/Operand.cs @@ -1,4 +1,6 @@ using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; + namespace CodeReviews.Console.Calculator; public enum Operand @@ -9,16 +11,21 @@ public enum Operand Division } -public class Operator(string? input) +public class Operator : IParsable { - private Operand _operand = input?.ToUpper().Trim() switch + private readonly Operand? _operand; + + public Operator(string? input) { - "+" => Operand.Addition, - "-" => Operand.Subtraction, - "*" => Operand.Multiplication, - "/" => Operand.Division, - _ => default - }; + _operand = input?.ToUpper().Trim() switch + { + "+" => Operand.Addition, + "-" => Operand.Subtraction, + "*" => Operand.Multiplication, + "/" => Operand.Division, + _ => null + }; + } public double Result(double a, double b) => _operand switch { @@ -38,9 +45,22 @@ public class Operator(string? input) _ => throw new InvalidEnumArgumentException("Operand not recognized") }; - public void Randomize(Random rnd) + public static Operator Parse(string s, IFormatProvider? provider) + { + return TryParse(s, provider, out var result) ? result : throw new FormatException("Not a valid input Operator"); + } + + public static bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, [MaybeNullWhen(false)] out Operator result) { - var values = Enum.GetValues(); - _operand = values[rnd.Next(values.Length - 1)]; + var op = new Operator(s); + + if (op._operand == null) + { + result = null; + return false; + } + + result = op; + return true; } } diff --git a/UserInterface.cs b/UserInterface.cs index f51e43a7..34f48f6b 100644 --- a/UserInterface.cs +++ b/UserInterface.cs @@ -15,9 +15,14 @@ public static void Start() _num1 = AskUserANumber(); _num2 = AskUserANumber("second"); Operator op = AskUserOperand(); - - PrintResult(op); - + try + { + PrintResult(op); + } + catch (DivideByZeroException e) + { + Console.WriteLine(e.Message); + } endApp = AskCloseApp(); } } @@ -31,48 +36,18 @@ private static void Intro() private static double AskUserANumber(string amount = "first") { - double num; - bool isInvalidInput = false; - do - { - if (isInvalidInput) - { - Console.WriteLine("This is not a valid input. Entre a double"); - } - Console.WriteLine($"Type the {amount} number, and press ENTER"); - isInvalidInput = !double.TryParse(Console.ReadLine(), out num); - } while (isInvalidInput); - - return num; + return AskUser.Ask( + [$"Type the {amount} number, and press ENTER"]); } private static Operator AskUserOperand() { - string? choice; - bool isInvalidOption = false; - do - { - if (isInvalidOption) - { - Console.WriteLine("Choose a correct option"); - } - Console.WriteLine("Choose an option from the following list"); - Console.WriteLine("\t+ - Add"); - Console.WriteLine("\t- - Subtract"); - Console.WriteLine("\t* - Multiply"); - Console.WriteLine("\t/ - Divide"); - - choice = Console.ReadLine(); - isInvalidOption = !new[] { "+", "-", "*", "/" }.Contains(choice); - } while (isInvalidOption); - - if (choice == "/" && _num2 == 0) - { - Console.WriteLine("Cannot divide by zero"); - _num2 = AskUserANumber("second"); - } - - return new Operator(choice); + return AskUser.Ask( + ["Choose an option from the following list", + "\t+ - Add", + "\t- - Subtract", + "\t* - Multiply", + "\t/ - Divide"]); } private static void PrintResult(Operator op) From e5c0a2dcd93adee031cb18c8c0a6f3e70f5513a7 Mon Sep 17 00:00:00 2001 From: Boudi Date: Mon, 28 Sep 2026 13:31:24 +0200 Subject: [PATCH 3/4] Add logger and support for more operations --- AskUser.cs | 2 +- Logger.cs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ Operand.cs | 33 +++++++++++++++++++++++-- UserInterface.cs | 34 ++++++++++++++++++++----- 4 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 Logger.cs diff --git a/AskUser.cs b/AskUser.cs index d3312591..c59a72a1 100644 --- a/AskUser.cs +++ b/AskUser.cs @@ -23,7 +23,7 @@ public static T Ask(string[] optionTexts) where T : IParsable } while (!isValidOption); // isValidOption is true when result get correctly parsed so != null - return result; + return result!; } } \ No newline at end of file diff --git a/Logger.cs b/Logger.cs new file mode 100644 index 00000000..f305c01a --- /dev/null +++ b/Logger.cs @@ -0,0 +1,64 @@ +namespace CodeReviews.Console.Calculator; +using System.Diagnostics; + +public class Logger : IDisposable +{ + private StreamWriter? _logFile; + private TextWriterTraceListener? _listener; + private readonly string _filePath = "Calculator."; + + public Logger(string fileName) + { + _filePath += fileName; + InitLogger(); + } + + private void InitLogger() + { + _logFile = File.CreateText(_filePath); + _listener = new TextWriterTraceListener(_logFile); + Trace.Listeners.Add(_listener); + Trace.AutoFlush = true; + Intro(_filePath); + } + + public void Dispose() + { + Trace.WriteLine($"Closing log at {DateTime.Now}"); + if (_listener != null) + { + Trace.Listeners.Remove(_listener); + _listener.Dispose(); + _listener = null; + } + if (_logFile != null) + { + _logFile.Dispose(); + _logFile = null; + } + } + + public void Result(double n1, double n2, Operator op, double result) + { + if (_logFile == null) + { + InitLogger(); + } + Trace.WriteLine($"{(op.AmountInput() > 1 ? n1 + " " : "")}{op.GetSymbol()} {n2} = {result}"); + } + + public void DeleteLogs() + { + Dispose(); + if (File.Exists(_filePath)) + { + File.Delete(_filePath); + } + } + + private void Intro(string fileName) + { + Trace.WriteLine($"Starting {fileName} Log"); + Trace.WriteLine(String.Format($"Started {DateTime.Now}")); + } +} \ No newline at end of file diff --git a/Operand.cs b/Operand.cs index 0ac84739..530b495b 100644 --- a/Operand.cs +++ b/Operand.cs @@ -8,7 +8,11 @@ public enum Operand Addition, Subtraction, Multiplication, - Division + Division, + SquareRoot, + Power, + Cos, + Sin } public class Operator : IParsable @@ -23,6 +27,10 @@ public Operator(string? input) "-" => Operand.Subtraction, "*" => Operand.Multiplication, "/" => Operand.Division, + "SQRT" => Operand.SquareRoot, + "^" => Operand.Power, + "COS" => Operand.Cos, + "SIN" => Operand.Sin, _ => null }; } @@ -30,9 +38,13 @@ public Operator(string? input) public double Result(double a, double b) => _operand switch { Operand.Addition => a + b, - Operand.Subtraction => a - b, + Operand.Subtraction => a! - b, Operand.Multiplication => a * b, Operand.Division => b != 0 ? a / b : throw new DivideByZeroException("Can't divide by zero"), + Operand.SquareRoot => b >= 0 ? Math.Sqrt(b) : throw new Exception("Square root of negative number isn't a real number"), + Operand.Power => (b % 0 ==0 || a >= 0) ? Math.Pow(a, b) : throw new Exception("Power of negative number with fractional exponent isn't a real number"), + Operand.Cos => Math.Cos(b), + Operand.Sin => Math.Sin(b), _ => throw new InvalidEnumArgumentException("Operand not recognized") }; @@ -42,9 +54,26 @@ public Operator(string? input) Operand.Subtraction => "-", Operand.Multiplication => "*", Operand.Division => "/", + Operand.SquareRoot => "SQRT", + Operand.Power => "^", + Operand.Cos => "cos", + Operand.Sin => "sin", _ => throw new InvalidEnumArgumentException("Operand not recognized") }; + public int AmountInput() + { + switch (_operand) + { + case Operand.SquareRoot: + case Operand.Cos: + case Operand.Sin: + return 1; + default: + return 2; + } + } + public static Operator Parse(string s, IFormatProvider? provider) { return TryParse(s, provider, out var result) ? result : throw new FormatException("Not a valid input Operator"); diff --git a/UserInterface.cs b/UserInterface.cs index 34f48f6b..645d4d58 100644 --- a/UserInterface.cs +++ b/UserInterface.cs @@ -5,6 +5,12 @@ public static class UserInterface { private static double _num1; private static double _num2; + + // Could add timestamps in the name for persistent logs + // Here we would rather override the file each time + private const string LogName = "calculator.log"; + private static readonly Logger Logs = new Logger(LogName); + public static void Start() { bool endApp = false; @@ -13,18 +19,22 @@ public static void Start() while (!endApp) { _num1 = AskUserANumber(); - _num2 = AskUserANumber("second"); Operator op = AskUserOperand(); + // For some operation, only one number is needed, take the value of num1 for easier print + _num2 = (op.AmountInput() > 1) ? AskUserANumber("second") : _num1; + try { PrintResult(op); } - catch (DivideByZeroException e) + catch (Exception e) { Console.WriteLine(e.Message); } endApp = AskCloseApp(); } + + Logs.Dispose(); } private static void Intro() @@ -47,17 +57,29 @@ private static Operator AskUserOperand() "\t+ - Add", "\t- - Subtract", "\t* - Multiply", - "\t/ - Divide"]); + "\t/ - Divide", + "\tsqrt - Square root", + "\t^ - Power", + "\tcos - Cosinus", + "\tsin - Sinus"]); } private static void PrintResult(Operator op) { - Console.WriteLine($"Your result: {_num1} {op.GetSymbol()} {_num2} = {op.Result(_num1, _num2)}"); + double result = op.Result(_num1, _num2); + Console.WriteLine($"Your result: {(op.AmountInput() > 1 ? _num1 : "")} {op.GetSymbol()} {_num2} = {result}"); + Logs.Result(_num1, _num2, op, result); } private static bool AskCloseApp() { - Console.WriteLine("Press 'n' and Enter to close the app, or press any other key and Enter to continue: "); - return (Console.ReadLine() == "n"); + Console.WriteLine("Press 'n' and Enter to close the app, or press 'd' and Enter to delete the logs or press any other key and Enter to continue: "); + string? input = Console.ReadLine(); + if (input == "d") + { + Logs.DeleteLogs(); + return AskCloseApp(); + } + return (input == "n"); } } \ No newline at end of file From 012f9717e1b0b9551ea65bacea54a18b1241b882 Mon Sep 17 00:00:00 2001 From: Boudi Date: Tue, 29 Sep 2026 01:53:44 +0200 Subject: [PATCH 4/4] Add Library project + json logs --- AskUser.cs => Calculator.Console/AskUser.cs | 2 +- .../Calculator.Console.csproj | 4 ++ Logger.cs => Calculator.Console/Logger.cs | 4 +- Program.cs => Calculator.Console/Program.cs | 2 +- .../UserInterface.cs | 16 +++-- Calculator.Library/Calculator.Library.csproj | 13 ++++ Calculator.Library/JsonLogger.cs | 66 +++++++++++++++++++ Operand.cs => Calculator.Library/Operand.cs | 3 +- Calculator.slnx | 4 ++ 9 files changed, 104 insertions(+), 10 deletions(-) rename AskUser.cs => Calculator.Console/AskUser.cs (94%) rename CodeReviews.Console.Calculator.csproj => Calculator.Console/Calculator.Console.csproj (68%) rename Logger.cs => Calculator.Console/Logger.cs (92%) rename Program.cs => Calculator.Console/Program.cs (68%) rename UserInterface.cs => Calculator.Console/UserInterface.cs (83%) create mode 100644 Calculator.Library/Calculator.Library.csproj create mode 100644 Calculator.Library/JsonLogger.cs rename Operand.cs => Calculator.Library/Operand.cs (98%) create mode 100644 Calculator.slnx diff --git a/AskUser.cs b/Calculator.Console/AskUser.cs similarity index 94% rename from AskUser.cs rename to Calculator.Console/AskUser.cs index c59a72a1..8b46eb7b 100644 --- a/AskUser.cs +++ b/Calculator.Console/AskUser.cs @@ -1,4 +1,4 @@ -namespace CodeReviews.Console.Calculator; +namespace Calculator.Console; using Console = System.Console; public static class AskUser diff --git a/CodeReviews.Console.Calculator.csproj b/Calculator.Console/Calculator.Console.csproj similarity index 68% rename from CodeReviews.Console.Calculator.csproj rename to Calculator.Console/Calculator.Console.csproj index ed9781c2..9a478729 100644 --- a/CodeReviews.Console.Calculator.csproj +++ b/Calculator.Console/Calculator.Console.csproj @@ -1,5 +1,9 @@  + + + + Exe net10.0 diff --git a/Logger.cs b/Calculator.Console/Logger.cs similarity index 92% rename from Logger.cs rename to Calculator.Console/Logger.cs index f305c01a..65da7b06 100644 --- a/Logger.cs +++ b/Calculator.Console/Logger.cs @@ -1,4 +1,4 @@ -namespace CodeReviews.Console.Calculator; +namespace Calculator.Console; using System.Diagnostics; public class Logger : IDisposable @@ -38,7 +38,7 @@ public void Dispose() } } - public void Result(double n1, double n2, Operator op, double result) + public void Result(double n1, double n2, Library.Operator op, double result) { if (_logFile == null) { diff --git a/Program.cs b/Calculator.Console/Program.cs similarity index 68% rename from Program.cs rename to Calculator.Console/Program.cs index 726e6f5c..35fb26b6 100644 --- a/Program.cs +++ b/Calculator.Console/Program.cs @@ -1,4 +1,4 @@ -namespace CodeReviews.Console.Calculator; +namespace Calculator.Console; class Program { diff --git a/UserInterface.cs b/Calculator.Console/UserInterface.cs similarity index 83% rename from UserInterface.cs rename to Calculator.Console/UserInterface.cs index 645d4d58..1ec75811 100644 --- a/UserInterface.cs +++ b/Calculator.Console/UserInterface.cs @@ -1,4 +1,6 @@ -namespace CodeReviews.Console.Calculator; +using Calculator.Library; + +namespace Calculator.Console; using Console = System.Console; public static class UserInterface @@ -10,6 +12,7 @@ public static class UserInterface // Here we would rather override the file each time private const string LogName = "calculator.log"; private static readonly Logger Logs = new Logger(LogName); + private static readonly JsonLogger JsonLogs = new JsonLogger(); public static void Start() { @@ -19,7 +22,7 @@ public static void Start() while (!endApp) { _num1 = AskUserANumber(); - Operator op = AskUserOperand(); + Library.Operator op = AskUserOperand(); // For some operation, only one number is needed, take the value of num1 for easier print _num2 = (op.AmountInput() > 1) ? AskUserANumber("second") : _num1; @@ -35,6 +38,7 @@ public static void Start() } Logs.Dispose(); + JsonLogs.Dispose(); } private static void Intro() @@ -50,9 +54,9 @@ private static double AskUserANumber(string amount = "first") [$"Type the {amount} number, and press ENTER"]); } - private static Operator AskUserOperand() + private static Library.Operator AskUserOperand() { - return AskUser.Ask( + return AskUser.Ask( ["Choose an option from the following list", "\t+ - Add", "\t- - Subtract", @@ -64,11 +68,12 @@ private static Operator AskUserOperand() "\tsin - Sinus"]); } - private static void PrintResult(Operator op) + private static void PrintResult(Library.Operator op) { double result = op.Result(_num1, _num2); Console.WriteLine($"Your result: {(op.AmountInput() > 1 ? _num1 : "")} {op.GetSymbol()} {_num2} = {result}"); Logs.Result(_num1, _num2, op, result); + JsonLogs.LogResult(_num1, _num2, op, result); } private static bool AskCloseApp() @@ -78,6 +83,7 @@ private static bool AskCloseApp() if (input == "d") { Logs.DeleteLogs(); + JsonLogs.DeleteLogs(); return AskCloseApp(); } return (input == "n"); diff --git a/Calculator.Library/Calculator.Library.csproj b/Calculator.Library/Calculator.Library.csproj new file mode 100644 index 00000000..ec19b2b7 --- /dev/null +++ b/Calculator.Library/Calculator.Library.csproj @@ -0,0 +1,13 @@ + + + + net10.0 + enable + enable + + + + + + + diff --git a/Calculator.Library/JsonLogger.cs b/Calculator.Library/JsonLogger.cs new file mode 100644 index 00000000..9d6b44e0 --- /dev/null +++ b/Calculator.Library/JsonLogger.cs @@ -0,0 +1,66 @@ +using Newtonsoft.Json; + +namespace Calculator.Library; + +public class JsonLogger : IDisposable +{ + private JsonWriter? _writer; + private const string FilePath = "CalculatorLog.json"; + + public JsonLogger() + { + InitLogger(); + } + + private void InitLogger() + { + var logFile = File.CreateText(FilePath); + logFile.AutoFlush = true; + _writer = new JsonTextWriter(logFile); + _writer.Formatting = Formatting.Indented; + _writer.WriteStartObject(); + _writer.WritePropertyName("Operations"); + _writer.WriteStartArray(); + } + + public void LogResult(double n1, double n2, Operator op, double result) + { + if (_writer == null) + { + InitLogger(); + } + _writer!.WriteStartObject(); + _writer.WritePropertyName("Operand1"); + _writer.WriteValue(n1); + if (op.AmountInput() > 1) + { + _writer.WritePropertyName("Operand2"); + _writer.WriteValue(n2); + } + _writer.WritePropertyName("Operation"); + _writer.WriteValue(op.GetSymbol()); + _writer.WritePropertyName("Result"); + _writer.WriteValue(result); + _writer.WriteEndObject(); + } + + public void DeleteLogs() + { + Dispose(); + if (File.Exists(FilePath)) + { + File.Delete(FilePath); + } + } + + public void Dispose() + { + if (_writer == null) return; + + _writer.WriteEndArray(); + _writer.WriteEndObject(); + _writer.Close(); + ((IDisposable)_writer).Dispose(); + _writer = null; + } +} \ No newline at end of file diff --git a/Operand.cs b/Calculator.Library/Operand.cs similarity index 98% rename from Operand.cs rename to Calculator.Library/Operand.cs index 530b495b..f3d22bc4 100644 --- a/Operand.cs +++ b/Calculator.Library/Operand.cs @@ -1,7 +1,8 @@ +namespace Calculator.Library; + using System.ComponentModel; using System.Diagnostics.CodeAnalysis; -namespace CodeReviews.Console.Calculator; public enum Operand { diff --git a/Calculator.slnx b/Calculator.slnx new file mode 100644 index 00000000..4dee6fc6 --- /dev/null +++ b/Calculator.slnx @@ -0,0 +1,4 @@ + + + +