Skip to content
Open
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 Calculator.klaudia021/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>
195 changes: 195 additions & 0 deletions Calculator.klaudia021/Calculator/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@

using System.Text.RegularExpressions;
using CalculatorLibrary;
using Validation;

const int CalculatorAppMenu = 1;
const int ListHistoryMenu = 2;
const int DeleteHistoryMenu = 3;

double? listInput1 = null;
double? listInput2 = null;

bool endApp = false;
// Display title as the C# console calculator app.
Console.WriteLine("Console Calculator in C#\r");
Console.WriteLine("------------------------\n");

Calculator calculator = new Calculator();

while (!endApp)
{
ListMenu();

string? menuInput = "";
Console.Write("Type a menu number, and then press Enter: ");
menuInput = Console.ReadLine();

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

switch (chosenMenu)
{
case CalculatorAppMenu:
CalculatorApp();
break;
case ListHistoryMenu:
calculator.ListHistory();
PreviousResultMenu();
break;
case DeleteHistoryMenu:
calculator.ClearList();
break;
default:
break;
}

Console.WriteLine("\n"); // Friendly linespacing.

// 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.
}

calculator.Finish();

void CalculatorApp()
{
// Declare variables and set to empty.
double result = 0;
double cleanNum1 = listInput1 ?? ValidatorService.GetUserInputForDouble("first");
double cleanNum2 = listInput2 ?? ValidatorService.GetUserInputForDouble("second");

// 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.WriteLine("\te - Exponentiation");
Console.WriteLine();
Console.WriteLine("First number is used:");
Console.WriteLine("\tq - Square root");
Console.WriteLine("\ti - Sine(°)");
Console.WriteLine("\to - Cosine(°)");
Console.WriteLine("\tt - Tangent(°)");
Console.WriteLine("\tc - Cotangent(°)");
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|q|e|i|o|t|c]"))
{
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");

listInput1 = null;
listInput2 = null;
}

void ListMenu()
{
Console.WriteLine("------------------------");
Console.WriteLine($"{CalculatorAppMenu} - Calculator");
Console.WriteLine($"{ListHistoryMenu} - List History");
Console.WriteLine($"{DeleteHistoryMenu} - Delete History");
Console.WriteLine("------------------------\n");
}

void PreviousResultMenu()
{
if (!calculator.HistoryHasEnoughResults(1))
return;

string? input = "";

Console.Write("Do you want to use previous results from the list? (y/n): ");
input = Console.ReadLine();

if (input != "y")
{
Console.WriteLine("\nExiting list...");
return;
}

Console.Write("\nHow many previous result do you want to use? (1-2): ");
input = Console.ReadLine();

int numbersCount = ValidatorService.GetValidIntInputValue(input);
bool validNumberWasChosen = numbersCount == 1 || numbersCount == 2;
bool historyHasNotEnoughResult = numbersCount == 2 && !calculator.HistoryHasEnoughResults(2);

if (!validNumberWasChosen || historyHasNotEnoughResult)
{
Console.WriteLine("Input is not valid, or not enough results are available. Exiting list...\n\n");
return;
}

UseNumbersFromList(numbersCount);
}

void UseNumbersFromList(int inputCount)
{
double? num2 = null;

calculator.ListHistory();

double? num1 = GetHistoryResult("first");

if (inputCount == 2)
num2 = GetHistoryResult("second");

listInput1 = num1;
listInput2 = num2;

CalculatorApp();
}

double GetHistoryResult(string numberCountText)
{
CalculatorHistory? previousResult = null;
bool validHistoryChosen = false;

do
{
Console.Write($"Choose the number of the results for the {numberCountText} number: ");

string? input = Console.ReadLine();
int chosenNumber = ValidatorService.GetValidIntInputValue(input);

previousResult = calculator.GetHistoryByIndex(chosenNumber - 1);

if (previousResult == null)
Console.WriteLine($"\nThere is no result available for index {chosenNumber}");
else
validHistoryChosen = true;

} while (!validHistoryChosen);


return previousResult!.Result;
}
40 changes: 40 additions & 0 deletions Calculator.klaudia021/Calculator/ValidatorService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
namespace Validation;

public static class ValidatorService
{
public static double GetUserInputForDouble(string numberCountText)
{
Console.Write($"Type the {numberCountText} number, and then press Enter: ");
string? numInput = Console.ReadLine();

return GetValidDoubleInputValue(numInput);
}

public static double GetValidDoubleInputValue(string? input)
{
double cleanNum = 0.0;

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

return cleanNum;
}


public static int GetValidIntInputValue(string? input)
{
int cleanNum = 0;

while (!int.TryParse(input, out cleanNum))
{
Console.Write("\nThis is not valid input. Please enter a numeric integer value: ");
input = Console.ReadLine();
}

return cleanNum;
}

}
54 changes: 54 additions & 0 deletions Calculator.klaudia021/CalculatorLibrary/CalculatorHistory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System.Text.RegularExpressions;

namespace CalculatorLibrary;

public class CalculatorHistory
{
public int Id { get; set; }
public double Number1 { get; set; }
public double Number2 { get; set; }
public string Operation { get; set; }
public double Result { get; set; }
private string _operationLetter;

public CalculatorHistory(int id, double num1, double num2, string operation, double result)
{
Id = id;
Number1 = num1;
Number2 = num2;
_operationLetter = operation;
Operation = AddSymbol(operation);
Result = result;
}

private string AddSymbol(string op)
{
Dictionary<string, string> operationSigns = new Dictionary<string, string>()
{
{"a", "+"},
{"s", "-"},
{"m", "*"},
{"d", "/"},
{"q", "sqrt"},
{"e", "^"},
{"i", "sin"},
{"o", "cos"},
{"t", "tan"},
{"c", "cot"},
};

string? symbol;
operationSigns.TryGetValue(op, out symbol);

return symbol?? " ";

}

public override string ToString()
{
if (Regex.IsMatch(_operationLetter, "[a|s|m|d|e]"))
return $"{Id}.: {Number1} {Operation} {Number2} = {Result}";

return $"{Id}.: {Operation}({Number1}) = {Result}";
}
}
Loading