Esempio n. 1
0
    protected void botaoCalcular_Click(object sender, EventArgs e)
    {
        const double erroComparacao = 0.01;

        if ((TextBoxA.BorderColor == System.Drawing.ColorTranslator.FromHtml("#ff0000")) || (TextBoxB.BorderColor == System.Drawing.ColorTranslator.FromHtml("#ff0000")) || (TextBoxC.BorderColor == System.Drawing.ColorTranslator.FromHtml("#ff0000")))
        {
            ScriptManager.RegisterStartupScript(this, GetType(), "Erro", "alert('Só são permitidos valores numéricos até 8 dígitos.');", true);
            return;
        }

        //testar se as 3 caixas de texto se encontram vazias (o que significa que são interpretadas como tendo o valor 0)
        //se estiverem vazias, não é possível efectuar qualquer cálculo
        if (TextBoxA.Text.Equals("") && TextBoxB.Text.Equals("") && TextBoxC.Text.Equals(""))
        {
            ScriptManager.RegisterStartupScript(this, GetType(), "Erro", "alert('Não foram introduzidos quaisquer valores.');", true);
            return;
        }

        //inicializar um objeto da classe cálculo.
        Calculo calculo = new Calculo(TextBoxA.Text, TextBoxB.Text, TextBoxC.Text);

        //verifica se a=0 e b=0.
        if (calculo.getA() == 0 && calculo.getB() == 0 && calculo.getC() != 0)
        {
            ScriptManager.RegisterStartupScript(this, GetType(), "Erro", "alert('Os valores introduzidos não constituem uma equação. Introduza outro valor para além do termo C.');", true);
            return;
        }

        eq_valida_actual = calculo.geteq();

        //verifica se (a=0 ou b=0) e c=0, mostrando o valor de x nesse caso.
        if ((calculo.getA() == 0 || calculo.getB() == 0) && calculo.getC() == 0)
        {
            mostraResultado(0);

            return;
        }

        //verifica se a=0 e b!=0 e c!=0
        if (calculo.getA() == 0 && calculo.getB() != 0 && calculo.getC() != 0)
        {
            mostraResultado(calculo.formulaSimplificada());
            return;
        }

        //--------------->testar se a equação tem 2 raízes, 1 raíz ou nenhum raíz usando o discriminante da fórmula resolvente (discriminante = b * b - 4*a*c)
        double discriminante = calculo.getB() * calculo.getB() - 4 * calculo.getA() * calculo.getC();

        //se discriminante<0 a equação não possui raízes
        if (discriminante < 0)
        {
            ScriptManager.RegisterStartupScript(this, GetType(), "Erro", "alert('A equação indicada não possui raízes.');", true);
            resultado.Text="<br/>";
            return;
        }

        //se discriminante=0 a equação possui apenas 1 raiz
        if (discriminante == 0)
        {
            //comparar o x obtido pela fórmula resolvente com o obtido pelo método de newton
            double x1FR = calculo.formulaResolvente_x1(), x1MN = 0, aux = 0;
            calculo.metodoNewton(ref x1MN, ref aux);
            if((Math.Abs(x1FR - x1MN)) >= erroComparacao) // se a diferença entre os valores obtidos pelos 2 métodos for superior ao erroComparacao, surge mensagem de erro
            {
                ScriptManager.RegisterStartupScript(this, GetType(), "Erro", "alert('Erro de cálculo; resultado não fidedigno.');", true);
                return;
            }
            mostraResultado(x1FR);
            return;
        }

        //se discriminante=0 a equação possui 2 raizes
        if (discriminante > 0)
        {
            //comparar x1 e x2 obtido pela fórmula resolvente com o obtido pelo método de newton
            double x1FR = calculo.formulaResolvente_x1(), x1MN = 0, x2FR = calculo.formulaResolvente_x2(), x2MN = 0;
            calculo.metodoNewton(ref x1MN, ref x2MN);
            // se a diferença entre os valores obtidos pelos 2 métodos for superior ao erroComparacao, surge mensagem de erro
            if ((((Math.Abs(x1FR - x1MN)) >= erroComparacao) || ((Math.Abs(x2FR - x2MN)) >= erroComparacao)) && (((Math.Abs(x1FR - x2MN)) >= erroComparacao) || ((Math.Abs(x2FR - x1MN)) >= erroComparacao)))
            {
                ScriptManager.RegisterStartupScript(this, GetType(), "Erro", "alert('Erro de cálculo; resultado não fidedigno.');", true);
                return;
            }
            mostraResultado(x1FR, x2FR);
            return;
        }
    }