Programa em C que exibe as raízes de uma equação do 2o grau - até as complexas

Propomos para você várias questões sobre o que ensinamos a respeito do Teste Condicional IF ELSE, aqui em nosso curso C Progressivo.

Dentre elas, o seguinte desafio:
Escreva um programa na linguagem C que pede os coeficientes de uma equação do segundo grau e exibe as raízes da equação, sejam elas reais ou complexas.

Esse programa exige uma complexidade maior. Mas explicaremos tudo aqui, passo-a-passo.

Clique aqui e saiba como obter seu certificado de programação C! Entre já no Mercado de Trabalho!

Aplicativo em C que resolve uma equação do segundo grau



Passo 1:
A primeira parte do programa recebe os três coeficientes da equação, que são 'a', 'b' e 'c' e serão representados pelo tipo float.

Passo 2:
Uma equação do 2o grau só é válida se 'a' for diferente de 0, então, se for igual a 0 o programa deverá terminar.
Ou seja, nosso programa irá acontece dentro do 'if' que checa que 'a' é diferente de 0.

Passo 3:
Determinando o valor de delta: delta = b² - 4ac
Determinando a raiz quadrada de delta: sqrtdelta = sqrt(delta);

Onde sqrt significa 'square root', ou raiz quadrada, em inglês.
Em C, calculamos a raiz quadrada do número x usando a função sqrt(), que está na biblioteca math.h. Logo, precisamos importar essa biblioteca no começo do programa.

Passo 4:
Se delta for maior ou igual a zero, as raízes são dadas por:
raiz1 = (-b + sqrtdelta) / 2a
raiz2 = (-b - sqrtdelta) / 2a

Passo 5:
Se delta for menor que zero, suas raízes serão complexas e as raízes serão da forma:
raiz1 = (-b + i.sqrt(-delta) )/2a
raiz2 = (-b - i.sqrt(-delta) )/2a

Formatei a saída da seguinte forma, para ficar mais legível, que é a mesma coisa das equações anteriores:
raiz1 = (-b)/2a + i.sqrt(-delta)/2a
raiz2 = (-b)/2a - i.sqrt(-delta)/2a

Assim, chegamos ao resultado final de nosso programa em C:

Código C:
#include <stdio.h>
#include <math.h>
int main()
{
    float a, b, c,    //coeficientes
          delta,      //delta
          sqrtdelta,  //raiz quadrada de delta
        raiz1,raiz2;  //raízes

        //Passo 1: Recebendo os coeficientes
        printf("Equação do 2o grau: ax² + bx + cx = 0\n");

        printf("Entre com o valor de a: ");
        scanf("%f", &a);

        printf("Entre com o valor de b: ");
        scanf("%f", &b);

        printf("Entre com o valor de c: ");
        scanf("%f", &c);


        //Passo 2: Checando se a equação é válida
        if(a != 0)
        {

        //Passo 3: recebendo o valor de delta e calculando sua raiz quadrada
            delta = (b*b) - (4*a*c);
            sqrtdelta = sqrt(delta);

        //Passo 4: se a raiz de delta for maior que 0, as raízes são reais
            if(delta >= 0)
            {
                raiz1 = (-b + sqrtdelta)/(2*a);
                raiz2 = (-b - sqrtdelta)/(2*a);
                printf("Raízes: %.2f e %.2f", raiz1, raiz2);
            }
        //Passo 5: se delta for menor que 0, as raízes serão complexas
            else
            {
                delta = -delta;
                sqrtdelta = sqrt(delta);
                printf("Raíz 1: %.2f + i.%.2f\n", (-b)/(2*a), (sqrtdelta)/(2*a));
                printf("Raíz 2: %.2f - i.%.2f\n", (-b)/(2*a), (sqrtdelta)/(2*a));

            }

        }
        else
            printf("Coeficiente 'a' inválido. Não é uma equação do 2o grau");
}

