Trouve pas l'erreur (Calcul de Rho) + Erreur dans triage - C - Programmation
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 : |
Marsh Posté le 10-10-2005 à 20:12:39
Joel F a écrit : et l'erreur c'est quoi |
Ben j'en vois, pas pourtant ca fonctionne pas, en testant avec des valeurs j'ai du n'importe quoi
Marsh Posté le 10-10-2005 à 20:30:23
Citation : void main (void) |
main() retourne toujours un int, donc : int main(void)
Citation : printf("Entrer la valeur de a: " ); |
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 : |
C'est le même test.
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)
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.
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.
Marsh Posté le 10-10-2005 à 21:22:20
Juste, merci beaucoup
Citation : |
J'obtiens donc, ca
Marsh Posté le 10-10-2005 à 22:52:22
J'ai corrigé l'autre
Enfin trouvé
Citation : |
Marsh Posté le 11-10-2005 à 08:19:38
Non, tu n'as pas lu mon message. Voir ci-dessus.
Marsh Posté le 11-10-2005 à 16:58:24
Citation : |
Je vois pas comment je pourrais faire d'autre avec mes connaissances actuelles
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)
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
Le prof nous a dit de toujours mettre
Citation : void main (void) |
...
Marsh Posté le 11-10-2005 à 18:09:33
ReplyMarsh Posté le 11-10-2005 à 18:19:09
Joel F a écrit : Ecris une lettre au rectorat/doyen d'academie et demande son licensiement |
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.
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 ??
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 :-)
Marsh Posté le 11-10-2005 à 20:07:53
Qu'on lui fasse bouffer ses tripes.
Spoiler : |
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...
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.
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.
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> |
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 !=
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
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
Marsh Posté le 11-10-2005 à 20:29:20
Citation : |
Citation : |
Ces deux représentations sont-elles justes maintenant? (juste pour voir si j'ai compris)
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.
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
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...
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
Marsh Posté le 11-10-2005 à 21:03:41
donc c'est bon, tu as réussi à faire ton Rho ?
Marsh Posté le 11-10-2005 à 21:06:40
Reply
Marsh Posté le 10-10-2005 à 20:08:56
Bonjour à tous,
J'ai réalisé ce programme.
#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