• Domingo 15 de Diciembre de 2024, 18:45

Autor Tema:  Ejercicio con estructuras  (Leído 3213 veces)

kingsizen

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Ejercicio con estructuras
« en: Jueves 23 de Abril de 2009, 06:06 »
0
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
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 1000
  5.  
  6.  
  7.  
  8. struct libreria
  9. {
  10.        char codigo[7];
  11.        char titulo[15];
  12.        char autor[25];
  13.        char editorial[15];
  14.        int existencia;
  15.        float precio;
  16. };
  17.  
  18. void carga_datos (struct libreria *l,int cant)
  19. {
  20.      int i=0;
  21.      int c,j;
  22.      
  23.      do
  24.      {
  25.          
  26.          printf ("Ingrese Codigon");
  27.          scanf ("%s",&l[i].codigo);
  28.          printf ("Ingrese Titulo y Autorn");
  29.          scanf ("%s %s",&l[i].titulo,&l[i].autor);
  30.          printf ("Ingrese Editorialn");
  31.          scanf ("%s",&l[i].editorial);
  32.          printf ("Ingrese stock y precion");
  33.          scanf ("%d %f",&l[i].existencia,&l[i].precio);
  34.          ++i;
  35.          printf ("finalizar? s/n n");
  36.          c=getchar();
  37.          c=getchar();
  38.          }while (c =='n');
  39.          cant=i+1;
  40.          for (j=0;j<i;j++)
  41.          {
  42.          printf ("%dn",l[j].codigo);
  43.          printf ("%sn",l[j].titulo);
  44.          printf ("%sn",l[j].autor);
  45.          printf ("%sn",l[j].editorial);
  46.          printf ("%dn",l[j].existencia);
  47.          printf ("%fn",l[j].precio);
  48.          }
  49.          c=getchar();
  50.          c=getchar();
  51. }
  52.          
  53.          
  54.      
  55.  
  56. main()
  57. {    
  58.       int c,cant_lib;
  59.       struct libreria libros[sub];
  60.      
  61.       do
  62.       {
  63.       printf ("Elija Una Opcionn");
  64.       printf ("a) Carga datosn");
  65.       printf ("b) Consultasn");
  66.       printf ("c) Actualizarn");
  67.       printf ("d) Facturacionn");
  68.       printf ("e)Salirn");
  69.       c=getchar();
  70.      
  71.      
  72.       switch (c)
  73.       {
  74.              case 'a':
  75.                   {  
  76.                   carga_datos(libros,cant_lib);
  77.                   }
  78.                   break;
  79.                   }
  80.                  
  81.      
  82.      
  83.      
  84.      
  85.      
  86.      
  87.      
  88.      
  89.      
  90.      
  91.      
  92.      
  93.      
  94.      
  95.      
  96.      
  97.      
  98.       }while (c=='e');
  99. }  
  100.      
  101.  
  102.      
  103.  
  104.  

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

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Ejercicio con estructuras
« Respuesta #1 en: Jueves 23 de Abril de 2009, 06:43 »
0
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
  1. while (c!='e');
  2.  

y la de la funcion