14 comentários:

  1. Otimo tutorial, me ajudou bastante.
    Obrigado a todos!

    ResponderExcluir
  2. Otimo conteudo. Me ajudou bastante. Obrigado a todos!

    ResponderExcluir
  3. E tem um programa q faca o inverso: vc digita as raizes e o programa lhe mostra a equacao correspondente?

    ResponderExcluir
  4. Muito bom o tutorial. Desculpe, mas uma coisa ficou um pouco confusa: no 5º passo, oque significa o i?
    "
    raiz1 = (-b)/2a + i.sqrt(-delta)/2a
    raiz2 = (-b)/2a - i.sqrt(-delta)/2a"

    ResponderExcluir
  5. Uma explicação importante que está faltando é o pow(a,b) para elevar o número ao quadrado.

    ResponderExcluir
  6. i significa raiz de -1. É a unidade imaginária, ela determina se um número é real ou complexo. Isso é matemática do 2º ~ 3º ano do ensino médio.

    ResponderExcluir
  7. Podem me ajudar por favor?
    Meu compilador esta dando este erro:

    ~/Área de Trabalho/programas/exercicios_if else $ cc equaçao_resolvido.c -o equaçao_resolvido
    /tmp/ccMJgEn8.o: na função `main':
    equaçao_resolvido.c:(.text+0xd4): referência indefinida a `sqrt'
    equaçao_resolvido.c:(.text+0x187): referência indefinida a `sqrt'
    collect2: error: ld returned 1 exit status

    Ja tinha feito o exercicio e a funçao sqrt nao é aceite pelo compilador, entao eu peguei o problema resolvido e colei chapado e continua com o mesmo erro!!!

    ResponderExcluir
  8. na hora de executar ele fecha , por que?

    ResponderExcluir
  9. Tenho alguns exercícios de equações para resolver em C e não achei mais nada a respeito além da sua explicação aqui e fiquei com uma dúvida, essa fórmula que você apresentou:
    raiz1 = (-b)/2a + i.sqrt(-delta)/2a
    raiz2 = (-b)/2a - i.sqrt(-delta)/2a
    Ela também serve para os exercícios no papel ou é utilizado somente para o programa ?

    ResponderExcluir
  10. No caso do numero imaginario "i". como ele fica no programa? atribuo algum valor ? o C não entende o i como numero imaginario né ? Ou não precisa por o "i" no programa ? serviria apenas para indicar que é raiz complexa ?

    Ótimo curso, Parabéns a toda equipe do Prog. Progressiva !

    ResponderExcluir
  11. boa noite estou com uma duvida e preciso saber qual codigo em c# para esse exercicio

    a) Leia três valores inteiros. Calcule e exiba a equação do 2º grau, obedecendo as regras da matemática.
    A não pode ser zero;
    Delta não pode ser negativo;
    Se delta for zero as duas raízes serão iguais.

    ResponderExcluir
  12. Sobre a questão 0, fiz assim:

    #include
    #include
    int main(){
    setlocale(LC_ALL,"Portuguese");
    int x,h;
    printf("Digite um número: ");
    scanf("%d",&x);
    printf("Digite o segundo número: ");
    scanf("%d",&h);
    if(x==h){
    printf("São iguais, por isso não satisfaz à questão\n");}

    if (x>h){
    printf("O valor de x= %d é maior do que h= %d.\n",x,h);}
    if(x
    #include
    int main(){
    setlocale(LC_ALL,"Portuguese");
    int x,h;
    printf("Digite um número: ");
    scanf("%d",&x);
    printf("Digite o segundo número: ");
    scanf("%d",&h);

    if (x>h){
    printf("O valor de x= %d é maior do que h= %d.\n",x,h);}
    else
    if(x<h){
    printf("O valor de x= %d é menor do que h= %d.\n",x,h);}
    else
    if(x==h){
    printf("São iguais, por isso não satisfaz à questão\n");}

    system("pause");
    return 0;}

    ResponderExcluir
  13. Boa noite senhores ...
    O enunciado ficou confuso e incompleto.
    Não seria melhor: " Faça um programa que peça e mostre os coeficientes de uma equação do 2º grau e que em seguida resolva está equação. ???

    ResponderExcluir
  14. Fiz deste jeito, deu os resultados das raízes:
    #include
    #include

    int main()
    {

    float a, //declarando os coeficientes da equação de segundo grau
    b,
    c,
    delta,
    y,
    x;

    int quatro=4,
    dois=2;

    printf("Digite os coeficientes da equação de segundo grau que daremos as raízes: ");
    scanf ("%f %f %f",&a,&b,&c);


    //valor do dricriminante

    delta = ((b)*(b) - (quatro)*(a)*(c));

    if (delta>=0)
    {

    x=((-b)-(sqrt(delta)))/((dois)*(a));

    y=((-b)+(sqrt(delta)))/((dois)*(a));

    printf("O valor das raízes são %.2f e %.2f", x,y);

    }

    else

    if(delta<0)

    {
    printf("Não há como encontrar raízes, pois o valor do discriminate é negativo");
    }



    }

    ResponderExcluir

É quase impossível criar centenas de páginas voltadas para programação C e não cometer algum erro.

- Se notar algum conceito, letra ou trecho de código errado, deixe sua correção

- Se perceber uma maneira melhor ou mais eficiente de fazer algo, deixe sua ideia

- Se algo não ficar claro ou for confuso, nos avise

Aos poucos vamos aumentando e melhorando a qualidade de nosso material, e para isso contamos com sua ajuda.