Exercice : Fournitures

Exercice : Fournitures#

À faire

2025-2026

Extraire le code dans un fichier pour le compiler.

Une entreprise vend des fournitures de bureau (crayon, gomme, ciseaux, …). Chaque fourniture stockée dans la réserve est identifiée par un code numérique unique (ex : 345), un libellé exprimé sous la forme d’une chaîne de caractères (ex. stylo feutre pointe fine marque Boc), un prix d’achat unitaire au fournisseur (ex. 1,5 euro), le nombre d’items achetés au fournisseur et le nombre d’items déjà vendus.

Chaque fin d’année, l’entreprise effectue son inventaire, i.e. décompte, pour chaque fourniture, le nombre d’items théoriquement en stock (c.à.d. le nombre d’items achetés au fournisseur moins le nombre d’items vendus) puis calcule le montant total du stock (somme des prix d’achat unitaire multipliés par les nombres d’items théoriquement en stock).

  1. Définissez une structure Fourniture adaptée à la représentation des informations apparaissant dans l’énoncé ci-dessus.

    BEGIN SOLUTION

    struct Fourniture{
        string libelle;
        float prix;
        int code, nbAchat, nbVendu;
    };
    

    END SOLUTION

  2. Définissez la procédure permettant de saisir (lire au clavier) les informations relatives à une fourniture et de les transmettre en résultat.

    BEGIN SOLUTION

    void litFourniture(Fourniture &f){
        cout << "Entrez le code, le libellé et le prix "<< endl;
        cin >> f.code >> f.libelle >> f.prix ;
        do {
            cout <<  "nb achetés et nb vendus " << endl;
            cin >> f.nbAchat >> f.nbVendu ;
        } while ((f.nbAchat < 0) or (f.nbVendu > f.nbAchat) );
    }
    

    END SOLUTION

  3. Définissez la procédure permettant d’afficher les informations relatives à une fourniture donnée.

    BEGIN SOLUTION

    void ecritFourniture(Fourniture f) {
        cout << "la fourniture " << f.libelle << " de code " << f.code
             << " commandée " << f.nbAchat << " fois, a ete vendue "
             << f.nbVendu << " fois" << endl;
    }
    

    END SOLUTION

  4. Définissez la procédure qui met à jour une fourniture \(f\) donnée, quand une vente de \(n\) unités de cette fourniture vient d’être effectuée.

    BEGIN SOLUTION

    void maj(Fourniture &f, int n) {
        f.nbVendu += n;
    }
    

    END SOLUTION

  5. Définissez la procédure qui pour une fourniture \(f\) donnée, calcule et transmet en résultat le nombre d’items en stock et le montant correspondant.

    BEGIN SOLUTION

    void stock(Fourniture f, int &n, float &montant) {
        n = f.nbAchat - f.nbVendu;
        montant = n * f.prix;
    }
    

    END SOLUTION

  6. Quel type peut-on utiliser pour représenter l’ensemble des fournitures vendues par l’entreprise? Dans la suite de l’énoncé, on appellera cela un catalogue.

    BEGIN SOLUTION

    Il faut utiliser une forme de collection. Le plus simple est d’utiliser un vecteur. On peut utiliser aussi un tableau classique du C mais cela impose une taille fixe.

    END SOLUTION

  7. Définissez la procédure permettant de rajouter une nouvelle fourniture \(f\) donnée dans un catalogue \(c\) donné.

    BEGIN SOLUTION

    void ajouteAuCatalogue(vector<Fourniture> &c, Fourniture f) {
        c.push_back(f);
    }
    

    END SOLUTION

  8. Définissez la procédure ou fonction bilan qui étant donné un catalogue \(c\), affiche pour chaque fourniture, son libellé, le nombre d’éléments en stock et le montant correspondant, puis enfin, affiche la valeur totale du stock.

    BEGIN SOLUTION

    void bilan(vector<Fourniture> c) { // ou (const vector<Fourniture> &c)
        int n; float m, sum = 0; Fourniture f;
        for (int i = 0; i < c.size(); i++){
            f = c[i];
            stock(f, n, m);
            cout << "il y a " << n << " " << f.libelle
                 << " en euro, ca represente " << m << endl;
            sum += m;
        }
        cout << "le stock total vaut " << sum << endl;
    }
    

    END SOLUTION

  9. Définissez la procédure permettant de retirer une fourniture de code donné d’un catalogue \(c\) donné.

    BEGIN SOLUTION

    void retireCatalogue(vector<Fourniture> &c, int code) {
        int i = 0;
        while (i < c.size() && c[i].code != code)
            i++;
        if (i == c.size()) {
            cout << "la fourniture de code " << code << " n existe pas ";
        } else { // on supprime la i-ieme donc on decale le reste du tableau
            for (int j = i; j + 1 < c.size(); j++)
                c[j] = c[j + 1];
            c.pop_back();
        }
    }
    

    END SOLUTION

  10. Comment faudrait-il faire pour disposer d’un type Catalogue ?

    BEGIN SOLUTION

    using Catalogue = vector<Fourniture>;
    

    END SOLUTION