Código: C
  1. while (c !='s');
  2.  

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

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Ejercicio con estructuras
« Respuesta #2 en: Jueves 23 de Abril de 2009, 20:11 »
0
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
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 1000
  5.  
  6.  
  7.  
  8. struct libreria
  9. {
  10.        char codigo[7];
  11.        char titulo[15];
  12.        char autor[25];
  13.        char editorial[15];
  14.        int existencia;
  15.        float precio;
  16. };
  17.  
  18. void carga_datos (struct libreria l[],int *cant)
  19. {
  20.      int i=0;
  21.      int c,j;
  22.      
  23.      do
  24.      {
  25.          
  26.          printf ("Ingrese Codigon");
  27.          scanf ("%s",&l[i].codigo);
  28.          /*printf ("Ingrese Titulo y Autorn");
  29.          scanf ("%s %s",&l[i].titulo,&l[i].autor);
  30.          printf ("Ingrese Editorialn");
  31.          scanf ("%s",&l[i].editorial);
  32.          printf ("Ingrese stock y precion");
  33.          scanf ("%d %f",&l[i].existencia,&l[i].precio);*/
  34.          ++i;
  35.          printf ("finalizar? s/n n");
  36.          c=getchar();
  37.          c=getchar();
  38.          }while (c =='n');
  39.          *cant=i;
  40.          for (j=0;j<i;j++)
  41.          {
  42.          printf ("%sn",l[j].codigo);
  43.         /* printf ("%sn",l[j].titulo);
  44.          printf ("%sn",l[j].autor);
  45.          printf ("%sn",l[j].editorial);
  46.          printf ("%dn",l[j].existencia);
  47.          printf ("%fn",l[j].precio);/**/
  48.          }
  49.          c=getchar();
  50.          c=getchar();
  51. }
  52.        
  53. char* consultas (struct libreria l[])
  54. {
  55.       char tit[15],aut[25];
  56.      
  57.       printf ("Ingrese Titulo y Autorn");
  58.       gets (tit);
  59.       gets (aut);
  60. }
  61.      
  62.        
  63.          
  64.      
  65.  
  66. main()
  67. {    
  68.       int c,cant_lib;
  69.       struct libreria libros[sub];
  70.       char *respuesta[14];
  71.       cant_lib=0;
  72.      
  73.       do
  74.       {
  75.       printf ("Elija Una Opcionn");
  76.       printf ("a) Carga datosn");
  77.       printf ("b) Consultasn");
  78.       printf ("c) Actualizarn");
  79.       printf ("d) Facturacionn");
  80.       printf ("e)Salirn");
  81.       c=getchar();
  82.      
  83.      
  84.       switch (c)
  85.       {
  86.              case 'a':
  87.                   {  
  88.                   carga_datos(libros,&cant_lib);
  89.                  
  90.                   printf ("cantidad libros= %d",cant_lib);
  91.                  
  92.                   c=getchar();
  93.          c=getchar();
  94.                   }
  95.                   break;
  96.          
  97.             case 'b':
  98.                  {
  99.                      *respuesta=consultas(libros);
  100.                      printf ("%s",*respuesta);
  101.                      }
  102.                   break;
  103.                  
  104.                   }
  105.                
  106.      
  107.      
  108.      
  109.      
  110.      
  111.      
  112.      
  113.      
  114.      
  115.      
  116.      
  117.      
  118.      
  119.      
  120.      
  121.      
  122.      
  123.       }while (c!='e');
  124. }  
  125.      
  126.  
  127.      
  128.  
  129.  
  130.  
  131.  

