TP : Structures complexes et constantes en C
Introduction
Ce TP vise à vous faire pratiquer l'utilisation des structures complexes et des constantes en C à travers l'amélioration d'un carnet d'adresses. Le code de base fourni permet déjà d'ajouter, d'afficher et de sauvegarder des contacts simples.
Exercice 1 : Structure imbriquée pour l'adresse
Modifiez la structure Contact pour inclure une structure imbriquée Adresse.
-
Créez une structure
Adresseavec les champs suivants :rue(chaîne de 100 caractères)codePostal(chaîne de 10 caractères)ville(chaîne de 50 caractères)pays(chaîne de 50 caractères)
-
Intégrez cette structure dans la structure
Contactexistante. -
Modifiez les fonctions
ajouterContact(),afficherContacts(),sauvegarderContacts()etchargerContacts()pour prendre en compte cette nouvelle structure.
Exercice 2 : Structure pour gérer plusieurs numéros de téléphone
Les contacts peuvent avoir plusieurs numéros de téléphone (mobile, domicile, travail).
-
Créez une structure
Telephonecontenant :type(chaîne de 20 caractères : "Mobile", "Domicile", "Travail")numero(chaîne de 15 caractères)
-
Modifiez la structure
Contactpour inclure un tableau de structuresTelephone(maximum 3 numéros) et un compteurnbTelephones. -
Adaptez les fonctions existantes pour gérer ces multiples numéros.
Exercice 3 : Utilisation de constantes symboliques
Définissez des constantes pour rendre le code plus lisible et facilement modifiable.
-
Remplacez les tailles de tableaux par des constantes symboliques :
#define MAX_NOM 50 #define MAX_PRENOM 50 #define MAX_TELEPHONE 15 #define MAX_RUE 100 #define MAX_CODE_POSTAL 10 #define MAX_VILLE 50 #define MAX_PAYS 50 #define MAX_TYPE_TEL 20 #define MAX_TELEPHONES 3 -
Définissez des constantes pour les choix du menu :
#define CHOIX_AJOUTER 1 #define CHOIX_AFFICHER 2 #define CHOIX_RECHERCHER 3 #define CHOIX_QUITTER 4 -
Utilisez ces constantes dans le code pour remplacer tous les nombres "magiques".
Exercice 4 : Tableau de structures dynamique
Modifiez le programme pour utiliser une allocation dynamique pour le tableau de contacts.
-
Remplacez
Contact contacts[MAX_CONTACTS]par un pointeurContact *contactsdansmain(). -
Allouez la mémoire à l'initialisation :
contacts = malloc(MAX_CONTACTS * sizeof(Contact)); -
Ajoutez une fonction de réallocation qui double la taille du tableau lorsqu'il est plein :
void agrandirTableauContacts(Contact **contacts, int *capacite); -
N'oubliez pas de libérer la mémoire à la fin du programme.
Exercice 5 : Structure pour les dates
Ajoutez une gestion des dates pour chaque contact.
-
Créez une structure
Dateavec les champs :jour(entier)mois(entier)annee(entier)
-
Ajoutez un champ
dateNaissancede typeDateà la structureContact. -
Ajoutez un champ
dateCreationde typeDateà la structureContactqui sera automatiquement rempli lors de la création du contact (fonctiontime.h). -
Modifiez les fonctions existantes pour gérer ces nouveaux champs.
Exercice 6 : Structure avec union
Ajoutez un champ "catégorie" à vos contacts avec différentes informations selon la catégorie.
-
Créez une énumération pour les différentes catégories :
typedef enum { PERSONNEL, PROFESSIONNEL, AUTRE } CategorieContact; -
Créez une union pour stocker des informations spécifiques à chaque catégorie :
typedef union { struct { char relation[30]; Date derniereRencontre; } infoPersonnel; struct { char entreprise[50]; char poste[30]; } infoProfessionnel; } InfoCategorie; -
Ajoutez à la structure
Contactun champcategoriede typeCategorieContactet un champinfode typeInfoCategorie. -
Modifiez les fonctions pour gérer ces nouveaux champs.
Exercice 7 : Constantes sous forme de macros avec paramètres
Créez des macros avec paramètres pour faciliter les opérations courantes.
-
Créez une macro pour calculer l'âge d'un contact à partir de sa date de naissance :
#define CALCULER_AGE(dateNaissance) (/* expression pour calculer l'âge */) -
Créez une macro pour vérifier si un contact a un anniversaire aujourd'hui :
#define EST_ANNIVERSAIRE(dateNaissance) (/* expression pour vérifier */) -
Utilisez ces macros dans une nouvelle fonction
afficherDetailsContact().