c# – Factorial C # Calculator

Question:

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 have an error in the 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();
    }
}
}

Answer:

Note that the calculation you are doing is only valid for whole numbers. 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 factorial of non-integer numbers you have to use the Gamma function.

Scroll to Top