Poniéndolo todo junto
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 54 de 63.
Desafío
FácilCompleta tu sistema de gestión de contactos integrando todas las funciones que has creado en las lecciones anteriores. Tu programa debe:
- Utilizar la misma definición de struct
Contactde las lecciones anteriores con los miembros:- Un arreglo de caracteres
namecon tamaño 50 - Un arreglo de caracteres
phonecon tamaño 20 - Un arreglo de caracteres
emailcon tamaño 40 - Un entero
age
- Un arreglo de caracteres
- Utilizar la misma función
createContactde 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
- Asigna dinámicamente memoria para un struct
- Utilizar la misma función
populateContactde las lecciones anteriores que:- Toma un puntero a un struct
Contactcomo parámetro - Solicita la entrada del usuario y rellena todos los campos del contacto
- Valida los datos de entrada
- Toma un puntero a un struct
- Escribir una función
displayContactque:- Toma un puntero constante a un struct
Contactcomo 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
- Toma un puntero constante a un struct
- Escribir una función llamada
updateContactque:- Toma un puntero a un struct
Contactcomo parámetro - No devuelve nada (void)
- Solicita al usuario que elija qué campo actualizar imprimiendo:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter 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
- Si la elección es 1: imprime
- Después de una actualización exitosa, imprime
Contact updated successfully
- Toma un puntero a un struct
- 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
populateContactpara completar los datos iniciales del contacto - Imprimir
--- Initial Contact --- - Llamar a la función
displayContactpara mostrar la información inicial del contacto - Imprimir
--- Updating Contact --- - Llamar a la función
updateContactpara modificar un campo - Imprimir
--- Updated Contact --- - Llamar a la función
displayContactnuevamente para mostrar la información del contacto actualizada - Liberar la memoria asignada dinámicamente
- Imprimir
Contact management completed
- Crear un contacto usando la función
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
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas6Gestión de memoria
Memoria Stack vs. HeapAsignación dinámica - malloc()Uso de sizeof() para la asignaciónComprobación de fallos de asignaciónLiberación de memoria con free()Asignación con calloc()Resumen: Arrays dinámicos9Proyecto: Registro de contacto simple
Proyecto: Definir la estructura ContactFunción para crear un contacto