Trouve pas l'erreur (Calcul de Rho) + Erreur dans triage

Trouve pas l'erreur (Calcul de Rho) + Erreur dans triage - C - Programmation

Marsh Posté le 10-10-2005 à 20:08:56    

Bonjour à tous,
 
J'ai réalisé ce programme.
 

Citation :


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void main (void)
 
{
 float a,b,c,r,x1,x2,x3;
 
 printf("Coefficient du carre: " );
 scanf("%d", &a);
 printf("\nCoefficient du x: " );
 scanf("%d", &b);
 printf("\nTerme independant: " );
 scanf("%d", &c);
 
 r=(b*b)-(4*a*c);
 
 if (r<0) printf("\nImpossible\n" );
  else if (r=0) {
      x1=(-b)/(2*a);
      printf("\nIl n'y a qu'une racine et c'est: %f\n",x1);
      }
   else
      x2=(-b+sqrt(r))/(2*a);
      x3=(-b-sqrt(r))/(2*a);
 
      printf("\nLa premiere racine est: %f\n",x2);
      printf("\nLa deuxieme racine est: %f\n",x3);
     
 
 system("pause" );
 
}


 
J'apprends le C @School, mais là je sèche.


Message édité par Profil supprimé le 10-10-2005 à 20:12:10
Reply

Marsh Posté le 10-10-2005 à 20:08:56   

Reply

Marsh Posté le 10-10-2005 à 20:10:38    

et l'erreur c'est quoi [:daw]

Reply

Marsh Posté le 10-10-2005 à 20:11:15    

Tant qu'à faire je me posais aussi une autre question, j'ai pas l'ordre croissant quand b<c<a et quand c<a<b
Sinon pour le reste c'est bon
 

Citation :


#include <stdio.h>
#include <stdlib.h>
 
void main (void)
 
{
 
 //Afficher a,b,c dans l'ordre croissant
 
 int a,b,c;
 
 printf("Entrer la valeur de a: " );
 scanf("%d", &a);
 printf("\nEntrer la valeur de b: " );
 scanf("%d", &b);
 printf("\nEntrer la valeur de c: " );
 scanf("%d", &c);
 
 if(a<b) {
    if(b<c)printf("\n%d<%d<%d\n", a,b,c);
     else if (c<b.) printf("\n%d<%d<%d\n", a,c,b);
      else printf("\n%d<%d<%d\n", c,a,b);
   }
 
 else {  
    if(a<c) printf("\n%d<%d<%d\n", b,a,c);
     else if (c>a) printf("\n%d<%d<%d\n", b,c,a);
      else printf("\n%d<%d<%d\n", c,b,a);
  }
   
 
 system("pause" );
 
}


Message édité par Profil supprimé le 10-10-2005 à 20:13:02
Reply

Marsh Posté le 10-10-2005 à 20:12:39    

Joel F a écrit :

et l'erreur c'est quoi [:daw]


 
Ben j'en vois, pas pourtant ca fonctionne pas, en testant avec des valeurs j'ai du n'importe quoi :/

Reply

Marsh Posté le 10-10-2005 à 20:30:23    

Citation :

void main (void)


 
 [:kzimir]  
 
main() retourne toujours un int, donc : int main(void)
 
 

Citation :

printf("Entrer la valeur de a: " );
 scanf("%d", &a);
 printf("\nEntrer la valeur de b: " );
 scanf("%d", &b);
 printf("\nEntrer la valeur de c: " );
 scanf("%d", &c);


 
C'est généralement une mauvaise idée d'utiliser scanf(), quand on n'en connait pas exactement l'usage. C'est une fonction loin d'être triviale à utiliser.
Soit tu blindes le scanf() pour être sûr de récupérer un entier, soit tu testes son retour, soit tu utilises fgets() + strtol() pour la saisie d'un entier.
 
 

Citation :


if(a<c)...
   else if (c>a)


 
C'est le même test.  [:petrus75]
 
EDIT : et pour ce que tu fais y a plus chouette comme méthode que tes if{} imbriqués qui sont difficiles à comprendre (la preuve)


Message édité par Elmoricq le 10-10-2005 à 20:37:15
Reply

Marsh Posté le 10-10-2005 à 20:33:46    

Ah vui j'avais pas vu le même test :)
Je connais pas le fgets et compagnie, j'ai commencé le C y'a 2 semaines, donc je débute à mort. :/

Reply

Marsh Posté le 10-10-2005 à 21:17:33    


Si tu fais du calcul numérique avec des float/double :
1. les constantes s'écrivent avec des . et éventuellement le suffixe f. Donc "x1=(-b)/(2*a)" doit s'écrire : "x1=(-b)/(2.0f*a)"
2. "if (r=0)" contient 2 erreurs :  
    - l'une classique du débutant est l'assignation au lieu de la comparaison : tu aurais dû écrire if (r == 0.0f) et ton compilo te l'aurait probablement signalé si tu avais mis les warnings. C'est la raison de ton n'importe quoi.
    - l'autre est que de toute façon, une telle comparaison reste interdite avec des float/double à cause des erreurs d'approximation numérique : il faut définir un intervalle de confiance epsilon et faire: if fabs(r - 0.0f)  < epsilon.


Message édité par el muchacho le 10-10-2005 à 21:18:38

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 10-10-2005 à 21:22:20    

Juste, merci beaucoup :)
 

Citation :


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void main (void)
 
{
 float a,b,c,r,x1,x2,x3;
 
 printf("Coefficient du carre: " );
 scanf("%f", &a);
 printf("\nCoefficient du x: " );
 scanf("%f", &b);
 printf("\nTerme independant: " );
 scanf("%f", &c);
 
 r=(b*b)-(4*a*c);
 
 if (r<0) printf("\nImpossible\n" );
  else if (r==0) {
      x1=(-b)/(2.0f*a);
      printf("\nIl n'y a qu'une racine et c'est: %0.2f\n",x1);
      }
   else {
      x2=(-b+sqrt(r))/(2.0f*a);
      x3=(-b-sqrt(r))/(2.0f*a);
 
      printf("\nLa premiere racine est: %0.2f\n",x2);
      printf("\nLa deuxieme racine est: %0.2f\n",x3);
    }  
 
 system("pause" );
 
}


 
J'obtiens donc, ca :)

Message cité 1 fois
Message édité par Profil supprimé le 10-10-2005 à 22:26:43
Reply

Marsh Posté le 10-10-2005 à 22:52:22    

J'ai corrigé l'autre :p
Enfin trouvé :p
 

Citation :


#include <stdio.h>
#include <stdlib.h>
 
void main (void)
 
{
 
 //Afficher a,b,c dans l'ordre croissant
 
 int a,b,c;
 
 printf("Entrer la valeur de a: " );
 scanf("%d", &a);
 printf("\nEntrer la valeur de b: " );
 scanf("%d", &b);
 printf("\nEntrer la valeur de c: " );
 scanf("%d", &c);
 
 if (a <= b) {  
   if (b <= c) printf("\n%d<%d<%d\n", a, b, c);  
    else if (a <= c) printf("\n%d<%d<%d\n", a, c, b);  
     else printf("\n%d<%d<%d\n", c, a, b);
    }
 
 else {  
    if(a<=c) printf("\n%d<%d<%d\n", b,a,c);
     else if (b<=c) printf("\n%d<%d<%d\n", b,c,a);
      else printf("\n%d<%d<%d\n", c,b,a);
  }
   
 
 system("pause" );
 
}

Reply

Marsh Posté le 11-10-2005 à 08:19:38    


Non, tu n'as pas lu mon message. Voir ci-dessus.


Message édité par el muchacho le 11-10-2005 à 08:24:25

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 11-10-2005 à 08:19:38   

Reply

Marsh Posté le 11-10-2005 à 16:58:24    

Citation :


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void main (void)
 
{
 float a,b,c,r,res1,res2,res3,x;
 int p;
 
 printf("Coefficient du carre: " );
 scanf("%f", &a);
 printf("\nCoefficient du x: " );
 scanf("%f", &b);
 printf("\nTerme independant: " );
 scanf("%f", &c);
 
 printf("\nQuelle precision voulez-vous apres la virgule?: " );
 scanf("%d", &p);
 
 if (a==0) {
    x=(-c/b);
    printf("\nx=%.*f\n\n",p, x);
 }
 
 
 else {  
  r=(b*b)-(4*a*c);
   
  if (r<0)  printf("\nImpossible\n" );
     
   else if (r==0) {
      res1=(-b)/(2*a);
      printf("\nIl n'y a qu'une racine et c'est: %.*f\n\n",p,res1);
      }
    else {
      r=sqrt(r);
      res2=(-b+r)/(2*a);
      res3=(-b-r)/(2*a);
 
      printf("\nLa premiere racine est: %.*f\n\n",p,res2);
      printf("\nLa deuxieme racine est: %.*f\n\n",p,res3);
    }  
 }
 system("pause" );
 
}


 
Je vois pas comment je pourrais faire d'autre avec mes connaissances actuelles :/

Message cité 1 fois
Message édité par Profil supprimé le 11-10-2005 à 16:59:24
Reply

Marsh Posté le 11-10-2005 à 17:14:20    


 
Comme l'a dit el_muchacho, on ne doit pas tester un nombre flottant directement.
 
Il faut utiliser les constantes FLT_EPSILON pour les float, et DBL_EPSILON pour les double. Ces constantes sont définies dans float.h.
 
Ainsi, "if (r==0)" devient :

if ( abs(r) <= FLT_EPSILON )


 
 
 
EDIT : en plus je t'ai dit que c'était int main(void), et pas void main (void)  :fou:


Message édité par Elmoricq le 11-10-2005 à 17:17:40
Reply

Marsh Posté le 11-10-2005 à 18:03:29    

Ca je suis tout à fait d'accord, mais je n'ai pas encore vu ces notions au cours, donc je réalise les exercices en fonction de ce que j'ai vu, pas trop envie de mettre des trucs que je comprends pas, si le prof me demande pourquoi je fais ca :p
 
Le prof nous a dit de toujours mettre

Citation :

void main (void)

...

Reply

Marsh Posté le 11-10-2005 à 18:09:33    


 
Ecris une lettre au rectorat/doyen d'academie et demande son licensiement :o

Reply

Marsh Posté le 11-10-2005 à 18:19:09    

Joel F a écrit :

Ecris une lettre au rectorat/doyen d'academie et demande son licensiement :o


 
 
ROFL, d'accord :)
 
Donc pour résumer c'est mieux de mettre int main (void)
 
 
Mais pour le epsilon, ca m'échappe un peu donc je laisse tomber pour le moment.

Reply

Marsh Posté le 11-10-2005 à 19:58:00    

Tu n'as pas eu un cours sur la représentation des nombres en mémoire ??


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 11-10-2005 à 19:59:01    

el muchacho a écrit :

Tu n'as pas eu un cours sur la représentation des nombres en mémoire ??


 
Si, mais le prof a jamais parlé de cette manip :-)

Reply

Marsh Posté le 11-10-2005 à 20:07:53    


Qu'on lui fasse bouffer ses tripes.

Spoiler :

http://www.yannchollet.com/images%20porcs/etripe11.jpg


Message édité par Emmanuel Delahaye le 11-10-2005 à 20:13:16

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-10-2005 à 20:14:15    


C'est simple. La représentation mémoire des nombres flottants autorise une grande plage de valeur, mais le prix à payer est la perte de précision. On ne peut donc pas utiliser '==' pour comparer des flottants. On utilise '-' et on regarde si <edit>la valeur absolue du</edit> résultat est < FLT_EPLSILON ou DBL_EPSILON selon le type. xxx_EPSILON est la plus petite valeur significative pour un type donné. Elle est définie dans <float.h>
 
C'est pas dans la FAQ ? Ca devrait...


Message édité par Emmanuel Delahaye le 12-10-2005 à 09:41:17

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-10-2005 à 20:14:49    

