Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Dania.Calculator/Calculator/Calculator.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\CalculatorLibrary\CalculatorLibrary.csproj" />
</ItemGroup>

</Project>
4 changes: 4 additions & 0 deletions Dania.Calculator/Calculator/Calculator.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<Solution>
<Project Path="../CalculatorLibrary/CalculatorLibrary.csproj" Id="8c230c77-dcfa-4d52-bfb3-d0d4ac6e72fc" />
<Project Path="Calculator.csproj" />
</Solution>
44 changes: 44 additions & 0 deletions Dania.Calculator/Calculator/Helpers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
public class Helpers
{
static int numberOfCalculations = 0;

public static double CheckInputIsDouble()
{
string? numInput = Console.ReadLine();
double cleanNum = 0;

while (!double.TryParse(numInput, out cleanNum))
{
Console.WriteLine("This is not a valid input. Please enter a numeric value: ");
numInput = Console.ReadLine();
}

return cleanNum;
}

public static void CheckResultIsNaN(double result)
{
try
{
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);
}
}

public static void IncreaseNumberOfCalculations()
{
numberOfCalculations++;
}

public static int GetNumberOfCalculations()
{
return numberOfCalculations;
}
}
118 changes: 118 additions & 0 deletions Dania.Calculator/Calculator/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using System.Text.RegularExpressions;
using CalculatorLibrary;

class Program
{
static void Main(string[] args)
{
bool isEndApp = false;

Calculator calculator = new Calculator();
while (!isEndApp)
{
double num1 = 0;
double num2 = 0;
double result = 0;

Console.Clear();
Console.WriteLine($"Number of Calculations this session: {Helpers.GetNumberOfCalculations()}");
Console.WriteLine("Choose an option from the following list:");
Console.WriteLine("\tA - Add");
Console.WriteLine("\tS - Subtract");
Console.WriteLine("\tM - Multiply");
Console.WriteLine("\tD - Divide");
Console.WriteLine("\tSQ - Square Root");
Console.WriteLine("\tP - Power");
Console.WriteLine("\tTE - 10x");
Console.WriteLine("\tT - Trigonometry");
Console.Write("Your option: ");

string? op = Console.ReadLine();
if (op != null) op = op.ToLower().Trim();

if (Regex.IsMatch(op, "[a|s|m|d]") && op != "sq")
{
Console.WriteLine("Type a number, and then press Enter: ");
num1 = Helpers.CheckInputIsDouble();

Console.WriteLine("Type another number, and then press Enter: ");
num2 = Helpers.CheckInputIsDouble();

result = calculator.DoOperation(num1, num2, op);
Helpers.CheckResultIsNaN(result);

Helpers.IncreaseNumberOfCalculations();
}
else if (Regex.IsMatch(op, "[p]"))
{
Console.WriteLine("Type the base number, and then press Enter: ");
num1 = Helpers.CheckInputIsDouble();

Console.WriteLine("Type the power number, and then press Enter: ");
num2 = Helpers.CheckInputIsDouble();

result = calculator.DoPower(num1, num2);
Helpers.CheckResultIsNaN(result);

Helpers.IncreaseNumberOfCalculations();
}
else if (Regex.IsMatch(op, "[sq|te]") && (op == "sq" || op == "te"))
{
Console.WriteLine("Type a number, and then press Enter: ");
num1 = Helpers.CheckInputIsDouble();

switch (op)
{
case "sq":
result = calculator.DoSquareRoot(num1);
break;
case "te":
result = calculator.DoTenExponent(num1);
break;
}
Helpers.CheckResultIsNaN(result);

Helpers.IncreaseNumberOfCalculations();
}
else if (Regex.IsMatch(op, "[t]"))
{
Console.WriteLine("Choose an option from the list: ");
Console.WriteLine("\tS - sin");
Console.WriteLine("\tC - cos");
Console.WriteLine("\tT - tan");
Console.Write("Your option: ");

do
{
op = Console.ReadLine();
if (op != null) op = op.ToLower().Trim();

if (!Regex.IsMatch(op, "[s|c|t]"))
Console.WriteLine("Error: Unrecognized input.");

} while (!Regex.IsMatch(op, "[s|c|t]"));

Console.WriteLine("Type a radian, and then press Enter: ");
num1 = Helpers.CheckInputIsDouble();

result = calculator.DoTrigonometry(num1, op);
Helpers.CheckResultIsNaN(result);

Helpers.IncreaseNumberOfCalculations();
}
else
{
Console.WriteLine("Error: Unrecognized input.");
}
Console.WriteLine("------------------------\n");

Console.Write("Press 'n' and Enter to close the app, or press any other key and Enter to continue: ");
if (Console.ReadLine() == "n") isEndApp = true;

Console.WriteLine("\n");
}

calculator.Finish();
return;
}
}
156 changes: 156 additions & 0 deletions Dania.Calculator/CalculatorLibrary/CalculatorLibrary.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
using Newtonsoft.Json;

