#include #include #include /* Med: On déclare généralement les structures en global. */ //DECLARATION DES TYPES DE STRUCTURES typedef struct piste { int code_piste, nb_empl; char designation[20], statut[20], type_vol[20]; }piste; typedef struct employe { int code_employe, code_piste,nb_empl; char nom[15], prenom[15], tel[11], fonction[20]; /* Med: Champ inutile dont je ne m'explique pas la présence. piste element; */ }employe; //Macro ARRAYSIZE(), qui donne toujours la longueur d'un tableau. //A ne pas utiliser sur les pointeurs. #ifndef ARRAYSIZE #define ARRAYSIZE(tab) (sizeof(tab)/sizeof(tab[0])) #endif /*===========================================================================*/ /* Med : Cette fonction ressemble sûrement à une formule magique, mais elle sert à vider une ligne dans l'entrée. */ int ViderLigne(void) { int retour = 0; int c; while((c=getchar()) != EOF && c != '\n') { } if(c==EOF) retour = -1; /* Il n'y a plus rien en entrée */ return retour; } /*---------------------------------------------------------------------------*/ /* Med: Une fonction assez sûre pour demander un entier. Retourne def en cas d'échec. */ int DemanderNombre(char const *message, int def) { int choix = def; int nScanned; int resViderLigne = 0; /* 0 = Une valeur qui ne fait pas quitter la boucle. */ /* Med: Une boucle do-while qui pose la question jusqu'à ce qu'une réponse valide soit donnée. */ do { printf(message); /* Med : Après un printf() sans retour à la ligne, un fflush() est nécessaire */ fflush(stdout); nScanned = scanf("%d", &choix); resViderLigne = ViderLigne(); } while(nScanned != 1 && resViderLigne >= 0); if(nScanned != 1 && resViderLigne < 0) { /* Echec de scanf(), et plus rien en entrée: Retourner def */ choix = def; } return choix; } /*---------------------------------------------------------------------------*/ /* Med: Une fonction assez sûre pour demander une chaîne. Retourne -1 en cas d'échec, la longueur de la chaîne sinon. Note: taille est un int au lieu d'un size_t, parce que la fonction fgets() prend un int. */ int DemanderChaine(char const *message, char *buffer, int taille) { int retour = 0; printf(message); /* Med : Après un printf() sans retour à la ligne, un fflush() est nécessaire */ fflush(stdout); if(fgets(buffer, taille, stdin)==NULL) { //Erreur de saisie, plus rien en entrée : retourner -1 retour = -1; } else { //Traiter la saisie: Il y a forcément un \n de tapé, mais il est soit dans la chaîne, //soit toujours dans la console. char *pLF = strchr(buffer, '\n'); if(pLF != NULL) { //Supprimer le \n dans la chaîne, calculer la longueur. *pLF = '\0'; retour = (int)(pLF-buffer); } else { //Le \n est toujours dans la console, la chaîne saisie a la longueur maximale. ViderLigne(); retour = taille-1; } } return retour; } /*---------------------------------------------------------------------------*/ int ChoixMenuPrincipal(void) { system("cls"); puts("\n\t\t°°°°°°°°° Menu principal°°°°°°°°°"); puts("\t\t° °"); puts("\t\t° 1. Gestion des pistes °"); puts("\t\t° 2. Gestion des employes °"); puts("\t\t° 3. Statistiques °"); puts("\t\t° 0. Quitter °"); puts("\t\t° °"); puts("\t\t°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°\n"); return DemanderNombre("\t\tVotre choix : ", 0); } /*---------------------------------------------------------------------------*/ int ChoixMenuPiste(void) { system("cls"); puts("______________Gestions des pistes______________\n"); puts(" 1. Ajouter une piste"); puts(" 2. Consulter une piste"); puts(" 3. Modifier une piste"); puts(" 4. Supprimer une piste"); puts(" 5. Afficher les employes d'une piste"); puts(" 6. Trier les pistes par nombre d'employes"); puts(" 7. Trier les pistes par type de vol"); puts(" 8. Trier les pistes par statut"); puts(" 9. Reaffecter l'employe d'une piste a une autre"); puts(" 0. Quitter"); return DemanderNombre("Choix : ", 0); } /*---------------------------------------------------------------------------*/ int ChoixMenuEmploye(void) { system("cls"); puts("______________Gestions des employes______________\n"); puts(" 1. Ajouter un employe"); puts(" 2. Consulter un employe"); puts(" 3. Modifier un employe"); puts(" 4. Supprimer un employe"); puts(" 5. Trier les employes par numero de piste"); puts(" X. Trier les employes de l'international"); puts(" X. Trier les employes de la nationale"); puts(" 8. Trier les employes par fonction"); puts(" 9. Verifier les doublons"); puts(" 0. Quitter"); return DemanderNombre("Choix : ", 0); } /*---------------------------------------------------------------------------*/ int ChoixMenuStatistiques(void) { system("cls"); puts("_________________________Statistiques_________________________\n"); puts(" 1. Les pistes par nombre d'employes"); puts(" 2. Les pistes qui ont un minimum et un maximum d'employes"); puts(" 3. Nombre moyen d'employes par piste"); puts(" 4. Nombre d'employe par statut"); puts(" 5. Nombre d'employes par type de vol"); puts(" 6. Nombre d'employes par fonction"); puts(" 0. Quitter"); return DemanderNombre("Choix : ", 0); } /*---------------------------------------------------------------------------*/ /* Retourne l'index de la piste dans un tableau de nPistes pistes. Retourne une valeur de 0 à nPistes-1 si trouvé, nPistes en cas d'échec. */ size_t TrouverPiste(piste const * pcPistes, size_t nPistes, int code) { size_t iPiste; for(iPiste=0 ; iPiste 0) { size_t iPiste; for(iPiste=0 ; iPistestatut, ARRAYSIZE(pPiste->statut)); } break; case 2: { system("cls"); DemanderChaine("Donner la nouvelle designation\n", pPiste->designation, ARRAYSIZE(pPiste->designation)); } break; case 3: { system("cls"); DemanderChaine("Donner le nouveau type de vol\n", pPiste->type_vol, ARRAYSIZE(pPiste->type_vol)); } break; default: printf("Erreur de saisie\n"); } } while(choix_m!=0); } /*---------------------------------------------------------------------------*/ void GestionDesPistes(piste * tab_piste, size_t *pNPistes, size_t maxPistes, employe * tab_employe, size_t *pNEmployes) { size_t nb_piste = *pNPistes; size_t nb_employe = *pNEmployes; int choix_p; do { choix_p = ChoixMenuPiste(); switch(choix_p) { case 1: // AJOUT D'UNE PISTE { system("cls"); if(nb_piste >= maxPistes) printf("Nb max de pistes (%d) atteint.\n", (int)maxPistes); else { printf("Vous allez saisir une piste\n"); tab_piste[nb_piste].code_piste = DemanderNombre("Saisir le code piste\n", -1); DemanderChaine("Saisir un statut\n", tab_piste[nb_piste].statut, ARRAYSIZE(tab_piste[nb_piste].statut)); DemanderChaine("Saisir une designation\n", tab_piste[nb_piste].designation, ARRAYSIZE(tab_piste[nb_piste].designation)); DemanderChaine("Saisir un type de vol\n", tab_piste[nb_piste].type_vol, ARRAYSIZE(tab_piste[nb_piste].type_vol)); nb_piste++; printf("\nIl y a maintenant %d pistes\n\n", (int)nb_piste); } system("pause"); } break; case 2: // CONSULTER UNE PISTE { /* Med: On peut déclarer une variable au début de n'importe quel bloc. */ size_t iPiste=0; int codePisteVoulue; system("cls"); codePisteVoulue = DemanderNombre("Quel code piste souhaitez vous consulter?\n", 0); iPiste = TrouverPiste(tab_piste, nb_piste, codePisteVoulue); if(iPiste < nb_piste) { printf("Les renseignements sur la piste %d sont:\n", codePisteVoulue); printf("son nom : %s\n",tab_piste[iPiste].designation); printf("son statut : %s\n",tab_piste[iPiste].statut); printf("et de type vol : %s\n\n",tab_piste[iPiste].type_vol); system("pause"); } else printf("Erreur de saisie"); } break; case 3: //MODIFIER UNE PISTE { size_t iPiste=0; int codePisteVoulue; system("cls"); codePisteVoulue = DemanderNombre("Donner le code de la piste a modifier\n", 0); iPiste = TrouverPiste(tab_piste, nb_piste, codePisteVoulue); if(iPiste < nb_piste) ModifierPiste(&tab_piste[iPiste]); else printf("Erreur de saisie\n"); } break; case 4: //SUPPRIMER UNE PISTE { size_t iPiste=0; int codePisteVoulue; system("cls"); codePisteVoulue = DemanderNombre("Donner le code de la piste a supprimer\n", 0); iPiste = TrouverPiste(tab_piste, nb_piste, codePisteVoulue); /* Supprime la piste et met la dernière à la place pour ne pas laisser de trou */ if(iPiste < nb_piste) { /* Med: Il faut diminuer le nombre total AVANT la copie, sinon on copie une piste qui n'existe pas. */ nb_piste--; tab_piste[iPiste] = tab_piste[nb_piste]; printf("Il reste donc: %d pistes\n", (int)nb_piste); system("pause"); } else printf("Erreur de saisie\n"); } break; case 5: //AFFICHER LES EMPLOYES D'UNE PISTE { size_t iEmpl=0; int codePisteVoulue; system("cls"); codePisteVoulue = DemanderNombre("Quel est le code piste utilise pour la recherche du nombre d'employe?\n", 0); // POUR LES BOUCLES PAS DE <= CAR ON COMMENCE A i=0 printf("\nConcernant le code piste:%d, les employes sont:\n", codePisteVoulue); for(iEmpl=0 ; iEmpl 0) { for(iPiste=0 ; iPiste 0) { /* Echange */ piste tempPiste = tab_piste[iPiste]; tab_piste[iPiste] = tab_piste[iAutrePiste]; tab_piste[iAutrePiste] = tempPiste; } } } } printf("Les pistes triees par types de vol donnent:\n"); for(iPiste=0 ; iPiste 0) { for(iPiste=0 ; iPiste correspond mieux. */ if(strcmp(tab_piste[iPiste].statut, tab_piste[iAutrePiste].statut) > 0) { /* Echange */ piste tempPiste = tab_piste[iPiste]; tab_piste[iPiste] = tab_piste[iAutrePiste]; tab_piste[iAutrePiste] = tempPiste; } } } } printf("Les pistes triees par statut sont:\n"); for(iPiste=0 ; iPistenom, ARRAYSIZE(pEmpl->nom)); } break; case 2: { system("cls"); DemanderChaine("Donner le prenom a rectifier\n", pEmpl->prenom, ARRAYSIZE(pEmpl->prenom)); } break; case 3: { system("cls"); DemanderChaine("Donner le nouveau numero de telephone\n", pEmpl->tel, ARRAYSIZE(pEmpl->tel)); } break; case 4: { system("cls"); DemanderChaine("Donner la nouvelle fonction\n", pEmpl->fonction, ARRAYSIZE(pEmpl->fonction)); } break; case 5: { system("cls"); pEmpl->code_piste = DemanderNombre("Donner le nouveau code piste\n", -1); } break; default: printf("Erreur de saisie\n"); } } while (choix_m!=0); } /*---------------------------------------------------------------------------*/ void VerifierDoublons(employe const * tab_employe, size_t nb_employe) { int choix_d; system("cls"); printf("Verification de doublons\n\n"); printf("Que voulez vous verifier?\n\n"); do { printf(" 1. Verifier les codes employes\n"); printf(" 2. Verifier les noms\n"); printf(" 3. Verifier les prenoms\n"); printf(" 4. Verifier les numero de telephone\n"); printf(" 0. Quitter\n"); choix_d = DemanderNombre("Choix : ", 0); switch(choix_d) { case 1: { system("cls"); if(nb_employe > 0) { size_t iEmpl; for(iEmpl=0 ; iEmpl 0) { size_t iEmpl; for(iEmpl=0 ; iEmpl 0) { size_t iEmpl; for(iEmpl=0 ; iEmpl 0) { size_t iEmpl; for(iEmpl=0 ; iEmpl= maxEmployes) printf("Nb max d'employes (%d) atteint.\n", (int)maxEmployes); else { printf("Vous allez saisir un employe\n"); tab_employe[nb_employe].code_employe = DemanderNombre("Saisir le code employe\n", -1); DemanderChaine("Saisir le nom\n", tab_employe[nb_employe].nom, ARRAYSIZE(tab_employe[nb_employe].nom)); DemanderChaine("Saisir le prenom\n", tab_employe[nb_employe].prenom, ARRAYSIZE(tab_employe[nb_employe].prenom)); DemanderChaine("Saisir le numero de telephone\n", tab_employe[nb_employe].tel, ARRAYSIZE(tab_employe[nb_employe].tel)); DemanderChaine("Saisir la fonction\n", tab_employe[nb_employe].fonction, ARRAYSIZE(tab_employe[nb_employe].fonction)); tab_employe[nb_employe].code_piste = DemanderNombre("Saisir le code piste\n", -1); nb_employe++; printf("\nIl y a maintenant %d employes\n\n", (int)nb_employe); } system("pause"); } break; case 2: //CONSULTER UNE EMPLOYE { int codeEmplVoulu; size_t iEmpl; system("cls"); codeEmplVoulu = DemanderNombre("Quel code employe voulez vous consulter?\n", 0); iEmpl = TrouverEmploye(tab_employe, nb_employe, codeEmplVoulu); if(iEmpl < nb_employe) { printf("Les renseignements sur l'employe du code:%d sont:\n", codeEmplVoulu); printf("Nom: %s\n", tab_employe[iEmpl].nom); printf("Prenom: %s\n", tab_employe[iEmpl].prenom); printf("Telephone: %s\n", tab_employe[iEmpl].tel); printf("Fonction: %s\n", tab_employe[iEmpl].fonction); printf("Code piste: %d\n", tab_employe[iEmpl].code_piste); system("pause"); } else printf("Erreur de saisie\n"); } break; case 3: //MODIFIER UN EMPLOYE { int codeEmplVoulu; size_t iEmpl; system("cls"); codeEmplVoulu = DemanderNombre("Donner le code de l'employe a modifier\n", 0); iEmpl = TrouverEmploye(tab_employe, nb_employe, codeEmplVoulu); if(iEmpl < nb_employe) ModifierEmploye(&tab_employe[iEmpl]); else printf("Erreur de saisie\n"); } break; case 4: //SUPPRIMER UN EMPLOYE { int codeEmplVoulu; size_t iEmpl; system("cls"); codeEmplVoulu = DemanderNombre("Donner le code de l'employe a supprimer\n", 0); iEmpl = TrouverEmploye(tab_employe, nb_employe, codeEmplVoulu); if(iEmpl < nb_employe) { /* Med: Il faut diminuer le nombre total AVANT la copie, sinon on copie un employe qui n'existe pas. */ nb_employe--; tab_employe[iEmpl] = tab_employe[nb_employe]; } else printf("Erreur de saisie\n"); } break; case 5: //TRIER LES EMPLOYES PAR NUMERO DE PISTE { size_t iEmpl; system("cls"); if(nb_employe > 0) { for(iEmpl=0 ; iEmpl Ton compilo aurait du te donner un warning... if(tab_employe[i].code_piste=tab_employe[j].code_piste) */ if(tab_employe[iEmpl].code_piste > tab_employe[iAutreEmpl].code_piste) { /* Là encore, pourquoi +1 ? tempemploye = tab_employe[i+1]; tab_employe[i+1]=tab_employe[j]; tab_employe[j]=tempemploye; */ employe tempEmploye = tab_employe[iEmpl]; tab_employe[iEmpl] = tab_employe[iAutreEmpl]; tab_employe[iAutreEmpl] = tempEmploye; } } } } printf("Les employes tries par pistes sont:\n"); for(iEmpl=0 ; iEmpl 0) { for(iEmpl=0 ; iEmpl strcmp() if(tab_employe[i].fonction==tab_employe[j].fonction) */ if(strcmp(tab_employe[iEmpl].fonction, tab_employe[iAutreEmpl].fonction) > 0) { employe tempEmploye = tab_employe[iEmpl]; tab_employe[iEmpl] = tab_employe[iAutreEmpl]; tab_employe[iAutreEmpl] = tempEmploye; } } } } printf("Les employes tries par fonction sont:\n"); for(iEmpl=0 ; iEmpl