using System;
using System.Collections.Generic;
namespace Simple_Calculator
{
class FourOperatorsCalculator
{
//Description:
// - Enter an expression, example: 8.23 + 8.12
// - Check the expression's validity
// - Return the result
static void Main(string[] args)
{
//Causes Of Invalidity:
//- Invalid Operator Count
//- Invalid Types
//- Division by Zero
string quote = "Please enter a simple mathematic expression.";
char[] operators = new char[4]
{
'+', '-', '*', '/'
};
char operatorUsed;
while (true)
{
Console.WriteLine(quote);
quote = "Please enter a simple mathematic expression.";
string s = Console.ReadLine();
if (s == "$exit") { break; }
Tools.RemoveCharsFromString(ref s, ' ');
operatorUsed = Tools.FindAndCountOperators(s, out int operatorCount, operators);
if ((operatorCount != 1) || (!(Tools.ArrayContains<char>(operators, operatorUsed))))
{
quote = "Please retry. Error: Invalid Operators or Invalid Operators Count";
continue;
}
string[] numberStrings = s.Split(operatorUsed);
double[] numbers = new double[numberStrings.Length];
bool hasOneFalse = false;
for (int i = 0; i < numberStrings.Length; i++)
{
bool isDouble = Double.TryParse(numberStrings[i], out numbers[i]);
if (!isDouble)
{
hasOneFalse = true;
}
}
if (hasOneFalse)
{
quote = "Please retry. Error: Invalid Numbers";
continue;
}
switch (operatorUsed)
{
case '+':
Console.WriteLine(numbers[0] + numbers[1]);
break;
case '-':
Console.WriteLine(numbers[0] - numbers[1]);
break;
case '*':
Console.WriteLine(numbers[0] * numbers[1]);
break;
case '/':
if (numbers[1] == 0)
{
quote = "Please retry. Error: Division by Zero.";
continue;
}
else
Console.WriteLine(numbers[0] / numbers[1]);
break;
}
}
}
}
static class Tools
{
public static void RemoveCharsFromString(ref string s, params char[] chars)
{
string result = "";
foreach (char charOfString in s)
{
if (!ArrayContains<char>(chars, charOfString))
{
result += charOfString;
}
}
s = result;
}
public static bool ArrayContains<T>(T[] container, T contained)
{
foreach (T containerMember in container)
{
if (EqualityComparer<T>.Default.Equals(containerMember, contained))
{
return true;
}
}
return false;
}
public static char FindAndCountOperators(string s, out int count, char[] operators)
{
char lastOperatorFound = '?';
count = 0;
int index = -1;
while ((index = s.IndexOfAny(operators, index + 1)) != -1)
{
count++;
if (index >= 0) { lastOperatorFound = s[index]; }
}
return lastOperatorFound;
}
}
}