Exercices Langage C

Exercice 4 Langage C Corrigé S1

Gestion d'un Système de Gestion des Stocks d'un Magasin

Objectifs :

  1. Manipuler des structures de données complexes en C.
  2. Utiliser l'allocation dynamique de mémoire et les tableaux dynamiques.
  3. Travailler avec des fichiers pour enregistrer et charger des données.
  4. Implémenter des algorithmes de tri et de recherche.
  5. Gérer des transactions complexes, comme des achats et des ventes.

Énoncé : L'objectif de cet exercice est de développer un programme en C pour gérer les stocks d'un magasin. Chaque article en stock est représenté par :

  • Le nom de l'article,
  • Un code-barres unique,
  • Le prix unitaire,
  • La quantité en stock.

Le programme doit permettre à l'utilisateur d'effectuer plusieurs opérations, telles que l'ajout d'un nouvel article, la vente d'un article, l'achat de nouveaux stocks, et l'affichage du stock actuel.

Menu à afficher :

------------------MENU------------------
1: Ajouter un nouvel article
2: Vendre un article
3: Acheter de nouveaux stocks
4: Consulter les informations d'un article
5: Afficher le résumé du stock
6: Sauvegarder l'état des stocks
7: Charger l'état des stocks depuis un fichier
0: Quitter le programme
-----------------------------------------

