elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda en C  (Leído 1,538 veces)
xtremehope

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda en C
« en: 28 Junio 2012, 22:49 pm »

alguien podría ayudarme en la Compilación de este programa que me da errores y warning en la programación:




#include <stdlib.h>
#include <stdio.h>
#include <conio.h>


typedef struct perso//definimos la estructura que usaremos, debemos tener cuidado de no elegir los mismo nombres
                    //para la definicion de la variable y para la variable
{
    char nombre [30];
    char apellido [30];
    int edad;
    struct perso *lista;

}persona;

void ingrese_persona(persona *p);//declaramos las funciones
void imprima_persona(persona *p);
persona *busca_persona(persona *listanueva,char nombre);
persona *agregar_persona(persona*lista);

int main ()
{
    int opcion=0,N=0;
    persona *listanueva=NULL;
    do{//ciclo do while para evitar seleccionar un numero que no este entre las opciones
    printf ("\n\nMenu:\n\n");
    printf("seleccione una opcion:\n\n\t\t 1.-Ingresar persona\n \t\t2.-Imprimir lista\n\t\t3.-Salir\n\n");
    opcion=getch();//se ocupa getch() y no getchar() o si no me devuelve dos veces el menu cada vez y nos lee el caracter desde teclado, parecido a scanf
    switch (opcion)
    {

            case '1'://definimos las opciones y sus correspondientes valores
                    if(N<5)
                {
                    printf("Selecciono opcion: 1\n\n");
                  listanueva=agregar_persona(listanueva);}//llama a funcion
                  else
                                {
                                    printf("limite de personas");
                                }
                                    N++;
                  break;
            case '2':
               printf("Selecciono opcion: 2\n\n");
                  imprima_persona(listanueva);//llama para imprimri
                  break;
            case '3':
               printf("Selecciono opcion: 3\n\n");
                  printf("fin programa\n\n");
                  break;
                case '4':
                listanueva=busca_persona(listanueva);
                default:
                  printf("seleccion no valida\n\n"); //nos evita
                  break;

      }

    }

    while (opcion!='3');
   return 0;
 
}

void ingrese_persona (persona *p)
{
        printf("\nIngrese nombre: ");
        scanf("%s", p->nombre);
        printf("Ingrese apellido: ");
        scanf("%s", p->apellido);
        printf("Ingrese edad: ");
        scanf("%d", &(p->edad));
        p++;
        p->lista=NULL;
}

void imprima_persona(persona *p)
{
        persona *aux3=p;
        while (aux3!=NULL)
        {
            printf(" %s %s (%d años)\n",aux3->nombre, aux3->apellido, aux3->edad);
        aux3=aux3->lista;//definimos un puntero auxiliar para evitar que el puntero quede en nULL
        }
}

persona *agregar_persona(persona *auxlista)//definicion de puntero a persona lista
{
    persona *aux2lista=(persona*)malloc(sizeof(persona));//reservamos con memoria dinamica un espacio para el puntero
    ingrese_persona(aux2lista);//agregamos la funcnio
    aux2lista->lista=NULL;//ahora debemos usar un puntero auxiliar para que asi lista nos quede apuntando a NULL
    if (auxlista==NULL)
    {
        auxlista=aux2lista;//si el puntero auxiliar es igual a NULL quedara apuntando a NUll
    }
    else
    {
        persona *actual=auxlista,*anterior;//creacion de dos punteros para recorrer la lista
        while (actual!=NULL)
        {
            anterior=actual;//anterior queda apuntando a actual
            actual=actual->lista;//actual apunta al siguietne
        }
        anterior->lista=aux2lista;//de esta forma se genera que el puntero no este apuntando a NULL si no al puntero siguiente
    }
    return(auxlista);//devuleve el puntero a lista
}

persona *busca_persona(persona *listanueva,char nombre)
{
    persona *auxbuscar=listanueva;
    while (auxbuscar!=NULL)
    {
        if (auxbuscar->nombre==nombre)
        {
            printf("nombre encontrado\n");
            return auxbuscar;
        }
        auxbuscar=auxbuscar->lista;
    }
    printf ("no co existe\n");
    return auxbuscar;
}


atte: xtreme
Código
  1. [code=cpp][code=cpp][code=cpp][code=c][code=cpp]
[/code][/code][/code][/code][/code]hope


En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Ayuda en C
« Respuesta #1 en: 29 Junio 2012, 02:21 am »

Hola! decidi compilarlo y ver los errores que marca, mira q facil:

1º: en el case 4 llamas a la funcion
Código
  1. listanueva=busca_persona(listanueva);
pero vos la definiste como
Código
  1. persona *busca_persona(persona *listanueva,char nombre);
Si vas a pasar un nombre a la funcion el prototipo debe ser
Código
  1. persona *busca_persona(persona *listanueva,char *nombre); // el nombre es un puntero a char

2º El warning es por esto:
Código
  1. if (auxbuscar->nombre==nombre) // nose puede comparar de esta manera
para comparar cadenas tenes que usar la funcion strcmp


Saludos


En línea

Ahorrate una pregunta, lee el man
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Ayuda en C
« Respuesta #2 en: 29 Junio 2012, 02:46 am »

Bueno se me ha adelantado durasno , la proxima vez que postees , por favor pon las etiquetas GeSHi y los errores , verás que pronto acuden los usuarios a ayudar. Y lo que te venia diciendo durasno corregido , mas una cosa ¿Porqué utilizas conio.h? para hacer el getch , simplemente en vez de utilizar valores enteros de carácteres para comparar en el switch ,utiliza valores enteros que es mas fácil , y recoges la opcion con:
Código
  1. scanf("%d",&opcion);
