Simple Calculator

mail@pastecode.io avatar
unknown
csharp
3 years ago
4.2 kB
8
Indexable
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;
        }

    }
}