Définissez les structures pour représenter les chambres, les clients, et les réservations.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NOM 50
#define MAX_TYPE_CHAMBRE 20
#define MAX_RESERVATIONS 100
typedef struct {
int numero;
char type[MAX_TYPE_CHAMBRE];
float prix_par_nuit;
int reservee; // 0 pour disponible, 1 pour réservée
} Chambre;
typedef struct {
char nom[MAX_NOM];
char prenom[MAX_NOM];
struct tm date_arrivee;
struct tm date_depart;
} Client;
typedef struct {
Chambre chambre;
Client client;
} Reservation;
Les prototypes des fonctions nécessaires au programme :
void afficher_menu();
void ajouter_reservation(Chambre* chambres, int nb_chambres, Reservation* reservations, int* nb_reservations);
void annuler_reservation(Reservation* reservations, int* nb_reservations);
void afficher_reservations(Reservation* reservations, int nb_reservations);
void rechercher_reservation(Reservation* reservations, int nb_reservations);
void afficher_chambres_disponibles(Chambre* chambres, int nb_chambres, Reservation* reservations, int nb_reservations);
void sauvegarder_reservations(Reservation* reservations, int nb_reservations);
void charger_reservations(Reservation* reservations, int* nb_reservations);
La fonction principale gère le menu et les options.
int main() {
int choix;
int nb_chambres = 5; // Exemple : nombre initial de chambres
int nb_reservations = 0;
Chambre chambres[] = {
{101, "Simple", 50.0, 0},
{102, "Double", 80.0, 0},
{103, "Suite", 120.0, 0},
{104, "Simple", 50.0, 0},
{105, "Double", 80.0, 0}
};
Reservation* reservations = malloc(MAX_RESERVATIONS * sizeof(Reservation));
if (reservations == 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_reservation(chambres, nb_chambres, reservations, &nb_reservations);
break;
case 2:
annuler_reservation(reservations, &nb_reservations);
break;
case 3:
afficher_reservations(reservations, nb_reservations);
break;
case 4:
rechercher_reservation(reservations, nb_reservations);
break;
case 5:
afficher_chambres_disponibles(chambres, nb_chambres, reservations, nb_reservations);
break;
case 6:
sauvegarder_reservations(reservations, nb_reservations);
break;
case 0:
printf("Au revoir !\n");
break;
default:
printf("Option invalide\n");
break;
}
} while (choix != 0);
free(reservations);
return 0;
}
Affiche le menu principal du programme.
void afficher_menu() {
printf("\n------------------MENU------------------\n");
printf("1: Ajouter une nouvelle réservation\n");
printf("2: Annuler une réservation\n");
printf("3: Afficher les réservations en cours\n");
printf("4: Rechercher une réservation par nom de client\n");
printf("5: Afficher la liste des chambres disponibles\n");
printf("6: Sauvegarder les réservations dans un fichier\n");
printf("0: Quitter le programme\n");
printf("-----------------------------------------\n");
}
Ajoute une nouvelle réservation en vérifiant la disponibilité de la chambre.
void ajouter_reservation(Chambre* chambres, int nb_chambres, Reservation* reservations, int* nb_reservations) {
char nom[MAX_NOM];
char prenom[MAX_NOM];
int numero_chambre;
struct tm date_arrivee = {0};
struct tm date_depart = {0};
printf("Nom du client : ");
fgets(nom, MAX_NOM, stdin);
nom[strcspn(nom, "\n")] = 0;
printf("Prénom du client : ");
fgets(prenom, MAX_NOM, stdin);
prenom[strcspn(prenom, "\n")] = 0;
printf("Numéro de chambre souhaité : ");
scanf("%d", &numero_chambre);
getchar(); // Consommer le '\n'
printf("Date d'arrivée (JJ MM AAAA) : ");
scanf("%d %d %d", &date_arrivee.tm_mday, &date_arrivee.tm_mon, &date_arrivee.tm_year);
date_arrivee.tm_mon -= 1; // struct tm utilise des mois indexés à partir de 0
date_arrivee.tm_year -= 1900; // struct tm utilise l'année depuis 1900
printf("Date de départ (JJ MM AAAA) : ");
scanf("%d %d %d", &date_depart.tm_mday, &date_depart.tm_mon, &date_depart.tm_year);
date_depart.tm_mon -= 1;
date_depart.tm_year -= 1900;
int chambre_disponible = 0;
for (int i = 0; i < nb_chambres; i++) {
if (chambres[i].numero == numero_chambre && chambres[i].reservee == 0) {
chambre_disponible = 1;
for (int j = 0; j < *nb_reservations; j++) {
if (reservations[j].chambre.numero == numero_chambre) {
if ((mktime(&date_arrivee) < mktime(&reservations[j].client.date_depart)) &&
(mktime(&date_depart) > mktime(&reservations[j].client.date_arrivee))) {
printf("Chambre non disponible pour les dates spécifiées.\n");
return;
}
}
}
chambres[i].reservee = 1;
reservations[*nb_reservations].chambre = chambres[i];
strcpy(reservations[*nb_reservations].client.nom, nom);
strcpy(reservations[*nb_reservations].client.prenom, prenom);
reservations[*nb_reservations].client.date_arrivee = date_arrivee;
reservations[*nb_reservations].client.date_depart = date_depart;
(*nb_reservations)++;
printf("Réservation ajoutée avec succès.\n");
return;
}
}
if (!chambre_disponible) {
printf("Numéro de chambre invalide ou chambre déjà réservée.\n");
}
}
Annule une réservation en fonction du nom du client.
void annuler_reservation(Reservation* reservations, int* nb_reservations) {
char nom[MAX_NOM];
char prenom[MAX_NOM];
printf("Nom du client : ");
fgets(nom, MAX_NOM, stdin);
nom[strcspn(nom, "\n")] = 0;
printf("Prénom du client : ");
fgets(prenom, MAX_NOM, stdin);
prenom[strcspn(prenom, "\n")] = 0;
for (int i = 0; i < *nb_reservations; i++) {
if (strcmp(reservations[i].client.nom, nom) == 0 &&
strcmp(reservations[i].client.prenom, prenom) == 0) {
for (int j = 0; j < nb_chambres; j++) {
if (chambres[j].numero == reservations[i].chambre.numero) {
chambres[j].reservee = 0;
break;
}
}
for (int k = i; k < *nb_reservations - 1; k++) {
reservations[k] = reservations[k + 1];
}
(*nb_reservations)--;
printf("Réservation annulée avec succès.\n");
return;
}
}
printf("Réservation non trouvée.\n");
}
Affiche la liste des réservations en cours.
void afficher_reservations(Reservation* reservations, int nb_reservations) {
printf("\nRéservations en cours :\n");
for (int i = 0; i < nb_reservations; i++) {
printf("Client : %s %s\n", reservations[i].client.nom, reservations[i].client.prenom);
printf("Chambre : %d (%s)\n", reservations[i].chambre.numero, reservations[i].chambre.type);
printf("Dates : %02d/%02d/%d - %02d/%02d/%d\n",
reservations[i].client.date_arrivee.tm_mday,
reservations[i].client.date_arrivee.tm_mon + 1,
reservations[i].client.date_arrivee.tm_year + 1900,
reservations[i].client.date_depart.tm_mday,
reservations[i].client.date_depart.tm_mon + 1,
reservations[i].client.date_depart.tm_year + 1900);
printf("\n");
}
}
Rechercher une réservation par le nom du client.
void rechercher_reservation(Reservation* reservations, int nb_reservations) {
char nom[MAX_NOM];
char prenom[MAX_NOM];
printf("Nom du client : ");
fgets(nom, MAX_NOM, stdin);
nom[strcspn(nom, "\n")] = 0;
printf("Prénom du client : ");
fgets(prenom, MAX_NOM, stdin);
prenom[strcspn(prenom, "\n")] = 0;
for (int i = 0; i < nb_reservations; i++) {
if (strcmp(reservations[i].client.nom, nom) == 0 &&
strcmp(reservations[i].client.prenom, prenom) == 0) {
printf("Réservation trouvée :\n");
printf("Chambre : %d (%s)\n", reservations[i].chambre.numero, reservations[i].chambre.type);
printf("Dates : %02d/%02d/%d - %02d/%02d/%d\n",
reservations[i].client.date_arrivee.tm_mday,
reservations[i].client.date_arrivee.tm_mon + 1,
reservations[i].client.date_arrivee.tm_year + 1900,
reservations[i].client.date_depart.tm_mday,
reservations[i].client.date_depart.tm_mon + 1,
reservations[i].client.date_depart.tm_year + 1900);
return;
}
}
printf("Réservation non trouvée.\n");
}
Affiche les chambres disponibles pour une période donnée.
void afficher_chambres_disponibles(Chambre* chambres, int nb_chambres, Reservation* reservations, int nb_reservations) {
struct tm date_debut = {0};
struct tm date_fin = {0};
printf("Date de début (JJ MM AAAA) : ");
scanf("%d %d %d", &date_debut.tm_mday, &date_debut.tm_mon, &date_debut.tm_year);
date_debut.tm_mon -= 1;
date_debut.tm_year -= 1900;
printf("Date de fin (JJ MM AAAA) : ");
scanf("%d %d %d", &date_fin.tm_mday, &date_fin.tm_mon, &date_fin.tm_year);
date_fin.tm_mon -= 1;
date_fin.tm_year -= 1900;
printf("\nChambres disponibles :\n");
for (int i = 0; i < nb_chambres; i++) {
int disponible = 1;
for (int j = 0; j < nb_reservations; j++) {
if (chambres[i].numero == reservations[j].chambre.numero) {
if ((mktime(&date_debut) < mktime(&reservations[j].client.date_depart)) &&
(mktime(&date_fin) > mktime(&reservations[j].client.date_arrivee))) {
disponible = 0;
break;
}
}
}
if (disponible && chambres[i].reservee == 0) {
printf("Chambre : %d (%s) - Prix : %.2f par nuit\n", chambres[i].numero, chambres[i].type, chambres[i].prix_par_nuit);
}
}
}
Sauvegarde les réservations dans un fichier binaire.
void sauvegarder_reservations(Reservation* reservations, int nb_reservations) {
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_reservations, sizeof(int), 1, fichier);
fwrite(reservations, sizeof(Reservation), nb_reservations, fichier);
fclose(fichier);
printf("Réservations sauvegardées avec succès.\n");
}
Charge les réservations depuis un fichier binaire.
void charger_reservations(Reservation* reservations, int* nb_reservations) {
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_reservations, sizeof(int), 1, fichier);
fread(reservations, sizeof(Reservation), *nb_reservations, fichier);
fclose(fichier);
printf("Réservations chargées avec succès.\n");
}
Ajouter un commentaire
Veuillez vous connecter pour ajouter un commentaire.
Pas encore de commentaires.