[ Foro de C ]

Agenda en C

27-Apr-2013 13:06
Invitado (Dario)
5 Respuestas

Estoy siguiendo tu curso de C y me parece muy interesante. Pero tengo un problema con un ejercicio del capitulo 5 sobre arrays y cadenas de texto.

Este es el ejercicio:

Un programa que sea capaz de almacenar los datos de hasta 50 personas: nombre,
dirección, teléfono, edad (usando una tabla de structs). Deberá ir pidiendo los datos
uno por uno, hasta que un nombre se introduzca vacío (se pulse Intro sin teclear
nada). Entonces deberá aparecer un menú que permita:
o Mostrar la lista de todos los nombres.
o Mostrar las personas de una cierta edad.
o Mostrar las personas cuya inicial sea la que el usuario indique.
o Salir del programa
(lógicamente, este menú debe repetirse hasta que se escoja la opción de ?salir?).

Mi problema esta en la opcion de mostrar las personas segun su letra inicial.
¿Como comparo una letra con una cadena?


27-Apr-2013 13:08
Invitado (Dario)

Este es el fuente


#include <stdio.h>
#include <string.h>

struct lista
{
    char nombre[20];
    char direccion[40];
    char telefono[8];
    int edad;
};

int main()
{
    struct lista listaPersona[50];
    int edadBuscar,i,opcion,j=0;
    char n;
    
    for (i=0; i<50; i++)
    {
        printf("nombre::");
        gets(listaPersona[i].nombre);
        j++;
        if (strcmp(listaPersona[i].nombre,"")==0)
            break;
        printf("edad::");
        scanf("%d",&listaPersona[i].edad);
        getchar();
        printf("direccion::");
        gets(listaPersona[i].direccion);
        printf("telefono::");
        gets(listaPersona[i].telefono);
    } 
    
    do
    {
        printf("\n");
        printf("1. Mostrar todos los nombre\n");
        printf("2. Buscar personas por edad\n");
        printf("3. Buscar personas cuya inicial se indique\n");
        printf("4. Salir\n");
        printf("\nSeleccione opcion::");
        scanf("%d",&opcion);
        switch (opcion)
        {
            case 1:
                for (i=0; i<j; i++)
                    puts(listaPersona[i].nombre);
                break;
            case 2:
                printf("ingrese edad a buscar::");
                scanf("%d",&edadBuscar);
                for (i=0; i<j; i++)
                {
                    if (listaPersona[i].edad==edadBuscar)
                        printf("%s\n",listaPersona[i].nombre);
                }
                break;
            case 3:
                printf("indique inicial del nombre para buscar::");
                n=getchar();
                getchar();
                for (i=0; i<j; i++)
                {
                    if (listaPersona[0].nombre[i]==n)
                        printf("%s\n",listaPersona[i].nombre);
                }
                break;
        }
    }
    while (opcion != 4);   
    return 0;
}

27-Apr-2013 13:32
Nacho Cabanes (+83)

En general, está muy bien. Aun así, tienes 3 fallos pequeños, que te pueden volver loco:

1.- En la búsqueda por inicial, los índices están al revés: no es "if (listaPersona[0].nombre[i]==n)" sino "if (listaPersona[i].nombre[0]==n)" (es decir; en la persona actual, en la primera letra de su nombre).

2.- El "getchar" no está donde debe. Recuerda que es peligroso leer datos como "char" cuando estás leyendo datos numéricos con "scanf", porque el "avance de línea" tras un número se queda en el buffer del teclado, y eso es lo que se queda tu "getchar". Por eso, tendrías que hacer:

getchar();  // Salto el avance de linea previo
n=getchar(); // Leo una letra

o incluso, eliminando el nuevo "avance de línea" que habrá al pulsar Intro tras esa letra

getchar();  // Salto el avance de linea previo
n=getchar(); // Leo una letra
getchar();  // Salto el avance de linea posterior

3.- Cuentas una ficha de más, porque haces "j++" antes de comprobar si ha introducido un nombre válido o ha pulsado Intro para indicar el fin de los datos.

De paso, yo cambiaría el nombre de alguna variable, para que el programa sea más legible: "j" la llamaría "cantidadDeDatos" y a "n" la llamaría "inicial".


27-Apr-2013 16:54
dario delgado

Hola Nacho de nuevo por aca, donde pondria el j++ despues del gets del nombre o en otro sitio.
Saludos.


27-Apr-2013 17:06
Nacho Cabanes (+83)

Debe estar después del "break", o se incrementará aunque hayas decidido terminar.

Por legibilidad, yo lo pondría después del "gets" del teléfono, para que se parezca a la idea natural de "pides todos los datos, y entonces ya hay una ficha más".


28-Apr-2013 03:28
dario delgado

Gracias por la respuesta Nacho, lo pondre al final del gets del telefono.
Ire por el siguiente ejercicio, si tengo dudas te molestare nuevamente.
Saludos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)