Factorial C # Calculator

3

I'm building a calculator in C # and I'm having a little problem building the button that calculates the factorial.

private void btnfact_Click(object sender, RoutedEventArgs e)
{
    primeiro += double.Parse(janela.Text);
    //int i = 0;
    primeiro = Convert.ToSingle(primeiro);
    for (int i = primeiro - 1; i > 1; i--)
    {
        resutado *= i;
    }
    janela.Text = resutado.ToString();
}

I'm having an error in FOR "first - 1"

Semi-complete calculator:

{  
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    double primeiro;
    double segundo;
    double resutado;
    string operacao;
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "1";
    }

    private void btn2_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "2";
    }

    private void btn3_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "3";
    }

    private void btn4_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "4";
    }

    private void btn5_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "5";
    }

    private void btn6_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "6";
    }

    private void btn7_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "7";
    }

    private void btn8_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "8";
    }

    private void btn9_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "9";
    }

    private void btn0_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + "0";
    }

    private void btnponto_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = janela.Text + ",";
    }

    private void btnsoma_Click(object sender, RoutedEventArgs e)
    {
        operacao = "+";
        primeiro += double.Parse(janela.Text);
        janela.Text = "";
    }

    private void btnsubtracao_Click(object sender, RoutedEventArgs e)
    {
        operacao = "-";
        primeiro += double.Parse(janela.Text);
        janela.Text = "";
    }

    private void btnmultiplicacao_Click(object sender, RoutedEventArgs e)
    {
        operacao = "*";
        primeiro += double.Parse(janela.Text);
        janela.Text = "";
    }

    private void btndivisao_Click(object sender, RoutedEventArgs e)
    {
        operacao = "/";
        primeiro += double.Parse(janela.Text);
        janela.Text = "";
    }

    private void btnresto_Click(object sender, RoutedEventArgs e)
    {
        operacao = "%";
        primeiro += double.Parse(janela.Text);
        janela.Text = "";
    }

    private void btnraiz_Click(object sender, RoutedEventArgs e)
    {
        primeiro += double.Parse(janela.Text);
        resutado = Convert.ToSingle(Math.Sqrt(primeiro));
        janela.Text = resutado.ToString();
    }

    private void btnigual_Click(object sender, RoutedEventArgs e)
    {
        segundo = double.Parse(janela.Text);

        switch (operacao)
        {
            case "+":
                resutado = primeiro + segundo;
                janela.Text = resutado.ToString();
                break;
            case "-":
                resutado = primeiro - segundo;
                janela.Text = resutado.ToString();
                break;
            case "/":
                resutado = primeiro / segundo;
                janela.Text = resutado.ToString();
                break;
            case "*":
                resutado = primeiro * segundo;
                janela.Text = resutado.ToString();
                break;
            case "%":
                resutado = primeiro % segundo;
                janela.Text = resutado.ToString();
                break;

        }

    }

    private void btnlimpar_Click(object sender, RoutedEventArgs e)
    {
        janela.Text = "";
        primeiro = 0;
        segundo = 0;
        operacao = null;
    }

    private void btncos_Click(object sender, RoutedEventArgs e)
    {
        primeiro += double.Parse(janela.Text);
        resutado = Convert.ToSingle(Math.Sqrt(primeiro));
        janela.Text = resutado.ToString();
    }


    private void btnsin_Click(object sender, RoutedEventArgs e)
    {
        primeiro += double.Parse(janela.Text);
        resutado = Convert.ToSingle(Math.Sin(primeiro));
        janela.Text = resutado.ToString();
    }

    private void btnfact_Click(object sender, RoutedEventArgs e)
    {
        primeiro += double.Parse(janela.Text);
        //int i = 0;
       primeiro = Convert.ToSingle(primeiro);
        for (int i = primeiro - 1; i > 1; i--)
        {
            resutado *= i;
        }
        janela.Text = resutado.ToString();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        primeiro += double.Parse(janela.Text);
        resutado = Convert.ToSingle(Math.Tan(primeiro));
        janela.Text = resutado.ToString();
    }
}
}
    
asked by anonymous 09.08.2016 / 10:51

2 answers

1

Please note that the calculation you are doing is only valid for integers. So:

private void btnfact_Click(object sender, RoutedEventArgs e)
{
    int numeroConvertido = int.Parse(janela.Text);
    int resultado = numeroConvertido; 

    // caso especial 1 e 0
    if (resultado <= 1)
        resultado = 1;
    else
    {
        for (int i = 1; i < numeroConvertido; i++)
        {
            resultado = resultado * i;
        }
    }

    janela.Text = resultado.ToString();
}

(You can see an example of the algorithm working for the first 10 integers here )

If you want to calculate the non-integer factorial you have to use the Gamma function.

    
09.08.2016 / 13:38
-1

