[c]pb pour gérer des float

pb pour gérer des float [c] - C - Programmation

Marsh Posté le 17-02-2005 à 11:08:54    

Bonjour,
 
je réalise un programme pour la gestion d'un inventaire pour un terminal portable laser (fonctionnant sous dos):
 
J'utilise une liste chaîné.
(C'est surement pas la meilleur des solutions, mais ça fait pas des masses que j'ai commencé le C :| et surtout j'ai commencé par du C++  :sarcastic: )
Alors, j'ai commencé par une structure comme celle ci :

Code :
  1. struct CInvent
  2. {
  3.        char emp[9]; // emplacement
  4.        char arti[21]; // articles
  5.        char nlot[9]; // numéro de lot
  6.        long int qte; // quantité
  7.        float tempe;  // température
  8.        double mouillage; // mouillage
  9.        float degre;      // degré
  10.        struct CInvent *suiv;
  11. };
  12. l=(struct CInvent *)malloc(sizeof(struct CInvent));


 
J'effectue une écriture sur fichier standard .txt des résultats des saisie.
J'ai besoin de gérer des float (en entré et sortie) et je me pose quelles questions:
 
Par exemple pour la température je dois accepter xx.yy (x= chiffre avant virgule; y= chiffre après virgule)
 
pour le moment j'ai quelque chose comme ça qui me convient pas trop ça gère pas assez :/  
Je vous donne l'exemple de la température:

Code :
  1. do {
  2.          affiche_titre();   
  3.          printf("Temperature: " );
  4.          scanf("%f",&l->tempe);                     
  5.          }while(l->tempe < 0 || l->tempe  > 99);
  6.          [...]
  7.          // l'écriture dans mon fichier
  8.          fprintf(fp,"%.2f;",deb->tempe);


 
A ce stade:  
- ça tronque bien en sortie les chiffres en trop après la virgule
- les chiffres avant la virgule sont bien limité de 0 à 99
Mais si je rentre un nombre trop grand d'ailleur ça ne va pas. (pas de gestion de la taille de la variable.
 
Est-ce la bonne solution de récuperer directement un float ou faut t-il passer par un char ou autre?
 
(sinon question bête, existe t-il un équivalent de itoa pour les float?)
 
voilà, je remercie ceux qui vont jeter un coup d'oeil à mon problème.
 
 :hello:


Message édité par gaar@ le 17-02-2005 à 12:12:39
Reply

Marsh Posté le 17-02-2005 à 11:08:54   

Reply

Marsh Posté le 17-02-2005 à 11:58:06    

gaar@ a écrit :


Alors, j'ai commencé par une structure comme celle ci :


struct CInvent
{
       char emp[9]; // emplacement
       char arti[21]; // articles
       char nlot[9]; // numéro de lot
       long int qte; // quantité
       float tempe;  // température
       double mouillage; // mouillage
       float degre;      // degré
       struct CInvent *suiv;
 
 
l=(struct CInvent *)malloc(sizeof(struct CInvent));
};




Problème. Dans une structure de données, on ne peut pas mettre de code exécutable. Tu veux sans doute dire:


struct CInvent
{
   char emp[9]; // emplacement
   char arti[21]; // articles
   char nlot[9]; // numéro de lot
   long int qte; // quantité
   float tempe;  // température
   double mouillage; // mouillage
   float degre;      // degré
   struct CInvent *suiv;
};


Sacré mélange entre flot, double... Le mieux est 'double'. On utilise float si on a des masses de données à stocker... pour gagner un peu de place (au détriment de la précision)

Citation :


J'effectue une écriture sur fichier standard .txt des résultats des saisie.
J'ai besoin de gérer des float (en entré et sortie) et je me pose quelles questions:
 
Par exemple pour la température je dois accepter xx.yy (x= chiffre avant virgule; y= chiffre après virgule)
 
pour le moment j'ai quelque chose comme ça qui me convient pas trop ça gère pas assez :/  
Je vous donne l'exemple de la température:

Code :
  1. do {
  2.          affiche_titre();   
  3.          printf("Temperature: " );
  4.          scanf("%f",&l->tempe);                     
  5.          }while(l->tempe < 0 || l->tempe  > 99);
  6.          [...]
  7.          // l'écriture dans mon fichier
  8.          fprintf(fp,"%.2f;",deb->tempe);




Problème classique d'E/S en C. Le mieux est d'utiliser fgets() et strtod() dans la boucle de vérification qui va bien (do-while)...
 
http://mapage.noos.fr/emdel/notes.htm#saisie


---------------
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 17-02-2005 à 12:02:00    

Emmanuel Delahaye a écrit :

Problème. Dans une structure de données, on ne peut pas mettre de code exécutable.  


erreur de copier coller ça   :wahoo:  
 
Dans mon code il est pas dans la structure. voilà c'est éditer.
 
 

Citation :

Sacré mélange entre flot, double... Le mieux est 'double'. On utilise float si on a des masses de données à stocker... pour gagner un peu de place (au détriment de la précision)

 
 
oki je note.


Message édité par gaar@ le 17-02-2005 à 12:04:33
Reply

Marsh Posté le 17-02-2005 à 15:38:23    

Suite à tes conseils Emmanuel Delahaye (merci d'ailleur) :
 
voilà un bout de code, ça semble fonctionner  :)  
 

Code :
  1. do {
  2.     err = FALSE;
  3.     affiche_titre();   
  4.     printf("Temperature: " );
  5.     fflush (stdout);
  6.     fgets (saisie, sizeof saisie, stdin);
  7.     ret = sscanf (saisie, "%[0-9-.-]s", temp);
  8.     n = strtod(temp, NULL);
  9.     if(n <0 || n >99) err = TRUE;               
  10.     }while (ret != 1 || err);
  11.    
  12. l->tempe = n;


 
ya peut-être des choses inutiles?
 
 
 
 

Reply

Sujets relatifs:

Leave a Replay

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