Programación General > C/C++

 Ejercicio con estructuras

<< < (2/3) > >>

betopin:

--- Cita de: "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:
--- Fin de la cita ---

Hola

No se si no me he hecho entender bien con lo de void, jejeje. Esta es un tipo de funcion cualquiera...es decir, lo que haces en ella...muere en ella (obviamente me refiero en cuanto a las variables que declaras alli y las operaciones que realices con estas), sin embargo, en esta tu puedes retornar lo que desees...un entero, un caracter, un float....o por el contrario nada. Logicamente esto que retornas es lo que manipularas en main. Esto quiere decir quer mientras en una funcion tipo int, char, etc estas obligado a devolver un dato acorde al tipo de funcion que defines, en las void lo puedes o no hacer. No existe obligatoriedad de retorno

En cuanto a gets su uso es simple. Si tienes un array, por ejemplo, cadena[50], para caprurar la cadena simplemente tendras que hacer gets(cadena); y listo....sin embargo ten cuidado ya que si la cadena que se intenta ingresar sobrepasa el tamaño del array, poseerás problemas

Saludos

kingsizen:
bien.. eso esta claro, tal vez yo no puedo expresar cual es mi duda...
te voy a mostrar 2 ejemplos que encontre en un manual


--- Código: C --- #include <stdio.h> int suma( int a, int b )     {          int c;     c=a+b;     a=2000;return c;     } int main()     {     int var1, var2, resultado;      var1 = 5; var2 = 8;     resultado = suma(var1, var2);     printf( "La suma es : %i %dn", resultado,var1 );     }   aqui cambio el valor de var1 en la funcion, pero sigue valiendo lo mismo en main.


--- Código: C --- #include <stdio.h> int suma( int *a, int b )     {     int c;      c = *a + b;     *a = 2000;     return c;     } int main()     {     int var1, var2, resultado;      var1 = 5; var2 = 8;     resultado = suma(&var1, var2);     printf( "La suma es: %i y a vale: %in", resultado , var1 );     }  aqui modifico var1 en la funcion y se modifica en main...

entonces, en el ejemplo de los libros, cant_lib en este caso es como el var1 de el ultimo ejemplo, yo quiero darle un valor en la funcion y ke lo mantenga en main, que no lo pierda.
por eso no entiendo cuando me dices

--- Citar ---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.
--- Fin de la cita ---

 :(  :(  :(  :(

betopin:
Bien, lo que hiciste en el primer ejemplo puedes hacerlo exactamente igual en la funcion void que definiste en el primer codigo que escribiste. El punto es que la variable con la que manipulas los indices del array de estructuras debe ser inicializado en cero en main e irse modificando en la funcion acorde a la cantidad de datos que desee ingresar el usuario. Tal dato (indice de la estructura - variable i en tu codigo) deberas retornarlo al final de la funcion a main para no perder el indice en el que vas. Tal como tienes el programa, los datos ingresados previamente se perderan ya que a pesar de que estas manipulando la estructura a traves de un puntero, el indice de esta siempre comienza en cero acorde a la definicion de i que tiene tu primer codigo en la funcion. Asi que si el usuario desea volver a escribir datos en la estructura tras haber previamente invocado a la funcion y haber ingresado datos, lo que hara es sobreescribir lo ya ingresado.

Lo ves???....Es decir...lo que debes hacer es algo asi


--- 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;}; int carga_datos (struct libreria *l,int cant){     int i=cant;     int j;     char c;          do     {      // Lineas y mas lineas de codigo.....      // Mas lineas       ++i;         printf ("finalizar? s/n n");         c=getchar();      // Lineas y mas lineas de codigo.....      // Mas lineas return i;}        main(){           int cant_lib=0;      char c;      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':                     cant_lib=carga_datos(libros,cant_lib);                  break;                  // Lineas de Codigo// Mas lineas de codigo// .....                  }    
Saludos!!!!

kingsizen:
entendido!, ahora me esta tirando un error:
return-statement with a value, in function returning 'void'
 :mellow:  :mellow:


--- 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");         c=getchar();         c=getchar();                  }while (c =='n');                  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();         return i;}        char* consultas (struct libreria l[]){      char tit[15],aut[25];      int i,ban;           printf ("Ingrese Titulo y Autorn");      fflush(stdin);      gets(tit);      gets(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 stockn";}            /*void actualizar (struct libreria l[],char cod,float nue_pre,int cant_lib){     int i;     for (i=0;i<sub;++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;                  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':                  {                     cant_lib=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;        /*   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:
Tu codigo sigue teniendo fallos, debes decantarlos. Mira por ejemplo la variable c en la funcion carga datos y en main. La defines como un entero pero capturas caracteres, los while como los mencione en mensajes anteriores no son correctos ya que no funcionaran como esperas, los return donde devuelves texto deberas corregirlos, asi como inicializar en ceros la variable que pasaras a la funcion para controlar la estructura

Te aconsejo decantes a profundidad tu codigo y prestes atencion al esquema que te propse en el mensaje anterior

Saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa