Programación General > C/C++
Ejercicio con estructuras
kingsizen:
saludos!, estoy haciendo un ejercicio de un examen final y tengo un pequeño problemita, la consigna pide que el se ingresen libros (todos sus datos) con una funcion del tipo void llamada carga_libros y que se deje en la funcion main la cantidad de libros ingresados. a que se refiere exactamente eso?
porke si modifico la variable desde la funcion, al llegar a main va a seguir valiendo lo que valen en main. entonces... tengo ke usar un puntero?
--- Código: C --- # include <stdio.h># include <string.h># define sub 1000 struct libreria { char codigo[7]; char titulo[15]; char autor[25]; char editorial[15]; int existencia; float precio;}; void carga_datos (struct libreria *l,int cant){ int i=0; int c,j; do { printf ("Ingrese Codigon"); scanf ("%s",&l[i].codigo); printf ("Ingrese Titulo y Autorn"); scanf ("%s %s",&l[i].titulo,&l[i].autor); printf ("Ingrese Editorialn"); scanf ("%s",&l[i].editorial); printf ("Ingrese stock y precion"); scanf ("%d %f",&l[i].existencia,&l[i].precio); ++i; printf ("finalizar? s/n n"); c=getchar(); c=getchar(); }while (c =='n'); cant=i+1; for (j=0;j<i;j++) { printf ("%dn",l[j].codigo); printf ("%sn",l[j].titulo); printf ("%sn",l[j].autor); printf ("%sn",l[j].editorial); printf ("%dn",l[j].existencia); printf ("%fn",l[j].precio); } c=getchar(); c=getchar();} main(){ int c,cant_lib; struct libreria libros[sub]; do { printf ("Elija Una Opcionn"); printf ("a) Carga datosn"); printf ("b) Consultasn"); printf ("c) Actualizarn"); printf ("d) Facturacionn"); printf ("e)Salirn"); c=getchar(); switch (c) { case 'a': { carga_datos(libros,cant_lib); } break; } }while (c=='e');}
recien estoy haciendo la parte A de la carga de datos.
tengo muchas preguntas sobre este ejercicio pero, empezemos por la primera.
muchas gracias!
betopin:
Respondiendo a tu interrogante, podria ser pero no es estrictamente necesario..Aparte de que tu variable determina la cantidad de libros, esta determina igualmente el indice en que el array de la estructura va, que en la funcion lo defines como i. Esto quiere decir, que la variable que defines desde main como cant_lib en la funcion debe transformarse a i. Sin embargo, como"salvas" el valor ...sea manipulandolo atraves de un puntero o retornando el dato desde la funcion hacia main lo defines tu. Desde una funcion tipo void igualmente puedes retornar datos. Hay que aclarar, que este dato tendras que inicializarlo una sola ves y tendras que hacerlo en main.
Hay otras cosas en tu codigo
1) Al manipular estructuras con punteros, el operador para acceder a los campos no es punto (.) sino flecha (->). Esto quiere decir que todas las operaciones que estas realizando en la funcion, tanto de captura como de impresion de datos debes corregirlas
2) Las condiciones de los bucles estan mal. La de main deberia ser
--- Código: C ---while (c!='e');
y la de la funcion
--- Código: C ---while (c !='s');
3) Eso quiere decir que dentro del switch o en su defecto con if - else deberas adecuar las condiciones que definan datos que no esperan que se ingresen para el correcto funcionamiento del codigo: Por ejemplo que se ingrese z en el menu principal
4) No te aconsejo que captures datos con un getchar. Para eso se encuentran comandos como scanf que estan diseñados para el caso y con el que puedes manejar un cierto control de errores
5) Al capturar cadenas de caracteres, sobra &
Saludos
kingsizen:
Excelente!, a ver si entendi bien... osea que si uso una funcion del tipo void, esta me va a modificar de manera permanente una variable que este en main. y si utilizo una funcion que devuelva un solo valor (del tipo int ), solo va a modificar la variable en la funcion y no en main?
aqui va el nuevo codigo, estoy haciendo la parte b del programa, asique les voy a hacer algunas preguntas:
- para ingresar un titulo de un libro que contiene espacios, debo usar gets?
- o gets se usa para c++?
--- Código: C --- # include <stdio.h># include <string.h># define sub 1000 struct libreria { char codigo[7]; char titulo[15]; char autor[25]; char editorial[15]; int existencia; float precio;}; void carga_datos (struct libreria l[],int *cant){ int i=0; int c,j; do { printf ("Ingrese Codigon"); scanf ("%s",&l[i].codigo); /*printf ("Ingrese Titulo y Autorn"); scanf ("%s %s",&l[i].titulo,&l[i].autor); printf ("Ingrese Editorialn"); scanf ("%s",&l[i].editorial); printf ("Ingrese stock y precion"); scanf ("%d %f",&l[i].existencia,&l[i].precio);*/ ++i; printf ("finalizar? s/n n"); c=getchar(); c=getchar(); }while (c =='n'); *cant=i; for (j=0;j<i;j++) { printf ("%sn",l[j].codigo); /* printf ("%sn",l[j].titulo); printf ("%sn",l[j].autor); printf ("%sn",l[j].editorial); printf ("%dn",l[j].existencia); printf ("%fn",l[j].precio);/**/ } c=getchar(); c=getchar();} char* consultas (struct libreria l[]){ char tit[15],aut[25]; printf ("Ingrese Titulo y Autorn"); gets (tit); gets (aut);} main(){ int c,cant_lib; struct libreria libros[sub]; char *respuesta[14]; cant_lib=0; do { printf ("Elija Una Opcionn"); printf ("a) Carga datosn"); printf ("b) Consultasn"); printf ("c) Actualizarn"); printf ("d) Facturacionn"); printf ("e)Salirn"); c=getchar(); switch (c) { case 'a': { carga_datos(libros,&cant_lib); printf ("cantidad libros= %d",cant_lib); c=getchar(); c=getchar(); } break; case 'b': { *respuesta=consultas(libros); printf ("%s",*respuesta); } break; } }while (c!='e');}
saludos!. espero sus respuestas!
betopin:
--- Cita de: "kingsizen" ---Excelente!, a ver si entendi bien... osea que si uso una funcion del tipo void, esta me va a modificar de manera permanente una variable que este en main. y si utilizo una funcion que devuelva un solo valor (del tipo int ), solo va a modificar la variable en la funcion y no en main?
aqui va el nuevo codigo, estoy haciendo la parte b del programa, asique les voy a hacer algunas preguntas:
- para ingresar un titulo de un libro que contiene espacios, debo usar gets?
- o gets se usa para c++?!
--- Fin de la cita ---
Varias cosas
1) Lo que hagas en una funcion muere al concluir las operaciones a realizar en esta a menos de que uses punteros o que retornes los datos. El caso void es un caso especial de las funciones ya que con esta puedes o no retornar valores
2) El usos de gets es C, en C++ (que tambien se puede usar), se utiliza normalmente la clase string
Saludos
kingsizen:
bien, lo que haga en una funcion muere al cuncluir esta. el tipo void es un caso especial de funcion en el cual no muere nada de lo que haga? osea ke utilizando el tipo void puedo cambiar valores de variables que estan en main usando o no punteros?... ahi entendi bien?
ahora tengo el nuevo codigo de mi programa y presento un nuevo problemilla...
- al ingresar un titulo de un libro digamos "COMO HACER UN PROGRAMA", utilizando scanf, me toma los espacion como fin de cadena o algo asi... por lo tanto tengo que utilizar el gets (que gracias a betopin ahora sé que esta funcion corresponde a c :D ), pero... como se usa??. aca va el codigo, diganme como reemplazarian los scanf por los gets.
les comento que el programa en la funcion consultas (opcion b) debe recibir un titulo y un autor y de tener stock disponible, devolver a main la cadena "si" y de lo contrario "no hay stock", les comento por si ven algun error para corregir, o algun metodo mas adecuado que yo no haya utilizado.
muchisismas gracias y espero sus respuestas!!! :beer:
pd: van a ver muchos getchar() que no tienen sentido, es que los uso para pausar el programa y ver los resultados :blink:
--- Código: C --- # include <stdio.h># include <string.h># define sub 1000 struct libreria { char codigo[7]; char titulo[15]; char autor[25]; char editorial[15]; int existencia; float precio;}; void carga_datos (struct libreria l[],int *cant){ int i=0; int c,j; do { printf ("Ingrese Codigon"); scanf ("%s",&l[i].codigo); printf ("Ingrese Titulon"); scanf ("%s",&l[i].titulo); printf ("Ingrese Autorn"); scanf ("%s",&l[i].autor); printf ("Ingrese Editorialn"); scanf ("%s",&l[i].editorial); printf ("Ingrese stockn"); scanf ("%d",&l[i].existencia); printf ("Ingrese precion"); scanf ("%f",&l[i].precio); ++i; printf ("finalizar? s/n n"); c=getchar(); c=getchar(); }while (c =='n'); *cant=i; for (j=0;j<i;j++) { printf ("%sn",l[j].codigo); printf ("%sn",l[j].titulo); printf ("%sn",l[j].autor); printf ("%sn",l[j].editorial); printf ("%dn",l[j].existencia); printf ("%fn",l[j].precio); } c=getchar(); c=getchar();} char* consultas (struct libreria l[]){ char tit[15],aut[25]; int i,ban; printf ("Ingrese Titulo y Autorn"); scanf ("%s",&tit); scanf ("%s",&aut); for (i=0;i<sub;++i) { if ((strcmp(tit,l[i].titulo)==0) && (strcmp(aut,l[i].autor)==0)) { if (l[i].existencia !=0) { return "si"; ban=1; } } } if (ban !=1) return "no hay stock";} main(){ int c,cant_lib; struct libreria libros[sub]; char *respuesta[14]; cant_lib=0; do { printf ("Elija Una Opcionn"); printf ("a) Carga datosn"); printf ("b) Consultasn"); printf ("c) Actualizarn"); printf ("d) Facturacionn"); printf ("e)Salirn"); c=getchar(); switch (c) { case 'a': { carga_datos(libros,&cant_lib); printf ("cantidad libros= %d",cant_lib); c=getchar(); c=getchar(); } break; case 'b': { *respuesta=consultas(libros); printf ("%s",*respuesta); } break; } }while (c!='e');}
Navegación
[#] Página Siguiente
Ir a la versión completa