Exercices Langage C

Exercice 1 Langage C Corrigé S1

Gestion d'une bibliothèque

Objectifs :

  • Manipuler les structures de données en C.
  • Utiliser des tableaux dynamiques.
  • Manipuler des fichiers.
  • Utiliser l'allocation dynamique de la mémoire.

Énoncé :

L'objectif de cet exercice est de créer un programme en C pour gérer une collection de livres dans une bibliothèque. Chaque livre est caractérisé par les éléments suivants :

  • Le titre du livre,
  • Le numéro ISBN,
  • Le nombre de pages,
  • Son statut de disponibilité (disponible ou emprunté).

Le programme doit afficher le menu suivant :

------------------MENU--------------
1: Ajouter un nouveau livre
2: Emprunter un livre
3: Retourner un livre
4: Informations d'un livre
5: Résumé de la bibliothèque
6: Sauvegarder l'état de la bibliothèque
0: Quitter le programme
------------------------------------

Options du menu :

  • Choix 1 (Ajouter un nouveau livre) : Le programme demande le titre du livre, le numéro ISBN et le nombre de pages. Si le livre existe déjà dans la collection, il signale une erreur. Sinon, le livre est ajouté comme disponible.

  • Choix 2 (Emprunter un livre) : Le programme demande le numéro ISBN du livre. Si le livre n'existe pas, il signale une erreur. Si le livre est déjà emprunté, le programme le notifie. Sinon, le livre est marqué comme emprunté.

  • Choix 3 (Retourner un livre) : Le programme demande le numéro ISBN du livre. Si le livre n'existe pas, il signale une erreur. Si le livre n'était pas emprunté, le programme informe l'utilisateur. Sinon, le livre est marqué comme disponible.

  • Choix 4 (Informations d'un livre) : Le programme demande le numéro ISBN. Si le livre n'existe pas, il signale une erreur. Sinon, il affiche le titre du livre, le numéro ISBN, le nombre de pages et la disponibilité.

  • Choix 5 (Résumé de la bibliothèque) : Le programme affiche un résumé de l'état de la bibliothèque, y compris :

    • Le nombre total de livres,
    • Le nombre de livres empruntés avec leurs numéros ISBN,
    • Le nombre de livres disponibles avec leurs numéros ISBN,
    • Le nombre moyen de pages pour l'ensemble des livres.
  • Choix 6 (Sauvegarder l'état de la bibliothèque) : Le programme enregistre l'état actuel de la bibliothèque dans un fichier binaire. Le nom du fichier est lu au clavier.

Objectifs :

  1. Manipuler les structures de données en C.
  2. Utiliser des tableaux dynamiques.
  3. Manipuler des fichiers.
  4. Utiliser l'allocation dynamique de la mémoire.

Chaque livre de la bibliothèque sera représenté par une structure Livre, et les livres seront stockés dans un tableau dynamique. Le programme proposera des options pour ajouter, emprunter, retourner et sauvegarder des livres.

Structure de base

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

#define MAX_TITLE_LENGTH 100
#define MAX_ISBN_LENGTH 20

typedef struct {
    char titre[MAX_TITLE_LENGTH];
    char isbn[MAX_ISBN_LENGTH];
    int pages;
    int disponible; // 1 pour disponible, 0 pour emprunté
} Livre;

1. Initialisation de la bibliothèque

Pour commencer, nous avons besoin d'une fonction d'initialisation de la bibliothèque (tableau dynamique). Cette fonction alloue de l'espace pour n livres.

Livre* init_bibliotheque(int *n) {
    printf("Entrez le nombre de livres à ajouter initialement : ");
    scanf("%d", n);
    return (Livre*)malloc((*n) * sizeof(Livre));
}

2. Ajouter un nouveau livre

Cette fonction vérifie si le livre existe déjà dans la bibliothèque via son numéro ISBN. Si ce n'est pas le cas, elle ajoute le livre à la fin du tableau dynamique.

int ajouter_livre(Livre **bibliotheque, int *n) {
    char isbn[MAX_ISBN_LENGTH];
    printf("Entrez le numéro ISBN du livre : ");
    scanf("%s", isbn);

    // Vérifier si le livre existe déjà
    for (int i = 0; i < *n; i++) {
        if (strcmp((*bibliotheque)[i].isbn, isbn) == 0) {
            printf("Erreur : Le livre existe déjà dans la bibliothèque.\n");
            return 0;
        }
    }

    // Si le livre n'existe pas, ajoutons-le
    *bibliotheque = realloc(*bibliotheque, (*n + 1) * sizeof(Livre));
    strcpy((*bibliotheque)[*n].isbn, isbn);

    printf("Entrez le titre du livre : ");
    scanf("%s", (*bibliotheque)[*n].titre);

    printf("Entrez le nombre de pages : ");
    scanf("%d", &(*bibliotheque)[*n].pages);

    (*bibliotheque)[*n].disponible = 1; // Le livre est disponible par défaut

    (*n)++;
    printf("Livre ajouté avec succès.\n");

    return 1;
}

3. Emprunter un livre

Cette fonction cherche un livre par son numéro ISBN et change son statut à "emprunté" si le livre est disponible.

int emprunter_livre(Livre *bibliotheque, int n) {
    char isbn[MAX_ISBN_LENGTH];
    printf("Entrez le numéro ISBN du livre à emprunter : ");
    scanf("%s", isbn);

    for (int i = 0; i < n; i++) {
        if (strcmp(bibliotheque[i].isbn, isbn) == 0) {
            if (bibliotheque[i].disponible == 0) {
                printf("Erreur : Le livre est déjà emprunté.\n");
                return 0;
            } else {
                bibliotheque[i].disponible = 0;
                printf("Le livre a été emprunté avec succès.\n");
                return 1;
            }
        }
    }

    printf("Erreur : Livre introuvable.\n");
    return 0;
}

4. Retourner un livre

Cette fonction marque un livre comme disponible lorsque l'utilisateur le retourne.

int retourner_livre(Livre *bibliotheque, int n) {
    char isbn[MAX_ISBN_LENGTH];
    printf("Entrez le numéro ISBN du livre à retourner : ");
    scanf("%s", isbn);

    for (int i = 0; i < n; i++) {
        if (strcmp(bibliotheque[i].isbn, isbn) == 0) {
            if (bibliotheque[i].disponible == 1) {
                printf("Erreur : Ce livre n'a pas été emprunté.\n");
                return 0;
            } else {
                bibliotheque[i].disponible = 1;
                printf("Le livre a été retourné avec succès.\n");
                return 1;
            }
        }
    }

    printf("Erreur : Livre introuvable.\n");
    return 0;
}

5. Informations sur un livre

Cette fonction affiche les informations d'un livre donné via son numéro ISBN.

void afficher_info_livre(Livre *bibliotheque, int n) {
    char isbn[MAX_ISBN_LENGTH];
    printf("Entrez le numéro ISBN du livre : ");
    scanf("%s", isbn);

    for (int i = 0; i < n; i++) {
        if (strcmp(bibliotheque[i].isbn, isbn) == 0) {
            printf("Titre: %s\n", bibliotheque[i].titre);
            printf("ISBN: %s\n", bibliotheque[i].isbn);
            printf("Nombre de pages: %d\n", bibliotheque[i].pages);
            printf("Disponibilité: %s\n", bibliotheque[i].disponible ? "Disponible" : "Emprunté");
            return;
        }
    }

    printf("Erreur : Livre introuvable.\n");
}

6. Résumé de la bibliothèque

Cette fonction affiche un résumé des livres disponibles et empruntés, ainsi que la moyenne du nombre de pages.

void afficher_resume_bibliotheque(Livre *bibliotheque, int n) {
    int livres_disponibles = 0, livres_empruntes = 0;
    int total_pages = 0;

    printf("Résumé de la bibliothèque :\n");

    for (int i = 0; i < n; i++) {
        total_pages += bibliotheque[i].pages;

        if (bibliotheque[i].disponible) {
            livres_disponibles++;
            printf("Livre disponible - ISBN: %s\n", bibliotheque[i].isbn);
        } else {
            livres_empruntes++;
            printf("Livre emprunté - ISBN: %s\n", bibliotheque[i].isbn);
        }
    }

    printf("Total de livres : %d\n", n);
    printf("Livres disponibles : %d\n", livres_disponibles);
    printf("Livres empruntés : %d\n", livres_empruntes);
    printf("Nombre moyen de pages : %.2f\n", (float)total_pages / n);
}

7. Sauvegarde de la bibliothèque

Cette fonction permet de sauvegarder l'état actuel de la bibliothèque dans un fichier binaire

void sauvegarder_bibliotheque(Livre *bibliotheque, int n) {
    char nom_fichier[50];
    printf("Entrez le nom du fichier de sauvegarde : ");
    scanf("%s", nom_fichier);

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

    fwrite(&n, sizeof(int), 1, f); // Sauvegarder le nombre de livres
    fwrite(bibliotheque, sizeof(Livre), n, f); // Sauvegarder la bibliothèque
    fclose(f);

    printf("État de la bibliothèque sauvegardé avec succès.\n");
}

8. Programme principal

Le programme principal affiche le menu et permet à l'utilisateur de sélectionner les options.

int main() {
    Livre *bibliotheque = NULL;
    int n = 0;
    int choix;

    // Initialiser la bibliothèque
    bibliotheque = init_bibliotheque(&n);

    do {
        printf("\n------------------MENU--------------\n");
        printf("1: Ajouter un nouveau livre\n");
        printf("2: Emprunter un livre\n");
        printf("3: Retourner un livre\n");
        printf("4: Informations d'un livre\n");
        printf("5: Résumé de la bibliothèque\n");
        printf("6: Sauvegarder l'état de la bibliothèque\n");
        printf("0: Quitter le programme\n");
        printf("------------------------------------\n");
        printf("Entrez votre choix: ");
        scanf("%d", &choix);

        switch (choix) {
            case 1:
                ajouter_livre(&bibliotheque, &n);
                break;
            case 2:
                emprunter_livre(bibliotheque, n);
                break;
            case 3:
                retourner_livre(bibliotheque, n);
                break;
            case 4:
                afficher_info_livre(bibliotheque, n);
                break;
            case 5:
                afficher_resume_bibliotheque(bibliotheque, n);
                break;
            case 6:
                sauvegarder_bibliotheque(bibliotheque, n);
                break;
            case 0:
                printf("Fin du programme.\n");
                break;
            default:
                printf("Option non valide.\n");
                break;
        }

    } while (choix != 0);

    free(bibliotheque);
    return 0;
}

 

Ajouter un commentaire

Veuillez vous connecter pour ajouter un commentaire.

Pas encore de commentaires.