Probleme sur petit programme de débutant

Probleme sur petit programme de débutant - C - Programmation

Marsh Posté le 01-07-2006 à 19:05:15    

Bonjour  :)  
 
Alors voila j'essaye de faire un convertisseur euros <==> francs
Je fais afin de m'entrainer sur les fonctions :
 
J'ai créer 2 fonctions en plus de la main afin de convertir dans les 2 sens mais mon programme ne marche pas !
 
Voici le code :
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.                      
  4. double francs=0,euros=0; //On déclare toutes les variables avant
  5. double euro ( double francs ) // cette fonction tranforme les francs en euros
  6.        {
  7.        euros = francs*6.55957 ;
  8.        return euros ;
  9.        }
  10. double franc ( double euros )// cette fonction tranforme les euros en francs
  11.        { 
  12.        francs = euros/6.55957 ;
  13.        return francs ;   
  14.        }   
  15. int main (int argc, char *argv[])
  16.     {
  17.        
  18.    
  19.     printf("                      === CoNvErTiSeUr ===                 By S@MoS \n\n                      FrAnCs  <===> EuRoS \n\n" );
  20.    
  21.     printf("1.  Francs --> Euros \n\n2.  Euros  --> Francs \n\n\n            ?" );
  22.    
  23.     long choix=0,resultat=0;
  24.    
  25.     scanf("%ld",&choix);
  26.    
  27.     if (choix == 1 )
  28.             {
  29.             printf("Entrer la somme a convertir en Francs : " );
  30.             scanf("%lf",&francs);
  31.             printf(" %lf Francs = %lf Euros",francs,franc(euros));
  32.             }
  33.    
  34.     else (choix == 2);
  35.             {
  36.             printf("Entrer la somme a convertir en Francs : " );   
  37.             scanf("%lf",&euros);
  38.             printf(" %lf Euros = %lf Francs",euros,euro(francs));               
  39.             }
  40.    
  41.    
  42.     system("PAUSE" );
  43.     return 0;
  44.    
  45.     }


 
A la fin ca me met :
 
0.00000 Euros = 0.0000 Francs
 
De plus la boucle    if (choix == 1 ) tourne en boucle et ne veut pas s'arrete avec le return 0 ;
 
Merci d'avance pour votre aide
 


---------------
débute en C
Reply

Marsh Posté le 01-07-2006 à 19:05:15   

Reply

Marsh Posté le 01-07-2006 à 19:32:06    

Salut samos :)
 
Bah déjà, perso, j'évite de mettre des variables globales. A moins que tu n'aie des constantes à déclarer ca fait pas super propre.
Ensuite, ce truc:

Code :
  1. else (choix == 2);

cay très mal. soit tu met juste

Code :
  1. else

, soit

Code :
  1. else if (choix == 2)


Là ton else, il exécute la commande qui a juste après cad choix == 2. D'ailleurs t'as mis un ";" pour pouvoir compiler je suppose...
 
Sinon, autre truc, j'aurais utilisé un getchar() pour faire le choix, vu que tu n'as besoin que d'un caractère. Dans ce cas, tu dois déclarer ta variable choix comme caractère.
Dans tes fonctions, ca renvoie des doubles. faut renvoyer des float si tu veux avoir de la précision. Pareil pour le parametre, si tu veux convertir 12fr50centimes.
Et, pas besoin de mettre du double de partout, ca bouffe quand même en mémoire. du int suffit généralement amplement.
Donc de manière générale, gaffe à tes variables
 
Bonne prog  ;)


Message édité par GroXx le 01-07-2006 à 19:39:04
Reply

Marsh Posté le 01-07-2006 à 20:02:44    

Merci de tes précisions  
 
j'ai procédé aux modifications que tu m'as di sauf des variables générales parce que si je ne les met pas au début ca me met que je ne les ai pas déclarer ...
 
Mais le programme ne marche toujours pas
 
ca me met toujours 0000 francs = 0000 euros
 
De plus je n'ai pas compris pour le getchar() je ne connais pas cette commande  
 
