[C] programme cherche les racines des polynomes

programme cherche les racines des polynomes [C] - C - Programmation

Marsh Posté le 16-10-2011 à 16:09:35    

Salut,
 
voila je débute en C et j'ai essayer de faire pour m'amuser (je sais qu'il y a plus ludique mais bon) un programme qui trouverais la valeur des racines qui annule un polynôme du second degrés.
J'ai déjà écrit une bonne partie du code sous code blocks j'ai choisi comme type de projet console application (je sais pas si cette précision est pertinente)  
 
voici mon code

Code :
  1. #include<stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.     int a = 0;
  5.     int b = 0;
  6.     int c = 0;
  7.     int delta = 0;
  8.     int x1 = 0;
  9.     int x2 = 0;
  10.     #define quatre = 4
  11.     #define j = 'j'
  12. // on demande les coefs pour delta
  13.     printf("entrez A : " );
  14.     scanf("%d",a);
  15.     printf("entrez B : " );
  16.     scanf("%d",b);
  17.     printf("entrez C : " );
  18.     scanf("%d",c);
  19. // on calcule delta
  20.     delta=(b*b)-4*a*c;
  21. // on fait une boucle pour chercher les racines
  22.     if(delta=0)
  23.     {
  24.         x1=(-b)/(2*a);
  25.         x2=(-b)/(2*a);
  26.     }
  27.     else if(delta>0)
  28.     {
  29.         x1=((-b)+sqrt(delta))/(2*a);
  30.         x2=((-b)-sqrt(delta))/(2*a);
  31.    }
  32.    else if(delta<0)
  33.    {
  34.        x1=(-b)/(2*a) + sqrt(fabs(delta))/(2*a);
  35.        x2=(-b)/(2*a) - sqrt(fabs(delta))/(2*a);
  36.    }
  37.    printf("les racines sont \n X1 = %d \n X2 = %d \n", x1,x2 );
  38.    return 0;
  39. }

 
 
mais voila quand je le compile et l’exécute grâce au bouton prévus par code blocks , la console me demande d'entrer A ce que je fait puis mon programme crash quelqu'un a une idée?
 
merci d'avance

Reply

Marsh Posté le 16-10-2011 à 16:09:35   

Reply

Marsh Posté le 16-10-2011 à 16:18:09    

 printf("entrez A : " );
    scanf("%d",a);
    printf("entrez B : " );
    scanf("%d",b);
    printf("entrez C : " );
    scanf("%d",c);
 
C'est faux:
 
  printf("entrez A : " );
    scanf("%d",&a);
    printf("entrez B : " );
    scanf("%d",&b);
    printf("entrez C : " );
    scanf("%d",&c);
 
Devrait mieux marcher


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 16-10-2011 à 21:08:17    

oui merci beaucoup  
 
pour mon next problème c'est que j'aimerais avoir la valeur exacte des racine j'ai donc passer x1 x2 et delta en float mais ca me donne des valeurs aberrante  
 
et ma deuxieme question c'est que parfois je ne peux pas utiliser le debugger de code blocks tout est griser pourquoi ?  
 
merci d'avance

Reply

Marsh Posté le 17-10-2011 à 00:40:38    

poneyz a écrit :

pour mon next problème c'est que j'aimerais avoir la valeur exacte des racine j'ai donc passer x1 x2 et delta en float mais ca me donne des valeurs aberrante  
 

Code :
  1. x1=(-b)/(2*a);
  2. x2=(-b)/(2*a);

 


Salut
 
Le problème, c'est que le calcul se fait dans la précision de l'opérande le plus large impliqué. Or a et b étant des int, le calcul se fait en int et le résultat (entier) est ensuite copié dans x1 et x2 mais c'est trop tard, tu as déjà perdu les décimales

Code :
  1. x1=(-b)/(2.0*a);
  2. x1=(-b)/(2.0*a);

 
Avec un double impliqué (2.0), le calcul se fera en précision double.
 
Attention, il faut bien comprendre que le calcul se fait avec la précision des opérandes strictement impliqués par chaque opération et non dans la précision de l'opérande le plus large qu'on peut trouver dans le calcul. Exemple

Code :
  1. float f=5 / 2 + 3.0


La division étant prioritaire, le premier calcul sera 5/2 et se fera donc en précision int (le 3.0 n'étant pas impliqué ne sera pas pris en compte). Le résultat sera alors en int (2) et sera ensuite additionné à 3.0 pour donner 5.0 ce qui ne correspond pas au résultat espéré (5.5)
 

poneyz a écrit :

et ma deuxieme question c'est que parfois je ne peux pas utiliser le debugger de code blocks tout est griser pourquoi ?


Alors là...
 
PS: inutile de passer par fabs() quand delta < 0. Puisque delta est <0, te suffit de prendre -delta. Plus rapide quoi. Toutefois, dans ce cas là, le polynôme n'a pas de racine réelle donc ce que tu affiches est faux...


Message édité par Sve@r le 17-10-2011 à 00:48:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 17-10-2011 à 11:56:16    

Salut,
 
merci beaucoups pour toute ces précision je comprend mieux maintenant merci encore  
 
PS si tu veux dire que pour le delta <0 les racines sont complexe je le savais mais j ai juste voulu voir si ça marchais je rajouterais le j après.
 il manque encore pas mal de truc nottament vérifier que la saissi par l utilisateur de a b et c soient bien des nombres et non des lettres
 

Reply

Marsh Posté le 17-10-2011 à 21:30:06    

poneyz a écrit :

il manque encore pas mal de truc nottament vérifier que la saissi par l utilisateur de a b et c soient bien des nombres et non des lettres


Code :
  1. char saisie[80];
  2. int nb;
  3. while (1)
  4. {
  5.     printf("Saisissez un nombre: " ), fflush(stdout);
  6.     fgets(saisie, 80, stdin);
  7.     if (sscanf(saisie, "%d", &nb) == 1) break;
  8.     printf("Saisie erronée, %s n'est pas un nombre - Recommencez\n", saisie);
  9. }


 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed