Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2720 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1219889
Profil sup​primé
Posté le 10-10-2005 à 20:08:56  answer
 

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
mood
Publicité
Posté le 10-10-2005 à 20:08:56  profilanswer
 

n°1219890
Joel F
Real men use unique_ptr
Posté le 10-10-2005 à 20:10:38  profilanswer
 

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

n°1219891
Profil sup​primé
Posté le 10-10-2005 à 20:11:15  answer
 

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
n°1219892
Profil sup​primé
Posté le 10-10-2005 à 20:12:39  answer
 

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 :/

n°1219901
Elmoricq
Modérateur
Posté le 10-10-2005 à 20:30:23  profilanswer
 

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
n°1219905
Profil sup​primé
Posté le 10-10-2005 à 20:33:46  answer
 

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. :/

n°1219940
el muchach​o
Comfortably Numb
Posté le 10-10-2005 à 21:17:33  profilanswer
 


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
n°1219950
Profil sup​primé
Posté le 10-10-2005 à 21:22:20  answer
 

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
n°1220048
Profil sup​primé
Posté le 10-10-2005 à 22:52:22  answer
 

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" );
 
}

n°1220126
el muchach​o
Comfortably Numb
Posté le 11-10-2005 à 08:19:38  profilanswer
 


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
mood
Publicité
Posté le 11-10-2005 à 08:19:38  profilanswer
 

n°1220566
Profil sup​primé
Posté le 11-10-2005 à 16:58:24  answer
 

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
n°1220587
Elmoricq
Modérateur
Posté le 11-10-2005 à 17:14:20  profilanswer
 


 
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
n°1220625
Profil sup​primé
Posté le 11-10-2005 à 18:03:29  answer
 

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)

...

n°1220634
Joel F
Real men use unique_ptr
Posté le 11-10-2005 à 18:09:33  profilanswer
 


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

n°1220637
Profil sup​primé
Posté le 11-10-2005 à 18:19:09  answer
 

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.

n°1220723
el muchach​o
Comfortably Numb
Posté le 11-10-2005 à 19:58:00  profilanswer
 

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
n°1220725
Profil sup​primé
Posté le 11-10-2005 à 19:59:01  answer
 

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 :-)

n°1220731
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-10-2005 à 20:07:53  profilanswer
 


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/
n°1220736
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-10-2005 à 20:14:15  profilanswer
 


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/
n°1220737
el muchach​o
Comfortably Numb
Posté le 11-10-2005 à 20:14:49  profilanswer
 

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
n°1220738
Elmoricq
Modérateur
Posté le 11-10-2005 à 20:16:58  profilanswer
 


 
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
n°1220740
Profil sup​primé
Posté le 11-10-2005 à 20:20:47  answer
 

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

n°1220741
Profil sup​primé
Posté le 11-10-2005 à 20:22:00  answer
 

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 :/

n°1220745
Profil sup​primé
Posté le 11-10-2005 à 20:29:20  answer
 

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
n°1220749
Elmoricq
Modérateur
Posté le 11-10-2005 à 20:32:29  profilanswer
 

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

n°1220750
Profil sup​primé
Posté le 11-10-2005 à 20:34:03  answer
 

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

n°1220765
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-10-2005 à 20:48:47  profilanswer
 


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/
n°1220770
Profil sup​primé
Posté le 11-10-2005 à 20:52:56  answer
 

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

n°1220773
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 11-10-2005 à 21:03:41  profilanswer
 


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


---------------
J'ai un string dans l'array (Paris Hilton)
n°1220774
Elmoricq
Modérateur
Posté le 11-10-2005 à 21:06:40  profilanswer
 

Harkonnen a écrit :

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


 
 [:taiche]

n°1220976
blackgodde​ss
vive le troll !
Posté le 12-10-2005 à 09:38:12  profilanswer
 


 
Au bûcher :o


---------------
-( BlackGoddess )-
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Erreur Incomprise ...Erreur de syntax...
Eclipse ne trouve pas mon API JavaCommandes DOS / Retour du FIND / non trouvé
préchargement en CSS pour roll over (trouvé)[SQL] Erreur #306 sur Requete comparant 2 mémo ! Help plz
Erreur objet...erreur de compilation en c++(Devcpp):no such file or directory
message d'erreur lors de ma connection à MySQL via PhpMyAdminenvoyer image de userfrom vers feuille de calcul
Plus de sujets relatifs à : Trouve pas l'erreur (Calcul de Rho) + Erreur dans triage


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR