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

  FORUM HardWare.fr
  Programmation
  C

  Les structures - petite question

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Les structures - petite question

n°1679268
pepito17
Posté le 30-01-2008 à 20:03:40  profilanswer
 

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

mood
Publicité
Posté le 30-01-2008 à 20:03:40  profilanswer
 

n°1679279
tpierron
Posté le 30-01-2008 à 20:30:21  profilanswer
 

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
n°1679299
pepito17
Posté le 30-01-2008 à 21:31:55  profilanswer
 

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

n°1679304
pepito17
Posté le 30-01-2008 à 21:44:04  profilanswer
 

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

n°1679305
pepito17
Posté le 30-01-2008 à 21:47:32  profilanswer
 

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

n°1679313
tpierron
Posté le 30-01-2008 à 22:06:37  profilanswer
 

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

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

n°1679314
pepito17
Posté le 30-01-2008 à 22:10:57  profilanswer
 

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.

n°1679332
tpierron
Posté le 30-01-2008 à 22:56:03  profilanswer
 

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.

n°1679336
pepito17
Posté le 30-01-2008 à 23:02:05  profilanswer
 

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

n°1679845
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2008 à 15:51:21  profilanswer
 

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/

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

  Les structures - petite question

 

Sujets relatifs
une petite questionune question importante
Listes et sort [résolu]Petite question SQLienne --> organisation des tables
Question SQLQuestion rapide programme en C !
[PERL] de l'aide pour petite manip de champs dans un fichierSvchost.exe + droit systeme : Petite question...
Plus de sujets relatifs à : Les structures - petite question


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