IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Création d'un programme permettant de gérer des produits


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Création d'un programme permettant de gérer des produits
    Un fichier contient des descriptions de code article et de prix. Le code d’article est un numéro entre 0 et 99. Chaque ligne du fichier contient un code et un prix séparés par un espace :
    code1 prix1
    code2 prix2 etc. On se propose d’organiser les données en mémoire centrale sous forme de tableaux : on trouve le prix de chaque produit de code c dans la case d’indice c du tableau.
    a) Proposer une structure de données pour représenter les produits en mémoire centrale.
    b) Écrire une fonction qui réalise le chargement en mémoire centrale des données.
    c) Écrire une fonction qui donne le prix d’un produit à partir de son code.
    d) Écrire une fonction qui permet à un utilisateur de rentrer un nouveau produit dans la base. On supposera que la base de données a été préalablement chargée en mémoire.
    e) Écrire une fonction qui permet de sauvegarder la base de données dans un fichier.
    f) Écrire le programme principal qui charge les données et, tant que l’utilisateur le souhaite, propose un menu avec trois options : • Ajouter un produit • Consulter un prix • Quitter En fin de programme, la sauvegarde des données sera effectuée.

    Salut ! J'aimerai avoir votre avis sur ce que j'ai fais sur ce projet..je rencontre un problème lors de la consultation du prix du produit a base du code ..j'obtiens une boucle infini
    Voici mon code👇


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    //definition de la structure produit qui est un nouveau type
    typedef struct Produit produit; 
    struct Produit
    {
      float prix;
      int code;
    };
     
    produit p;
     
    // fonction de charGement de donnee en memoire
     
       int chargement( int numrech){
      FILE*fic=fopen("Produits.txt","r"); 
      do{
          fscanf(fic,"%d ;%f \n", &p.code,&p.prix);
          if(p.code==numrech){
            fclose(fic);
            return 1;
          }
      }while(!feof(fic));
        fclose(fic);
        return -1;
       }
    // consultation du produit a base de son code
    void consult_produit(){
      int codepro;
      printf("entrer le code du produit\n");
      scanf("%d", &codepro);
        FILE*fic=fopen("Produits.txt","r");
      do{
     
        fscanf(fic,"\n code:%d;\n prix: %f\n", &p.code,&p.prix);
        if(codepro==p.code){
          printf("code\t:%d\n",p.code);
          printf("prix\t:%f\n",p.prix);
        }
    }
    while(!feof(fic));
        fclose(fic);
      }
     
    //ajouter un nouveau produit
     void ajouter_produit(){
         FILE*fic=fopen("Produits.txt","a");
         int num;
            printf("Entrer le code du produit a ajouter\n");
            scanf("%d",&num);
            while(chargement(num)==1){
            printf("\n ce numero existe deja\n");
            printf("Entrer le code du produit a ajouter\n");
            scanf("%d",&num);
            }
            p.code=num;  
                printf("entrer le prix du produit\n");
                scanf("%f FCFA",&p.prix);
              fprintf(fic,"%d\t%f\n",p.code,p.prix);
        fclose(fic);
     }
     
     // sauvegarde des donnees dans un ficher
     void save_produit(){
       FILE*fic=fopen("Produits.txt","w");
         fprintf(fic,"code:%d\t prix:%f",p.code,p.prix);
       fclose(fic);
     }
     
    int main(){
      int choix;
      char reponse;
     
      do{
        printf("\n     1-Ajouter un produit  \n");
        printf("\n     2-Consulter un produit  \n");
        printf("\n     3-Quitter  \n");
     
        do{
            printf("\n  Entrer votre choix \n");
            scanf("%d",&choix);
        }while(choix<1||choix>3);
        switch(choix){
          case 1: ajouter_produit();
          break;
          case 2:consult_produit();break;
     
          case 3:
          break;
        }
          printf("\n  voulez vous continuer?: O/N \n");
          scanf("%s",&reponse);
          fflush(stdin);
      }while(reponse=='o'||reponse=='O');
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ton code lit deux fois le même fichier en utilisant deux chaînes de format différentes, donc il y a forcément au moins une qui échoue...
    Et vu que tu ne consultes pas la valeur de retour de fscanf()...

    PS: Autres problèmes:
    • Variable globale non-justifiée
    • while(feof()) --> On ne doit utiliser feof() qu'une fois qu'une autre fonction de lecture a échoué, pour savoir si l'échec était dû à la fin de fichier (généralement OK) ou à une vraie erreur)
    • scanf("%s") sans limite de taille
    • scanf() sans lire le reste de la ligne entretemps (si je tape 'a' sur ton menu, j'aurai une boucle infinie)
    • Tes fonctions mélangent interaction avec l'utilisateur et boucles de lecture du fichier; tu devrais séparer ça à chaque fois.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Limbardo Voir le message
    J'aimerai avoir votre avis sur ce que j'ai fais sur ce projet.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //definition de la structure produit qui est un nouveau type
    typedef struct Produit produit; 
    struct Produit
    {
      float prix;
      int code;
    };
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	float prix;
    	int  code;
    } t_produit;

    Citation Envoyé par Limbardo Voir le message
    produit p;
    Pas de variable globale (surtout vu ce que tu en fais !!!)

    Citation Envoyé par Limbardo Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // fonction de charGement de donnee en memoire
       int chargement( int numrech){
      FILE*fic=fopen("Produits.txt","r"); 
      do{
          fscanf(fic,"%d ;%f \n", &p.code,&p.prix);
          if(p.code==numrech){
            fclose(fic);
            return 1;
          }
      }while(!feof(fic));
        fclose(fic);
        return -1;
       }
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // fonction de chargement de données en memoire. Un retour négatif indique une erreur, un retour à 0 indique que l'info n'a pas été trouvée
    int chargement(int numrech) {
    	char *fic="Produits.txt";
    	FILE *fp=fopen(fic, "r");
    	if (fp == NULL) {
    		fprintf(stderr, "Erreur ouverture [%s] - %s\n", fic, strerror(errno));
    		return -1;
    	}
     
    	t_produit p;
    	while (fscanf(fp,"%d ;%f \n", &p.code, &p.prix) > 0) {
    		if (p.code == numrech) {
    			fclose(fp);
    			return 1;
    		}
    	}
    	// Puisque tu veux absolument utiliser feof(), alors voici son utilité: détecter si la fin de lecture est due à une fin de fichier ou autre chose (une erreur)
    	if (feof(fp) == 0) {
    		// Ici il y a eu erreur de lecture
    		fprintf(stderr, "Erreur lecture [%s] - %s\n", fic, strerror(errno));
    		fclose(fp);
    		return -2;
    	}
    	fclose(fp);
    	return 0;
    }
    Voilà un bon exemple pour démarrer. Bien sûr perso je mettrais le nom du fichier en paramètre ce qui permet de rendre la fonction plus "universelle" mais bon pour un premier TP ça n'est pas prioritaire.

    Citation Envoyé par Limbardo Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //ajouter un nouveau produit
     void ajouter_produit(){
         FILE*fic=fopen("Produits.txt","a");
         int num;
            printf("Entrer le code du produit a ajouter\n");
            scanf("%d",&num);
            while(chargement(num)==1)
    Tu as ouvert le fichier en append, puis tu appelles "chargement()" qui va le réouvrir en lecture. Là je ne sais pas trop comment ça va se comporter. Est-ce que tout a bien été écrit à ce moment là ??? Et sinon question algo, le while() va appeler la fonction autant de fois qu'il faut ; fonction qui elle va potentiellement lire tout le fichier => ça peut fonctionner mais en tout cas ça ne fonctionnera pas vite !!!

    Citation Envoyé par Limbardo Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // sauvegarde des donnees dans un ficher
     void save_produit(){
       FILE*fic=fopen("Produits.txt","w");
         fprintf(fic,"code:%d\t prix:%f",p.code,p.prix);
       fclose(fic);
     }
    Ah oui, classe !!! Donc déjà ce n'est pas "sauvegarde des données" mais "sauvegarde de ma seule et unique donnée" et bon ben ouverture en "w" = effacement du fichier.

    Pour le reste les remarques de Medinoc sont très complètes. Et moi je rajouterai que c'est quand tu veux que tu indentes proprement ton code. Franchement, c'est pas plus aisé à relire et donc à comprendre un code bien indenté ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/02/2012, 14h25
  2. Réponses: 6
    Dernier message: 13/12/2011, 20h54
  3. Réponses: 1
    Dernier message: 18/02/2011, 09h49
  4. Réponses: 13
    Dernier message: 27/02/2008, 09h49
  5. Réponses: 22
    Dernier message: 07/12/2005, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo