Skip to content
Closed
4 changes: 4 additions & 0 deletions Calculator.ivangar/Calculator.ivangar.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<Solution>
<Project Path="Calculator.ivangar/Calculator.ivangar.csproj" />
<Project Path="CalculatorLibrary/CalculatorLibrary.csproj" Id="0ffd093c-69fc-443d-984d-33df18b0faa5" />
</Solution>
159 changes: 159 additions & 0 deletions Calculator.ivangar/Calculator.ivangar/Application.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
using Calculator.ivangar.Enums;
using CalculatorLibrary;
using CalculatorLibrary.Enums;

namespace Calculator.ivangar
{
public class Application
{
private bool EndApp = false;
private readonly CalculatorEngine Calculator = new();

private readonly Random _random = new();

public void Run()
{
Menu.Intro();
Menu.PrintMenu();

string? optionInput = Console.ReadLine();
MainMenuOptions menuOption;

while (!EndApp)
{
while (!Menu.TryGetMenuOption(optionInput, out menuOption))
{
Menu.PrintMenu(invalid: true);
optionInput = Console.ReadLine();
}

switch (menuOption)
{
case MainMenuOptions.PerformOperation:
PerformCalculation();
break;
case MainMenuOptions.ViewOperations:
Calculator.PrintAllOperations();
break;
case MainMenuOptions.DeleteOperations:
Calculator.DeleteOperations();
break;
case MainMenuOptions.Exit:
EndApp = true;
Console.WriteLine("\nThank you for using the Calculator.");
break;
}

if (EndApp)
break;

Menu.PrintMenu();
optionInput = Console.ReadLine();
}

Calculator.Finish();
}

public void PerformCalculation()
{
// Ask the user to choose an operator.
Menu.PrintOperations();
string? op = Console.ReadLine();

while (!Menu.ValidateOperationChoice(op))
{
Menu.PrintOperations(invalid: true);
op = Console.ReadLine();
}

switch (op!.ToLower())
{
case "r":
SquareRootOperation(op);
break;
case "p":
PowerOperation(op);
break;
case "t":
TrigonometryOperation(op);
break;
default:
BaseMathOperation(op);
break;
}
}

public void BaseMathOperation(string operation)
{
double operand1 = Menu.GetOperand("Type a number, and then press Enter: ");
double operand2 = Menu.GetOperand("Type another number, and then press Enter: ");

try
{
var result = Calculator.DoOperation(operand1, operation, operand2);

if (double.IsNaN(result))
Console.WriteLine("This operation will result in a mathematical error.\n");
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
}

public void SquareRootOperation(string operation)
{
var radicand = Menu.GetOperand("Type the radicand, and then press Enter: ");

try
{
var result = Calculator.DoOperation(radicand, operation);

if (double.IsNaN(result))
Console.WriteLine("This operation will result in a mathematical error.\n");
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
}

public void PowerOperation(string operation)
{
double baseOperand = Menu.GetOperand("Type the base, and then press Enter: ");
double exponent = Menu.GetOperand("Type the exponent, and then press Enter: ");

try
{
var result = Calculator.DoOperation(baseOperand, operation, exponent);

if (double.IsNaN(result))
Console.WriteLine("This operation will result in a mathematical error.\n");
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
}

public void TrigonometryOperation(string operation)
{
double degrees = Menu.GetOperand("Enter an angle in degrees°: ");
var functionValues = Enum.GetValues<TrigonometryFunctions>();
var randomFunction = _random.Next(functionValues.Length);
var function = functionValues[randomFunction];

try
{
var result = Calculator.DoTrigonometryOperation(degrees, function, operation);

if (double.IsNaN(result))
Console.WriteLine("This operation will result in a mathematical error.\n");
}
catch (Exception e)
{
Console.WriteLine("Oh no! An exception occurred trying to do the math.\n - Details: " + e.Message);
}
}
}
}
14 changes: 14 additions & 0 deletions Calculator.ivangar/Calculator.ivangar/Calculator.ivangar.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>
10 changes: 10 additions & 0 deletions Calculator.ivangar/Calculator.ivangar/Enums/MainMenuOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Calculator.ivangar.Enums
{
public enum MainMenuOptions
{
PerformOperation = 1,
ViewOperations = 2,
DeleteOperations = 3,
Exit = 4,
}
}
86 changes: 86 additions & 0 deletions Calculator.ivangar/Calculator.ivangar/Menu.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
using Calculator.ivangar.Enums;

namespace Calculator.ivangar
{
public static class Menu
{
private static readonly Dictionary<char, string> _operations = new()
{
{ 'a', "Add"},
{ 's', "Subtract"},
{ 'm', "Multiply"},
{ 'd', "Divide"},
{ 'r', "Square Root"},
{ 'p', "Power"},
{ 't', "Trigonometry function"},
};

public static void Intro()
{
Console.WriteLine("Console Calculator in C#\r");
Console.WriteLine("------------------------\n");
}

public static void PrintMenu(bool invalid = false)
{
if (invalid)
Console.WriteLine("\nInvalid input.");

Console.WriteLine("\nPlease choose any of the following options (you have to type the number, i.e. 2):\n");

foreach (MainMenuOptions option in Enum.GetValues(typeof(MainMenuOptions)))
Console.WriteLine($"\t{(int)option}. {option}");
}

public static bool TryGetMenuOption(string? input, out MainMenuOptions menuItem)
{
menuItem = default;

if (!int.TryParse(input, out int optionNumber))
return false;

if (!Enum.IsDefined(typeof(MainMenuOptions), optionNumber))
return false;

menuItem = (MainMenuOptions)optionNumber;
return true;
}

public static void PrintOperations(bool invalid = false)
{
if (invalid)
Console.WriteLine("\nError: Unrecognized input.");

Console.WriteLine("\nChoose an operation from the following list (you have to type the letter, i.e. 'a'):\n");

foreach (var (key, op) in _operations)
Console.WriteLine($"\t{key} - {op}");

Console.Write("Your option? ");
}

public static double GetOperand(string message)
{
double cleanNum1;

Console.Write(message);
string? numInput1 = Console.ReadLine();

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

return cleanNum1;
}

public static bool ValidateOperationChoice(string? option)
{
if (string.IsNullOrEmpty(option) || string.IsNullOrWhiteSpace(option) || option.Length != 1)
return false;

return _operations.ContainsKey(char.ToLower(option[0]));
}
}
}
4 changes: 4 additions & 0 deletions Calculator.ivangar/Calculator.ivangar/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
using Calculator.ivangar;

var application = new Application();
application.Run();
Loading
Loading