Equation du 2nd degrée dans c

Description

Permet la résolution d'une équation du second degret du type:
Z1.x²+Z2.x+Z=0 avec Z1, Z2, Z3 et x des complexes.

Source / Exemple :


/* ---------------------------------------------- */
/* secgdeg.C: Resolution d'une equation du second */
/*            degree                              */
/* ---------------------------------------------- */

/* En-tete */
#include<stdio.h>
#include<math.h>

/* Structure */
struct complexe
{
     float za; /* Partie Reel */
     float zb; /* Partie Imaginaire */
};

/* Variables globales */
struct complexe x1, x2; /* Racines du polynome */
const char carre = (char)253; /* caractere 'carre'*/
struct complexe A, B, C; /* Coefficient complexe */

/* Prototypes des fonctions: */
void ResEq2Deg(float Aa, float Ab, float Ba, float Bb, float Ca, float Cb); /* Résolution de l'équation */
int PrintComplexe(float a, float b);      /* Affichage d'un nombre complexe */

/* Fonction PRINCIPAL */
int main(void)
{
  char Quite;
  printf("\t\t\t --- Debut du programme ---\n\n");
  do
  {
  
      printf("\n--------------------------------------------------------------------------------");
      /* Lecture des valeurs de l'equation */
      printf("Ax%c+Bx+C=0\n\t",carre);

      printf("A=");
      scanf("%f",&A.za);
      printf("\tA=%f+i",A.za);
      scanf("%f",&A.zb);

      printf("\tB=");
      scanf("%f",&B.za);
      printf("\tB=%f+i",B.za);
      scanf("%f",&B.zb);

      printf("\tC=");
      scanf("%f",&C.za);
      printf("\tC=%f+i",C.za);
      scanf("%f",&C.zb);

      ResEq2Deg(A.za, A.zb, B.za, B.zb, C.za, C.zb);
      printf("\n\t\t\t------------------------------\n");
      
      /* Verification que a != 0 */
      if (  ( (A.za==(float)0) & (A.zb==(float)0) ) & ( (B.za!=(float)0) | (B.zb!=(float)0) )  )
      {
	   /* pour A = 0 et B =! 0, on résout de la maniere suivante: (X = -C / B)*/
           printf("\n( ");
           PrintComplexe(B.za, B.zb);
           printf(" )x + ( ");
           PrintComplexe(C.za, C.zb);
           printf(" ) = 0\n\n=> x = ");
           PrintComplexe(x1.za, x1.zb);
      }

      else if ( (A.za!=(float)0) | (A.zb!=(float)0) )
      {

      /* Affichage du resultat */
		/* Affichage de l'équation */
		printf("\n(");
		PrintComplexe(A.za,A.zb);
		printf(")X%c + (",carre);
		PrintComplexe(B.za,B.zb);
		printf(")X + (");
		PrintComplexe(C.za,C.zb);
		printf(") = 0\n");
		
		/* Résultat */
		
      if (((x1.za!=x2.za) | (x1.zb!=x2.zb)) & ((x2.za!=(float)0) | (x2.zb!=(float)0)) & ((x1.za!=(float)0) | (x1.zb!=(float)0)))
      {
             printf("\n\n\t%c X = ", char(218));
		     PrintComplexe(x1.za,x1.zb);
		     printf("\n=>\t%c\t",char(179));
             printf("ET\n\t%c X = ", char(192));		
		     PrintComplexe(x2.za,x2.zb);
        }
        else if (((x1.za!=x2.za) & (x1.zb!=x2.zb)) & ((x2.za!=(float)0) | (x2.zb!=(float)0)) & (x1.za==(float)0) & (x1.zb==(float)0))
        {
             printf("\n\n=>\t\t X = ");
		     PrintComplexe(x2.za,x2.zb);
        }
        else
        {
             printf("\n\n=>\t\t X = ");
		     PrintComplexe(x1.za,x1.zb);
        }             
        printf("\n");
    }
  
    else printf("Erreur A = B = 0!\n  Resolution Impossible\n"); /* Si a et b sont nul, l'equation ne peut etre resolu */
  
    printf("\n--------------------------------------------------------------------------------");
    printf("\n\n  Appuyez sur q pour quitter ou sur entree pour continuer ...\n\n:");
    scanf("%c",&Quite);
    scanf("%c",&Quite);
  
  } while(Quite!='q');
  printf("\n\n\n\t\t\t --- Fin du programme ---\n\n");
}
/* Fonction ResEq2Deg */
void ResEq2Deg(float a, float b, float c, float d, float e, float f)
{
  /* Variable locale */
  
  float denom, g, h, j, k, l, m, n, o, p;

  
  
  if (  ( (a==(float)0) & (b==(float)0) ) & ( (c!=(float)0) | (d!=(float)0) )  )
  { 
  	/* pour A = 0 et B =! 0, on résout de la maniere suivante: (X = -C / B)*/
    	p = (c*c) + (d*d);
	    x1.za = -( (e * c) + (f * d) ) / p;
	    x1.zb = +( (e * d) + (c * f) ) / p;
    
  }
  else if ((a!=0) | (b!=0))
  {
       /* Calcul du discriminant */
        g = c*c - d*d + 4*(b*f - a*e);
        h = 2*c*d - 4*(a*f + b*e);

        /* Calcul de la racine carré du discriminant */
        j = sqrt( (g + sqrt(g*g + h*h) )/2);
        k = sqrt((sqrt(g*g + h*h) - g)/2);
        if (2*j*k > (float)0 & h<(float)0)
                      k=-k;
        
        /* determination de x1 = (x1.za + i*x1.zb) et x2 = (x2.za + i*x2.zb) */
        p = 2*(a*a + b*b);
  
  
        l = -(a*(+j + c) + b*(k + d))/p;
        m = +(b*(+j + c) - a*(k + d))/p;
        n = +(a*(+j - c) + b*(k - d))/p;
        o = +(b*(-j + c) + a*(k - d))/p;
        x1.za = l;
        x1.zb = m;
        x2.za = n;
        x2.zb = o; 
       
  }
}

int PrintComplexe(float a, float b)
{
     if (a>0) printf("%f",a);
     if (a<0) printf(" - %f",-a);
     if ((b>0)&(b!=1)) printf(" + %fi",b);
     if ((b<0)&(b!=-1)) printf(" - %fi",-b);
     if ((b>0)&(b==1)) printf(" + i");
     if ((b<0)&(b==-1)) printf(" - i");
     if ((a==0)&(b==0)) printf("0");     
}

Conclusion :


j'espere que c'est compréhensible, dites mois ce que vous en penser...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.