Si vous pouviez détaillez ca m'aider parce que la j'ai vraiment du mal
 
Merci d'avance  :)


---------------
débute en C
Reply

Marsh Posté le 01-07-2006 à 20:33:59    

samos38 a écrit :

j'ai procédé aux modifications que tu m'as di sauf des variables générales parce que si je ne les met pas au début ca me met que je ne les ai pas déclarer ...


Tu les mets dans ton main() !!!
 

samos38 a écrit :

De plus je n'ai pas compris pour le getchar() je ne connais pas cette commande


C'est une fonction qui récupère un seul caractère du clavier
 

samos38 a écrit :

Si vous pouviez détaillez ca m'aider parce que la j'ai vraiment du mal


Ok - Je rectifie un peu ton source (cela n'enfreint pas les règles du forum puisque le source est déjà écrit)


#include <stdio.h>
#include <stdlib.h>      
 
// Déjà, c'est bien de donner des noms plus explicites aux fonctions
double franc2euro ( double francs ) // cette fonction tranforme les francs en euros (lire "franc to euro" )
{
      double calcul;    // Variable locale à la fonction
                 
       calcul=francs*6.55957 ;
       return calcul ;
}
 
double euro2franc ( double euros )// cette fonction tranforme les euros en francs (lire "euro to franc" )
{
      double calcul;    // Variable locale à la fonction
                 
       calcul=euros/6.55957 ;
       return calcul;
}
 
int main (int argc, char *argv[])
{
    double monnaie;        // une seule variable suffit puisque le programme n'en n'utilise qu'une seule pour le calcul !!!
    long choix;
         
    printf("                      === CoNvErTiSeUr ===                 By S@MoS \n\n                      FrAnCs  <===> EuRoS \n\n" );
     
    printf("1.  Francs --> Euros \n\n2.  Euros  --> Francs \n\n\n            ?" );
     
    scanf("%ld", &choix);
 
    switch (choix)
    {
         case 1: // Francs vers euros
             printf("Entrer la somme a convertir en Francs : " );
             scanf("%lf",&monnaie);  
             printf(" %lf Francs = %lf Euros", monnaie, franc2euro(monnaie));
             break;
         case 2: // Euros vers francs
             printf("Entrer la somme a convertir en Euros : " );      
             scanf("%lf",&monnaie);  
             printf(" %lf Euros = %lf Francs", monnaie ,euro2franc(monnaie));                
             break;
     }
     
 
     system("PAUSE" );
     return 0;
     
}


Bon, j'ai pas testé mais cela devrait être pas mal. Essaye de regarder les principes de ce programme.
1) jamais de variable globale => cela engendre de la confusion dans la lecture et ouvre la porte aux bugs (n'importe quelle fonction peut modifier une globale)
2) utiliser des noms de fonctions significatifs et éviter dans la mesure du possible des noms de fonctions (comme "euro" ) similaire aux noms de variables (comme "euros" ) => bonjour l'angoisse de la relecture !!!
3) essayer de regrouper différentes variables ayant une utilité similaire et utilisées alternativement en une seule variable plus "générale" => "euros" et "francs" sont devenues "monnaie" (aurait pu aussi s'appeler "somme" )
 

samos38 a écrit :

De plus la boucle    if (choix == 1 );


[:heink] Ne reparle jamais de "boucle if" !!!
 

samos38 a écrit :

tourne en boucle et ne veut pas s'arrete avec le return 0


Ce comportement est typique d'un "scanf" mal utilisé. Cette fonction est très rigoureuse et attend des entrées "formattées" (c'est à dire bien écrites). Si tu entres un truc qui n'est pas comme il faut, "choix" contient n'importe quoi. En général, pour une saisie manuelle, il vaut mieux éviter "scanf" et utiliser d'autres fonctions comme "getchar()" ou "fgets()".


Message édité par Sve@r le 01-07-2006 à 20:39:07

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

Marsh Posté le 01-07-2006 à 21:03:38    

Ok j'ai compris l'accumulation des choses qui on fait que j'était perdu :P
 
