#include #include #include #include #define MAX_PASSAGERS 50 #define NOM_VOL_MAX 20 /* ---- Classes disponibles ---- */ #define CLASSE_ECO 1 #define CLASSE_AFFAIRES 2 #define CLASSE_PREMIERE 3 /* ---- Structure Passager ---- */ typedef struct { char nom[50]; char prenom[50]; int classe; int siege; float prix; } Passager; /* ---- Structure Vol ---- */ typedef struct { char code[NOM_VOL_MAX]; char destination[50]; int nb_passagers; Passager passagers[MAX_PASSAGERS] } Vol; /* ---- Prototypes ---- */ float getPrix(int classe); void afficherPassager(Passager p); int rechercherPassager(Vol *vol, char *nom); void sauvegarderVol(Vol vol); float calculerCA(Vol *vol); /* ============================================================ FONCTION : getPrix Retourne le prix selon la classe ============================================================ */ float getPrix(int classe) { if (classe == CLASSE_ECO) return 150.0; if (classe == CLASSE_AFFAIRES) return 450.0; if (classe == CLASSE_PREMIERE) return 900.0; return 0.0; } /* ============================================================ FONCTION : afficherPassager Affiche les infos d'un passager ============================================================ */ void afficherPassager(Passager p) { char *classeStr; if (p.classe == CLASSE_ECO) classeStr = "Economique"; if (p.classe == CLASSE_AFFAIRES) classeStr = "Affaires "; if (p.classe == CLASSE_PREMIERE) classeStr = "Premiere "; printf(" Siege %3d | %-20s %-15s | %-10s | %7.2f EUR\n", p.siege, p.nom, p.prenom, classeStr, p.prix); } /* ============================================================ FONCTION : rechercherPassager Retourne l'indice du passager dont le nom contient 'nom' (recherche insensible a la casse), ou -1 si non trouve ============================================================ */ int rechercherPassager(Vol *vol, char *nom) { int i, j; char nomMin[50], rechMin[50]; int len; strncpy(rechMin, nom, 49); rechMin[49] = '\0'; for (j = 0; rechMin[j]; j++) rechMin[j] = tolower(rechMin[j]); for (i = 0; i < vol->nb_passagers; i++) { strncpy(nomMin, vol->passagers[i].nom, 49); nomMin[49] = '\0'; for (j = 0; nomMin[j]; j++) nomMin[j] = tolower(nomMin[j]); if (strstr(nomMin, rechMin) != NULL) return i; } return -1; } /* ============================================================ FONCTION : calculerCA Retourne le chiffre d'affaires total du vol ============================================================ */ float calculerCA(Vol *vol) { int i; float total = 0.0; for (i = 0; i < vol->nb_passagers; i++) { total += vol->passagers[i].prix; } return total } /* ============================================================ FONCTION : sauvegarderVol Ecrit la liste des passagers dans "passagers.txt" ============================================================ */ void sauvegarderVol(Vol vol) { int i; FILE *f = fopen("passagers.txt", "w"); if (f == NULL) { printf("Erreur : impossible de creer le fichier.\n"); return; } fprintf(f, "VOL:%s DESTINATION:%s PASSAGERS:%d\n", vol.code, vol.destination, vol.nb_passagers); for (i = 0; i < vol.nb_passagers; i++) { fprintf(f, "%d;%s;%s;%d;%.2f\n", vol.passagers[i].siege, vol.passagers[i].nom, vol.passagers[i].prenom, vol.passagers[i].classe, vol.passagers[i].prix); } fclose(f); printf("Fichier passagers.txt sauvegarde (%d passagers).\n", vol.nb_passagers); } /* ============================================================ MAIN ============================================================ */ int main(void) { Vol vol; int choix, classe; int continuer = 1; char buffer[100]; char ligne[200]; FILE *f; /* Initialisation du vol */ strcpy(vol.code, "AF1842"); strcpy(vol.destination, "Tokyo"); vol.nb_passagers = 0; printf("===========================================\n"); printf(" Systeme de reservation - Vol %s vers %s\n", vol.code, vol.destination); printf("===========================================\n\n"); /* Ajout de 2 passagers par defaut pour les tests */ strcpy(vol.passagers[0].nom, "BERNARD"); strcpy(vol.passagers[0].prenom, "Sophie"); vol.passagers[0].classe = CLASSE_AFFAIRES; vol.passagers[0].siege = 1; vol.passagers[0].prix = getPrix(CLASSE_AFFAIRES); vol.nb_passagers++; strcpy(vol.passagers[1].nom, "MARTIN"); strcpy(vol.passagers[1].prenom, "Lucas"); vol.passagers[1].classe = CLASSE_ECO; vol.passagers[1].siege = 2; vol.passagers[1].prix = getPrix(CLASSE_ECO); vol.nb_passagers++; /* ---- Boucle menu ---- */ while (continuer) { printf("\n--- MENU ---\n"); printf("1. Ajouter un passager\n"); printf("2. Afficher tous les passagers\n"); printf("3. Rechercher un passager\n"); printf("4. Afficher le chiffre d'affaires\n"); printf("5. Sauvegarder et afficher le fichier\n"); printf("0. Quitter\n"); printf("Choix : "); scanf("%d", &choix); getchar(); switch (choix) { /* ---- Ajouter un passager ---- */ case 1: if (vol.nb_passagers >= MAX_PASSAGERS) { printf("Vol complet !\n"); break; } { Passager nouveau; printf("Nom : "); fgets(nouveau.nom, 50, stdin); printf("Prenom : "); fgets(nouveau.prenom, 50, stdin); /* Retirer le '\n' laisse par fgets */ nouveau.nom[strcspn(nouveau.nom, "\n")] = '\0'; nouveau.prenom[strcspn(nouveau.prenom, "\n")] = '\0'; printf("Classe (1=Eco / 2=Affaires / 3=Premiere) : "); scanf("%d", &classe); getchar(); if (classe < 1 || classe > 3) { printf("Classe invalide.\n"); break; } nouveau.classe = classe; nouveau.siege = vol.nb_passagers; nouveau.prix = getPrix(classe); vol.passagers[vol.nb_passagers] = nouveau; vol.nb_passagers++; printf("Passager ajoute au siege %d.\n", nouveau.siege); } break; /* ---- Afficher tous les passagers ---- */ case 2: if (vol.nb_passagers == 0) { printf("Aucun passager enregistre.\n"); break; } printf("\n%-5s | %-20s %-15s | %-10s | %s\n", "Siege", "Nom", "Prenom", "Classe", "Prix"); printf("-------------------------------------------------------------\n"); { int i; for (i = 0; i <= vol.nb_passagers; i++) afficherPassager(vol.passagers[i]); } break; /* ---- Rechercher un passager ---- */ case 3: printf("Nom a rechercher : "); fgets(buffer, 100, stdin); buffer[strcspn(buffer, "\n")] = '\0'; { int idx = rechercherPassager(&vol, buffer); if (idx == -1) { printf("Passager '%s' non trouve.\n", buffer); } else { printf("Passager trouve (indice %d) :\n", idx); afficherPassager(vol.passagers[idx]); } } break; /* ---- Chiffre d'affaires ---- */ case 4: printf("Chiffre d'affaires vol %s : %.2f EUR\n", vol.code, calculerCA(vol)); break; /* ---- Sauvegarder + afficher fichier ---- */ case 5: sauvegarderVol(vol); f = fopen("passagers.txt", "r"); if (f == NULL) { printf("Impossible de relire le fichier.\n"); break; } printf("\n--- Contenu de passagers.txt ---\n"); while (fgets(ligne, sizeof(ligne), f) != NULL) printf(ligne); fclose(f); break; case 0: continuer = 0; printf("Au revoir.\n"); break; default: printf("Choix invalide.\n"); } } return 0; }