Ejercicio 07 — Agenda de 5 contactos hardcodeados

Dificultad: rojo · Módulo 08 (Structs)

Enunciado

Agenda de 5 contactos hardcodeados; función de búsqueda por nombre.

Diagramas de flujo

Diagrama de flujo (actividad) del ejercicio 07

Diagrama de flujo (grafo) del ejercicio 07

Cómo se resuelve

Una agenda es un array de structs Contacto, cada uno con dos cadenas: nombre[50] y telefono[20]. Aquí los datos no se piden al usuario, sino que se hardcodean con un inicializador de llaves anidado, un par de llaves por contacto:

Contacto agenda[N] = {
    {"Ana",    "600111222"},
    {"Carlos", "611333444"},
    ...
};

La función de búsqueda es el corazón del ejercicio:

int buscar(Contacto agenda[], int n, char *nombre) {
    for (int i = 0; i < n; i++) {
        if (strcmp(agenda[i].nombre, nombre) == 0) {
            return i;
        }
    }
    return -1;
}

Recorre el array y, en cada vuelta, compara el nombre del contacto con el buscado usando strcmp de <string.h>. strcmp devuelve 0 cuando las dos cadenas son iguales, así que la condición correcta es == 0. Si encuentra coincidencia devuelve el índice; si el bucle termina sin éxito, devuelve -1 como señal de “no encontrado”. Ese -1 es un patrón muy común en C para indicar ausencia. En main se comprueba con if (idx != -1) para decidir qué imprimir.

Trampa habitual: comparar cadenas con == (agenda[i].nombre == nombre). Eso compara direcciones de memoria, no el texto, y casi nunca da lo que esperas. Para comparar el contenido de dos strings en C siempre se usa strcmp.

Para practicar — cópialo y complétalo

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 07 — PRACTICA (rellena los TODO)
 * Enunciado: Agenda de 5 contactos hardcodeados; función de búsqueda por nombre.
 * Dificultad: rojo
 * Stdin: Elena
 * Compilar: gcc -std=c11 -Wall ej07_practica.c -o ej07 && ./ej07
 */
 
#include <stdio.h>
#include <string.h>   // para strcmp
 
#define N 5
 
// TODO 1: Define typedef struct Contacto con char nombre[50] y char telefono[20].
 
// TODO 2: Escribe int buscar(Contacto agenda[], int n, char *nombre).
//         Recorre el array con un for.
//         En cada iteracion usa strcmp(agenda[i].nombre, nombre) == 0 para comparar.
//         Si encuentra coincidencia, devuelve i.
//         Si el bucle termina sin encontrar, devuelve -1.
 
int main(void) {
    // TODO 3: Declara Contacto agenda[N] e inicializa con 5 contactos usando llaves:
    //         { {"Ana","600111222"}, {"Carlos","611333444"}, ... }
    //         Incluye "Elena" con telefono "612345678" para poder probar la busqueda.
 
    char busqueda[50];
 
    // TODO 4: Pide al usuario un nombre y leelo con scanf.
 
    // TODO 5: Llama a buscar(agenda, N, busqueda) y guarda el resultado en int idx.
 
    // TODO 6: Si idx != -1, imprime nombre y telefono del contacto encontrado.
    //         Si idx == -1, imprime "Contacto no encontrado.\n".
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 07 — MODELO (resuelto)
 * Enunciado: Agenda de 5 contactos hardcodeados; función de búsqueda por nombre.
 * Dificultad: rojo
 * Stdin: Elena
 * Compilar: gcc -std=c11 -Wall ej07_modelo.c -o ej07 && ./ej07
 */
 
#include <stdio.h>
#include <string.h>
 
#define N 5
 
typedef struct {
    char nombre[50];
    char telefono[20];
} Contacto;
 
/*
 * Busca en agenda[] de taman~o n el contacto con ese nombre.
 * Devuelve el indice si lo encuentra, -1 si no existe.
 */
int buscar(Contacto agenda[], int n, char *nombre) {
    for (int i = 0; i < n; i++) {
        // strcmp devuelve 0 si las cadenas son iguales
        if (strcmp(agenda[i].nombre, nombre) == 0) {
            return i;
        }
    }
    return -1;
}
 
int main(void) {
    // Inicializacion con inicializadores de llaves anidados
    Contacto agenda[N] = {
        {"Ana",    "600111222"},
        {"Carlos", "611333444"},
        {"Elena",  "612345678"},
        {"Marta",  "633555666"},
        {"Pedro",  "644777888"}
    };
 
    char busqueda[50];
    printf("Introduce un nombre a buscar: ");
    scanf("%49s", busqueda);
 
    int idx = buscar(agenda, N, busqueda);
 
    if (idx != -1) {
        printf("Nombre: %s\n", agenda[idx].nombre);
        printf("Telefono: %s\n", agenda[idx].telefono);
    } else {
        printf("Contacto no encontrado.\n");
    }
 
    return 0;
}

Ejecútalo en el navegador

▶ Abrir y ejecutar en Compiler Explorer

Se abre con la solución ya cargada; pulsa el botón de ejecutar (Run) para ver la salida. No hay que instalar nada.

Cómo usarlo

Pega el código en un fichero y ejecútalo con tu toolchain habitual (o el botón de Ejecutar de tu editor). Antes de mirar la solución, intenta completar tú el esqueleto: es la mejor forma de aprender.

Conexiones