[C] [Debutant] Petit problème avec un programme tout bete

Petit problème avec un programme tout bete [C] [Debutant] - C - Programmation

Marsh Posté le 02-05-2006 à 11:11:55    

Tout dabord salut :hello:
 
Alors je me suis mis très récement au C (depuis hier) et je suis activement le tuto sur le site du zéro, et j'ai voulu faire un petit programme en C qui convertis des Euros en Francs et vice versa :D
 
Le problème c'est qu'il ne marche pas [:matleflou]
 
Voici mon code :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.   // Definition des variables et constantes
  6.   const double DEVISE = 6.55957;
  7.   long action;
  8.   double francs, euros;
  9.  
  10.   // Affichage du menu pour l'action à effectuer
  11.   printf("=== Menu ===\n\n" );
  12.   printf("1. Convertir des Euros en Francs\n" );
  13.   printf("2. Convertir des Francs en Euros\n" );
  14.  
  15.   printf("\n" );
  16.  
  17.   printf("Que voulez-vous faire ? " );
  18.   scanf("%ld", &action);
  19.  
  20.   system("cls" );
  21.  
  22.   double convertef(euros)
  23.   {
  24.          return euros * DEVISE;
  25.   }
  26.  
  27.   double convertfe(francs)
  28.   {
  29.          return francs / DEVISE;
  30.   }
  31.   switch (action)
  32.   {
  33.          case 1:
  34.               printf("Combien d'Euros voulez-vous convertir en Francs ? " );
  35.               scanf("%lf", &euros);
  36.               system("cls" );
  37.               printf("Alors, %lf Euros ca fait %lf Francs\n\n", euros, convertef(euros));
  38.               break;
  39.          case 2:
  40.               printf("Combien de Francs voulez-vous convertir en Euros ? " );
  41.               scanf("%lf", &francs);
  42.               system("cls" );
  43.               printf("Alors, %lf Francs ca fait %lf Euros\n\n", francs, convertfe(francs));
  44.               break;
  45.          default:
  46.                  exit(0);
  47.                  break;
  48.   }
  49.   system("PAUSE" );
  50.   return 0;
  51. }


 
Quand par exemple je veux convertir 100 Francs en Euros je tappe donc 2 pour faire l'action 2, et ensuite 100 pour dire que je veux convertir 100 Francs, et il me sort que ça fait 0 € :o
 
Ya comme un bug :p Vous pouvez m'aider ?
 
Merci d'avance :jap:
 
Edit : Tiens ya un jocebug avec l'affichage du code :o
Et je tiens à preciser que si je passe tout avec des "long" ça marche... Mais je veux garder des "double" pour pouvoir utiliser des nombres décimaux moi :/

Message cité 2 fois
Message édité par Max2000 le 02-05-2006 à 11:15:38
Reply

Marsh Posté le 02-05-2006 à 11:11:55   

Reply

Marsh Posté le 02-05-2006 à 11:25:48    

Max2000 a écrit :

Voici mon code :


Il y a quelques problèmes dans ce code...