Détails des options :

  • Option 1 (Ajouter un nouvel article) : Le programme demande le nom de l'article, le code-barres, le prix unitaire, et la quantité initiale. Si l'article existe déjà, le programme signale une erreur, sinon il l'ajoute au stock.

  • Option 2 (Vendre un article) : Le programme demande le code-barres de l'article et la quantité à vendre. Il vérifie si la quantité en stock est suffisante. Si l'article n'existe pas ou si la quantité est insuffisante, il signale une erreur. Sinon, il diminue la quantité de l'article en stock.

  • Option 3 (Acheter de nouveaux stocks) : Le programme demande le code-barres de l'article et la quantité à ajouter. Si l'article n'existe pas, il signale une erreur, sinon il augmente la quantité en stock.

  • Option 4 (Consulter les informations d'un article) : Le programme demande le code-barres de l'article et affiche son nom, son prix, et la quantité restante. Si l'article n'existe pas, une erreur est signalée.

  • Option 5 (Afficher le résumé du stock) : Le programme affiche un résumé des articles en stock, y compris :

    • Le nombre total d'articles différents,
    • La quantité totale d'articles,
    • La valeur totale du stock (quantité * prix unitaire),
    • Les articles qui sont en rupture de stock.
  • Option 6 (Sauvegarder l'état des stocks) : Le programme sauvegarde l'état actuel des stocks dans un fichier binaire dont le nom est saisi par l'utilisateur.

  • Option 7 (Charger l'état des stocks) : Le programme charge l'état des stocks à partir d'un fichier binaire. Si le fichier n'existe pas, une erreur est signalée.

Consignes :

  • Utiliser une structure Article pour stocker les informations sur chaque article.
  • Gérer les stocks avec un tableau dynamique de structures Article.
  • Implémenter des algorithmes de tri pour afficher les articles par ordre alphabétique ou par quantité en stock.
  • Utiliser des fichiers binaires pour sauvegarder et charger l'état des stocks.
  • Mettre en place un contrôle d'erreurs pour gérer les saisies incorrectes (article inexistant, quantité insuffisante, etc.).
  • Mettre à jour automatiquement la valeur du stock après chaque vente ou achat.

1. Définition de la Structure

La structure Article représente chaque article en stock.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAILLE_INITIALE 2
#define TAILLE_CODE 20
#define TAILLE_NOM 50

typedef struct {
    char nom[TAILLE_NOM];
    char code_barres[TAILLE_CODE];
    float prix;
    int quantite;
} Article;

2. Prototypes des Fonctions

Les prototypes des fonctions nécessaires au programme :

void afficher_menu();
void ajouter_article(Article** stock, int* nb_articles, int* taille_max);
void vendre_article(Article* stock, int* nb_articles);
void acheter_article(Article* stock, int nb_articles);
void consulter_article(Article* stock, int nb_articles);
void afficher_resume(Article* stock, int nb_articles);
void sauvegarder_stock(Article* stock, int nb_articles);
void charger_stock(Article** stock, int* nb_articles, int* taille_max);
void trier_stock_par_nom(Article* stock, int nb_articles);
void trier_stock_par_quantite(Article* stock, int nb_articles);

3. Fonction Principale

La fonction principale gère le menu et les options.

int main() {
    int choix;
    int nb_articles = 0;
    int taille_max = TAILLE_INITIALE;
    Article* stock = malloc(taille_max * sizeof(Article));

    if (stock == NULL) {
        printf("Erreur d'allocation mémoire\n");
        return 1;
    }

    do {
        afficher_menu();
        printf("Choisissez une option: ");
        scanf("%d", &choix);
        getchar(); // Pour consommer le '\n' restant dans le buffer

        switch (choix) {
            case 1:
                ajouter_article(&stock, &nb_articles, &taille_max);
                break;
            case 2:
                vendre_article(stock, &nb_articles);
                break;
            case 3:
                acheter_article(stock, nb_articles);
                break;
            case 4:
                consulter_article(stock, nb_articles);
                break;
            case 5:
                afficher_resume(stock, nb_articles);
                break;
            case 6:
                sauvegarder_stock(stock, nb_articles);
                break;
            case 7:
                charger_stock(&stock, &nb_articles, &taille_max);
                break;
            case 0:
                printf("Au revoir !\n");
                break;
            default:
                printf("Option invalide\n");
                break;
        }
    } while (choix != 0);

    free(stock);
    return 0;
}

4. Afficher le Menu

Affiche le menu principal du programme.

void afficher_menu() {
    printf("\n------------------MENU------------------\n");
    printf("1: Ajouter un nouvel article\n");
    printf("2: Vendre un article\n");
    printf("3: Acheter de nouveaux stocks\n");
    printf("4: Consulter les informations d'un article\n");
    printf("5: Afficher le résumé du stock\n");
    printf("6: Sauvegarder l'état des stocks\n");
    printf("7: Charger l'état des stocks depuis un fichier\n");
    printf("0: Quitter le programme\n");
    printf("-----------------------------------------\n");
}

5. Ajouter un Nouvel Article

Ajoute un nouvel article au stock.

void ajouter_article(Article** stock, int* nb_articles, int* taille_max) {
    if (*nb_articles == *taille_max) {
        *taille_max *= 2;
        *stock = realloc(*stock, *taille_max * sizeof(Article));
        if (*stock == NULL) {
            printf("Erreur de réallocation mémoire\n");
            exit(1);
        }
    }

    Article nouvel_article;
    printf("Nom de l'article : ");
    fgets(nouvel_article.nom, TAILLE_NOM, stdin);
    nouvel_article.nom[strcspn(nouvel_article.nom, "\n")] = 0;

    printf("Code-barres : ");
    fgets(nouvel_article.code_barres, TAILLE_CODE, stdin);
    nouvel_article.code_barres[strcspn(nouvel_article.code_barres, "\n")] = 0;

    printf("Prix unitaire : ");
    scanf("%f", &nouvel_article.prix);
    getchar();

    printf("Quantité initiale : ");
    scanf("%d", &nouvel_article.quantite);
    getchar();

    for (int i = 0; i < *nb_articles; i++) {
        if (strcmp((*stock)[i].code_barres, nouvel_article.code_barres) == 0) {
            printf("Erreur : l'article existe déjà.\n");
            return;
        }
    }

    (*stock)[*nb_articles] = nouvel_article;
    (*nb_articles)++;
    printf("Article ajouté avec succès !\n");
}

6. Vendre un Article

Gère la vente d'un article en vérifiant la quantité disponible.

void vendre_article(Article* stock, int* nb_articles) {
    char code_barres[TAILLE_CODE];
    printf("Code-barres de l'article à vendre : ");
    fgets(code_barres, TAILLE_CODE, stdin);
    code_barres[strcspn(code_barres, "\n")] = 0;

    int quantite_vendre;
    printf("Quantité à vendre : ");
    scanf("%d", &quantite_vendre);
    getchar();

    for (int i = 0; i < *nb_articles; i++) {
        if (strcmp(stock[i].code_barres, code_barres) == 0) {
            if (stock[i].quantite >= quantite_vendre) {
                stock[i].quantite -= quantite_vendre;
                printf("Vente réussie. Quantité restante : %d\n", stock[i].quantite);
                return;
            } else {
                printf("Quantité insuffisante en stock.\n");
                return;
            }
        }
    }

    printf("Article non trouvé.\n");
}

7. Acheter de Nouveaux Stocks

Augmente la quantité d'un article existant.

void acheter_article(Article* stock, int nb_articles) {
    char code_barres[TAILLE_CODE];
    printf("Code-barres de l'article à acheter : ");
    fgets(code_barres, TAILLE_CODE, stdin);
    code_barres[strcspn(code_barres, "\n")] = 0;

    int quantite_acheter;
    printf("Quantité à acheter : ");
    scanf("%d", &quantite_acheter);
    getchar();

    for (int i = 0; i < nb_articles; i++) {
        if (strcmp(stock[i].code_barres, code_barres) == 0) {
            stock[i].quantite += quantite_acheter;
            printf("Achats réussis. Quantité actuelle : %d\n", stock[i].quantite);
            return;
        }
    }

    printf("Article non trouvé.\n");
}

8. Consulter les Informations d'un Article

Affiche les informations d'un article spécifique.

void consulter_article(Article* stock, int nb_articles) {
    char code_barres[TAILLE_CODE];
    printf("Code-barres de l'article à consulter : ");
    fgets(code_barres, TAILLE_CODE, stdin);
    code_barres[strcspn(code_barres, "\n")] = 0;

    for (int i = 0; i < nb_articles; i++) {
        if (strcmp(stock[i].code_barres, code_barres) == 0) {
            printf("Nom : %s\nPrix unitaire : %.2f\nQuantité restante : %d\n",
                   stock[i].nom, stock[i].prix, stock[i].quantite);
            return;
        }
    }

    printf("Article non trouvé.\n");
}

9. Afficher le Résumé du Stock

Affiche un résumé des articles en stock.

void afficher_resume(Article* stock, int nb_articles) {
    int total_articles = 0;
    int quantite_totale = 0;
    float valeur_totale = 0.0;
    
    printf("\nRésumé du stock :\n");
    for (int i = 0; i < nb_articles; i++) {
        total_articles++;
        quantite_totale += stock[i].quantite;
        valeur_totale += stock[i].quantite * stock[i].prix;
        
        if (stock[i].quantite == 0) {
            printf("Article en rupture de stock : %s (Code-barres: %s)\n", stock[i].nom, stock[i].code_barres);
        }
    }
    
    printf("Nombre total d'articles différents : %d\n", total_articles);
    printf("Quantité totale d'articles : %d\n", quantite_totale);
    printf("Valeur totale du stock : %.2f\n", valeur_totale);
}

10. Sauvegarder l'État des Stocks

Sauvegarde les stocks dans un fichier binaire.

void sauvegarder_stock(Article* stock, int nb_articles) {
    char nom_fichier[100];
    printf("Nom du fichier de sauvegarde : ");
    fgets(nom_fichier, 100, stdin);
    nom_fichier[strcspn(nom_fichier, "\n")] = 0;

    FILE* fichier = fopen(nom_fichier, "wb");
    if (fichier == NULL) {
        printf("Erreur d'ouverture du fichier\n");
        return;
    }

    fwrite(&nb_articles, sizeof(int), 1, fichier);
    fwrite(stock, sizeof(Article), nb_articles, fichier);
    fclose(fichier);

    printf("État des stocks sauvegardé avec succès.\n");
}

11. Charger l'État des Stocks

Charge les stocks depuis un fichier binaire.

void charger_stock(Article** stock, int* nb_articles, int* taille_max) {
    char nom_fichier[100];
    printf("Nom du fichier de chargement : ");
    fgets(nom_fichier, 100, stdin);
    nom_fichier[strcspn(nom_fichier, "\n")] = 0;

    FILE* fichier = fopen(nom_fichier, "rb");
    if (fichier == NULL) {
        printf("Erreur d'ouverture du fichier\n");
        return;
    }

    fread(nb_articles, sizeof(int), 1, fichier);

    *taille_max = *nb_articles;
    *stock = realloc(*stock, *taille_max * sizeof(Article));
    if (*stock == NULL) {
        printf("Erreur de réallocation mémoire\n");
        fclose(fichier);
        exit(1);
    }

    fread(*stock, sizeof(Article), *nb_articles, fichier);
    fclose(fichier);

    printf("État des stocks chargé avec succès.\n");
}

12. Tri des Articles

Implémente des algorithmes de tri pour trier les articles par nom et par quantité.

void trier_stock_par_nom(Article* stock, int nb_articles) {
    for (int i = 0; i < nb_articles - 1; i++) {
        for (int j = i + 1; j < nb_articles; j++) {
            if (strcmp(stock[i].nom, stock[j].nom) > 0) {
                Article temp = stock[i];
                stock[i] = stock[j];
                stock[j] = temp;
            }
        }
    }
}

void trier_stock_par_quantite(Article* stock, int nb_articles) {
    for (int i = 0; i < nb_articles - 1; i++) {
        for (int j = i + 1; j < nb_articles; j++) {
            if (stock[i].quantite < stock[j].quantite) {
                Article temp = stock[i];
                stock[i] = stock[j];
                stock[j] = temp;
            }
        }
    }
}

 

Ajouter un commentaire

Veuillez vous connecter pour ajouter un commentaire.

Pas encore de commentaires.