Ir ao conteúdo
  • Cadastre-se

C Equação seguno grau em C usando ponteiros


Ir à solução Resolvido por Ansi C,

Posts recomendados

Gente eu precisaria declarar o delta (d) na função main, para adicionar  retornos : return -2 caso a equação não possua raízes reais.

só que quando tento fazer isso, não funciona.

e outro retorno para quando as raízes apresentarem valores iguais, mas pra isso eu preciso do delta.

#include<stdio.h>


#include<math.h>
void ResolveEquacao2Grau (float a, float b, float c, float *x1, float *x2)

{
   float d;
   d = sqrt( b * b - 4 * a * c);

   *x1 =  - (b + d) / (2 * a);
   *x2 = (d - b) / (2 * a);
}


int main(void){
 float a, b, c, px, p2, d;

     printf("Digite o lado a:");
     scanf("%f", &a);
     printf("Digite o lado b:");
     scanf("%f", &b);
     printf("Digite o lado c:");
     scanf("%f", &c);


     if (d < 0){
        return 2;
     }
     if (a == 0){
            printf("os coficientes  nao formam uma equacao do segundo grau pois o coeficiente a = 0\n");
            return 1;
     }

     ResolveEquacao2Grau(a, b, c,&px, &p2 );
     printf("raiz de x1:%0.2f\n", p2);
     printf("raiz de x2: %0.2f\n", px);


 return 0;

}
 

Link para o comentário
Compartilhar em outros sites

agora, mauro_b disse:

Sua função usa retornos por mudança de parâmetro.

 

Como gostaria de retorna o status -2

Por parâmetro ou por retorno de função no lugar de void?

Eu não poderia retornar por paramêtro, porque no exercício pede que a função e seus paramêtros sejam somente aqueles.

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Leanderson Pinheiro disse:

Eu não poderia retornar por paramêtro, porque no exercício pede que a função e seus paramêtros sejam somente aqueles.

Aah então é por retorno de função.

 

No lugar de   void?

Assim:

int   ResolveEquacao2Grau (float a, float b, float c, float *x1, float *x2)

{
   float d;
   d = sqrt( b * b - 4 * a * c);

   *x1 =  - (b + d) / (2 * a);
   *x2 = (d - b) / (2 * a);
   
  if(d < 0)return -2;
  return 0;
}

 

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, mauro_b disse:

Aah então é por retorno de função.

 

No lugar de   void?

Assim:


int   ResolveEquacao2Grau (float a, float b, float c, float *x1, float *x2)

{
   float d;
   d = sqrt( b * b - 4 * a * c);

   *x1 =  - (b + d) / (2 * a);
   *x2 = (d - b) / (2 * a);
   
  if(d < 0)return -2;
  return 0;
}

 

Tipo, eu queria meio que retornar o delta, na função main, sacou ? Porque só com ele eu poderia printar se existem ou não raízes reais, e se as raízes seriam iguais tlg ?

Eu consegui resolver, criando outra função Delta. Entretanto, não sei se era permitido, mas funcionou.

Link para o comentário
Compartilhar em outros sites

51 minutos atrás, Leanderson Pinheiro disse:

Tipo, eu queria meio que retornar o delta, na função main, sacou ? Porque só com ele eu poderia printar se existem ou não raízes reais, e se as raízes seriam iguais tlg ?

Eu consegui resolver, criando outra função Delta. Entretanto, não sei se era permitido, mas funcionou.

Calculará o delta duas vezes! Tente retorno da função

Link para o comentário
Compartilhar em outros sites

5 minutos atrás, mauro_b disse:

Calculará o delta duas vezes! Tente retorno da função.

 

Assim:


#include<stdio.h>
#include<math.h>
float ResolveEquacao2Grau (float a, float b, float c, float *x1, float *x2)
{
   float d;
   d = sqrt( b * b - 4 * a * c);

   *x1 =  - (b + d) / (2 * a);
   *x2 = (d - b) / (2 * a);
  
  retutn d;
}


int main(void){
 float a, b, c, px, p2, d;

     printf("Digite o lado a:");
     scanf("%f", &a);
     printf("Digite o lado b:");
     scanf("%f", &b);
     printf("Digite o lado c:");
     scanf("%f", &c);

     float d= ResolveEquacao2Grau(a, b, c,&px, &p2 );
     if (d < 0){
        //<<<< Aqui coloque a mensagem
     }
     if (a == 0){
            printf("os coficientes  nao formam uma equacao do segundo grau pois o coeficiente a = 0\n");
            return 1;
     }

     
     printf("raiz de x1:%0.2f\n", p2);
     printf("raiz de x2: %0.2f\n", px);


 return 0;

}
 

 

Apresentou erro, " redeclaration of 'd' with no linkage".

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 minutos atrás, mauro_b disse:

Huuummm já existe um d, vou corrigir


#include<stdio.h>
#include<math.h>
float ResolveEquacao2Grau (float a, float b, float c, float *x1, float *x2)
{
   float d;
   d = sqrt( b * b - 4 * a * c);

   *x1 =  - (b + d) / (2 * a);
   *x2 = (d - b) / (2 * a);
  
  retutn d;
}