Ben si tu lisais sérieusement ton cours, tu comprendrais pourquoi il n'y a aucune raison que la représentation  de B^2-4AC tombe exactement sur 0.0f alors que A, B, C sont des floats qui ne sont pas eux-mêmes des représentations exactes de rationnels.

Message cité 1 fois
Message édité par el muchacho le 11-10-2005 à 20:16:33

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 11-10-2005 à 20:16:58    


 
Non, ce n'est pas "mieux", c'est la norme, il a deux manières de déclarer main() :
 

int main (void)


 
ou
 

int main (int argc, char **argv)


 
Si ton prof te dit "void main (void)", alors achète-toi un livre, tu apprendras mieux. :o
 
 
 
 
Le problème est que ton nombre flottant est stocké en interne en base 2, alors que nous on le voit en base 10.
 
T'as l'impression que 0.01 ça tombe juste ?
 
Essaie ce ridicule petit programme, qui affiche 0.01 avec 10 chiffres après la virgule :

#include <stdio.h>
 
int main(void)  
{
    printf("%.10f\\n", .01f);
   
    return 0;
}


 
:o
 
Bref, comme les flottants ne sont pas représentés de manière exacte, il faut travailler dans l'inexactitude.
Ainsi, on ne compare pas "strictement égal", mais "quasiment égal, à DBL_EPSILON près" (ou FLT_EPSILON, en fonction du type de donnée sur lequel on travaille).
 
DBL_EPSILON (et FLT_EPSILON) sont en fait définis pour représenter cette petite marge d'inexactitude.
 
Et c'est pourquoi on ne teste jamais un flottant avec == ou !=


Message édité par Elmoricq le 11-10-2005 à 20:34:56
Reply

Marsh Posté le 11-10-2005 à 20:20:47    

Waow, Merci beaucoup pour ce petit complément, je ne manquerai pas de m'appliquer à l'utiliser correctement dorénavant.
 
Ca fait plaisir de voir que les gens consacrent du temps à aider les autres.
 
Merci

Reply

Marsh Posté le 11-10-2005 à 20:22:00    

el muchacho a écrit :

Ben si tu lisais sérieusement ton cours, tu comprendrais pourquoi il n'y a aucune raison que la représentation  de B^2-4AC tombe exactement sur 0.0f alors que A, B, C sont des floats qui ne sont pas eux-mêmes des représentations exactes de rationnels.


 
Y'a po ca dans mon cours n'empêche :/

Reply

Marsh Posté le 11-10-2005 à 20:29:20    

Citation :


#include <float.h>
[bla bla bla]
int main (void)
[bla bla bla]
if ( abs(r) <= FLT_EPSILON )


 

Citation :


#include <float.h>
[bla bla bla]
int main (void)
[bla bla bla]
if abs ( r-0 <= FLT_EPSILON )


 
Ces deux représentations sont-elles justes maintenant? (juste pour voir si j'ai compris)


Message édité par Profil supprimé le 11-10-2005 à 20:29:33
Reply

Marsh Posté le 11-10-2005 à 20:32:29    

r - 0 c'est r, mais c'est le principe.
 
Par contre la parenthèse fermante de abs() est mal placée. :o

Reply

Marsh Posté le 11-10-2005 à 20:34:03    

Ah vui :)
 
J'ai vu aujourd'hui que le zéro n'était pas nécessaire dans ce genre de cas :p

Reply

Marsh Posté le 11-10-2005 à 20:48:47    


Ca fait surtout mal au coeur de constater qu'il y a autant de profs foireux...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-10-2005 à 20:52:56    

Emmanuel Delahaye a écrit :

Ca fait surtout mal au coeur de constater qu'il y a autant de profs foireux...


 
En tout cas je prends bonne note de vos critiques, l'important c'est d'apprendre :p

Reply

Marsh Posté le 11-10-2005 à 21:03:41    


donc c'est bon, tu as réussi à faire ton Rho ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-10-2005 à 21:06:40    

Harkonnen a écrit :

donc c'est bon, tu as réussi à faire ton Rho ?


 
 [:taiche]

Reply

Marsh Posté le 12-10-2005 à 09:38:12    


 
Au bûcher :o


---------------
-( BlackGoddess )-
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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