Menu
Coddy logo textTech

Poniéndolo todo junto

Parte de la sección Logic & Flow del Journey de C de Coddy — lección 54 de 63.

challenge icon

Desafío

Fácil

Completa tu sistema de gestión de contactos integrando todas las funciones que has creado en las lecciones anteriores. Tu programa debe:

  1. Utilizar la misma definición de struct Contact de las lecciones anteriores con los miembros:
    • Un arreglo de caracteres name con tamaño 50
    • Un arreglo de caracteres phone con tamaño 20
    • Un arreglo de caracteres email con tamaño 40
    • Un entero age
  2. Utilizar la misma función createContact de las lecciones anteriores que:
    • Asigna dinámicamente memoria para un struct Contact
    • Inicializa todos los miembros con valores por defecto
    • Devuelve un puntero al contacto
  3. Utilizar la misma función populateContact de las lecciones anteriores que:
    • Toma un puntero a un struct Contact como parámetro
    • Solicita la entrada del usuario y rellena todos los campos del contacto
    • Valida los datos de entrada
  4. Escribir una función displayContact que:
    • Toma un puntero constante a un struct Contact como parámetro
    • Imprime cada campo en su propia línea en este formato exacto:
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. Escribir una función llamada updateContact que:
    • Toma un puntero a un struct Contact como parámetro
    • No devuelve nada (void)
    • Solicita al usuario que elija qué campo actualizar imprimiendo:
      • What would you like to update?
      • 1. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter choice (1-4):
    • Lee la elección del usuario y actualiza el campo correspondiente:
      • Si la elección es 1: imprime Enter new name: y actualiza el nombre
      • Si la elección es 2: imprime Enter new phone: y actualiza el teléfono
      • Si la elección es 3: imprime Enter new email: y actualiza el correo electrónico
      • Si la elección es 4: imprime Enter new age: y actualiza la edad
      • Si la elección no es válida (no es 1-4): imprime Invalid choice
    • Después de una actualización exitosa, imprime Contact updated successfully
  6. En la función main, implementar un flujo de trabajo completo de gestión de contactos:
    • Crear un contacto usando la función createContact
    • Verificar si la creación del contacto fue exitosa
    • Llamar a la función populateContact para completar los datos iniciales del contacto
    • Imprimir --- Initial Contact ---
    • Llamar a la función displayContact para mostrar la información inicial del contacto
    • Imprimir --- Updating Contact ---
    • Llamar a la función updateContact para modificar un campo
    • Imprimir --- Updated Contact ---
    • Llamar a la función displayContact nuevamente para mostrar la información del contacto actualizada
    • Liberar la memoria asignada dinámicamente
    • Imprimir Contact management completed

Nota: La función displayContact en esta lección utiliza un formato simple — una línea por campo sin detalles o unidades adicionales (por ejemplo, la edad se imprime como un número simple, no como "25 years old"). Asegúrate de que tu salida coincida exactamente con el formato mostrado arriba, ya que los casos de prueba dependen de ello.

Este desafío final reúne todos los componentes de tu sistema de gestión de contactos: definición de struct, asignación dinámica de memoria, entrada y validación de datos, visualización formateada y modificación de datos. Demostrarás el ciclo de vida completo de un struct asignado dinámicamente desde su creación hasta su limpieza, mientras practicas la organización de funciones y el uso adecuado de punteros durante todo el proceso.

Pruébalo tú mismo

#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;
}

Todas las lecciones de Logic & Flow