Programación General > C/C++
Retornar un puntero a una estructura
(1/1)
kingsizen:
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 --- # include <stdio.h># include <string.h># define sub 50 struct productos{ char codigo[5]; char modelo[10]; char descripcion[200]; float precio; char codprov[10]; char nomprov[30];}; void carga (struct productos [],int *);int buscar (struct productos [],int ,char []); main(){ struct productos prod[sub]; int *puntero,c,cant_prod,codigo_orden; char modelo_buscado[10],codigo_buscado[5]; cant_prod=0; carga (prod,&cant_prod); printf ("%d",cant_prod); do { printf ("------------------------------< Elija Una Opcion >n"); printf ("1) Ordenarn"); printf ("2) Mostrarn"); printf ("3) Buscarn"); printf ("4) Modificarn"); printf ("5) Salirn"); scanf ("%d",&c); switch (c) { case 1: { printf ("Ingrese 1 para ordenar por codigo, 2 para ordenar por modelon"); scanf ("%d",&codigo_orden); ordenar (prod,cant_prod,codigo_orden); }break; case 2: { printf ("Ingrese Modelo Buscadon"); scanf ("%s",modelo_buscado); mostrar(prod,cant_prod,modelo_buscado); }break; case 3:{ printf ("Ingrese codigo buscadon"); scanf("%s",codigo_buscado); *puntero=buscar(prod,cant_prod,codigo_buscado); } }while c!=5;}int buscar (struct productos p[],int cant,cod[]){ int i,*punt; for (i=0;i<cant,++i) { if (strcmp(cod,p[i].codigo)==0) *punt=p[i];}return *punt;} void carga (struct productos p[],int *cant ){ int i=*cant; char r; do { printf ("Ingrese Codigon"); scanf ("%s",&p[i].codigo); /*fflush (stdin); printf ("Ingrese Modelon"); gets(p[i].modelo); printf ("Ingrese Descripcionn"); gets(p[i].descripcion); printf ("Ingrese Precion"); scanf ("%f",&p[i].precio); printf ("Ingrese Cod proveedorn"); scanf("%s",p[i].codprov); fflush (stdin); printf ("Ingrese Nombre proveedorn"); gets(p[i].nomprov);*/ i++; printf ("Seguir ingresando datos?n"); fflush (stdin); scanf ("%c",&r); }while (r !='n'); *cant=i;}
betopin:
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 ---#include <stdio.h>#include <stdlib.h>struct agenda{ char apellido[30]; char nombre[30]; char telefono[30]; int edad;}datos[3],*dat; struct agenda *suma(struct agenda *total){ int pos; for (pos=0;pos<3;pos++) if (((total+pos)->edad)>10) return (total+pos);} int main(){ int a,val=0; for (a=0;a<3;a++) { printf("Ingrese el apellido del sujeto #%i: ",a+1); scanf("%s",datos[a].apellido); printf("Ingrese el nombre del sujeto #%i: ",a+1); scanf("%s",datos[a].nombre); printf("Ingrese el telefono del sujeto #%i: ",a+1); scanf("%s",datos[a].telefono); printf("Ingrese la edad del sujeto #%i: ",a+1); scanf("%i",&datos[a].edad); printf("n"); } for (a=0;a<3;a++) { printf("Nombre: %s %s, Telefono: %s, Edad: %in",datos[a].apellido,datos[a].nombre,datos[a].telefono,datos[a].edad); if (datos[a].edad>10) val=1; } if (val==1) { dat=suma(datos); printf("Nombre: %s %s, Telefono: %s, Edad: %inn",dat->apellido,dat->nombre,dat->telefono,dat->edad); } system("pause"); return 0;}
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:
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 --- # include <stdio.h># include <string.h># define sub 50 struct productos{ char codigo[5]; char modelo[10]; char descripcion[200]; float precio; char codprov[10]; char nomprov[30];}; void carga (struct productos [],int *);//void ordenar (struct productos [],int,int); struct productos *buscar (struct productos *,int ,char []); main(){ struct productos prod[sub],*puntero; int c,cant_prod,codigo_orden; char modelo_buscado[10],codigo_buscado[5]; cant_prod=0; carga (prod,&cant_prod); printf ("%d",cant_prod); do { printf ("------------------------------< Elija Una Opcion >n"); printf ("1) Ordenarn"); printf ("2) Mostrarn"); printf ("3) Buscarn"); printf ("4) Modificarn"); printf ("5) Salirn"); scanf ("%d",&c); switch (c) { case 1: { printf ("Ingrese 1 para ordenar por codigo, 2 para ordenar por modelon"); scanf ("%d",&codigo_orden); //ordenar (prod,cant_prod,codigo_orden); }break; case 2: { printf ("Ingrese Modelo Buscadon"); scanf ("%s",modelo_buscado); // mostrar(prod,cant_prod,modelo_buscado); }break; case 3:{ printf ("Ingrese codigo buscadon"); scanf("%s",codigo_buscado); puntero=buscar(prod,cant_prod,codigo_buscado); } } }while (c!=5);} struct productos *buscar (struct productos *p,int cant,char cod[]){ int i; for (i=0;i<cant;++i) { if (strcmp(cod,(p+i)->codigo)==0) return (p+i); } } void carga (struct productos p[],int *cant ){ int i=*cant; char r; do { printf ("Ingrese Codigon"); scanf ("%s",&p[i].codigo); fflush (stdin); printf ("Ingrese Modelon"); gets(p[i].modelo); printf ("Ingrese Descripcionn"); gets(p[i].descripcion); printf ("Ingrese Precion"); scanf ("%f",&p[i].precio); printf ("Ingrese Cod proveedorn"); scanf("%s",p[i].codprov); fflush (stdin); printf ("Ingrese Nombre proveedorn"); gets(p[i].nomprov); i++; printf ("Seguir ingresando datos?n"); fflush (stdin); scanf ("%c",&r); }while (r !='n'); *cant=i;}
betopin:
--- Citar ---se usa *buscar en vez de buscar y porque se usa *p en vez de p[]
--- Fin de la cita ---
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
Navegación
Ir a la versión completa