int main(void){
 float a, b, c, px, p2, d;

     printf("Digite o lado a:");
     scanf("%f", &a);
     printf("Digite o lado b:");
     scanf("%f", &b);
     printf("Digite o lado c:");
     scanf("%f", &c);

     d= ResolveEquacao2Grau(a, b, c,&px, &p2);
     if (d < 0){
        //<<<< Aqui coloque a mensagem
       return -2;
     }
     if (a == 0){
            printf("os coficientes  nao formam uma equacao do segundo grau pois o coeficiente a = 0\n");
            return 1;
     }

     
     printf("raiz de x1:%0.2f\n", p2);
     printf("raiz de x2: %0.2f\n", px);


 return 0;

}
 

Retirei o float para usar o d existente.

ele está ignorando esse if onde existe o retorno -2. Quando o Delta está sendo negativo apresenta as seguintes saídas : raiz de x1:-1.#J
raiz de x2: 1.#R

Dessa maneira funciona perfeitamente, mas o enunciado diz que quer somente a função ResolveEquação, em tese não precisaria da Função Delta, mas só consigo avaliar as condiçõe para os returns, se tiver ela.

 

#include<stdio.h>
#include<math.h>
void ResolveEquacao2Grau (float a, float b, float c, float *x1, float *x2)

{
   float d;
   d = sqrt( b * b - 4 * a * c);
   *x1 =  - (b + d) / (2 * a);
   *x2 = (d - b) / (2 * a);


}
int Delta(int a, int b, int c){

    return b * b -4 * a * c;

}


int main(void){
 float a, b, c, px, p2, delta;

     printf("Digite o lado a:");
     scanf("%f", &a);
     printf("Digite o lado b:");
     scanf("%f", &b);
     printf("Digite o lado c:");
     scanf("%f", &c);

    delta = Delta(a, b, c);
    ResolveEquacao2Grau(a, b, c,&px, &p2 );

     if (delta == 0 && a !=0){
        printf("as raizes apresentam o mesmo valor = %lf\n", p2);

    }

    if (delta < 0){
        printf("Nao existem raizes reais\n");
        return -2;
    }

     if (a == 0){
            printf("os coficientes  nao formam uma equacao do segundo grau pois o coeficiente a = 0\n");
            return 1;
     }


     if (p2 != px){
     printf("raiz de x1:%0.2f\n", p2);
     printf("raiz de x2: %0.2f\n", px);
     }


 return 0;

}
 

Link para o comentário
Compartilhar em outros sites

  • Solução

É porque DELTA: b*b - (4*a*c)

É negativo, a raiz quadrado de um número negativo gera esse código impresso.

 

Temos que testar se DELTA < 0 antes de calcular a RAIZ quadrada dele,

 

Lá na função:

	
	float d= b * b - 4 * a * c;
	if(d < 0) return -1;
             
	d= sqrt( d );

	*x1 =  - (b + d) / (2 * a);
	*x2 = (d - b) / (2 * a);
             
 	return d;

 

 

Link para o comentário
Compartilhar em outros sites

@Leanderson Pinheiro Sua função pode ter esse retorno para testar em main se existe raiz,

 

int ResolveEquacao2Grau(float a, float b, float c, float *x1, float *x2){
    float d = b * b - 4 * a * c;
    if(d < 0){
        return -2;
    }
    d = sqrt(d);
    *x1 = -(b + d) / (2 * a);
    *x2 = (d - b) / (2 * a);
    return 1;
}

 

if(ResolveEquacao2Grau(a, b, c, &x1, &x2) != -2){
    printf("raiz de x1:%0.2f\n", x1);
    printf("raiz de x2: %0.2f\n", x2);
...

 

Link para o comentário
Compartilhar em outros sites

11 minutos atrás, mauro_b disse:

É porque DELTA: b*b - (4*a*c)

É negativo, a raiz quadrado de um número negativo gera esse código impresso.

 

Temos que testar se DELTA < 0 antes de calcular a RAIZ quadrada dele,

 

Lá na função:


	
	float d= b * b - 4 * a * c;
	if(d < 0) return -1;
             
	d= sqrt( d );

	*x1 =  - (b + d) / (2 * a);
	*x2 = (d - b) / (2 * a);
             
 	return d;

 

 

Resolveu, muito obrigado!

4 minutos atrás, Midori disse:

@Leanderson Pinheiro Sua função pode ter esse retorno para testar em main se existe raiz,

 


int ResolveEquacao2Grau(float a, float b, float c, float *x1, float *x2){
    float d = b * b - 4 * a * c;
    if(d < 0){
        return -2;
    }
    d = sqrt(d);
    *x1 = -(b + d) / (2 * a);
    *x2 = (d - b) / (2 * a);
    return 1;
}

 


if(ResolveEquacao2Grau(a, b, c, &x1, &x2) != -2){
    printf("raiz de x1:%0.2f\n", x1);
    printf("raiz de x2: %0.2f\n", x2);
...

 

Desta maneira, também resolveria o problema!!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!