saludos!. espero sus respuestas!

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Ejercicio con estructuras
« Respuesta #3 en: Jueves 23 de Abril de 2009, 21:13 »
0
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++?!

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

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Ejercicio con estructuras
« Respuesta #4 en: Viernes 24 de Abril de 2009, 00:03 »
0
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
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 1000
  5.  
  6.  
  7.  
  8. struct libreria
  9. {
  10.        char codigo[7];
  11.        char titulo[15];
  12.        char autor[25];
  13.        char editorial[15];
  14.        int existencia;
  15.        float precio;
  16. };
  17.  
  18. void carga_datos (struct libreria l[],int *cant)
  19. {
  20.      int i=0;
  21.      int c,j;
  22.      
  23.      do
  24.      {
  25.          
  26.          printf ("Ingrese Codigon");
  27.          scanf ("%s",&l[i].codigo);
  28.          printf ("Ingrese Titulon");
  29.          scanf ("%s",&l[i].titulo);
  30.          printf ("Ingrese Autorn");
  31.          scanf ("%s",&l[i].autor);
  32.          printf ("Ingrese Editorialn");
  33.          scanf ("%s",&l[i].editorial);
  34.          printf ("Ingrese stockn");
  35.          scanf ("%d",&l[i].existencia);
  36.          printf ("Ingrese precion");
  37.          scanf ("%f",&l[i].precio);
  38.          ++i;
  39.          printf ("finalizar? s/n n");
  40.          c=getchar();
  41.          c=getchar();
  42.          }while (c =='n');
  43.          *cant=i;
  44.          for (j=0;j<i;j++)
  45.          {
  46.          printf ("%sn",l[j].codigo);
  47.          printf ("%sn",l[j].titulo);
  48.          printf ("%sn",l[j].autor);
  49.          printf ("%sn",l[j].editorial);
  50.          printf ("%dn",l[j].existencia);
  51.          printf ("%fn",l[j].precio);
  52.          }
  53.          c=getchar();
  54.          c=getchar();
  55. }
  56.        
  57. char* consultas (struct libreria l[])
  58. {
  59.       char tit[15],aut[25];
  60.       int i,ban;    
  61.       printf ("Ingrese Titulo y Autorn");
  62.       scanf ("%s",&tit);
  63.       scanf ("%s",&aut);
  64.       for (i=0;i<sub;++i)
  65.       {
  66.           if ((strcmp(tit,l[i].titulo)==0) && (strcmp(aut,l[i].autor)==0))
  67.           {
  68.              if (l[i].existencia !=0)
  69.              {
  70.                 return "si";
  71.                 ban=1;
  72.              }
  73.           }
  74.       }
  75.       if (ban !=1)
  76.       return "no hay stock";
  77. }
  78.            
  79.  
  80.      
  81.        
  82.          
  83.      
  84.  
  85. main()
  86. {    
  87.       int c,cant_lib;
  88.       struct libreria libros[sub];
  89.       char *respuesta[14];
  90.       cant_lib=0;
  91.      
  92.       do
  93.       {
  94.       printf ("Elija Una Opcionn");
  95.       printf ("a) Carga datosn");
  96.       printf ("b) Consultasn");
  97.       printf ("c) Actualizarn");
  98.       printf ("d) Facturacionn");
  99.       printf ("e)Salirn");
  100.       c=getchar();
  101.      
  102.      
  103.       switch (c)
  104.       {
  105.              case 'a':
  106.                   {  
  107.                   carga_datos(libros,&cant_lib);
  108.                  
  109.                   printf ("cantidad libros= %d",cant_lib);
  110.                  
  111.                   c=getchar();
  112.          c=getchar();
  113.                   }
  114.                   break;
  115.          
  116.             case 'b':
  117.                  {
  118.                      *respuesta=consultas(libros);
  119.                      printf ("%s",*respuesta);
  120.                      }
  121.                   break;
  122.                  
  123.                   }
  124.                
  125.      
  126.      
  127.      
  128.      
  129.      
  130.      
  131.      
  132.      
  133.      
  134.      
  135.      
  136.      
  137.      
  138.      
  139.      
  140.      
  141.      
  142.       }while (c!='e');
  143. }  
  144.      
  145.  
  146.      
  147.  
  148.  
  149.  

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Ejercicio con estructuras
« Respuesta #5 en: Viernes 24 de Abril de 2009, 00:39 »
0
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:

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

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Ejercicio con estructuras
« Respuesta #6 en: Viernes 24 de Abril de 2009, 01:01 »
0
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
  1.  
  2. #include <stdio.h>
  3.  
  4. int suma( int a, int b )
  5.      {
  6.           int c;
  7.      c=a+b;
  8.      a=2000;
  9. return c;
  10.      }
  11.  
  12. int main()
  13.      {
  14.      int var1, var2, resultado;
  15.  
  16.      var1 = 5; var2 = 8;
  17.      resultado = suma(var1, var2);
  18.      printf( "La suma es : %i %dn", resultado,var1 );
  19.      }
  20.  
  21.  
  22.  
aqui cambio el valor de var1 en la funcion, pero sigue valiendo lo mismo en main.

