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 :

Mon programme de gestion des stocks ...


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut Mon programme de gestion des stocks ...
    Bonjour,

    Je travaille actuellement sur mon projet de fin d'étude chez Educatel (...)
    et je dois créer un programme de Gestion des stocks pour une petite pharmacie.

    Je commence donc et je me retrouve pour le moment avec un problème que je n'arrive pas à comprendre.

    Voici tout d'abord mon code (sachez qu'il n'est pas complet! Le main, et une autre classe sont écrite à part)

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<vector>
    #include<string>
     
    using namespace std;
     
    /////////////////////////////////
    //*******************************
    //CLASSE FICHE PRODUIT
    //*******************************
    /////////////////////////////////
     
    class Fichep {
     
    //Définition d'une fiche produit 
    typedef struct TypeProduit
    {
    string nom; //nom du produit
    vector<string>fournisseur; // nom du fournisseur
    vector<string>categorie; // catégorie du produit
    float prix; //pour le prix du produit
    int ref; // la référence du produit
    char rang[5]; // référence du lieu de rangement
    string info; // informations produit
    int qteStock; //quantité en stock actuel
    int qteAlerte; // valeur du stock alerte
    }Fiche;
     
    //Définition du type catégorie
    //pour les différentes catégories de produits
    typedef struct TypeCateg
    {
    vector<char>categorie;
    }Cat;
     
    //définition du type fournisseur
    //pour les différents fournisseurs possibles
    typedef struct TypeFourn
    {
    vector<char>fournisseur;
    }Fournisseur;
     
     
    //Un tableau regroupement toute la marchandise
    vector<Fiche>stock;
     
    public:
          Fichep(); //constructeur
           ~Fichep(); //destructeur
     
           void Creer_Fiche(); //permet de créer une nouvelle fiche produit
           void Modifier_Fiche(); //permet la modification d'une fiche produit
           void Supprimer_Fiche(); //permet de supprimer une fiche produit
           int Recherche_ref(); //permet de rechercher un produit par sa référence
    };
     
    //CONSTRUCTEUR DE FICHEP
    //************
     
    Fichep::Fichep () {
    cout<<"Creation d'une fiche produit par défaut.. "<<endl;
    cout<<endl;
     
     
     
     
    }
     
    //DESTRUCTEUR DE FICHEP
    //***********
     
    Fichep::~Fichep(){
     
    return;
    }
     
     
    //Fonction de creation de fiche produit:
    //**************************************
     
    void Fichep::Creer_Fiche() {
     
    cout<<"********************************"<<endl;
    cout<<"***CREATION UNE FICHE PRODUIT***"<<endl;
    cout<<"********************************"<<endl;
    cout<<endl;
    cout<<endl;
     
    cout<<"Nom du produit: ";
    getline(cin,nom);
    cout<<endl;
    cout<<"Fournisseur: ";
    getline(cin,fournisseur);
    cout<<endl;
    cout<<"Categorie produit: ";
    getline(cin,categorie);
    cout<<endl;
    cout<<"Prix unitaire: ";
    cin>>prix;
    cout<<endl;
    cout<<"Reference produit: ";
    cin>>ref;
    cout<<endl;
    cout<<"Reference rangement (par exemple A1E5 pour Armoire 1 Etagere 5): ";
    cin>>rang;
    cout<<endl;
    cout<<"Notes produit: ";
    getline(cin,info);
    cout<<endl;
    cout<<"Quantité en stock actuel: ";
    cin>>qteStock;
    cout<<endl;
    cout<<"Valeur stock d'alerte: ";
    cin>>QteAlerte;
    cout<<endl;
    cout<<endl;
     
     
    }
     
     
    //Fonction de modification de fiche produit:
    //******************************************
     
    void Fichep::Modifier_Fiche(){
     
    int x,i;
     
    cout<<"**********************************"<<endl;
    cout<<"*** MODIFIER UNE FICHE PRODUIT ***"<<endl;
    cout<<"**********************************"<<endl;
    cout<<endl;
    cout<<endl;
     
    i=recherche_ref(); //Il faut tout d'abord demander une recherche du produit
                       //a modifier ...
     
    if(i!=-1) {
     
    cout<<"Nouveau nom du produit: ";
    getline(cin,nom);
    cout<<endl;
    cout<<"Nouveau Fournisseur: ";
    getline(cin,fournisseur);
    cout<<endl;
    cout<<"Nouvelle categorie produit: ";
    getline(cin,categorie);
    cout<<endl;
    cout<<"Nouveau Prix unitaire: ";
    cin>>prix;
    cout<<endl;
    cout<<"Nouvelle Reference produit: ";
    cin>>ref;
    cout<<endl;
    cout<<"Nouvelle Reference rangement: ";
    cin>>rang;
    cout<<endl;
    cout<<"Nouvelles Notes produit: ";
    getline(cin,infp);
    cout<<endl;
    cout<<"Modification Quantité en stock actuel: ";
    cin>>qteStock;
    cout<<endl;
    cout<<"Modification Valeur stock d'alerte: ";
    cin>>QteAlerte;
    cout<<endl;
    cout<<"Fin de la modification."<<endl;
    cout<<endl;
    cout<<endl;
    }
     
    //ecriref(); //Modification a effectuer ici également
    //il faudra ici implanter de quoi modifier les infos dans le fichier
     
    }
     
     
    //Fonction de suppression de fiche produit
    //***************************************
     
    void Fichep::Supprimer_Fiche(){
     
    int i,x;  
     
    cout<<"**********************************"<<endl;
    cout<<"***SUPPRESSION DE FICHE PRODUIT***"<<endl;
    cout<<"**********************************"<<endl;
    cout<<endl;
    cout<<endl;
     
    i=Recherche_ref();
     
    if(i!=-1) {
     
    stock[i].nom='\0';
    stock[i].fournisseur.clear();
    stock[i].categorie.clear();
    stock[i].prix='\0';
    stock[i].ref='\0';
    stock[i].rang='\0';
    stock[i].info='\0';
    stock[i].qteStock='\0';
    stock[i].qteAlerte='\0';
    cout<<"Article supprime!"<<endl;
    cout<<endl;
    cout<<endl;
     
    }
     
    //ecriref(); //réinscription des données dans le fichier..
    //a faire
     
     
     
    }
     
     
    //Fonction de recherche par référence
    //***********************************
     
    int Fichep::Recherche_ref(){
     
    int x,i,j;
     
    cout<<"****************************"<<endl;
    cout<<"***RECHERCHE DE REFERENCE***"<<endl;
    cout<<"****************************"<<endl;
    cout<<endl;
    cout<<endl;
     
    i=0;
    j=-1;
     
    cout<<"Veuillez entrer la r\202f\202rence de l'article \205 modifier svp: ";
    cin>>x;
     
    for(i=0; i<stock.size)&&(j==-1); i++)
    {
    if(stock[i].ref==x){
    j=i;
    }
    if(j==-1){
    cout<<"R\202f\202rence non valide!"<<endl;
    cout<<endl;
    }
    return j;
    }
    }
    Bon en fait voilà, dans la fonction "Creer_fICHE" je me retrouve avec toute mes variables "inconnues" au bataillons:

    92 : `nom' undeclared (first use this function)
    95 `fournisseur' undeclared (first use this function)
    ...
    etc jusqu'à la fin !

    Idem dans la fonction de modification...

    Je me dit donc qu'il y a un problème avec la déclaration de ma structure "Fiche" ...
    Ou dans ma manière de réceptionner les données? (getline?)

    En passant le curseur sur les variables, DEVC++ reconnait pourtant que nom par exemple est de type string, etc...

    Je pensais m'être tromper dans getline et avais donc modifier
    getline(cin,nom);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getline(cin,Fiche.nom);
    Mais non..

    Quelqu'un peut il me mettre sur la voie ?

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    je me retrouve avec toute mes variables "inconnues" au bataillons:
    C'est normal, elles ne sont déclarées nul part.

    Je me dit donc qu'il y a un problème avec la déclaration de ma structure "Fiche" ...
    En fait ta structure Fiche est un nouveau Type definie avec typedef.

    Je pense qu'il va falloir revoir la conception de l'ensemble.

  3. #3
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    C'est normal, elles ne sont déclarées nul part.

    Ben si, j'ai bien déclaré toutes mes variables, dans la structure, là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct TypeProduit
    {
    string nom; //nom du produit
    vector<string>fournisseur; // nom du fournisseur
    vector<string>categorie; // catégorie du produit
    float prix; //pour le prix du produit
    int ref; // la référence du produit
    char rang[5]; // référence du lieu de rangement
    string info; // informations produit
    int qteStock; //quantité en stock actuel
    int qteAlerte; // valeur du stock alerte
    }Fiche;


  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Déjà, le typedef sur une structure, ce n'est nécessaire qu'en C, en C++, la déclaration de type est automatique dés que tu déclare un type personnalisé avec struct, class, union ou enum (et bien évidemment avec typedef )

    Ensuite, il faut faire attention au fait que ce n'est pas parce que tu déclare une structure donnée que tu dispose automatiquement d'une variable du type de cette structure.

    Et, quand bien même, tu viendrais à disposer d'une variable du type de cette structure, si tu veux accéder à l'un de ces membres, tu dois préciser... la variable à laquelle tu fais allusion.

    Actuellement, tout ce que tu sais, c'est qu'il existe une structure (un type) nommé TypeProduit ou Fiche (car les deux sont strictement équivalents), et qu'il y a une variable nommé nom dans cette structure.

    C'est déjà pas mal en soi, mais, si tu veux arriver à définir le nom d'un type de produit, il faut que tu dispose d'une variable du type correspondant

    Pour cela, tu dois déclarer une variable sous une forme proche de
    TypeProduit monproduit;
    puis faire référence à cette variable de manière à préciser que c'est bel et bien la variable nom de cette variable que tu veux récupérer, sous la forme de (selon ton exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getline(cin,monproduit.nom);
    Il faudrait, en outre attirer ton attention sur le fait que l'utilisation d'un tableau de caractères de taille fixe n'est clairement pas la solution adaptée à la gestion des noms de produit... surtout si tu limite "arbitrairement" le nombre de caractères utiles à 4 (avec le caractère '\0' de fin de chaine).

    En effet, si 4 caractères suffisent pour présenter AAS (acronyme de Acide Acethyl Salicilique, ce que l'on trouve dans l'aspirine de base), c'est largement insuffisant si tu décide d'écrire "dafalgan" ou, pire "dehydrobenzperidol", qui sont les noms "commerciaux" de certains produits

    Enfin, je voudrais attirer ton attention sur un principe que l'on nomme RAII (Ressource Acquisition Is Initialisation), qui conseille très fortement de faire en sorte que chaque objet que tu peux créer soit directement correctement initialisé (que les membres de chaque objet que tu crée prennent directement une valeur cohérente par rapport avec le reste).

    Or, une fiche de produit ne t'est d'aucune utilité si le nom, le prix, la quantité en stock et la côte d'alerte ne sont pas définis.

    De plus, il peut être dangeureux de laisser un acces en modification à ces informations:
    • Tu risque de faire passer de l'aspirine pour... du valium si permet la modification sans vérification du nom
    • Tu risque de faire payer de l'eau distillée à prix d'or si tu permet la modification sans vérification du prix (ou inversément de provoquer la faillite du magasin en permettant une diminution du prix sans vérification)
    • Tu risque d'avoir un état de stock qui ne correspond pas sur papier avec la réalité si tu permet la modification sans vérification de la quantité en stock (voire d'atteindre la cote d'alerte sans... etre alerté qu'il est temps d'en recommander)
    • Tu risque enfin d'avoir une cote d'alerte à 100 pour quelque chose qui est vendue deux fois par an (les 29 février et les 31 décembres) ou, inversément, d'avoir une cote d'alerte à 3 pour quelque chose qui est vendu à raison de trois par heure si tu permet la modification sans vérification de la cote d'alerte.
    Tu l'aura compris, ce sont là des situations tout à fait inacceptables, qui justifient de ne pas laisser ces informations "accessible (en modification) au premier venu":
    Une fois le nom défini (à la création de l'objet), il ne doit plus être modifié, et seul un acces "en lecture seule" doit être autorisé
    • Le prix ne doit être modifiable que "par le responsable" et accessible uniquement en "lecture seul" aux autres membres du personnel
    • La quantité en stock doit etre accessible en lecture seule d'un part (pour savoir s'il reste bien, à un moment donné, les 5 boites demandées par un client) et ne doit être modifiée que par le fait qu'on signale une vente ou un arrivage en stock
    • Une fois la cote d'alerte définie (à la création de l'objet), elle ne devrait plus être modifiée (et même le fait de laisser un acces en "lecture seule" devrait être murement réfléchi)

    Bref, en un mot, il faut que tu veilles à une bonne encapsulation de tes données, et donc à la création des fonctions qui iront bien en fonction de ces remarques

    Cela passera, entre autre, par le fait de créer un constructeur prenant en paramètre le nom, le prix, la quantité nominale en stock et la cote d'alerte et par le fait de revoir le moment où tu créera ton objet (qui ne pourra avoir lieu que lorsque tu auras toutes les données nécessaires)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Ben si, j'ai bien déclaré toutes mes variables, dans la structure, là :
    Ça c'est la définition d'un nouveau type à l'aide de typedef.
    Ce n'est pas des déclarations de variables.

  6. #6
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Bon !
    Eh bien merci pour cette énooooooooorme réponse koala01

    J'avoue que le choix de la pharmacie, c'est franchement pas évident
    Je peux choisir moi même un autre type d'enseigne mais comme je n'avais pas trop d'idées, j'ai gardé cet exemple, et puis, les défis c'est simpatique

    Et a coté de ça, j'ai également un programme de gestion des fournisseurs à faire à côté !! Mouahah ...

    Je vais donc retravailler là dessus au mieux... sans venir poser trop de questions ici





    Je laisse tout de même le sujet "open" pour la suite, au cas ou ....

    Encore merci!


  7. #7
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut Un programme de gestion des stocks
    Me revoilà après quelques modifications !

    Merci énormément pour cette aide (plus haut) qui m'a été très très utile !

    J'ai mit en place un système de mot de passe, pour toute modification dans mes données, mot de passe qui sera préalablement définit, possibilité de le modifier, et donc en possession unique du "chef".

    Passons les autres modifications j'aimerais savoir si une chose est possible,
    j'explique:

    J'ai mit en place un syteme d'écriture et lecture de fichier avec <fstream> ... pour conserver mes données.
    Seulement un petit "problème" de dérange:

    MA PREMIERE SOLUTION: A chaque création d'une nouvelle fiche produit, j'aurais voulu créer un nouveau fichier texte qui contient uniquement les données de ce produit..
    Vous allez me dire surement que ce n'est pas comme ça qu'il faut fonctionner, vu la quantité énooooorme de produits d'une pharmacie, autant de fichiers texte dans un répertoire serait ridicule... Je pense que oui aussi.

    Dans ce cas je devrais donc (2EM SOLUTION) mettre toutes les données dans un seul fichier.




    Dans ces 2 cas un problème différent se pose pour chacun:

    pour la première solution je ne sais pas comment nommer le fichier texte avec le nom du produit. Voyez par exemple je veut créer une fiche produit pour le produit DAFALGAN, j'aimerais donc que le fichier texte se nomme DAFALGAN.txt ... Mais comment changer le nom du fichier en fonction du nom du produit

    (L'intérêt pour moi de cette solution est que si monsieur le Chef veut imprimer par exemple la fiche info du produit DAFALGAN, il puisse allait chercher le fichier texte correspondant dans le répertoire... En meme temps, vous me direz, pourquoi il voudrais l'imprimer .... Et si il veut la consulter, le programme qui me prend la tete actuellement est là pour ça! Mouai...)



    Pour ma deuxième solution qui a l'air plus "intelligente" mon problème est tel:
    je doit modifier, supprimer ou tout simplement consulter les données d'un seul produit, dans ce fichier texte interminable, existe-t-il un moyen de chercher le nom DAFALGAN par exemple dans ce fichier texte immmmmmmmmmmmense puis ensuite afficher uniquement ces données? (bon pour l'affichage des données, pas compliqué je sais qu'il y a tant de lignes par produit: une boucle et hop)


    Voilà si quelqu'un pourrait me dire comment faire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Programme Gestion des stocks
    Par marlene65 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/12/2014, 11h12
  2. [DB2] calcul, gestion des stocks
    Par moineaux44 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2006, 13h06
  3. Gestion des Stocks
    Par laklak dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/06/2006, 14h52
  4. [MS-DOS] Application de gestion des stocks
    Par ¤dinky¤ dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 30/01/2006, 14h25
  5. gestion des stocks
    Par gekondo dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 11h41

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