Ejemplo n.º 1
0
        /// <summary>
        /// Deals with trigonometric function button clicks.
        /// </summary>
        private void trigFunction(object sender, RoutedEventArgs e)
        {
            if (errors.Contains(resultBox.Text))
            {
                return;
            }

            Button     button     = (Button)sender;
            string     buttonText = button.Content.ToString();
            string     equation   = "";
            string     result     = "";
            BigDecimal number     = getNumber();


            switch (currentTrigMode)
            {
            // Standard trig functions
            case trigModes.STANDARD:
                double radianAngle = Angles.Converter.radians((double)number, angleUnit);
                switch (buttonText)
                {
                case "sin":
                    equation = "sin(" + number.ToString() + ")";
                    result   = Math.Sin(radianAngle).ToString();
                    break;

                case "cos":
                    equation = "cos(" + number.ToString() + ")";
                    result   = Math.Cos(radianAngle).ToString();
                    break;

                case "tan":
                    equation = "tan(" + number.ToString() + ")";
                    result   = Math.Tan(radianAngle).ToString();
                    break;
                }
                break;

            // Hyperbolic trig functions
            case trigModes.HYPERBOLIC:
                switch (buttonText)
                {
                case "sinh":
                    equation = "sinh(" + number + ")";
                    result   = Math.Sinh((double)number).ToString();
                    break;

                case "cosh":
                    equation = "cosh(" + number + ")";
                    result   = Math.Cosh((double)number).ToString();
                    break;

                case "tanh":
                    equation = "tanh(" + number + ")";
                    result   = Math.Tanh((double)number).ToString();
                    break;
                }
                break;

            // Arc trig functions
            case trigModes.ARC:
                switch (buttonText)
                {
                case "asin":
                    equation = "asin(" + number + ")";
                    result   = Math.Asin((double)number).ToString();
                    break;

                case "acos":
                    equation = "acos(" + number + ")";
                    result   = Math.Acos((double)number).ToString();
                    break;

                case "atan":
                    equation = "atan(" + number + ")";
                    result   = Math.Atan((double)number).ToString();
                    break;
                }
                break;
            }

            // We need to convert the result to the given angle unit if arc trig functions are used
            if (currentTrigMode == trigModes.ARC)
            {
                switch (angleUnit)
                {
                case Angles.units.DEGREES:
                    result = Angles.Converter.degrees(double.Parse(result), Angles.units.RADIANS).ToString();
                    break;

                case Angles.units.GRADIANS:
                    result = Angles.Converter.gradians(double.Parse(result), Angles.units.RADIANS).ToString();
                    break;

                default:      // 'result' is in radians by default
                    break;
                }
            }

            if (operationCheck)
            {
                equation      = equationBox.Text + equation;
                functionCheck = true;
            }

            updateEquationBox(equation);
            showText(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Deals with function button clicks.
        /// </summary>
        private void function(object sender, RoutedEventArgs e)
        {
            if (errors.Contains(resultBox.Text))
            {
                return;
            }

            Button     button     = (Button)sender;
            string     buttonText = button.Content.ToString();
            BigDecimal number     = getNumber();
            string     equation   = "";
            string     result     = "";

            switch (buttonText)
            {
            // C# doesn't have a Math.factorial()? Who the f**k does that?!
            case "n!":
                if (number < 0 || number.ToString().Contains("."))
                {
                    showError(INVALID_INPUT);
                    return;
                }

                if (number > 3248)     // chose this number because the default windows calculator doesn't go beyond this number
                {
                    showError(OVERFLOW);
                    return;
                }
                double res = 1;
                if (number == 1 || number == 0)
                {
                    result = res.ToString();
                }
                else
                {
                    for (int i = 2; i <= number; i++)
                    {
                        res *= i;
                    }
                }
                equation = "fact(" + number.ToString() + ")";
                result   = res.ToString();
                break;

            case "ln":
                equation = "ln(" + number + ")";
                result   = ((BigDecimal)Math.Log((double)number)).ToString();
                break;

            case "log":
                equation = "log(" + number + ")";
                result   = Math.Log10((double)number).ToString();
                break;

            case "√":
                equation = "√(" + number + ")";
                result   = Math.Sqrt((double)number).ToString();
                break;

            case "+/-":
                equation = "negate(" + number + ")";
                result   = BigDecimal.Negate(number).ToString();
                break;

            case "F-E":
                int eidx = resultBox.Text.IndexOf('E');
                if (eidx != -1)
                {
                    BigDecimal bf  = number;
                    int        exp = 0;
                    while (bf > 10 || bf < 1)
                    {
                        if (bf > 10)
                        {
                            bf /= 10;
                            ++exp;
                        }
                        else if (bf < 1)
                        {
                            bf *= 10;
                            --exp;
                        }
                        else
                        {
                            break;
                        }
                    }
                    result = bf + (exp > 0 ? "E+" : "E") + exp;
                }
                else
                {
                }
                equation = "F-E(" + number + ")";
                break;
            }

            if (operationCheck)
            {
                equation      = equationBox.Text + equation;
                functionCheck = true;
            }

            updateEquationBox(equation);
            showText(result);
        }