Menu
Coddy logo textTech

Assembler le tout

Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 54 sur 63.

challenge icon

Défi

Facile

Complé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 :

  1. Utiliser la même définition de structure Contact des leçons précédentes avec les membres :
    • Un tableau de caractères name de taille 50
    • Un tableau de caractères phone de taille 20
    • Un tableau de caractères email de taille 40
    • Un entier age
  2. Utiliser la même fonction createContact des 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
  3. Utiliser la même fonction populateContact des leçons précédentes qui :
    • Prend un pointeur vers une structure Contact comme paramètre
    • Demande la saisie de l'utilisateur et remplit tous les champs du contact
    • Valide les données saisies
  4. Écrire une fonction displayContact qui :
    • Prend un pointeur constant vers une structure Contact comme paramètre
    • Affiche chaque champ sur sa propre ligne dans ce format exact :
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. Écrire une fonction nommée updateContact qui :
    • Prend un pointeur vers une structure Contact comme paramètre
    • Ne retourne rien (void)
    • Demande à l'utilisateur de choisir quel champ mettre à jour en affichant :
      • What would you like to update?
      • 1. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter 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
    • Après une mise à jour réussie, affiche Contact updated successfully
  6. 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 populateContact pour remplir les données initiales du contact
    • Afficher --- Initial Contact ---
    • Appeler la fonction displayContact pour afficher les informations initiales du contact
    • Afficher --- Updating Contact ---
    • Appeler la fonction updateContact pour modifier un champ
    • Afficher --- Updated Contact ---
    • Appeler à nouveau la fonction displayContact pour afficher les informations mises à jour du contact
    • Libérer la mémoire allouée dynamiquement
    • Afficher Contact management completed

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