Programación General > C/C++
Ejercicio con estructuras
kingsizen:
getchar obtiene un entero del caracter ingresado, por eso c lo declaro como entero
los while los corregi ni bien me dijiste
los returns de cadenas andan bien. ya he probado el programa
ahora el problema es el ke te mencione anteriormente : return-statement with a value, in function returning 'void'
este sale solo cuando pongo return i en la funcion void carga datos. sacando esto el programa funciona
<_< <_< espero tu ayuda
betopin:
Upsss....no habia visto el segundo codigo que posteaste. Tiene bastantes diferencias que el primero, sorry en verdad!!!...no habia notado la diferencia!!!!
Bueno varias cosas que ya este tema esta bastante largo, jeje
1) En cuanto a los getchar(). Si vas a detener la ejecucion del codigo es mejor que manipules system("pause") con la libreria stdlib.h y si vas a capturar caracteres con scanf. Esto le dara mas claridad a tu codigo.
2) En cuanto a los while, el que defines en carga datos
--- Código: C++ ---while (c =='n');
Este te aconsejo lo modifiques...si el usuario por ejemplo ingresara 'k', lo cual es un error, el ciclo dejaria de ejecutarse
3) La dichosa funcion void.... Ha sido error mio porque no he sido absolutamente claro con la explicacion de la misma y creo que en algo te he confundido porque supuse que conocias sus usos. Me explico
void la puedes definir de dos formas
Caso 1)
--- Código: C ---void suma (int a, int b){ printf("La suma es: %i",a+b);}
Cuando defines a void de esta forma, estas declarando que no se regresarán valores de tal función. Esto explica el error que te genera con el return i
Caso 2)
--- Código: C ---int suma (void){ int a=1,b=2; return a+b;}
En este caso, con void estas declarando en tu funcion, que esta no recibe parametro alguno pero date cuenta que devuelve datos. Por eso comentaba en mensajes anteriores que dependiendo como se declarara, void devolveria o no valores.
Espero que con esto que acabo de señalar quede mas claro el tema del void. Ahora bien, si ves el esquema que te propuse hay dos cosas importantes: La funcion que yo señale es de tipo int (teniendo presente el primer codigo posteado) y en main inicializo la variable cant_lib en cero
Esto ultimo lo he enfatizado en varios mensajes pero creo que aun no has caido en cuenta de la importancia de que esta se inicialice. Como estaba en el primer codigo que escribiste se inicializaba en la funcion, lo cual sobreescribiria los datos previamente ingresados cada ves que se invocara la funcion... en el segundo codigo ya no lo inicializaste en ninguna parte, asi que a la funcion llegara un valor indeterminado en donde empezara a guardar los valores el array de estructuras y asi seguira por siempre
Confio que con esto ya quede mas claro que el agua y disculpa por mi ligereza en el mensaje anterior pero realmente no habia observado los cambios del segundo codigo
Saludos!!!
kingsizen:
uhhhhhh... tengo mi cerebro quemado, pero he logrado que todo funcione correctamente gracias a tu ayuda.
logre modificar cant_lib mediante un puntero usando una funcion void y termine las otras funciones del programa. ahi te mando el codigo
si le encontras algun error o alguna sugerencia bienvenida sea!!, yo estoy aprendiendo. de lo contrario finalizamos el thread.
pero antes te voy a agradecer la paciencia y la predispocicion que has tenido. muchisimas gracias betopin! :beer:
--- 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=*cant; int c,j; do { printf ("Ingrese Codigon"); scanf ("%s",&l[i].codigo); fflush(stdin); printf ("Ingrese Titulon"); gets(l[i].titulo); printf ("Ingrese Autorn"); gets(l[i].autor); printf ("Ingrese Editorialn"); gets(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"); fflush(stdin); c=getchar(); while ((c!='s') && (c!='n')) { fflush(stdin); printf ("Ingrese S/nn"); 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[],int cant){ char tit[15],aut[25]; int i,ban; printf ("Ingrese Titulo y Autorn"); fflush(stdin); gets(tit); gets(aut); for (i=0;i<cant;++i) { if ((strcmp(tit,l[i].titulo)==0) && (strcmp(aut,l[i].autor)==0)) { if (l[i].existencia !=0) { return "SIn"; ban=1; } } } if (ban !=1) return "STOCK AGOTADOn";} void actualizar (struct libreria l[],char cod[],float nue_pre,int cant_lib){ int i; for (i=0;i<cant_lib;++i) { if ((strcmp(cod,l[i].codigo))==0) l[i].precio=nue_pre; }} main(){ int c,cant_lib; struct libreria libros[sub]; char *respuesta[14],cod[7]; float nue_pre; 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(); while ((c!='a')&&(c!='b')&&(c!='c')&&(c!='d')&&(c!='e')) { fflush(stdin); printf ("OPCION INCORRECTA, INGRESE UNA OPCION VALIDAn"); 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,cant_lib); printf ("%s",*respuesta); } break; case 'c': { printf("Ingrese codigo de libron"); scanf ("%s",cod); printf ("Ingrese nuevo precion"); scanf ("%f",&nue_pre); actualizar (libros,cod,nue_pre,cant_lib); } } }while (c!='e');}
betopin:
Cuidado con esto
--- Código: C ---if (l[i].existencia !=0) { return "SIn"; ban=1; }
Si se llega a cumplir la condicion, se regresará a main pero ban jamas tendra el valor de 1. Intercambia el orden
Saludos
Navegación
[*] Página Anterior
Ir a la versión completa