Calcul d'aire: retourne 0!

Calcul d'aire: retourne 0! - C - Programmation

Marsh Posté le 25-07-2009 à 15:52:45    

Bonjour,
 
Je continue de m'exercer sur le langage C, et je me suis attaqué aux fonctions (très très simples). J'ai donc voulu essayer de créer un petit programme calculant l'aire d'un rectangle. Voici mon code:
 

Code :
  1. #include<stdio.h>
  2. double calculAire(double longueur, double largeur)
  3. {
  4. return longueur*largeur;
  5. }
  6. int main(int argc, char *argv[])
  7. {
  8. double laLongueur, laLargeur;
  9. double aire;
  10. printf("Quelle est la longueur du rectangle svp?\n" );
  11. scanf("%f",&laLongueur);
  12. printf("Quelle est la largeur du rectangle svp?\n" );
  13. scanf("%f",&laLargeur);
  14. aire = calculAire(laLongueur,laLargeur);
  15. printf("L'aire de votre rectangle est de %f.\n",aire);
  16. return 0;
  17. }


 
Curieusement (ou pas?), il me renvoie à chaque fois, que l'aire du rectangle est de 0.000000... D'où vient le problème?
 
Merci d'avance. :wahoo:

Reply

Marsh Posté le 25-07-2009 à 15:52:45   

Reply

Marsh Posté le 25-07-2009 à 18:40:05    

Vérifie le code retour de scanf(), le contenu de tes variables, et passe plutôt par fgets() + strtod()

Reply

Marsh Posté le 25-07-2009 à 18:46:56    

Pour le moment, je préfère rester avec scanf (je débute), c'est le seul moyen qu'on m'ait appris... Qu'entends-tu par "vérifier le code retour"? Et comment faire? Je ne vois vraiment pas où est le problème..

Reply

Marsh Posté le 25-07-2009 à 18:55:59    

sauf que scanf c'est pas pr les débutants. fgets+strtod
Et change de fac/ecole ...

Reply

Marsh Posté le 25-07-2009 à 19:16:39    

Euh... ok, ok, je l'ignorais. Mais malgré tout, ne pouvez-vous pas m'expliquer d'où vient le problème svp?

Reply

Marsh Posté le 25-07-2009 à 19:57:59    

Essaye avec "%lf" à la place de "%f" pour un double.

Reply

Marsh Posté le 25-07-2009 à 20:30:52    

Wyruz a écrit :

Essaye avec "%lf" à la place de "%f" pour un double.

Clair!
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-07-2009 à 20:55:11    

dj_titeuf a écrit :

Pour le moment, je préfère rester avec scanf (je débute), c'est le seul moyen qu'on m'ait appris...


Hélas, comme beaucoup trop d'écoles.
Utiliser scanf() est une très mauvaise idée : c'est une fonction de lecture formatée, et comme elle est assez complète, son utilisation en est ardue. Pas à mettre entre les mains d'un débutant.
De plus, c'est une fonction qui te servira beaucoup moins souvent que fgets(), donc il vaut mieux te familiariser avec cette méthode. :)

 

Pour plus d'information : "man fgets" en ligne de commande sur un unix, ou sinon dans google ça fonctionne aussi.

 
dj_titeuf a écrit :

Qu'entends-tu par "vérifier le code retour"? Et comment faire? Je ne vois vraiment pas où est le problème..


Le prototype de scanf() indique que cette fonction retourne un entier :

int scanf (const char *format, ...);


Voici ce que retourne la fonction scanf() :

Return Value

 

These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.

 

The value EOF is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. EOF is also returned if a read error occurs, in which case the error indicator for the stream (see ferror(3)) is set, and errno is set indicate the error.

 

Par conséquent, tester le code retour de cette fonction permet de contrôler si elle a correctement traité les instructions que tu lui as donné. Tu lui as donné 1 variable à assigner, si scanf() ne retourne pas 1, c'est qu'il y a eu un problème. ;)


Message édité par Elmoricq le 25-07-2009 à 20:56:52
Reply

Marsh Posté le 26-07-2009 à 21:22:55    

On est déjà deux à t'avoir dit de ne pas utiliser scanf dans ton dernier post. Tu lis les réponses?
Si c'est parce que tu as du mal avec fgets ou les chaînes de caractères poses tes questions.
 

Joel F a écrit :

Et change de fac/ecole ...


mmm, facile à dire. Je pense qu'au départ scanf est utilisé par pas mal de profs pour permettre aux élèves d'entrer des nombres au clavier pour tester les premiers programmes, avant d'avoir vu les tableaux, chaînes de caractères tout ça. Montrer fgets + strtol au premier cours de C à des gens qui font de l'info depuis moins d'un mois... La salle risque d'être vide au prochain cours. Que le prof explique ensuite la bonne méthode c'est sûrement plus rare. Que cette bonne méthode qui parait plus complexe soit retenue par les élèves ça l'est sans doute encore plus.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 27-07-2009 à 07:32:15    

