title: Structures et pointeurs number: 6 —

Structures et pointeurs

Cet exercice est nettement plus compliqué que les précédent, il est un bon moyen de tester votre compréhension des pointeurs et des structures.

Exercice

L’objectif de cet exercice est de créer un type “carnet d’adresses” et de programmer un certain nombre de fonctions permettant de le manipuler. Il ne faut pas chercher à réaliser cet parfaitement du premier coup (il sera repris de façon incrémentalle). Penser cependant à rajouter des commentaires aux points d’extensions. Dans un premier temps, par exemple, on ne gèrera pas les multiples cas d’erreur pouvant survenir : erreurs de saisie (chaîne vide, le numéro de téléphone n’est pas un numéro, le sexe est autre que ‘H’ ou ‘F’, …), chaînes de caractères plus longues que le maximum prévu, ajout d’un contact figurant déjà dans le carnet d’adresse, noms identiques à la casse près, …

  • Écrivez une structure contact comprenant les champs numéro d’identification, nom, prénom, adresse, sexe et téléphone. Existe-t-il une information qui peut être facilement représentée par une énumération ? Écrivez les fonctions contact_afficher et contact_saisir permettant respectivement d’afficher et de saisir les informations sur un contact.

Pour saisir une chaîne de caractère pouvant contenir des espaces (scanf ne le fait pas) dans le tableau s de taille size, vous pourrez utiliser la fonction fgets(s, size, stdin).

  • Nous allons créer une structure carnet permettant de gérer un ensemble de contacts. On définira un carnet d’adresse comme un tableau de contact (pool) de taille MAX_CONTACTS, une liste simplement chaînée des contacts utilisables (available), c’est à dire, chaque élément est lié au suivant ainsi que une seconde liste simplement chaînée contacts utilisés (used). Afin de réaliser la chaîne nous rajouterons un champ suivant (next) aux contacts. Écrivez le code correspondant.

"Structure"

  • Écrivez les fonctions carnet_afficher et carnet_ajouter_contact. Vous pourrez utiliser le fichier contact.txt1 pour tester vos fonctions.

  • Écrivez une fonction qui prend en paramètre une chaîne de caractères représentant le nom d’un contact et qui affiche les informations du contact correspondant.

  • Affichage de l’ensemble des contacts commençant par la chaîne de caractères passée en paramètre.

  • Suppression d’un contact (donné par son numéro d’identification) d’un carnet.

  • Modifiez la fonction d’ajout d’un contact afin qu’elle insère le contact ``à sa place’’ dans l’ordre alphabétique.

  • Modifiez la fonction de recherche d’un contact pour qu’elle arrête la recherche plus tôt en cas de recherche infructueuse en exploitant le fait que la liste de contacts est triée.

  • Écrivez une fonction qui vérifie qu’un carnet d’adresses est trié.

  • On aimerait maintenant ajouter une recherche par la ville et/ou le code postal, que faut il modifier ?

  • Bonus: Modifiez l’ensemble pour ajouter de nouvelles entrées dans le pool au besoin. Que faut il modifier au code présent pour imaginer un jour libérer les entrées inutiles.


  1. Vous pouvez simuler des frappes au clavier à l’aide d’un fichier texte : ./a.out < fichier.txt. Si vous voulez continuer après l’affichage vous pouvez combiner le fichier texte à l’entrée standard: cat contact.txt - | ./a.out. Pour tester ceci essayez cat contact.txt - | nl. Pour terminer la saisie sur l’entrée standard, essayez Ctrl-D