That's how I did it now, you can get some ideas

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Hello_World
{
    public partial class Calculadora : Form
    {

        #region "Contas"
          enum Operacoes
        {
            Dividir = 47,
            Multiplicar = 42,
            Somar = 43,
            Subtrair = 45
        }


        double Num1 = 0;
        double Num2 = 0;
        bool limpou = false;

        Operacoes? operacao = null;


        const int virgula = 44;
        const int zero = 48;
        const int um = 49;
        const int dois = 50;
        const int tres = 51;
        const int quatro = 52;
        const int cinco = 53;
        const int seis = 54;
        const int sete = 55;
        const int oito = 56;
        const int nove = 57;

        const int igual = 61;
        const int asterisco = 42;
        const int mais = 43;
        const int menos = 45;
        const int barra = 47;
        const int backspace = 8;
        const int enter = 13;
        const int escape = 27;

        int[] teclasRender = new int[] { backspace, virgula, zero, um, dois, tres, quatro, cinco, seis, sete, oito, nove };
        int[] teclasOperacoes = new int[] { asterisco, mais, menos, barra };
        int[] teclasResultados = new int[] { igual, enter, escape };

        #endregion

        public Calculadora()
        {
            InitializeComponent();
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            Detect(sender, e);
        }
        public void Detect(object sender, KeyPressEventArgs e)
        { 
                    char tecla = e.KeyChar;
            int quantVirgulas = TextBoxCount.Text.Count(x => x == virgula);
            int quantNumeros = TextBoxCount.Text.Count(x => x >= zero && x <= nove);


            if (!teclasRender.Contains(tecla)
                || (quantVirgulas > 0 && tecla == virgula)
                || (quantNumeros < 1 && tecla == virgula))
            {
                e.Handled = true;
            }

            if (teclasResultados.Contains(tecla))
            {
                if (tecla == enter || tecla == igual)
                {

                    if (operacao.HasValue)
                    {
                        Num2 = double.Parse(TextBoxCount.Text);
                        double total = 0;

                        switch (operacao.Value)
                        {
                            case Operacoes.Dividir:
                                total = Num1 / Num2;
                                break;
                            case Operacoes.Multiplicar:
                                total = Num1 * Num2;
                                break;
                            case Operacoes.Somar:
                                total = Num1 + Num2;
                                break;
                            case Operacoes.Subtrair:
                                total = Num1 - Num2;
                                break;
                        }
                        TextBoxResultado.Text = total.ToString();
                        operacao = null;
                        limpou = false;
                    }
                }
                else
                {
                    TextBoxCount.Text = "";
                }

            }
            else if (teclasOperacoes.Contains(tecla))
            {
                operacao = (Operacoes)tecla;
                Num1 = double.Parse(TextBoxCount.Text);
            }
            else if (teclasRender.Contains(tecla))
            {
                if (operacao.HasValue && !limpou)
                { 
                    TextBoxCount.Text = "";
                    limpou = true;
                }
            }   

        }

        //btn Mais
        private void btnplus_Click(object sender, EventArgs e)
        {
            char tecla = Convert.ToChar(43);
            operacao = (Operacoes)tecla;
            Num1 = double.Parse(TextBoxCount.Text);
            TextBoxCount.Text = "";
            TextBoxCount.Focus();
        }

        //btn Menos
        private void btnless_Click(object sender, EventArgs e)
        {
            char tecla = Convert.ToChar(45);
            operacao = (Operacoes)tecla;
            Num1 = double.Parse(TextBoxCount.Text);
            TextBoxCount.Text = "";
            TextBoxCount.Focus();
        }

        //btn multiplicação
        private void btnMulti_Click(object sender, EventArgs e)
        {
            char tecla = Convert.ToChar(42);
            operacao = (Operacoes)tecla;
            Num1 = double.Parse(TextBoxCount.Text);
            TextBoxCount.Text = "";
            TextBoxCount.Focus();
        }

        //btn divisão
        private void btndivision_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            char tecla = Convert.ToChar(47);
            operacao = (Operacoes)tecla;
            Num1 = double.Parse(TextBoxCount.Text);
            TextBoxCount.Text = "";

        }
        #region "btnNumb"
        private void btn0_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 0;
        }

        private void btn1_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 1;
        }

        private void btn2_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 2;
        }

        private void btn3_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 3;
        }

        private void btn4_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 4;
        }

        private void btn5_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 5;
        }

        private void btn6_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 6;
        }

        private void btn7_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 7;
        }

        private void btn8_Click(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
            TextBoxCount.Text = TextBoxCount.Text + 8;
        }

        private void btn9_Click(object sender, EventArgs e)
        {
            TextBoxCount.Text = TextBoxCount.Text + 9;
            TextBoxCount.Focus();
        }
#endregion
        // btn clear
        private void btnClear_Click(object sender, EventArgs e)
        {
            TextBoxCount.Text = "";
            TextBoxCount.Focus();
        }
        // virugla
        private void btnVirgula_Click(object sender, EventArgs e)
        {
            TextBoxCount.Text = TextBoxCount.Text + ",";
            TextBoxCount.Focus();
        }
        // euqual
        private void Equal_Click(object sender, EventArgs e)
        {
            char tecla = Convert.ToChar(61);
            KeyPressEventArgs ex = new KeyPressEventArgs(tecla);
            Detect(sender,ex);
            TextBoxCount.Focus();         
            Num1 = double.Parse(TextBoxCount.Text);
        }
        // quando carregar
        private void Calculadora_Load(object sender, EventArgs e)
        {
            TextBoxCount.Focus();
        }   
    }
}
    
09.08.2016 / 11:51