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.