Les structures - petite question

Les structures - petite question - C - Programmation

Marsh Posté le 30-01-2008 à 20:03:40    

Bonjour tout le monde,
 
J'ai un petit probleme que si il se resout m fera avancer grandement...
 
J'ai fait une structure "struct produit" avec le champ "float Prix",  
 
Avant le main je declare ma fonction "short EncodeProduits (struct produit[], int) .
Dans le main, je declare "struct produit ListeProduit[100]" avec l'identificateur de la fonction et je fait passer "EncodeProduit(ListeProduits, i)
 
Dans le main de ma fonction je vx entrer une valeur en float, j'ecris : Veuillez entrez le prix : scanf("%f", ListeProduits[i].Prix);
seulement quand je l'execute, il ne vx pas me laisser entrer ma valeur et m'affcihe un message d'erreur...
 
 
AIDEZ MOI SVPPPP Merci beaucoup !!!!!!!!!!
 
voici le code :
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
struct produit {
 char origine;
 long NumProduit;
 char NomProduit[30];
 char UniteMesure[10];
 float Prix;
 char TypeProduit[20];
 int categorie;
   
};
 
short EncodeProduit (struct produit [], int, long [], int, int, int);
 
int main ()
 
{
 int nproduit=0, ProduitB=0, ProduitE=0, index[100];
 int enc,i;
 char data[100][56];
 long numprod[100];
 
 
 
 struct produit ListeProduits[100];
 
 i=0;
 do
 {
  printf("Produit n%d : ", i+1);
  printf("\n\n" );
  enc=EncodeProduit(ListeProduits, i, numprod, nproduit, ProduitB, ProduitE);  
   
  if (ListeProduits[i].origine=='B')
  {
   ProduitB++;
   
  }
 
  else
  {
   if (ListeProduits[i].origine=='E')
   {
    ProduitE++;
   }
  }
 
  if (ListeProduits[i].origine!=0x0A)
  {
   nproduit++;
   
  }
 
  system("cls" );
  i++;
 }
 while (enc==1);
 
 
 for (i=0;i<nproduit;i++)
 {
  printf("%d  ", numprod[i]);
 }
 
 
 system("pause" );
 
}
 
short EncodeProduit (struct produit ListeProduits[], int i, long numprod [], int nproduit, int ProduitB, int ProduitE)
{
 int r, tp, cp, verif;
 char v[3][30]={"Fini", "Semi-Fini", "Matiere Premiere"};
 
 do
 {
  printf("Quel est l'origine ? " );
  fflush (stdin);
  scanf("%c", &ListeProduits[i].origine);
 }
 while (ListeProduits[i].origine!=0x0A && ListeProduits[i].origine!='B' && ListeProduits[i].origine!='E');
 
 
 
 if (ListeProduits[i].origine!=0x0A)
 {
 
  printf("Entrez le numero du produit : " );
  scanf("%ld", &ListeProduits[i].NumProduit);
 
 
 
  printf("Entrez le nom du produit : " );
  fflush (stdin);
  gets (ListeProduits[i].NomProduit);
 
 
  printf("Entrez l'unite du produit : " );
  fflush (stdin);
  gets (ListeProduits[i].UniteMesure);
 
 
  printf("Entrez le prix du produit : " );
  scanf("%.1f", &ListeProduits[i].Prix);
 
 
  printf("Entrez le type du produit : " );
  printf("\n\n\t1.\tFini\n\t2.\tSemi-fini\n\t3.\tMatiere Premiere\n" );
  scanf ("%d", &tp);
  strcpy (ListeProduits[i].TypeProduit,v[tp-1]);
   
 
 
  printf("\n\nEntrez la categorie du produit : " );
  printf("\n\n\t0.\tNon Dangereux\n\t1.\tDangereux\n" );
  scanf ("%d", &cp);
  ListeProduits[i].categorie=cp;
 
   
  r=1;
 
 }
 else
 {
  r=0;
 }
   
 return r;
}

Reply

Marsh Posté le 30-01-2008 à 20:03:40   

Reply

Marsh Posté le 30-01-2008 à 20:30:21    

Tu débutes en C, c'est bien, tout à ton honneur. Je ne sais pas quel tutoriel/livre tu lis, mais s'il y a bien un avertissement qu'on devrait signaler, c'est :
 

Les compilateurs C sont TOUS BEAUCOUP trop laxistes, activer tous les warnings possibles, même si certains sont purement casse c*uille.


 
En l'occurence avec des options un peu plus sévères, pouf ton "erreur" s'affiche dans le tas :
 

E:\Projets\Utilities\float\main.c:: In function `main':
E:\Projets\Utilities\float\main.c:66: warning: int format, long int arg (arg 2)
E:\Projets\Utilities\float\main.c:22: warning: unused variable `index'
E:\Projets\Utilities\float\main.c:24: warning: unused variable `data'
E:\Projets\Utilities\float\main.c:72: warning: control reaches end of non-void function
E:\Projets\Utilities\float\main.c:: In function `EncodeProduit':
E:\Projets\Utilities\float\main.c:108: warning: unknown conversion type character `.' in format
E:\Projets\Utilities\float\main.c:108: warning: too many arguments for format
E:\Projets\Utilities\float\main.c:76: warning: unused variable `verif'
:: === Build finished: 0 errors, 7 warnings ===


 
Par contre, il en manque au moins une :

Code :
  1. fflush(stdin)


 
Ça ne fait pas du tout ce que tu crois. En fait, ça ne fait rien du tout et si tu avais lu le manuel de fflush, tu saurais qu'on ne l'utilise que pour les flux en écritures, pas en lecture.


Message édité par tpierron le 30-01-2008 à 20:30:44
Reply

Marsh Posté le 30-01-2008 à 21:31:55    

avec quoi as tu compiler et linker pour obtenir ces info ??? ca m'aiderai enormement pour mes etudes...
et ainsi je saurai voir aussi directement ou j'ai mon erreur... merci de me repondre dés que possible afin de finir ce programme... ;)  
Merci beaucoup deja pour ta reponse

Reply

Marsh Posté le 30-01-2008 à 21:44:04    

J'ai completer mon code, voici l'entiereté :  
 
Dites moi ou sont mes erreur pour le float svp. merci bcp pour tous !!!
 
code :
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
struct produit {
 char origine;
 long NumProduit;
 char NomProduit[30];
 char UniteMesure[10];
 float Prix;
 char TypeProduit[20];
 int categorie;
   
};
 
short EncodeProduit (struct produit [], int, long [], int, int, int);
short RechercheNumProd (struct produit[], int, long []);
void InsertionNumProd (struct produit[], long[], int);
 
int main ()
 
{
 int nproduit=0, ProduitB=0, ProduitE=0, index[100];
 int enc,i;
 char data[100][56];
 long numprod[100];
 
 
 
 struct produit ListeProduits[100];
 
 i=0;
 do
 {
  printf("Produit n%d : ", i+1);
  printf("\n\n" );
  enc=EncodeProduit(ListeProduits, i, numprod, nproduit, ProduitB, ProduitE);  
   
  if (ListeProduits[i].origine=='B')
  {
   ProduitB++;
   
  }
 
  else
  {
   if (ListeProduits[i].origine=='E')
   {
    ProduitE++;
   }
  }
 
  if (ListeProduits[i].origine!=0x0A)
  {
   nproduit++;
   
  }
 
  system("cls" );
  i++;
 }
 while (enc==1);
 
 
 for (i=0;i<nproduit;i++)
 {
  printf("%ld  ", numprod[i]);
 }
 
 
 system("pause" );
 
}
 
short EncodeProduit (struct produit ListeProduits[], int i, long numprod [], int nproduit, int ProduitB, int ProduitE)
{
 int r, tp, cp, verif;
 char v[3][30]={"Fini", "Semi-Fini", "Matiere Premiere"};
 
 do
 {
  printf("Quel est l'origine ? " );
  fflush (stdin);
  scanf("%c", &ListeProduits[i].origine);
 }
 while (ListeProduits[i].origine!=0x0A && ListeProduits[i].origine!='B' && ListeProduits[i].origine!='E');
 
 
 
 if (ListeProduits[i].origine!=0x0A)
 {
 
  printf("Entrez le numero du produit : " );
  scanf("%ld", &ListeProduits[i].NumProduit);
 
  do
  {
   verif=RechercheNumProd (ListeProduits, i, numprod);
  }
  while (verif==0);
 
  InsertionNumProd (ListeProduits, numprod, i);
 
   
 
 
  printf("Entrez le nom du produit : " );
  fflush (stdin);
  gets (ListeProduits[i].NomProduit);
 
 
  printf("Entrez l'unite du produit : " );
  fflush (stdin);
  gets (ListeProduits[i].UniteMesure);
 
 
  printf("Entrez le prix du produit : " );
  scanf("%f", &ListeProduits[i].Prix);
 
 
  printf("Entrez le type du produit : " );
  printf("\n\n\t1.\tFini\n\t2.\tSemi-fini\n\t3.\tMatiere Premiere\n" );
  scanf ("%d", &tp);
  strcpy (ListeProduits[i].TypeProduit,v[tp-1]);
   
 
 
  printf("\n\nEntrez la categorie du produit : " );
  printf("\n\n\t0.\tNon Dangereux\n\t1.\tDangereux\n" );
  scanf ("%d", &cp);
  ListeProduits[i].categorie=cp;
 
   
  r=1;
 
 }
 else
 {
  r=0;
 }
   
 return r;
}
 
short RechercheNumProd (struct produit ListeProduits[], int i, long numprod[])
{
 int t;
 
 t=i;
 
 while (t>=0)
 {
  if (ListeProduits[i].NumProduit==numprod[t])
   {
    printf("Numero de produit deja entrer..." );
    printf("Veuillez entrez a nouveau le numero du produit : " );
    scanf("%ld", &ListeProduits[i].NumProduit);
    return 0;
   }
  t--;
 }
 return 1;
}
 
 
void InsertionNumProd (struct produit ListeProduits[], long numprod [], int i)
{
 int t;
 
 t=i-1;
 
 while ((t>=0) && (ListeProduits[i].NumProduit<numprod[t]))
 {
  numprod[t+1]=numprod[t];
  t--;
 }
 numprod[t+1]=ListeProduits[i].NumProduit;
}

Reply

Marsh Posté le 30-01-2008 à 21:47:32    

Le message d'erreur qui apparait est le suivant :
 
Runtime error
 
donc je suppose kil y a une erreur dans mon entrée de valeur dans ma variable... mais où ???? celui qui trouvera, merci beaucoup

Reply

Marsh Posté le 30-01-2008 à 22:06:37    

Bah, pas grand à redire sur le code à part :

  • Vire ces putains de fflush(stdin).
  • utilise fgets(bleurp, sizeof bleurp, stdin) au lieu de gets().

Reply

Marsh Posté le 30-01-2008 à 22:10:57    

Je ne connais pas ces fonctions, et donc ne sais pas comment les utilisées...
 
et vous, le float il va ?? parce ke moi ca ne vas tjr pas... il affiche le message :" runtime error" au moment de où intervient le float.

Reply

Marsh Posté le 30-01-2008 à 22:56:03    

Oui, tout fonctionne, les fflush(stdin) sont ignorés comme il ne se le doit pas, les gets provoque des buffers overflow super sympa à débugguer, mais par contre le scanf("%f", &prix) fonctionne comme il se doit.

Reply

Marsh Posté le 30-01-2008 à 23:02:05    

oui il tourne... c'est super !
merci beaucoup !!
 
seulement j'ai un autre probleme...
 
for (i=0;i<nproduit;i++)
{
 strcpy (data[i][56],ListeProduits[i].origine);
 strcat (data[i][56],ListeProduits[i].NomProduit);
}
 
en fait j'ai un tableau a deux dimensions (data [100][56]) la valeur contenue dans ListeProduits[i].origine (caractere) et la valeur contenue dans ListeProduits[i].NomProduit (chaine de caractère).
 
Ce que j'aurai aimé faire c'est donc de copier le caractere de "ListeProduits[i].origine" dans le tableau "data", puis copier la valeur de "ListeProduits[i].NomProduit" à la suite de la vlaur qui sera deja dans le tableau "data [100][56]".
 
Merci pour toutes tes reponses qui me sont tres utiles !!

Reply

Marsh Posté le 31-01-2008 à 15:51:21    

pepito17 a écrit :

avec quoi as tu compiler et linker pour obtenir ces info ??? ca m'aiderai enormement pour mes etudes...


http://mapage.noos.fr/emdel/codage.htm#cfg_compilo
 


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