Exercice 1 Langage C Corrigé S1
Objectifs :
- Manipuler les structures de données en C.
- Utiliser des tableaux dynamiques.
- Manipuler des fichiers.
- 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;
}
Pas encore de commentaires.
Ajouter un commentaire
Veuillez vous connecter pour ajouter un commentaire.