Assembler le tout
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 54 sur 63.
Défi
FacileComplétez votre système de gestion de contacts en intégrant toutes les fonctions que vous avez créées dans les leçons précédentes. Votre programme doit :
- Utiliser la même définition de structure
Contactdes leçons précédentes avec les membres :- Un tableau de caractères
namede taille 50 - Un tableau de caractères
phonede taille 20 - Un tableau de caractères
emailde taille 40 - Un entier
age
- Un tableau de caractères
- Utiliser la même fonction
createContactdes leçons précédentes qui :- Alloue dynamiquement de la mémoire pour une structure
Contact - Initialise tous les membres aux valeurs par défaut
- Retourne un pointeur vers le contact
- Alloue dynamiquement de la mémoire pour une structure
- Utiliser la même fonction
populateContactdes leçons précédentes qui :- Prend un pointeur vers une structure
Contactcomme paramètre - Demande la saisie de l'utilisateur et remplit tous les champs du contact
- Valide les données saisies
- Prend un pointeur vers une structure
- Écrire une fonction
displayContactqui :- Prend un pointeur constant vers une structure
Contactcomme paramètre - Affiche chaque champ sur sa propre ligne dans ce format exact :
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Prend un pointeur constant vers une structure
- Écrire une fonction nommée
updateContactqui :- Prend un pointeur vers une structure
Contactcomme paramètre - Ne retourne rien (void)
- Demande à l'utilisateur de choisir quel champ mettre à jour en affichant :
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- Lit le choix de l'utilisateur et met à jour le champ correspondant :
- Si le choix est 1 : affiche
Enter new name:et met à jour le nom - Si le choix est 2 : affiche
Enter new phone:et met à jour le téléphone - Si le choix est 3 : affiche
Enter new email:et met à jour l'e-mail - Si le choix est 4 : affiche
Enter new age:et met à jour l'âge - Si le choix est invalide (pas 1-4) : affiche
Invalid choice
- Si le choix est 1 : affiche
- Après une mise à jour réussie, affiche
Contact updated successfully
- Prend un pointeur vers une structure
- Dans la fonction principale, implémenter un flux de travail complet de gestion de contacts :
- Créer un contact en utilisant la fonction
createContact - Vérifier si la création du contact a réussi
- Appeler la fonction
populateContactpour remplir les données initiales du contact - Afficher
--- Initial Contact --- - Appeler la fonction
displayContactpour afficher les informations initiales du contact - Afficher
--- Updating Contact --- - Appeler la fonction
updateContactpour modifier un champ - Afficher
--- Updated Contact --- - Appeler à nouveau la fonction
displayContactpour afficher les informations mises à jour du contact - Libérer la mémoire allouée dynamiquement
- Afficher
Contact management completed
- Créer un contact en utilisant la fonction
Note : La fonction displayContact dans cette leçon utilise un format simple — une ligne par champ sans détails ou unités supplémentaires (par exemple, l'âge est affiché comme un simple nombre, pas "25 years old"). Assurez-vous que votre sortie correspond exactement au format indiqué ci-dessus, car les cas de test en dépendent.
Ce défi final rassemble tous les composants de votre système de gestion de contacts : définition de structure, allocation dynamique de mémoire, saisie et validation de données, affichage formaté et modification de données. Vous démontrerez le cycle de vie complet d'une structure allouée dynamiquement, de sa création à son nettoyage, tout en pratiquant l'organisation des fonctions et l'utilisation appropriée des pointeurs tout au long du processus.
Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
struct Contact* createContact() {
struct Contact* contact = (struct Contact*)malloc(sizeof(struct Contact));
if (contact != NULL) {
strcpy(contact->name, "");
strcpy(contact->phone, "");
strcpy(contact->email, "");
contact->age = 0;
}
return contact;
}
void populateContact(struct Contact* contactPtr) {
printf("Enter name: ");
fgets(contactPtr->name, sizeof(contactPtr->name), stdin);
contactPtr->name[strcspn(contactPtr->name, "\n")] = '\0';
printf("Enter phone: ");
fgets(contactPtr->phone, sizeof(contactPtr->phone), stdin);
contactPtr->phone[strcspn(contactPtr->phone, "\n")] = '\0';
printf("Enter email: ");
fgets(contactPtr->email, sizeof(contactPtr->email), stdin);
contactPtr->email[strcspn(contactPtr->email, "\n")] = '\0';
printf("Enter age: ");
scanf("%d", &contactPtr->age);
}
void displayContact(const struct Contact *contactPtr) {
printf("=== CONTACT DETAILS ===\n");
printf("Name: %s\n", contactPtr->name);
printf("Phone: %s\n", contactPtr->phone);
printf("Email: %s\n", contactPtr->email);
printf("Age: %d years old\n", contactPtr->age);
printf("========================\n");
printf("Name length: %lu characters\n", strlen(contactPtr->name));
if (contactPtr->age >= 0 && contactPtr->age <= 12) {
printf("Generation: Child\n");
} else if (contactPtr->age >= 13 && contactPtr->age <= 19) {
printf("Generation: Teenager\n");
} else if (contactPtr->age >= 20 && contactPtr->age <= 39) {
printf("Generation: Young Adult\n");
} else if (contactPtr->age >= 40 && contactPtr->age <= 59) {
printf("Generation: Middle-aged Adult\n");
} else if (contactPtr->age >= 60) {
printf("Generation: Senior\n");
}
if (strchr(contactPtr->email, '@') != NULL) {
printf("Email format: Valid\n");
} else {
printf("Email format: Invalid\n");
}
}
int main() {
struct Contact* contact = createContact();
if (contact != NULL) {
populateContact(contact);
displayContact(contact);
free(contact);
printf("Program completed successfully\n");
}
return 0;
}Toutes les leçons de Logic & Flow
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînes6Gestion de la mémoire
Mémoire Pile vs TasAllocation dynamique - malloc()Utiliser sizeof() pour l'allocationVérifier l'échec de l'allocationLibérer la mémoire avec free()Allouer avec calloc()Récapitulatif : Tableaux dynamiques9Projet : Saisie de contact simple
Projet : Définir la structure ContactFonction pour créer un contact