diff --git a/Calculator.sln b/Calculator.sln new file mode 100644 index 00000000..4d23c69a --- /dev/null +++ b/Calculator.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeReviews.Console.Calculator", "CodeReviews.Console.Calculator\CodeReviews.Console.Calculator.csproj", "{526DCBA8-896A-4097-A3B9-B21A57F0D9ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CalculatorLibrary", "CalculatorLibrary\CalculatorLibrary.csproj", "{F5A74BD6-8F67-44DB-A6FD-2D5046EAE9C6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {526DCBA8-896A-4097-A3B9-B21A57F0D9ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {526DCBA8-896A-4097-A3B9-B21A57F0D9ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {526DCBA8-896A-4097-A3B9-B21A57F0D9ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {526DCBA8-896A-4097-A3B9-B21A57F0D9ED}.Release|Any CPU.Build.0 = Release|Any CPU + {F5A74BD6-8F67-44DB-A6FD-2D5046EAE9C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F5A74BD6-8F67-44DB-A6FD-2D5046EAE9C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5A74BD6-8F67-44DB-A6FD-2D5046EAE9C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F5A74BD6-8F67-44DB-A6FD-2D5046EAE9C6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/CalculatorLibrary/CalculatorLibrary.cs b/CalculatorLibrary/CalculatorLibrary.cs new file mode 100644 index 00000000..098ae38b --- /dev/null +++ b/CalculatorLibrary/CalculatorLibrary.cs @@ -0,0 +1,72 @@ +namespace CalculatorLibrary; + +using System.Diagnostics; +using Newtonsoft.Json; + +public class Calculator +{ + JsonWriter writer; + public Calculator() + { + StreamWriter logFile = File.CreateText("calculatorlog.json"); + logFile.AutoFlush = true; + writer = new JsonTextWriter(logFile); + writer.Formatting = Formatting.Indented; + writer.WriteStartObject(); + writer.WritePropertyName("operations"); + writer.WriteStartArray(); + } + public double DoOperation(double num1, double num2, string op) + { + double result = double.NaN; // Default value is "not-a-number" if an operation, such as division, could result in an error. + writer.WriteStartObject(); + writer.WritePropertyName("operand1"); + writer.WriteValue(num1); + writer.WritePropertyName("opearand2"); + writer.WriteValue(num2); + writer.WritePropertyName("opearation"); + + // Use a switch statement to do the math. + switch (op) + { + case "a": + result = num1 + num2; + writer.WriteValue("Add"); + break; + case "s": + result = num1 - num2; + writer.WriteValue("Substract"); + break; + case "m": + result = num1 * num2; + writer.WriteValue("Multiply"); + break; + case "d": + // Ask the user to enter a non-zero divisor. + if (num2 != 0) + { + result = num1 / num2; + writer.WriteValue("Division"); + } + break; + // Return text for an incorrect option entry. + default: + break; + } + writer.WritePropertyName("Result"); + writer.WriteValue(result); + writer.WriteEndObject(); + + Finish(); + return result; + } + + public void Finish() + { + writer.WriteEndArray(); + writer.WriteEndObject(); + writer.Close(); + } +} + + diff --git a/CalculatorLibrary/CalculatorLibrary.csproj b/CalculatorLibrary/CalculatorLibrary.csproj new file mode 100644 index 00000000..181661d7 --- /dev/null +++ b/CalculatorLibrary/CalculatorLibrary.csproj @@ -0,0 +1,13 @@ + + + + net9.0 + enable + enable + + + + + + + diff --git a/.codacy.yml b/CodeReviews.Console.Calculator/.codacy.yml similarity index 100% rename from .codacy.yml rename to CodeReviews.Console.Calculator/.codacy.yml diff --git a/CodeReviews.Console.Calculator/CodeReviews.Console.Calculator.csproj b/CodeReviews.Console.Calculator/CodeReviews.Console.Calculator.csproj new file mode 100644 index 00000000..c49d67a7 --- /dev/null +++ b/CodeReviews.Console.Calculator/CodeReviews.Console.Calculator.csproj @@ -0,0 +1,14 @@ + + + + Exe + net9.0 + enable + enable + + + + + + + diff --git a/CodeReviews.Console.Calculator/Program.cs b/CodeReviews.Console.Calculator/Program.cs new file mode 100644 index 00000000..397f3791 --- /dev/null +++ b/CodeReviews.Console.Calculator/Program.cs @@ -0,0 +1,85 @@ +using System.Text.RegularExpressions; +using CalculatorLibrary; +class Program +{ + static void Main(string[] args) + { + bool endApp = false; + // Display title as the C# console calculator app. + Console.WriteLine("Console Calculator in C#\r"); + Console.WriteLine("------------------------\n"); + + while (!endApp) + { + Calculator calculator = new Calculator(); + + // Declare variables and set to empty. + // Use Nullable types (with ?) to match type of System.Console.ReadLine + string? numInput1 = ""; + string? numInput2 = ""; + double result = 0; + + // Ask the user to type the first number. + Console.Write("Type a number, and then press Enter: "); + numInput1 = Console.ReadLine(); + + double cleanNum1 = 0; + while (!double.TryParse(numInput1, out cleanNum1)) + { + Console.Write("This is not valid input. Please enter a numeric value: "); + numInput1 = Console.ReadLine(); + } + + // Ask the user to type the second number. + Console.Write("Type another number, and then press Enter: "); + numInput2 = Console.ReadLine(); + + double cleanNum2 = 0; + while (!double.TryParse(numInput2, out cleanNum2)) + { + Console.Write("This is not valid input. Please enter a numeric value: "); + numInput2 = Console.ReadLine(); + } + + // Ask the user to choose an operator. + Console.WriteLine("Choose an operator from the following list:"); + Console.WriteLine("\ta - Add"); + Console.WriteLine("\ts - Subtract"); + Console.WriteLine("\tm - Multiply"); + Console.WriteLine("\td - Divide"); + Console.Write("Your option? "); + + string? op = Console.ReadLine(); + + // Validate input is not null, and matches the pattern + if (op == null || ! Regex.IsMatch(op, "^(a|s|m|d)$")) + { + Console.WriteLine("Error: Unrecognized input."); + } + else + { + try + { + result = calculator.DoOperation(cleanNum1, cleanNum2, op); + if (double.IsNaN(result)) + { + Console.WriteLine("This operation will result in a mathematical error.\n"); + } + else Console.WriteLine("Your result: {0:0.##}\n", result); + } + catch (Exception e) + { + Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message); + } + } + Console.WriteLine("------------------------\n"); + + // Wait for the user to respond before closing. + Console.Write("Press 'n' and Enter to close the app, or press any other key and Enter to continue: "); + if (Console.ReadLine() == "n") endApp = true; + + Console.WriteLine("\n"); // Friendly linespacing. + } + return; + } +} \ No newline at end of file diff --git a/CodeReviews.Console.Calculator/calculatorlog.json b/CodeReviews.Console.Calculator/calculatorlog.json new file mode 100644 index 00000000..1b79a3db --- /dev/null +++ b/CodeReviews.Console.Calculator/calculatorlog.json @@ -0,0 +1,10 @@ +{ + "operations": [ + { + "operand1": 23.0, + "opearand2": 23.0, + "opearation": "Division", + "Result": 1.0 + } + ] +} \ No newline at end of file