Bah ici ca passe très bien. Peut etre parce que on est un peu plus graduel dans l'enseignement.
En gros, je leur apprends à utiliser argc/argv pour leur entrées. La on introduit strtol et ses confreres.
Plus tard, on fait les fichiers, et on fait fgets & cie. Ca passe tout seul lorque que l'on fait le pont 'I/O = fichier'


Message édité par Joel F le 27-07-2009 à 07:33:19
Reply

Marsh Posté le 27-07-2009 à 07:32:15   

Reply

Marsh Posté le 27-07-2009 à 11:30:56    

C'est plus propre en effet. Ils doivent passer moins de temps sur HFR à désapprendre ce qu'ils savent. Je retiens (même si je ne suis pas prof et que ce n'est pas prévu).


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 27-07-2009 à 12:48:55    

ptitchep a écrit :


mmm, facile à dire. Je pense qu'au départ scanf est utilisé par pas mal de profs pour permettre...


Nan hein. Soit t'es un véritable enseignant, et tu enseignes des choses qui marchent. Soit t'es un connard. Comme je ne pense pas que tant de profs que ça soient des fumistes complets, c'est bien qu'une grande partie ne connaît pas mieux que scanf. Et n'ont pas envie d'approfondir.

 

Pour avoir vécu un cours de C où la prof (agée de ~30ans) connaissant write/read mais pas les FILE*, ce genre d'enseignement, c'est super courant.

Message cité 1 fois
Message édité par Taz le 27-07-2009 à 12:49:21
Reply

Marsh Posté le 27-07-2009 à 13:21:55    

Taz a écrit :


Comme je ne pense pas que tant de profs que ça soient des fumistes complets [...] Et n'ont pas envie d'approfondir.


lol
 
Ce que je voulais dire c'est que c'est pas parce qu'un prof propose scanf que la formation est mauvaise. Je pense avoir reçu une bonne formation dans mon IUT pourtant au début du C, on a vu scanf. A mon avis une bonne formation en info c'est plus un développement de la curiosité et des capacités de recherche personnelle. Même si il est vrai qu'il faut voir la base correctement.
On a tous eu de mauvais profs, d'où l'intérêt du développement de la curiosité pour "vérifier" ce que l'on apprend. J'ai plus appris sur ce forum (que je connaissais avant) qu'en cours, mais c'est depuis les cours que je sais chercher efficacement.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 27-07-2009 à 13:28:35    

Encore deux possibilités:
- soit il a jamais fait un vrai programme, travaillé pour une entreprise et il ne se rend pas compte des dégats que font les malappris du C; de l'inconscience pure;
- soit il s'en branle "le C c'est nul (forcément je sais pas en faire), moi dans mon labo je m'éclate avec du MLbidule et je fais des additions"

Reply

Marsh Posté le 27-07-2009 à 13:45:46    

Les deux sont souvent vraies en même temps


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 27-07-2009 à 16:07:21    

dj_titeuf a écrit :

Euh... ok, ok, je l'ignorais. Mais malgré tout, ne pouvez-vous pas m'expliquer d'où vient le problème svp?


 
Il vient très certainement, comme beaucoup l'ont dit, de ta façon de saisir. Il est vrai que scanf() est souvent enseigné pour des raisons de facilité (ça permet de faire de suite des petits programmes avec des valeurs saisies) mais ça a de gros inconvénients.
Mais quand tu veux vérifier une fonction, appelle-la simplement avec des valeurs en dur

Code :
  1. printf("L'aire de votre rectangle est de %lf.\n", calculAire(12.0, 5.0));


 
Maintenant, si tu veux comprendre 1) d'où vient le problème et 2) comment y remédier, il suffit de savoir que scanf attend une entrée précise et que si ce que tu saisis ne correspond pas, scanf ne fait rien. Dans ce cas ça entraine que
1) le buffer stdin contient toujours ta saisie
2) tes variables destinées à récupérer la valeur saisie ne récupèrent rien
 
Pour y remédier, il suffit de remédier au 1. Et donc remplacer scanf("%f" ) (saisie attendant impérativement un float)  par une saisie acceptant tout => fgets. Tu stockes ensuite cette saisie dans une chaine puis tu passes cette chaine à sscanf. Soit la chaine est bien saisie et sscanf arrive à la traiter, soit elle est mal saisie et sscanf ne traite rien. Dans tous les cas elle renvoie le nombre de variables remplies.

