TP 7 : les chaînes de caractères Gestion d`un agenda téléphonique
Transcription
TP 7 : les chaînes de caractères Gestion d`un agenda téléphonique
TP 7 : les chaînes de caractères Gestion d'un agenda téléphonique (2 séances) On souhaite gérer un répertoire téléphonique contenant des noms et des numéros de téléphone. On supposera dans ce TP que les noms sont tous distincts. Partie I En structurant votre programme par de nombreuses fonctions, écrire le programme qui propose les fonctionnalités suivantes par menu : 1 : ajouter une personne 2 : afficher tout le répertoire 3 : rechercher une personne dont le nom contient une suite de caractères donnée Aussi, on définira les variables globales suivantes : #define MAXnom 20 #define MAX 100 typedef char typeNom[MAXnom] ; typedef char typeTel[11] ; typeNom nom[MAX] ; /*tableau des noms */ typeTel tel[MAX] ; /*tableau des numéros */ int nbPersonne=0 ; /* nbre de personnes enregistrées */ Lecture d’un nom: On écrira la fonction lireNom qui prend en argument une variable de type typeNom, lit une suite de caractères terminées par <entrée> et la stocke dans cette variable après les modifications suivantes : - Les blancs seront ignorés - Toutes les lettres seront en majuscule, - Les noms dépassant MAXnom caractères seront tronqués - La variable respectera le format d’une chaîne de caractère (suite de caractères terminée par '\0') Par exemple, la frappe de "Du Pont" doit être remplacée par "DUPONT" . Pour ceux qui utiliseront fgets, on rappelle que cette fonction conserve le caractère ‘\n’ de la ligne lue et ajoute ‘\0’ Lecture d’un n° de téléphone : On écrira aussi la fonction lireTel qui prend en argument une variable de type typeTel, lit une suite de 10 chiffres terminée par <entrée> et la stocke dans cette variable en ajoutant '\0' de sorte à respecter la structure d’une chaîne de caractères. Ajout : Ecrire la fonction ajouter qui consiste à : - lire un nom et un numéro de téléphone et de les ajouter à la suite de ceux déjà saisis respectivement dans les tableaux nom et tel. - Incrémenter le nombre de personnes enregistrées Affichage : Il consiste à afficher les noms et les numéros de téléphone dans l’ordre de saisie. Partie II On souhaite maintenant obtenir un affichage du répertoire dans l’ordre alphabétique. Aussi, vous ajouterez la variable globale ci-dessous qui sera chargée de mémoriser les indices des noms dans l’ordre alphabétique. int repertoire[MAX] ; /* classement des noms dans l’ordre alpha. */ Modification de la fonction ajout : Les tableaux nom et tel contiennent les noms et numéros de téléphone dans l’ordre où ils ont été saisis. Lors d’une nouvelle saisie, le nouveau nom et son numéro de téléphone seront stockés à la suite des noms et numéros déjà enregistrés. Toutefois, pour bénéficier d’un classement alphabétique, le tableau repertoire sera mis à jour au fur et à mesure des saisies de sorte que son parcours donne les indices des noms suivant l’ordre alphabétique. L’ajout d’un nouvel indice dans le tableau repertoire se fera donc suivant le principe du "tri par insertion". Partie III Recherche d’un nom : On souhaite trouver tous les noms contenant une suite de caractères donnée. Par exemple, la chaîne "ona" donnera la liste de noms BONAVENTURE et BONARIEN. La recherche se fera de façon séquentielle dans le tableau de noms, - Lire la chaine de caractères - Pour chaque nom du tableau - Si la chaîne est une sous chaine du nom, afficher le nom et le n° de téléphone Remarque : On utilisera la fonction lireNom pour lire cette chaîne et la mettre sous la forme retenue pour un nom (suite de majuscules sans caractères blanc) avant de lancer la recherche. Partie IV pour les étudiants les plus avancés Modifiez votre programme pour que les chaînes soient allouées dynamiquement avec juste la longueur nécessaire (à la place du tableau nom). Le répertoire de nom sera donc un tableau d’adresse au lieu d’un tableau d’indice. Les chaînes des n° de téléphone seront aussi allouées dynamiquement et ordonnées avec les noms. Rappels sur la bibliothèque <string.h> char *strcpy(char *a, const char*b) copie la chaîne b dans la chaîne a, rend a char *strcat(char *a, const char*b) copie la chaîne b à la suite de la chaîne a, rend a int strcmp(char *a, const char*b) compare les chaînes a et b et retourne -1, 0 ou 1 selon que a < = > b int strlen(const char*a) rend le nombre de caractères de la chaîne a char *fgets(char *a, int max, FILE *f) lit dans f une ligne (chaîne terminée par ‘\n’) et la stocke dans a. Le caractère de fin de ligne (‘\n’) est conservé et le caractère ‘\0’ est ajouté à la fin. Il y a au maximum (max-1) caractères lus (protection d’un débordement de tableau) et les caractères non lus restent à lire. stdin est le « nom de fichier » utilisé pour lire au clavier. Le format %s permet de lire avec la fonction scanf une suite de caractères terminée par un séparateur. Le séparateur n’est pas lu et le caractère '\n' est ajouté à la fin de la suite.