Ajouter exo2/main.c

This commit is contained in:
bastien 2026-06-02 21:21:13 +00:00
parent 402f3b2178
commit 93bcbab368

283
exo2/main.c Normal file
View File

@ -0,0 +1,283 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#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;
}