Poniéndolo todo junto
Parte de la sección Lógica y Flujo 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:
- Usar la misma definición de la estructura
Contactde las lecciones anteriores, con los siguientes 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
- Usar la misma función
createContactde las lecciones anteriores, que:- Asigna memoria dinámicamente para una estructura
Contact - Inicializa todos los miembros con valores predeterminados
- Devuelve un puntero al contacto
- Asigna memoria dinámicamente para una estructura
- Usar la misma función
populateContactde las lecciones anteriores, que:- Recibe un puntero a una estructura
Contactcomo parámetro - Solicita datos al usuario y rellena todos los campos del contacto
- Valida los datos de entrada
- Recibe un puntero a una estructura
- Escribir una función
displayContactque:- Recibe un puntero constante a una estructura
Contactcomo parámetro - Imprime cada campo en su propia línea con este formato exacto:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Recibe un puntero constante a una estructura
- Escribir una función llamada
updateContactque:- Recibe un puntero a una estructura
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 opción del usuario y actualiza el campo correspondiente:
- Si la opción es 1: imprime
Enter new name:y actualiza el nombre - Si la opción es 2: imprime
Enter new phone:y actualiza el teléfono - Si la opción es 3: imprime
Enter new email:y actualiza el correo electrónico - Si la opción es 4: imprime
Enter new age:y actualiza la edad - Si la opción no es válida (no está entre 1 y 4): imprime
Invalid choice
- Si la opción es 1: imprime
- Después de una actualización correcta, imprime
Contact updated successfully
- Recibe un puntero a una estructura
- En la función principal, implementar un flujo completo de gestión de contactos:
- Crear un contacto usando la función
createContact - Comprobar si la creación del contacto fue correcta
- Llamar a la función
populateContactpara introducir 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 de nuevo a la función
displayContactpara mostrar la información actualizada del contacto - Liberar la memoria asignada dinámicamente
- Imprimir
Contact management completed
- Crear un contacto usando la función
Nota: La función displayContact de esta lección utiliza un formato sencillo: una línea por campo, sin detalles ni unidades adicionales (por ejemplo, la edad se imprime como un número simple, no como "25 años"). 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 estructuras, asignación dinámica de memoria, entrada y validación de datos, visualización con formato y modificación de datos. Demostrarás el ciclo de vida completo de una estructura asignada dinámicamente, desde su creación hasta su limpieza, mientras practicas la organización de funciones y el uso correcto de los 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 Lógica y Flujo
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 contactoPractica por tu cuenta: Compilador de C online