Objectifs :
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.
#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;
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));
}
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;
}
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;
}
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;
}
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");
}
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);
}
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");
}
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.