#define _C_td5 /* * ---------------------------------------------------------------------------- * * Fichier : td5.c * Langage : C ANSI * Auteur : P. Dechamboux * Creation : 7 novembre 1995 * ---------------------------------------------------------------------------- * Description : * Programme de manipualtion de personnes et de villes. * ---------------------------------------------------------------------------- * Interventions * >>>>>>>>>>>>> * ---------------------------------------------------------------------------- * Fonctions definies * Locales : LireChaine, * Init, * Habite, * ConjointDe, * InsererVille, * InsererPersonne. * Exportees : main. * * ---------------------------------------------------------------------------- */ /****************************************************************************/ /*------------------- INCLUSION DES INTERFACES SYSTEMES --------------------*/ /****************************************************************************/ #include /****************************************************************************/ /*----------------- INCLUSION DES INTERFACES APPLICATIVES ------------------*/ /****************************************************************************/ /****************************************************************************/ /*------------------ CONSTANTES, MACROS & TYPES LOCAUX ------------------*/ /****************************************************************************/ #define MAX_PERSONNES 100 /* nombre maximum de personnes */ #define MAX_VILLES 10 /* nombre maximum de villes */ #define TNV 32 /* taille maximum du nom d'une ville. * Le nom d'une ville doit commencer par une * majuscule */ #define TNP 128 /* taille maximum du nom d'une personne. * Un nom de personne est composer du nom * de famille suivi d'un ou plusieurs prenoms. * Les noms sont separes par des espaces et ils * commencent tous par une majuscule */ typedef struct { char nom[TNV]; unsigned nb_habitants; } Ville; typedef struct pers { char nom[TNP]; unsigned short age; Ville * p_ville; struct pers * p_conjoint; } Personne; /****************************************************************************/ /*------------------- SIGNATURES DES FONCTIONS LOCALES ---------------------*/ /****************************************************************************/ static char *LireChaine(char *str, unsigned maxc); static void Init(void); static void Habite(char *nomp, char *nomv); static void ConjointDe(char *nomp, char *nomc); static void InsererVille(char *nomv, unsigned nbh); static void InsererPersonne(char *nomp, unsigned short age); /****************************************************************************/ /*------------------- DEFINITIONS DES VARIABLES LOCALES --------------------*/ /****************************************************************************/ static Ville TabVilles[MAX_VILLES]; static Personne TabPersonnes[MAX_PERSONNES]; static unsigned long NbVilles, NbPersonnes; /****************************************************************************/ /*------------------- IMPLANTATION DES FONCTIONS LOCALES -------------------*/ /****************************************************************************/ /* * ---------------------------------------------------------------------------- * * Fonction : LireChaine * Resultat : char * Chaine lue. * Parametres : * Nom Type Role * str char * Tableau ou stocker la chaine lue. * maxc unsigned Nombre maximum de caracteres de la chaine. * * Description : * Lit une chaine de caracteres. Si elle fait plus de "maxc" caracteres, * elle est tronquee. * * ---------------------------------------------------------------------------- */ static char * LireChaine( char *str, unsigned maxc) { unsigned short i; i = 0; fflush(stdin); while ((i < (maxc - 1)) && (scanf("%c", &(str[i])) == 1)) { if (str[i] == '\n') break; else i++; } str[i] = '\0'; return str; } /* * ---------------------------------------------------------------------------- * * Fonction : Init * Resultat : void * Parametres : * Nom Type Role * * Description : * Initialise la gestion des personnes et des villes. * * ---------------------------------------------------------------------------- */ static void Init( void) { NbPersonnes = 0; NbVilles = 0; } /* * ---------------------------------------------------------------------------- * * Fonction : Habite * Resultat : void * Parametres : * Nom Type Role * nomp char * Nom de l'habitant. * nomv char * Nom de la ville ou il habite. * * Description : * Declare la personne "nomp" comme habitant la ville "nomv". * * ---------------------------------------------------------------------------- */ static void Habite( char *nomp, char *nomv) { long ip, iv; for (ip = 0; ip < NbPersonnes; ip++) if (!strcmp(nomp, TabPersonnes[ip].nom)) break; if (ip == NbPersonnes) { printf("Erreur : cette personne n'existe pas !\n"); return; } for (iv = 0; iv < NbVilles; iv++) if (!strcmp(nomv, TabVilles[iv].nom)) break; if (iv == NbVilles) { printf("Erreur : cette ville n'existe pas !\n"); return; } TabPersonnes[ip].p_ville = &(TabVilles[iv]); } /* * ---------------------------------------------------------------------------- * * Fonction : ConjointDe * Resultat : void * Parametres : * Nom Type Role * nomp char * Nom de la personne. * nomc char * Nom du conjoint. * * Description : * Declare la personne "nomc" comme le conjoint de la personne "nomp", et * reciproquement. * * ---------------------------------------------------------------------------- */ static void ConjointDe( char *nomp, char *nomc) { int ip, ic; for (ip = 0; ip < NbPersonnes; ip++) if (!strcmp(nomp, TabPersonnes[ip].nom)) break; if (ip == NbPersonnes) { printf("Erreur : la personne \"%s\" n'existe pas !\n", nomp); return; } for (ic = 0; ic < NbPersonnes; ic++) if (!strcmp(nomc, TabPersonnes[ic].nom)) break; if (ic == NbPersonnes) { printf("Erreur : la personne \"%s\" n'existe pas !\n", nomc); return; } if (ip == ic) { printf("Erreur : une personne ne peut etre son propre conjoint !\n", nomc); return; } TabPersonnes[ip].p_conjoint = &(TabPersonnes[ic]); TabPersonnes[ic].p_conjoint = &(TabPersonnes[ip]); } /* * ---------------------------------------------------------------------------- * * Fonction : InsererVille * Resultat : void * Parametres : * Nom Type Role * nomv char * Nom de la ville. * nbh unsigned Nombre d'habitants de la ville. * * Description : * Insere une nouvelle ville dans la table des villes. * * ---------------------------------------------------------------------------- */ static void InsererVille( char *nomv, unsigned nbh) { long iv = 0, i, res; if (NbVilles == MAX_VILLES) { printf("Erreur : la table des villes est saturee !\n"); return; } if (NbVilles != 0) { for (; iv < NbVilles; iv++) if ((res = strcmp(nomv, TabVilles[iv].nom)) == 0) { printf("Erreur : la ville existe deja !\n"); return; } else if (res < 0) break; for (i = NbVilles - 1; i >= iv; i--) TabVilles[i + 1] = TabVilles[i]; } strcpy(TabVilles[iv].nom, nomv); TabVilles[iv].nb_habitants = nbh; NbVilles++; } /* * ---------------------------------------------------------------------------- * * Fonction : InsererPersonne * Resultat : * Parametres : * Nom Type Role * nomp char * Nom de la personne. * nbh unsigned short Age de la personne. * * Description : * Insere une nouvelle personne dans la table des personnes. * * ---------------------------------------------------------------------------- */ static void InsererPersonne( char *nomp, unsigned short age) { long ip = 0, i, res; if (NbPersonnes == MAX_PERSONNES) { printf("Erreur : la table des personnes est saturee !\n"); return; } if (NbPersonnes != 0) { for (; ip < NbPersonnes; ip++) if ((res = strcmp(nomp, TabPersonnes[ip].nom)) == 0) { printf("Erreur : la personne existe deja !\n"); return; } else if (res < 0) break; for (i = NbPersonnes - 1; i >= ip; i--) TabPersonnes[i + 1] = TabPersonnes[i]; } strcpy(TabPersonnes[ip].nom, nomp); TabPersonnes[ip].age = age; TabPersonnes[ip].p_ville = NULL; TabPersonnes[ip].p_conjoint = NULL; NbPersonnes++; for (i = 0; i < NbPersonnes; i++) if (TabPersonnes[i].p_conjoint >= &(TabPersonnes[ip])) TabPersonnes[i].p_conjoint++; } /****************************************************************************/ /*------------------ IMPLANTATION DES FONCTIONS EXPORTEES ------------------*/ /****************************************************************************/ /* * ---------------------------------------------------------------------------- * * Fonction : main * Resultat : long Code d'erreur commande. * Parametres : * Nom Type Role * * Description : * Point d'entree du programme "td5" obtenu par compilation du fichier * "td5.c" (gcc -o td5 td5.c). * * ---------------------------------------------------------------------------- */ long main() { long sortie = 0, i; unsigned short nbh; unsigned short age; char choix, nomp[TNP], nomc[TNP], nomv[TNV]; Init(); do { printf("Les differentes fonctions possibles sont :\n"); printf("\t- Insertion d'une personne ............... 1\n"); printf("\t- Insertion d'une ville .................. 2\n"); printf("\t- Declaration d'un conjoint .............. 3\n"); printf("\t- Declaration d'un habitant .............. 4\n"); printf("\t- Liste des personnes .................... 5\n"); printf("\t- Liste des villes ....................... 6\n"); printf("\t- Quitter ................................ 0\n"); printf("\t Choix ? "); fflush(stdin); scanf("%c", &choix); switch (choix) { case '0' : sortie = 1; break; case '1' : printf("\nInsertion d'une personne :\n"); printf("\t- Nom de la personne ? "); LireChaine(nomp, TNP); printf("\t- Age de la personne ? "); scanf("%hu", &age); InsererPersonne(nomp, age); break; case '2' : printf("\nInsertion d'une ville :\n"); printf("\t- Nom de la ville ? "); LireChaine(nomv, TNV); printf("\t- Nombre d'habitants de la ville ? "); scanf("%u", &nbh); InsererVille(nomv, nbh); break; case '3' : printf("\nDeclaration d'un conjoint :\n"); printf("\t- Nom de la personne ? "); LireChaine(nomp, TNP); printf("\t- Nom de son conjoint ? "); LireChaine(nomc, TNP); ConjointDe(nomp, nomc); break; case '4' : printf("\nDeclaration d'un habitant :\n"); printf("\t- Nom de l'habitant ? "); LireChaine(nomp, TNP); printf("\t- Nom de la ville ? "); LireChaine(nomv, TNV); Habite(nomp, nomv); break; case '5' : printf("\nListe des personnes :\n"); for (i = 0; i < NbPersonnes; i++) { printf("%s\n", TabPersonnes[i].nom); printf("\t- age : %hu\n", TabPersonnes[i].age); printf("\t- ville : \"%s\"\n", (TabPersonnes[i].p_ville == NULL) ? "AUCUNE" : TabPersonnes[i].p_ville->nom); printf("\t- conjoint : \"%s\"\n", (TabPersonnes[i].p_conjoint == NULL) ? "AUCUN" : TabPersonnes[i].p_conjoint->nom); } break; case '6' : printf("\nListe des villes :\n"); for (i = 0; i < NbVilles; i++) { printf("%s\n", TabVilles[i].nom); printf("\t- nombre d'habitants : %u\n", TabVilles[i].nb_habitants); } break; default : printf("CHOIX INCORRECT !!!!!\n"); } printf("\n\n"); } while (!sortie); return(0); }