Par contre pour l'utilisation de "getchar()" ou "fgets()" je ne connais pas la synthaxe qu'il faut utiliser :
 
Est ce possible de me l'expliquer , promis c'est la derniere question :P
 
Merci beaucoup pour votre aide


---------------
débute en C
Reply

Marsh Posté le 01-07-2006 à 21:18:21    

samos38 a écrit :

Ok j'ai compris l'accumulation des choses qui on fait que j'était perdu :P
 
Par contre pour l'utilisation de "getchar()" ou "fgets()" je ne connais pas la synthaxe qu'il faut utiliser :
 
[quotemsg=1398643,5,337283]promis c'est la derniere question :P


T'as tord ! Quand j'ai appris le C, j'arrétais pas de poser des questions !!!
 

samos38 a écrit :

Ok j'ai compris l'accumulation des choses qui on fait que j'était perdu :P
 
Par contre pour l'utilisation de "getchar()" ou "fgets()" je ne connais pas la synthaxe qu'il faut utiliser :


 
getchar:

#include <stdio.h>
char carac;
carac=getchar();
printf("carac=[%c]\n", carac);


 
fgets:

#include <stdio.h>
char saisie[1000 + 1];
fgets(saisie, 1000 + 1, stdin);
printf("saisie=[%s]\n", saisie);


 
Si tu trouves étrange ce "1000 + 1", c'est une habitude des programmeurs C. Ils montrent ainsi qu'ils ont bien pris en compte le caractère '\0' qui sera rajouté automatiquement par la fonction "fgets" (et toutes les autres fonctions de remplissage de chaîne).
Et le "1000 + 1" dans "fgets" parce que "fgets" s'arrête à "N - 1" quand on lui demande "N" (pour garder justement la place pour ce fameux '\0')

Message cité 1 fois
Message édité par Sve@r le 01-07-2006 à 21:18:40

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

Marsh Posté le 01-07-2006 à 21:37:20    

Ok merci beaucoup pour votre aide je vais travailler tout ca et je vais sans doute  revenir vous voir  ;)


---------------
débute en C
Reply

Marsh Posté le 09-07-2006 à 10:55:53    

ta invercer tes fonctions , dans l'appele.


Message édité par big_dadi_fat le 11-07-2006 à 10:52:07
Reply

Marsh Posté le 09-07-2006 à 10:56:27    

ce n'est pas plutot : ?

Code :
  1. if (choix == 1 )
  2.             {
  3.             printf("Entrer la somme a convertir en Francs : " );
  4.             scanf("%lf",&francs);
  5.             printf(" %lf Francs = %lf Euros",francs,euros(francs));
  6.             }


 et l'autre fonction invercement (aussi).
 
 :sweat:  
 
babay :hello:[/quotemsg]

Message cité 1 fois
Message édité par big_dadi_fat le 11-07-2006 à 10:51:38
Reply

Marsh Posté le 10-07-2006 à 14:41:45    

big_dadi_fat a écrit :

et l'otre fonction invercement (aussi).


Tu as oublié de massacrer 'fonction' et 'aussi'...


---------------
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 10-07-2006 à 14:41:45   

Reply

Marsh Posté le 10-07-2006 à 18:21:20    

samos38 a écrit :


 
A la fin ca me met :
 
0.00000 Euros = 0.0000 Francs
 


et ben quoi, il marche ton convertisseur, 0 € == 0 Frs [:petrus dei]


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

Marsh Posté le 11-07-2006 à 11:16:01    

Sve@r a écrit :


getchar:

#include <stdio.h>
char carac;
carac=getchar();
printf("carac=[%c]\n", carac);




 
Non, non et non.
getchar() renvoie un 'int', pas un 'char'.
Ne pas utiliser 'char'.

Reply

Marsh Posté le 11-07-2006 à 19:08:05    

simple_stupid a écrit :

Non, non et non.
getchar() renvoie un 'int', pas un 'char'.
Ne pas utiliser 'char'.


Boaf... le "int" n'est utile que s'il faut tester "EOF"... ;)  


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

Sujets relatifs:

Leave a Replay

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