namespace CalculatorLibrary
{
public class Calculator
{
JsonWriter writer;

public Calculator()
{
StreamWriter logfile = File.CreateText("calculator.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)
{
writer.WriteStartObject();
writer.WritePropertyName("Operand1");
writer.WriteValue(num1);
writer.WritePropertyName("Operand2");
writer.WriteValue(num2);
writer.WritePropertyName("Operation");

double result = double.NaN;

switch (op)
{
case "a":
result = num1 + num2;
writer.WriteValue("Add");
break;
case "s":
result = num1 - num2;
writer.WriteValue("Subtract");
break;
case "m":
result = num1 * num2;
writer.WriteValue("Multiply");
break;
case "d":
if (num2 != 0)
{
result = num1 / num2;
}
writer.WriteValue("Divide");
break;
default:
break;
}

writer.WritePropertyName("Result");
writer.WriteValue(result);
writer.WriteEndObject();

return result;
}

public double DoSquareRoot(double num)
{
writer.WriteStartObject();
writer.WritePropertyName("Operand");
writer.WriteValue(num);
writer.WritePropertyName("Operation");
writer.WriteValue("Square Root");

double result = Math.Sqrt(num);

writer.WritePropertyName("Result");
writer.WriteValue(result);
writer.WriteEndObject();

return result;
}

public double DoPower(double based, double power)
{
writer.WriteStartObject();
writer.WritePropertyName("Base");
writer.WriteValue(based);
writer.WritePropertyName("Exponent");
writer.WriteValue(power);
writer.WritePropertyName("Operation");
writer.WriteValue("Power");

double result = Math.Pow(based,power);

writer.WritePropertyName("Result");
writer.WriteValue(result);
writer.WriteEndObject();

return result;
}

public double DoTenExponent(double exponent)
{
writer.WriteStartObject();
writer.WritePropertyName("Exponent");
writer.WriteValue(exponent);
writer.WritePropertyName("Operation");
writer.WriteValue("Ten Exponent");

double result = Math.Pow(10, exponent);

writer.WritePropertyName("Result");
writer.WriteValue(result);
writer.WriteEndObject();

return result;
}

public double DoTrigonometry(double num, string op)
{
writer.WriteStartObject();
writer.WritePropertyName("Operand");
writer.WriteValue(num);
writer.WritePropertyName("Operation");

double result = double.NaN;

switch (op)
{
case "s":
writer.WriteValue("Sin");
result = Math.Sin(num);
break;
case "c":
writer.WriteValue("Cos");
result = Math.Cos(num);
break;
case "t":
writer.WriteValue("Tan");
result = Math.Tan(num);
break;
}

writer.WritePropertyName("Result");
writer.WriteValue(result);
writer.WriteEndObject();

return result;
}

public void Finish()
{
writer.WriteEndArray();
writer.WriteEndObject();
writer.Close();
}
}

}
13 changes: 13 additions & 0 deletions Dania.Calculator/CalculatorLibrary/CalculatorLibrary.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>

</Project>