Code :
  1. char buffer[80];
  2. double valeur;
  3. fgets(buffer, 80, stdin);
  4. if (sscanf(buffer, "%lf", &valeur) == 1)
  5. {
  6.    // Saisie ok
  7. }
  8. else
  9. {
  10.    // Erreur de saisie - Cas à gérer
  11. }


 
Ensuite tu pourras montrer ce topic à ton prof. S'il est honnête et qu'il connait le C il approfondira avec toi cette explication sur les buffers et la saisie, sinon ben on sera toujours là.


Message édité par Sve@r le 27-07-2009 à 16:21:56

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

Marsh Posté le 29-07-2009 à 08:26:03    

ptitchep a écrit :


lol
 
Ce que je voulais dire c'est que c'est pas parce qu'un prof propose scanf que la formation est mauvaise. Je pense avoir reçu une bonne formation dans mon IUT pourtant au début du C, on a vu scanf. A mon avis une bonne formation en info c'est plus un développement de la curiosité et des capacités de recherche personnelle. Même si il est vrai qu'il faut voir la base correctement.
On a tous eu de mauvais profs, d'où l'intérêt du développement de la curiosité pour "vérifier" ce que l'on apprend. J'ai plus appris sur ce forum (que je connaissais avant) qu'en cours, mais c'est depuis les cours que je sais chercher efficacement.


Oui et non. En  maths, on apprend dès le début des concepts rigoureux, corps, anneaux, etc, même si ça ne sert pas forcément tous les jours. Je ne vois pas pourquoi l'enseignement en informatique ne devrait pas être aussi rigoureux. Ca fait partie de la formation de l'esprit. Parce qu'ensuite, on voit trop souvent des codeurs qui écrivent vraiment n'importe quoi et trouvent que c'est normal.


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

Marsh Posté le 29-07-2009 à 11:33:40    

c'est %f pour printf pour les float et les double.
mais pour scanf, c'est %f pour les float et %lf pour les doubles.

Reply

Marsh Posté le 29-07-2009 à 13:29:47    

el muchacho a écrit :


Oui et non. En  maths, on apprend dès le début des concepts rigoureux, corps, anneaux, etc, même si ça ne sert pas forcément tous les jours. Je ne vois pas pourquoi l'enseignement en informatique ne devrait pas être aussi rigoureux. Ca fait partie de la formation de l'esprit. Parce qu'ensuite, on voit trop souvent des codeurs qui écrivent vraiment n'importe quoi et trouvent que c'est normal.


Non.
Au tout début de l'apprentissage des math, tu as dû apprendre que 2-3 était impossible ce qui est faux. Ensuite tu as du apprendre que le carré d'un nombre est TOUJOURS positif; quelques années plus tard i²=-1. Je ne vais pas citer tous les exemples, combien de fois ton prof de math t'as dit: "Vous verrez plus tard que ça c'est faux"? Est-ce que tu remets en cause toute ta formation mathématique?
Je ne dis pas qu'il faut apprendre avec scanf, seulement que ce n'est pas pour ça qu'il faut mettre toute la fac/école à la poubelle. Des profs sont bons d'autres moins, certains sont complètement nuls mais toutes ces espèces peuvent cohabiter dans le même établissement.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 29-07-2009 à 17:01:17    

ptitchep a écrit :


Non.
Au tout début de l'apprentissage des math, tu as dû apprendre que 2-3 était impossible ce qui est faux. Ensuite tu as du apprendre que le carré d'un nombre est TOUJOURS positif; quelques années plus tard i²=-1. Je ne vais pas citer tous les exemples, combien de fois ton prof de math t'as dit: "Vous verrez plus tard que ça c'est faux"? Est-ce que tu remets en cause toute ta formation mathématique?
Je ne dis pas qu'il faut apprendre avec scanf, seulement que ce n'est pas pour ça qu'il faut mettre toute la fac/école à la poubelle. Des profs sont bons d'autres moins, certains sont complètement nuls mais toutes ces espèces peuvent cohabiter dans le même établissement.

Dès que tu tombes sur un prof de maths (on ne parle pas de l'enseignement primaire), très vite il t'enseigne que telle règle est valables avec tels nombres dans tel domaine. Par exemple, le recorde de France de points perdus doit certainement être détenu par "ce polynôme n'accepte pas de racines" ... "réelles" (4ème/3ème).

 

La science c'est ça, c'est une question de domaine. Einstein étend Newton mais le ne contredit pas. 2-3 ça le fait pas sur N, mais sur Z c'est valide. etc.

 

Mais par contre scanf, dans tous les cas, c'est mauvais.
Le temps que tu peux perdre en TP parce que t'y comprends rien et que ton enchaînement de scanf marche pas (c'est quoi c'est putain de retour charriots !), etc.

 

Un prof de C qui t'enseigne scanf, c'est pas un prof de C.

Message cité 1 fois
Message édité par Taz le 29-07-2009 à 17:01:29
Reply

Marsh Posté le 29-07-2009 à 18:16:23    

Taz a écrit :

Un prof de C qui t'enseigne scanf, c'est pas un prof de C.


Nous sommes d'accord.

Taz a écrit :

Mais par contre scanf, dans tous les cas, c'est mauvais.


Même si j'ai redéfini l'entrée standard et que je sais ce qui y arrive par exemple? Je ne m'en suis jamais servi mais je pensais que c'était à ça que ça servait.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 30-07-2009 à 15:04:50    

scanf/fscanf, même combat: en cas d'erreur (données inattendue, E/S, etc) c'est bien le bordel à récupérer.

Reply

Marsh Posté le 30-07-2009 à 20:28:36    

ptitchep a écrit :


Non.
Au tout début de l'apprentissage des math, tu as dû apprendre que 2-3 était impossible ce qui est faux. Ensuite tu as du apprendre que le carré d'un nombre est TOUJOURS positif; quelques années plus tard i²=-1. Je ne vais pas citer tous les exemples, combien de fois ton prof de math t'as dit: "Vous verrez plus tard que ça c'est faux"? Est-ce que tu remets en cause toute ta formation mathématique?
Je ne dis pas qu'il faut apprendre avec scanf, seulement que ce n'est pas pour ça qu'il faut mettre toute la fac/école à la poubelle. Des profs sont bons d'autres moins, certains sont complètement nuls mais toutes ces espèces peuvent cohabiter dans le même établissement.


 
C'est le cas de tout apprentissage. L'esprit humain ne peut progresser qu'en détruisant (en partie) ce qui a été appris avant.
Au début, on voit le soleil tourner autour de la Terre. On en déduis que le soleil tourne autour de la Terre
Puis, on évolue et on apprend en fait que c'est la Terre qui tourne autour du soleil.
Puis on apprend qu'un nombre sert à dénombrer les choses
Puis on évolue et cette connaissance se révèle fausse car on a aussi les nombres négatifs qui ne dénombrent rien de concret.
Puis on apprend qu'un carré est toujours positif
Puis cette connaissance se révèle fausse car on a i² = -1
Puis on apprend à calculer des vitesses relatives en les additionnant ou les soustrayant par rapport à la vitesse du référentiel
Puis on apprend que la relativité générale démontre que les vitesses ne s'additionnent pas.
 
etc etc. Et on en arrive à l'apprentissage du C où il faut commencer rapidement à écrire quelques codes avec saisies/affichage. On apprend donc qu'il faut utiliser scanf/printf.
Puis on évolue dans l'apprentissage de ce langage et on apprend alors qu'il ne faut pas utiliser scanf mais passer par une méthode plus rigoureuse.
 
Et ainsi de suite. On ne peut pas blâmer le prof d'avoir, pour simplifier et couper à une explication difficile et peut-être impossible vu les connaissances de ses élèves, indiqué de passer par scanf(). Mais on espère qu'ensuite il reviendra sur cette partie...
 

el muchacho a écrit :


Oui et non. En  maths, on apprend dès le début des concepts rigoureux, corps, anneaux, etc,


Dès le début ??? Ca dépend la branche et le besoin. Personnellement j'ai jamais vu ces items. Moi j'étais plutôt du coté des lois de Poisson, des calculs de graphe et de l'arithmétique du modulo...

Message cité 2 fois
Message édité par Sve@r le 30-07-2009 à 20:39:14

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

Marsh Posté le 31-07-2009 à 15:19:29    

Sve@r a écrit :


Mais on espère qu'ensuite il reviendra sur cette partie...


 
C'est surtout ca qu'il ne font jamais en fait :/

Reply

Marsh Posté le 31-07-2009 à 16:31:00    


 

Sve@r a écrit :


Dès le début ??? Ca dépend la branche et le besoin. Personnellement j'ai jamais vu ces items. Moi j'étais plutôt du coté des lois de Poisson, des calculs de graphe et de l'arithmétique du modulo...


 
M12 , 1ere année-1er semestre de DEUG-A. C'était assez obscur venant de la terminale ^^
 
Sinon pour l'utilisation de fgets + sscanf plutôt que scanf  :jap: (j'ai pourtant appris à mes dépends avec des scanf).

Reply

Marsh Posté le 31-07-2009 à 17:27:29    

Joel F a écrit :


 
C'est surtout ca qu'il ne font jamais en fait :/


Oui il a fallu que ce soit mon prof de C++ qui m'explique ça, cherchez l'erreur.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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