• Jueves 25 de Abril de 2024, 13:40

Autor Tema:  Retornar un puntero a una estructura  (Leído 4518 veces)

kingsizen

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Retornar un puntero a una estructura
« en: Lunes 27 de Abril de 2009, 22:45 »
0
que tal amigos, tengo una nueva pregunta para hacerles. encontre un examen final en el cual se plantea un ejercicio que dice

"... la funcion buscar, busca el producto que coincide con el codigo ingresado y retorna (no muestra) todos los datos de ese producto.

a) recibe los datos de todos los articulos, la cantidad total de articulos y el codigo buscado.
b) retorna en un puntero a la estructura que contiene los datos de ese articulo si es que el codigo existe, en caso contrario retorna un puntero a una estructura con codigo ***** "

aqui va el codigo de lo que estuve haciendo, fijense en la funcion buscar, no tengo idea como se retorna un puntero.. pero intente algo.

desde ya espero su ayuda. muchisimas gracias!!

Código: C
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 50
  5.  
  6. struct productos
  7. {
  8.        char codigo[5];
  9.        char modelo[10];
  10.        char descripcion[200];
  11.        float precio;
  12.        char codprov[10];
  13.        char nomprov[30];
  14. };
  15.  
  16. void carga (struct productos [],int *);
  17. int buscar (struct productos [],int ,char []);
  18.  
  19.  
  20. main()
  21. {    
  22.       struct productos prod[sub];
  23.       int *puntero,c,cant_prod,codigo_orden;
  24.       char modelo_buscado[10],codigo_buscado[5];
  25.       cant_prod=0;
  26.      
  27.       carga (prod,&cant_prod);
  28.       printf ("%d",cant_prod);
  29.       do
  30.       {
  31.       printf ("------------------------------< Elija Una Opcion >n");
  32.       printf ("1) Ordenarn");
  33.       printf ("2) Mostrarn");
  34.       printf ("3) Buscarn");
  35.       printf ("4) Modificarn");
  36.       printf ("5) Salirn");
  37.       scanf ("%d",&c);
  38.      
  39.       switch (c)
  40.       {
  41.              case 1:
  42.                   {
  43.                   printf ("Ingrese 1 para ordenar por codigo, 2 para ordenar por modelon");
  44.                   scanf ("%d",&codigo_orden);
  45.                   ordenar (prod,cant_prod,codigo_orden);
  46.                   }break;
  47.              case 2:
  48.                   {
  49.                          printf ("Ingrese Modelo Buscadon");
  50.                          scanf ("%s",modelo_buscado);
  51.                          mostrar(prod,cant_prod,modelo_buscado);
  52.                          }break;
  53.              case 3:{
  54.                   printf ("Ingrese codigo buscadon");
  55.                   scanf("%s",codigo_buscado);
  56.                   *puntero=buscar(prod,cant_prod,codigo_buscado);
  57.                  
  58.                  
  59.                  
  60.                  
  61.                   }
  62.                          
  63.                  
  64.              
  65.              
  66.      
  67.       }while c!=5;
  68. }
  69. int buscar (struct productos p[],int cant,cod[])
  70. {
  71.     int i,*punt;
  72.     for (i=0;i<cant,++i)
  73.     {
  74.         if (strcmp(cod,p[i].codigo)==0)
  75.         *punt=p[i];
  76. }
  77. return *punt;
  78. }
  79.  
  80. void carga (struct productos p[],int *cant )
  81. {
  82.      int i=*cant;
  83.      char r;
  84.      do
  85.      {  
  86.          
  87.          printf ("Ingrese Codigon");
  88.          scanf ("%s",&p[i].codigo);
  89.          /*fflush (stdin);
  90.          printf ("Ingrese Modelon");
  91.          gets(p[i].modelo);
  92.          printf ("Ingrese Descripcionn");
  93.          gets(p[i].descripcion);
  94.          printf ("Ingrese Precion");
  95.          scanf ("%f",&p[i].precio);        
  96.          printf ("Ingrese Cod proveedorn");
  97.          scanf("%s",p[i].codprov);
  98.          fflush (stdin);                  
  99.          printf ("Ingrese Nombre proveedorn");
  100.          gets(p[i].nomprov);*/
  101.          i++;
  102.          printf ("Seguir ingresando datos?n");
  103.          fflush (stdin);
  104.          scanf ("%c",&r);
  105.          }while (r !='n');
  106.      *cant=i;
  107. }
  108.  
  109.  
  110.  

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Retornar un puntero a una estructura
« Respuesta #1 en: Martes 28 de Abril de 2009, 06:20 »
0
Evidentemente ese ejemplo esta mal porque, en caso de funcionar, solo estas retornando uno solo de los campos de la estructura y no todos los que necesitas de un solo articulo. La funcion deberas de definirla de otra forma y tendras que utilizar probablemente el operador flecha

Te dejo un ejemplo para que te guies

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct agenda
  4. {
  5.  char apellido[30];
  6.  char nombre[30];
  7.  char telefono[30];
  8.  int edad;
  9. }datos[3],*dat;
  10.  
  11. struct agenda *suma(struct agenda *total)
  12. {
  13.  int pos;
  14.  for (pos=0;pos<3;pos++)
  15.   if (((total+pos)->edad)>10)
  16.     return (total+pos);
  17. }
  18.  
  19. int main()
  20. {
  21.  int a,val=0;
  22.  for (a=0;a<3;a++)
  23.  {
  24.   printf("Ingrese el apellido del sujeto #%i: ",a+1);
  25.   scanf("%s",datos[a].apellido);
  26.   printf("Ingrese el nombre del sujeto #%i: ",a+1);
  27.   scanf("%s",datos[a].nombre);
  28.   printf("Ingrese el telefono del sujeto #%i: ",a+1);
  29.   scanf("%s",datos[a].telefono);
  30.   printf("Ingrese la edad del sujeto #%i: ",a+1);
  31.   scanf("%i",&datos[a].edad);
  32.   printf("n");
  33.  }
  34.  for (a=0;a<3;a++)
  35.  {
  36.   printf("Nombre: %s %s, Telefono: %s, Edad: %in",datos[a].apellido,datos[a].nombre,datos[a].telefono,datos[a].edad);
  37.   if (datos[a].edad>10)
  38.     val=1;
  39.  }
  40.  if (val==1)
  41.  {
  42.   dat=suma(datos);
  43.   printf("Nombre: %s %s, Telefono: %s, Edad: %inn",dat->apellido,dat->nombre,dat->telefono,dat->edad);
  44.  }
  45.  system("pause");
  46.  return 0;
  47. }
  48.  

En el, capturo los datos de 3 personas e imprimo la primer persona que encuentra con edad mayor a 10 años. Mira que devuelvo todo a traves de un puntero a la estructura

Saludos

kingsizen

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Retornar un puntero a una estructura
« Respuesta #2 en: Martes 28 de Abril de 2009, 18:53 »
0
saludos, aca me guie en el ejemplo que me diste y modifique el codigo segun lo que entendi.
en primer lugar la funcion ahora devuelve un tipo de datos "struct productos" y no un "int" como hacia antes. declare en main un *puntero tambien con el tipo de dato struct productos, que va a recibir el puntero proveniente de la funcion.
ahora no me queda del todo claro, porque en este prototipo

struct productos *buscar (struct productos *p,int cant,char cod[])

se usa *buscar en vez de buscar y porque se usa *p en vez de p[]

espero tu respuesta. muchas gracias!!
aqui va el codigo:

Código: C
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 50
  5.  
  6. struct productos
  7. {
  8.        char codigo[5];
  9.        char modelo[10];
  10.        char descripcion[200];
  11.        float precio;
  12.        char codprov[10];
  13.        char nomprov[30];
  14. };
  15.  
  16. void carga (struct productos [],int *);
  17. //void ordenar (struct productos [],int,int);
  18.  
  19. struct productos *buscar (struct productos *,int ,char []);
  20.  
  21.  
  22. main()
  23. {    
  24.       struct productos prod[sub],*puntero;
  25.      int c,cant_prod,codigo_orden;
  26.       char modelo_buscado[10],codigo_buscado[5];
  27.       cant_prod=0;
  28.      
  29.       carga (prod,&cant_prod);
  30.       printf ("%d",cant_prod);
  31.       do
  32.       {
  33.       printf ("------------------------------< Elija Una Opcion >n");
  34.       printf ("1) Ordenarn");
  35.       printf ("2) Mostrarn");
  36.       printf ("3) Buscarn");
  37.       printf ("4) Modificarn");
  38.       printf ("5) Salirn");
  39.       scanf ("%d",&c);
  40.      
  41.       switch (c)
  42.       {
  43.              case 1:
  44.                   {
  45.                   printf ("Ingrese 1 para ordenar por codigo, 2 para ordenar por modelon");
  46.                   scanf ("%d",&codigo_orden);
  47.                   //ordenar (prod,cant_prod,codigo_orden);
  48.                   }break;
  49.              case 2:
  50.                   {
  51.                          printf ("Ingrese Modelo Buscadon");
  52.                          scanf ("%s",modelo_buscado);
  53.                        //  mostrar(prod,cant_prod,modelo_buscado);
  54.                          }break;
  55.              case 3:{
  56.                   printf ("Ingrese codigo buscadon");
  57.                   scanf("%s",codigo_buscado);
  58.                   puntero=buscar(prod,cant_prod,codigo_buscado);
  59.                  
  60.                  
  61.                  
  62.                  
  63.                  
  64.                   }
  65.                          
  66.                  
  67.                   }    
  68.              
  69.      
  70.       }while (c!=5);
  71. }
  72.  
  73. struct productos *buscar (struct productos *p,int cant,char cod[])
  74. {
  75.     int i;
  76.        
  77.     for (i=0;i<cant;++i)
  78.     {
  79.         if (strcmp(cod,(p+i)->codigo)==0)
  80.         return (p+i);
  81.        
  82.        
  83.  
  84. }
  85.  
  86. }
  87.  
  88. void carga (struct productos p[],int *cant )
  89. {
  90.      int i=*cant;
  91.      char r;
  92.      do
  93.      {  
  94.          
  95.          printf ("Ingrese Codigon");
  96.          scanf ("%s",&p[i].codigo);
  97.          fflush (stdin);
  98.          printf ("Ingrese Modelon");
  99.          gets(p[i].modelo);
  100.          printf ("Ingrese Descripcionn");
  101.          gets(p[i].descripcion);
  102.          printf ("Ingrese Precion");
  103.          scanf ("%f",&p[i].precio);        
  104.          printf ("Ingrese Cod proveedorn");
  105.          scanf("%s",p[i].codprov);
  106.          fflush (stdin);                  
  107.          printf ("Ingrese Nombre proveedorn");
  108.          gets(p[i].nomprov);
  109.          i++;
  110.          printf ("Seguir ingresando datos?n");
  111.          fflush (stdin);
  112.          scanf ("%c",&r);
  113.          }while (r !='n');
  114.      *cant=i;
  115. }
  116.  
  117.  
  118.  

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Retornar un puntero a una estructura
« Respuesta #3 en: Miércoles 29 de Abril de 2009, 03:32 »
0
Citar
se usa *buscar en vez de buscar y porque se usa *p en vez de p[]

la defino *buscar porque debes retornar un puntero que para el caso es un puntero a una estructura
y *p...bueno eso, segun lo que plantean en el enunciado que pusiste podrias tambien manejarlo como p[], la cuestion es recibir los datos de la estructura... En mi caso concreto no estoy acostrumbrado a declarar parametros de esa forma sino que prefiero siempre definir el puntero en propiedad...aunque cuidado, recuerrda que si vas a usar punteros a estructuras, ya sea fuera o dentro de la funcion tendras que utilizar el operador ->

Saludos