Código: C
  1.  
  2. #include <stdio.h>
  3.  
  4. int suma( int *a, int b )
  5.      {
  6.      int c;
  7.  
  8.      c = *a + b;
  9.      *a = 2000;
  10.      return c;
  11.      }
  12.  
  13. int main()
  14.      {
  15.      int var1, var2, resultado;
  16.  
  17.      var1 = 5; var2 = 8;
  18.      resultado = suma(&var1, var2);
  19.      printf( "La suma es: %i y a vale: %in", resultado , var1 );
  20.      }
  21.  
  22.  
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.

 :(  :(  :(  :(

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Ejercicio con estructuras
« Respuesta #7 en: Viernes 24 de Abril de 2009, 01:43 »
0
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
  1. # include <stdio.h>
  2. # include <string.h>
  3. # define sub 1000
  4.  
  5. struct libreria
  6. {
  7.        char codigo[7];
  8.        char titulo[15];
  9.        char autor[25];
  10.        char editorial[15];
  11.        int existencia;
  12.        float precio;
  13. };
  14.  
  15. int carga_datos (struct libreria *l,int cant)
  16. {
  17.      int i=cant;
  18.      int j;
  19.      char c;     
  20.      do
  21.      {
  22.       // Lineas y mas lineas de codigo.....
  23.       // Mas lineas
  24.        ++i;
  25.          printf ("finalizar? s/n n");
  26.          c=getchar();
  27.       // Lineas y mas lineas de codigo.....
  28.       // Mas lineas
  29.  return i;
  30. }
  31.        
  32. main()
  33. {    
  34.       int cant_lib=0;
  35.       char c;
  36.       struct libreria libros[sub];
  37.      
  38.       do
  39.       {
  40.       printf ("Elija Una Opcionn");
  41.       printf ("a) Carga datosn");
  42.       printf ("b) Consultasn");
  43.       printf ("c) Actualizarn");
  44.       printf ("d) Facturacionn");
  45.       printf ("e)Salirn");
  46.       c=getchar();
  47.      
  48.       switch (c)
  49.       {
  50.              case 'a':  
  51.                   cant_lib=carga_datos(libros,cant_lib);
  52.                   break;
  53.                  
  54. // Lineas de Codigo
  55. // Mas lineas de codigo
  56. // .....
  57.                  
  58. }  
  59.  

Saludos!!!!
« última modificación: Viernes 24 de Abril de 2009, 03:40 por betopin »

kingsizen

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Ejercicio con estructuras
« Respuesta #8 en: Viernes 24 de Abril de 2009, 02:06 »
0
entendido!, ahora me esta tirando un error:
return-statement with a value, in function returning 'void'
 :mellow:  :mellow:

Código: C
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 1000
  5.  
  6.  
  7.  
  8. struct libreria
  9. {
  10.        char codigo[7];
  11.        char titulo[15];
  12.        char autor[25];
  13.        char editorial[15];
  14.        int existencia;
  15.        float precio;
  16. };
  17.  
  18. void carga_datos (struct libreria l[],int *cant)
  19. {
  20.      int i=*cant;
  21.      int c,j;
  22.      
  23.      do
  24.      {
  25.          
  26.          printf ("Ingrese Codigon");
  27.          scanf ("%s",&l[i].codigo);
  28.          fflush(stdin);
  29.          printf ("Ingrese Titulon");
  30.          gets(l[i].titulo);
  31.          
  32.          printf ("Ingrese Autorn");
  33.          gets(l[i].autor);
  34.          printf ("Ingrese Editorialn");
  35.          gets(l[i].editorial);
  36.          printf ("Ingrese stockn");
  37.          scanf ("%d",&l[i].existencia);
  38.          printf ("Ingrese precion");
  39.          scanf ("%f",&l[i].precio);
  40.          ++i;
  41.          printf ("finalizar? s/n n");
  42.          c=getchar();
  43.          c=getchar();
  44.          
  45.          }while (c =='n');
  46.          
  47.          for (j=0;j<i;j++)
  48.          {
  49.          printf ("%sn",l[j].codigo);
  50.          printf ("%sn",l[j].titulo);
  51.          printf ("%sn",l[j].autor);
  52.          printf ("%sn",l[j].editorial);
  53.          printf ("%dn",l[j].existencia);
  54.          printf ("%fn",l[j].precio);
  55.          }
  56.          c=getchar();
  57.          c=getchar();
  58.          return i;
  59. }
  60.        
  61. char* consultas (struct libreria l[])
  62. {
  63.       char tit[15],aut[25];
  64.       int i,ban;    
  65.       printf ("Ingrese Titulo y Autorn");
  66.       fflush(stdin);
  67.       gets(tit);
  68.       gets(aut);
  69.       for (i=0;i<sub;++i)
  70.       {
  71.           if ((strcmp(tit,l[i].titulo)==0) && (strcmp(aut,l[i].autor)==0))
  72.           {
  73.              if (l[i].existencia !=0)
  74.              {
  75.                 return "si";
  76.                 ban=1;
  77.              }
  78.           }
  79.       }
  80.       if (ban !=1)
  81.       return "no hay stockn";
  82. }
  83.            
  84. /*void actualizar (struct libreria l[],char cod,float nue_pre,int cant_lib)
  85. {
  86.      int i;
  87.      for (i=0;i<sub;++i)
  88.      {
  89.          if (strcmp(cod,l[i].codigo)==0)
  90.             l[i].precio=nue_pre;
  91.      }
  92. }
  93.   */          
  94.      
  95.        
  96.          
  97.      
  98.  
  99. main()
  100. {    
  101.       int c,cant_lib;
  102.       struct libreria libros[sub];
  103.       char *respuesta[14],cod[7];
  104.       float nue_pre;
  105.      
  106.      
  107.       do
  108.       {
  109.       printf ("Elija Una Opcionn");
  110.       printf ("a) Carga datosn");
  111.       printf ("b) Consultasn");
  112.       printf ("c) Actualizarn");
  113.       printf ("d) Facturacionn");
  114.       printf ("e) Salirn");
  115.       c=getchar();
  116.      
  117.      
  118.       switch (c)
  119.       {
  120.              case 'a':
  121.                   {  
  122.                   cant_lib=carga_datos(libros,&cant_lib);
  123.                  
  124.                   printf ("cantidad libros= %d",cant_lib);
  125.                  
  126.                   c=getchar();
  127.          c=getchar();
  128.                   }
  129.                   break;
  130.          
  131.             case 'b':
  132.                  {
  133.                      *respuesta=consultas(libros);
  134.                      printf ("%s",*respuesta);
  135.                      }
  136.                   break;
  137.         /*   case 'c':
  138.                 {
  139.                     printf("Ingrese codigo de libron");
  140.                     scanf ("%s",cod);
  141.                     printf ("Ingrese nuevo precion");
  142.                     scanf ("%f",&nue_pre);
  143.                     actualizar (libros,cod,nue_pre,cant_lib);
  144.                     }*/
  145.                
  146.                  
  147.                  
  148.                   }
  149.                
  150.      
  151.      
  152.      
  153.      
  154.      
  155.      
  156.      
  157.      
  158.      
  159.      
  160.      
  161.      
  162.      
  163.      
  164.      
  165.      
  166.      
  167.       }while (c!='e');
  168. }  
  169.      
  170.  
  171.      
  172.  
  173.  

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Ejercicio con estructuras
« Respuesta #9 en: Viernes 24 de Abril de 2009, 03:39 »
0
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

kingsizen

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Ejercicio con estructuras
« Respuesta #10 en: Viernes 24 de Abril de 2009, 03:51 »
0
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
 &lt;_&lt;  &lt;_&lt;  espero tu ayuda

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Ejercicio con estructuras
« Respuesta #11 en: Viernes 24 de Abril de 2009, 06:39 »
0
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++
  1. while (c =='n');
  2.  

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
  1. void suma (int a, int b)
  2. {
  3.  printf("La suma es: %i",a+b);
  4. }
  5.  

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
  1. int suma (void)
  2. {
  3.  int a=1,b=2;
  4.  return a+b;
  5. }
  6.  

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

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
Re: Ejercicio con estructuras
« Respuesta #12 en: Viernes 24 de Abril de 2009, 07:03 »
0
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
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 1000
  5.  
  6.  
  7.  
  8. struct libreria
  9. {
  10.        char codigo[7];
  11.        char titulo[15];
  12.        char autor[25];
  13.        char editorial[15];
  14.        int existencia;
  15.        float precio;
  16. };
  17.  
  18. void carga_datos (struct libreria l[],int *cant)
  19. {
  20.      int i=*cant;
  21.      int c,j;
  22.      
  23.      do
  24.      {
  25.          
  26.          printf ("Ingrese Codigon");
  27.          scanf ("%s",&l[i].codigo);
  28.          fflush(stdin);
  29.          printf ("Ingrese Titulon");
  30.          gets(l[i].titulo);
  31.          
  32.          printf ("Ingrese Autorn");
  33.          gets(l[i].autor);
  34.          printf ("Ingrese Editorialn");
  35.          gets(l[i].editorial);
  36.          printf ("Ingrese stockn");
  37.          scanf ("%d",&l[i].existencia);
  38.          printf ("Ingrese precion");
  39.          scanf ("%f",&l[i].precio);
  40.          ++i;
  41.          printf ("finalizar? s/n n");
  42.          fflush(stdin);
  43.          c=getchar();
  44.          while ((c!='s') && (c!='n'))
  45.          {
  46.                fflush(stdin);
  47.                printf ("Ingrese S/nn");
  48.          c=getchar();
  49.          }
  50.          
  51.          
  52.          }while (c =='n');
  53.          *cant=i;
  54.          for (j=0;j<i;j++)
  55.          {
  56.          printf ("%sn",l[j].codigo);
  57.          printf ("%sn",l[j].titulo);
  58.          printf ("%sn",l[j].autor);
  59.          printf ("%sn",l[j].editorial);
  60.          printf ("%dn",l[j].existencia);
  61.          printf ("%fn",l[j].precio);
  62.          }
  63.          c=getchar();
  64.          c=getchar();
  65.          
  66. }
  67.        
  68. char* consultas (struct libreria l[],int cant)
  69. {
  70.       char tit[15],aut[25];
  71.       int i,ban;    
  72.       printf ("Ingrese Titulo y Autorn");
  73.       fflush(stdin);
  74.       gets(tit);
  75.       gets(aut);
  76.       for (i=0;i<cant;++i)
  77.       {
  78.           if ((strcmp(tit,l[i].titulo)==0) && (strcmp(aut,l[i].autor)==0))
  79.           {
  80.              if (l[i].existencia !=0)
  81.              {
  82.                 return "SIn";
  83.                 ban=1;
  84.              }
  85.           }
  86.       }
  87.       if (ban !=1)
  88.       return "STOCK AGOTADOn";
  89. }
  90.            
  91. void actualizar (struct libreria l[],char cod[],float nue_pre,int cant_lib)
  92. {
  93.      int i;
  94.      for (i=0;i<cant_lib;++i)
  95.      {
  96.          if ((strcmp(cod,l[i].codigo))==0)
  97.             l[i].precio=nue_pre;
  98.      }
  99. }
  100.            
  101.      
  102.        
  103.          
  104.      
  105.  
  106. main()
  107. {    
  108.       int c,cant_lib;
  109.       struct libreria libros[sub];
  110.       char *respuesta[14],cod[7];
  111.       float nue_pre;
  112.       cant_lib=0;
  113.      
  114.      
  115.       do
  116.       {
  117.       printf ("Elija Una Opcionn");
  118.       printf ("a) Carga datosn");
  119.       printf ("b) Consultasn");
  120.       printf ("c) Actualizarn");
  121.       printf ("d) Facturacionn");
  122.       printf ("e) Salirn");
  123.      
  124.      
  125.       c=getchar();
  126.       while ((c!='a')&&(c!='b')&&(c!='c')&&(c!='d')&&(c!='e'))
  127.       {
  128.             fflush(stdin);
  129.             printf ("OPCION INCORRECTA, INGRESE UNA OPCION VALIDAn");
  130.             c=getchar();
  131.             }
  132.            
  133.      
  134.      
  135.       switch (c)
  136.       {
  137.              case 'a':
  138.                   {  
  139.                   carga_datos(libros,&cant_lib);
  140.                  
  141.                   printf ("cantidad libros= %d",cant_lib);
  142.                  
  143.                   c=getchar();
  144.          c=getchar();
  145.                   }
  146.                   break;
  147.          
  148.             case 'b':
  149.                  {
  150.                      *respuesta=consultas(libros,cant_lib);
  151.                      printf ("%s",*respuesta);
  152.                      }
  153.                   break;
  154.            case 'c':
  155.                 {
  156.                     printf("Ingrese codigo de libron");
  157.                     scanf ("%s",cod);
  158.                     printf ("Ingrese nuevo precion");
  159.                     scanf ("%f",&nue_pre);
  160.                     actualizar (libros,cod,nue_pre,cant_lib);
  161.                     }
  162.                
  163.                  
  164.                  
  165.                   }
  166.                      
  167.       }while (c!='e');
  168. }  
  169.      
  170.  
  171.      
  172.  
  173.  

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Ejercicio con estructuras
« Respuesta #13 en: Viernes 24 de Abril de 2009, 15:45 »
0
Cuidado con esto

Código: C
  1. if (l[i].existencia !=0)
  2.              {
  3.                 return "SIn";
  4.                 ban=1;
  5.              }
  6.  

Si se llega a cumplir la condicion, se regresará a main pero ban jamas tendra el valor de 1. Intercambia el orden

Saludos