Compiling: main.c
main.c: In function `main_':
main.c:24: warning: function declaration isn't a prototype
main.c: In function `convertef':
main.c:24: warning: declaration of 'euros' shadows a previous local
main.c:9: warning: shadowed declaration is here
main.c: In function `main_':
main.c:29: warning: function declaration isn't a prototype
main.c: In function `convertfe':
main.c:29: warning: declaration of 'francs' shadows a previous local
main.c:9: warning: shadowed declaration is here
main.c:54:2: warning: no newline at end of file
main.c: In function `main_':
main.c:52: warning: will never be executed
Linking console executable: D:\dev\ed02\cb\ed02.exe
Process terminated with status 0 (0 minutes, 4 seconds)
0 errors, 8 warnings


A lire :  
 
http://mapage.noos.fr/emdel/notes.htm#portee
Notamment : Objets / Shadowing
 

  • Il n'est pas permi de définir des fonctions dans des fonctions en C standard.
  • Il faut préciser le type des paramètres, sinon, c'est int
  • Pour DEVISE, un constante globale suffit (macro)...


Message édité par Emmanuel Delahaye le 02-05-2006 à 11:37:55

---------------
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 02-05-2006 à 11:29:58    

Moi je n'ai aucune erreurs ni warning lors de la compilation :??:

Reply

Marsh Posté le 02-05-2006 à 11:32:20    

Max2000 a écrit :

Moi je n'ai aucune erreurs ni warning lors de la compilation :??:


Ben oui. La première chose à faire, c'est d'apprendre à regler son compilateur en mode paranoïd ... Quel est-il ?


Message édité par Emmanuel Delahaye le 02-05-2006 à 11:33: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/
Reply

Marsh Posté le 02-05-2006 à 11:33:33    

J'utilise Dev C++ comme IDE donc je crois que c'est GCC mon compilateur :??:
 
Mais je crois que je viens de trouver mon erreur en fait :p
 
Ah non, fausse alerte, ça marche pas :(
 
Mes fonctions convertef() et convertfe() doivent être obligatoirement à l'exterieur du main() ? Pasque j'ai essayé en les mettant dehors, et ça ne marche pas non plus :/

Message cité 2 fois
Message édité par Max2000 le 02-05-2006 à 11:39:15
Reply

Marsh Posté le 02-05-2006 à 11:39:55    

Max2000 a écrit :

J'utilise DevC++ comme IDE donc je crois que c'est GCC mon compilateur :??:


Alors je te conseille de le configurer pour qu'il ajoute ceci à la ligne de commade de gcc (ici MinGW, mais peu importe)

- Wall -Wextra -O2 -ansi -pedantic


Ca fera le ménage...


Message édité par Emmanuel Delahaye le 02-05-2006 à 11:41:29

---------------
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 02-05-2006 à 11:41:06    

Max2000 a écrit :

Mes fonctions convertef() et convertfe() doivent être obligatoirement à l'exterieur du main() ?


Oui. Et placées avant, c'est plus simple.

Citation :

Pasque j'ai essayé en les mettant dehors, et ça ne marche pas non plus :/


"ça ne marche pas" c'est vague... Mais il faut lire toutes mes remarques, notamment concernant les paramètres...


Message édité par Emmanuel Delahaye le 02-05-2006 à 11:43:13

---------------
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 02-05-2006 à 11:41:24    

Max2000 a écrit :

Code :
  1. double convertef(euros)
  2.   {
  3.          return euros * DEVISE;
  4.   }
  5.  
  6.   double convertfe(francs)
  7.   {
  8.          return francs / DEVISE;
  9.   }




 
Une variable non typée est mis à "int" par défaut => tes fonctions reçoivent des double qu'elles transforment en "int"  
 

Code :
  1. double convertef(double euros)
  2.   {
  3.          return euros * DEVISE;
  4.   }
  5.  
  6.   double convertfe(double francs)
  7.   {
  8.          return francs / DEVISE;
  9.   }


 
Et comme l'a dit Emmanuel, sors ces fonctions du "main()". Et remplace la variable "DEVISE" par une macro "DEVISE" (ou alors tu remplaces "DEVISE" par "devise" et tu passes "devise" en 2° paramètre à tes fonctions).
Et prend l'habitude de considérer qu'un identificateur écrit totalement en majuscule est conventionnellement une macro (les variables sont écrites généralement en minuscules avec parfois des majuscules pour identifier les mots => nbCarFic par exemple)


Message édité par Sve@r le 02-05-2006 à 11:42:41

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

Marsh Posté le 02-05-2006 à 11:48:33    

Ca marche désormais, merci à vous :)
 
Mais je voulais savoir quelle était la différence entre une macro et une constante ? Dans le chapitre où j'en suis on ne parle pas encore de macro, seulement de constantes et de variables...

Reply

Marsh Posté le 02-05-2006 à 11:55:19    

Max2000 a écrit :

Ca marche désormais, merci à vous :)
 
Mais je voulais savoir quelle était la différence entre une macro et une constante ? Dans le chapitre où j'en suis on ne parle pas encore de macro, seulement de constantes et de variables...


 
Une macro est une directive de précompilation
Lors de cette précompilation, le compilo génère un source où toutes les macro sont remplacées par leur correspondance littérale et c'est ce source qui est compilé
avantages:
=> pas de variable donc pas de mémoire pour une macro
=> si la valeur correspondante change, tu ne fais qu'une seule modif et tu recompiles
inconvénients:
=> danger inhérents au remplacement littéral et à la priorité des opérateurs
#define CARRE(x)     x * x
=> Tu demandes "CARRE(2 + 3)" => tu obtiens 2 + 3 * 2 + 3 soit 11 au lieu de 25
=> tu demandes "CARRE(i++)" => tu as "i++ * i++" soit i incrémenté de 2 au lieu de 1


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

Marsh Posté le 02-05-2006 à 11:55:19   

Reply

Marsh Posté le 02-05-2006 à 13:06:00    

Max2000 a écrit :

Ca marche désormais, merci à vous :)
 
Mais je voulais savoir quelle était la différence entre une macro et une constante ? Dans le chapitre où j'en suis on ne parle pas encore de macro, seulement de constantes et de variables...


  • Une macro est un mécanisme qui remplace du texte par un autre texte.
  • Il n'y  pas de 'constantes' mais des 'expressions constantes'. Une expression constante est une valeur évaluée à la compilation. Ce n'est pas un objet, elle a un type mais pas d'adresse.
  • Une variable ou objet peut contenir différentes valeurs. Elle a un type et une adresse.
Code :
  1. int const a = 123;


est un objet nommé a de type int, valeur 123 non modfiable (accès en lecture seule). Son adresse est &a. Ce n'est donc pas une expression constante.
 
 
 


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

Sujets relatifs:

Leave a Replay

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