Equation du 2nd degrée dans c

Soyez le premier à donner votre avis sur cette source.

Vue 8 953 fois - Téléchargée 317 fois

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

Ajouter un commentaire

Commentaires

Messages postés
132
Date d'inscription
mercredi 12 juin 2002
Statut
Membre
Dernière intervention
26 janvier 2006

Oui, désolé j'avais pas trop fait attention...
A+
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
pcman5, faudra éviter à l'avenir ce qui est déjà en de nombreux exemplaires.
On conservera donc pour les complexes.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Oui lol, une fois de plus, un programme de résolution du second degré.

Mais au moins, celui ci change un peu pour une fois. Il gère les complexes.
Messages postés
780
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 avril 2009
1
Trop c'est trop, voilà ce que je pense en voyant ta source.

Les exercices persos c'est bien, mais blinder les serveurs CodeS-SourceS avec des sources inutiles (car clonés de nombreuses fois) c'est mal.

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.