Assembler le tout
Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 54 sur 63.
Défi
FacileTerminez votre système de gestion des 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
Contactque dans les leçons précédentes, avec les membres suivants :- 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
createContactque dans les leçons précédentes, qui :- Alloue dynamiquement de la mémoire pour une structure
Contact - Initialise tous les membres avec des valeurs par défaut
- Retourne un pointeur vers le contact
- Alloue dynamiquement de la mémoire pour une structure
- Utiliser la même fonction
populateContactque dans les leçons précédentes, qui :- Prend un pointeur vers une structure
Contactcomme paramètre - Demande une saisie à l’utilisateur et renseigne 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 le 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 numéro de téléphone - Si le choix est 3 : affiche
Enter new email:et met à jour l’adresse e-mail - Si le choix est 4 : affiche
Enter new age:et met à jour l’âge - Si le choix est invalide (différent de 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 main, implémenter un workflow complet de gestion des contacts :
- Créer un contact à l’aide de la fonction
createContact - Vérifier que la création du contact a réussi
- Appeler la fonction
populateContactpour renseigner 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 à l’aide de la fonction
Remarque : La fonction displayContact de cette leçon utilise un format simple : une ligne par champ, sans détails ni unités supplémentaires (par exemple, l’âge est affiché comme un nombre simple, et non comme "25 ans"). Assurez-vous que votre sortie correspond exactement au format présenté ci-dessus, car les cas de test en dépendent.
Ce défi final rassemble tous les composants de votre système de gestion des contacts : définition d’une structure, allocation dynamique de mémoire, saisie et validation des données, affichage formaté et modification des données. Vous démontrerez le cycle de vie complet d’une structure allouée dynamiquement, de sa création à sa libération, tout en vous exerçant à organiser les fonctions et à utiliser correctement les pointeurs pendant tout le 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 Logique & Flux
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 contactEntraînez-vous par vous-même : Compilateur C en ligne