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

  FORUM HardWare.fr
  Programmation
  C

  Calcul d'aire: retourne 0!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Calcul d'aire: retourne 0!

n°1908529
dj_titeuf
Posté le 25-07-2009 à 15:52:45  profilanswer
 

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:

mood
Publicité
Posté le 25-07-2009 à 15:52:45  profilanswer
 

n°1908544
Elmoricq
Modérateur
Posté le 25-07-2009 à 18:40:05  profilanswer
 

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

n°1908546
dj_titeuf
Posté le 25-07-2009 à 18:46:56  profilanswer
 

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

n°1908547
Joel F
Real men use unique_ptr
Posté le 25-07-2009 à 18:55:59  profilanswer
 

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

n°1908550
dj_titeuf
Posté le 25-07-2009 à 19:16:39  profilanswer
 

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

n°1908555
Wyruz
Posté le 25-07-2009 à 19:57:59  profilanswer
 

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

n°1908564
gilou
Modérateur
Modzilla
Posté le 25-07-2009 à 20:30:52  profilanswer
 

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é!  --
n°1908572
Elmoricq
Modérateur
Posté le 25-07-2009 à 20:55:11  profilanswer
 

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
n°1908689
ptitchep
Posté le 26-07-2009 à 21:22:55  profilanswer
 

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
n°1908704
Joel F
Real men use unique_ptr
Posté le 27-07-2009 à 07:32:15  profilanswer
 

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
mood
Publicité
Posté le 27-07-2009 à 07:32:15  profilanswer
 

n°1908829
ptitchep
Posté le 27-07-2009 à 11:30:56  profilanswer
 

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
n°1908888
Taz
bisounours-codeur
Posté le 27-07-2009 à 12:48:55  profilanswer
 

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
n°1908906
ptitchep
Posté le 27-07-2009 à 13:21:55  profilanswer
 

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
n°1908911
Taz
bisounours-codeur
Posté le 27-07-2009 à 13:28:35  profilanswer
 

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"

n°1908925
ptitchep
Posté le 27-07-2009 à 13:45:46  profilanswer
 

Les deux sont souvent vraies en même temps


---------------
deluser --remove-home ptitchep
n°1909043
Sve@r
Posté le 27-07-2009 à 16:07:21  profilanswer
 

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.
n°1909593
el muchach​o
Comfortably Numb
Posté le 29-07-2009 à 08:26:03  profilanswer
 

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
n°1909773
Taz
bisounours-codeur
Posté le 29-07-2009 à 11:33:40  profilanswer
 

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.

n°1909831
ptitchep
Posté le 29-07-2009 à 13:29:47  profilanswer
 

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
n°1909994
Taz
bisounours-codeur
Posté le 29-07-2009 à 17:01:17  profilanswer
 

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
n°1910053
ptitchep
Posté le 29-07-2009 à 18:16:23  profilanswer
 

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
n°1910308
Taz
bisounours-codeur
Posté le 30-07-2009 à 15:04:50  profilanswer
 

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

n°1910464
Sve@r
Posté le 30-07-2009 à 20:28:36  profilanswer
 

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.
n°1910693
Joel F
Real men use unique_ptr
Posté le 31-07-2009 à 15:19:29  profilanswer
 

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

n°1910732
xilebo
noone
Posté le 31-07-2009 à 16:31:00  profilanswer
 


 

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

n°1910772
ptitchep
Posté le 31-07-2009 à 17:27:29  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  Calcul d'aire: retourne 0!

 

Sujets relatifs
[Excel] Calcul de moyenne automatiséProbleme calcul : conditions
[VB6] Problème arrondi calcul validité IBANCalcul avec 2 chiffres après la virgule
Factorielle et calcul de tous les ordres possibles de x élémentsdéclencher le calcul d'un fichier excel avec VBA
Problème de calcul de Delta[batch] Calcul d'un fichier txt et envoi vers sql
methode qui retourne toutes les id et les nomsPHP : Calcul opération dans une variable
Plus de sujets relatifs à : Calcul d'aire: retourne 0!


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