Te dejo el código corregido , he dejado los comentarios y eso , he añadido la función de buscar persoa para que te buscase un nombre que tu le metieses también , y los problemillas puntuales que salían :)
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. //#include <conio.h> Omitido , acostumbrate a no usarla...
  5.  
  6.  
  7. typedef struct perso//definimos la estructura que usaremos, debemos tener cuidado de no elegir los mismo nombres
  8.        //para la definicion de la variable y para la variable
  9. {
  10.    char nombre [30];
  11.    char apellido [30];
  12.    int edad;
  13.    struct perso *lista;
  14.  
  15. } persona;
  16.  
  17. void ingrese_persona(persona *p);//declaramos las funciones
  18. void imprima_persona(persona *p);
  19. persona *busca_persona(persona *listanueva,char *nombre);
  20. persona *agregar_persona(persona*lista);
  21.  
  22. int main ()
  23. {
  24.    int opcion=0,N=0;
  25.    persona *listanueva=NULL;
  26.    char nombpersbusc[30];//Variable para albelgar el nombre de la persona a buscar.
  27.    do //ciclo do while para evitar seleccionar un numero que no este entre las opciones
  28.    {
  29.        printf ("\n\nMenu:\n\n");
  30.        printf("Seleccione una opcion:\n\t\t");
  31.        printf("\n\n\t\t 1.-Ingresar persona");
  32.        printf("\n\t\t2.-Imprimir lista");
  33.        printf("\n\t\t3.Buscar persona");
  34.        printf("\n\t\t4.-Salir\n\n");
  35.        scanf("%d", &opcion);
  36.        //opcion=getch();//se ocupa getch() y no getchar() o si no me devuelve dos veces el menu cada vez y nos lee el caracter desde teclado, parecido a scanf
  37.        switch (opcion)
  38.        {
  39.  
  40.        case 1://definimos las opciones y sus correspondientes valores
  41.            if(N<5)
  42.            {
  43.                printf("Selecciono opcion: 1\n\n");
  44.                listanueva=agregar_persona(listanueva);//llama a funcion
  45.                N++;
  46.            }
  47.            else
  48.                printf("limite de personas");
  49.            break;
  50.        case 2:
  51.            printf("Selecciono opcion: 2\n\n");
  52.            imprima_persona(listanueva);//llama para imprimri
  53.            break;
  54.        case 3:
  55.            printf("Selecciono opcion:3\n\n");
  56.            printf("Digame el nombre de la persona a buscar:");
  57.            scanf("%s",nombpersbusc);
  58.            listanueva=busca_persona(listanueva,nombpersbusc);
  59.            break;
  60.        default:
  61.            printf("seleccion no valida\n\n"); //nos evita
  62.            break;
  63.  
  64.        }
  65.  
  66.    }
  67.  
  68.    while (opcion!=4);
  69.    return 0;
  70.  
  71. }
  72.  
  73. void ingrese_persona (persona *p)
  74. {
  75.    printf("\nIngrese nombre: ");
  76.    scanf("%s", p->nombre);
  77.    printf("Ingrese apellido: ");
  78.    scanf("%s", p->apellido);
  79.    printf("Ingrese edad: ");
  80.    scanf("%d", &(p->edad));
  81.    p++;
  82.    p->lista=NULL;
  83. }
  84.  
  85. void imprima_persona(persona *p)
  86. {
  87.    persona *aux3=p;
  88.    while (aux3!=NULL)
  89.    {
  90.        printf(" %s %s (%d a&#241;os)\n",aux3->nombre, aux3->apellido, aux3->edad);
  91.        aux3=aux3->lista;//definimos un puntero auxiliar para evitar que el puntero quede en nULL
  92.    }
  93. }
  94.  
  95. persona *agregar_persona(persona *auxlista)//definicion de puntero a persona lista
  96. {
  97.    persona *aux2lista=(persona*)malloc(sizeof(persona));//reservamos con memoria dinamica un espacio para el puntero
  98.    ingrese_persona(aux2lista);//agregamos la funcnio
  99.    aux2lista->lista=NULL;//ahora debemos usar un puntero auxiliar para que asi lista nos quede apuntando a NULL
  100.    if (auxlista==NULL)
  101.    {
  102.        auxlista=aux2lista;//si el puntero auxiliar es igual a NULL quedara apuntando a NUll
  103.    }
  104.    else
  105.    {
  106.        persona *actual=auxlista,*anterior;//creacion de dos punteros para recorrer la lista
  107.        while (actual!=NULL)
  108.        {
  109.            anterior=actual;//anterior queda apuntando a actual
  110.            actual=actual->lista;//actual apunta al siguietne
  111.        }
  112.        anterior->lista=aux2lista;//de esta forma se genera que el puntero no este apuntando a NULL si no al puntero siguiente
  113.    }
  114.    return(auxlista);//devuleve el puntero a lista
  115. }
  116.  
  117. persona *busca_persona(persona *listanueva,char *nombre)
  118. {
  119.    persona *auxbuscar=listanueva;
  120.    while (auxbuscar!=NULL)
  121.    {
  122.        //if (strcmp(auxbuscar->nombre,nombre)==0) Para comparar cadenas utiliza strcmp!!!!!
  123.        if(strcmp(auxbuscar->nombre,nombre)==0)
  124.        {
  125.            printf("nombre encontrado\n");
  126.            return auxbuscar;
  127.        }
  128.        auxbuscar=auxbuscar->lista;
  129.    }
  130.    printf ("no existe\n");
  131.    return auxbuscar;
  132. }
  133.  

¡Un saludo!
« Última modificación: 29 Junio 2012, 02:58 am por avesudra » En línea

Regístrate en
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines