• Jueves 28 de Marzo de 2024, 19:23

Autor Tema:  Funcion Alta, estructuras.  (Leído 2610 veces)

nicksynm

  • Visitante
Funcion Alta, estructuras.
« en: Viernes 25 de Septiembre de 2009, 20:58 »
0
Holas,

Quise hacer una funcion alta para ingresar datos en el vector de estruturas pero no funciona, cuando uso la opcion 1 se va todo al ca-ra-jo. Y me quema la cabeza no saber que esta mal.

Pd: El programa no esta completo, si se finjan en el menu voy a extenderlo.






#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
#define MAX 100
#define CANT 1000

typedef struct {
   char nyap [MAX];
   int doc;
   struct {
      int dia;
      int mes;
      int anio;
   }fecha;
}treg;

int menu();
void opcion(int opc,int cant,treg agenda, FILE *arch);
void alta (treg agenda,int cant);
int main (){
   FILE *arch;
   treg agenda[CANT];
   int opc=0, cant=0;
   opc=menu(void);
   opcion(opc,cant,agenda[CANT],arch);
   return 0;
}
int menu (){
   int op;
   printf("nnn1- Alta personasn2- Baja personasn3- Verificar si el primer nombre es capicuan4- Imprimir datos personan5- Guardar persona en un archivon6- Modificar personan7- Ordenar por Apellidon8- SalirnnElija la Opcion desada:n");
   scanf("%d",&op);
   
   return op;

}
void opcion(int opc,int cant,treg agenda, FILE *arch){
   while(opc!=8){
      if(opc==1){
         alta(agenda,cant);
      }

          opc=menu();
   }
   




}
void alta (treg agenda, int cant){
   int i;
   while(cant<CANT || i!=-1){
      puts("Nombre y Apellido:n");
      gets(agenda.nyap);
      printf("Numero de documento:n");
      scanf("%d",agenda.doc);
      printf("Fecha de Nacimiento:n");
      printf("dia:n");
      scanf("%d",agenda.fecha.dia);
      printf("mes:n");
      scanf("%d",agenda.fecha.mes);
      printf("anio:n");
      scanf("%d",agenda.fecha.anio);

      printf("Presione  1 para continuar, o -1 para finalizarn");
      scanf("%d",&i);
      cant=cant+1;

   }

}

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Funcion Alta, estructuras.
« Respuesta #1 en: Sábado 26 de Septiembre de 2009, 18:47 »
0
Varias cosas

1) Defines
Código: C
  1. int menu();
  2.  
e invocas
Código: C
  1. opc=menu(void);
  2.  
Ese void sobra
2)En cuanto a tu funcion Opcion y el manejo de estructuras anidadas

Tu dices

Código: C
  1.  
  2.  
  3. void opcion(int opc,int cant,treg agenda, FILE *arch);
  4.  
  5. int main ()
  6. {
  7.     FILE *arch;
  8.     treg agenda[CANT];
  9.     int opc=0, cant=0;
  10.     opc=menu();
  11.     opcion(opc,cant,agenda[CANT],arch);
  12.     return 0;
  13. }
  14.  

tu estas aclarando que la variable principal del anidamiento de estructuras es agenda[cant] y luego invocas a opcion.
Aca tienes un primer error. Tu no puedes pasar un arreglo de estructuras atraves de una funcion de esa forma. Necesitas valerte de punteros.

Tu funcion podrias definirla asi

Código: C
  1. void opcion(int opc,int cant,treg *agenda, FILE *arch);
  2.  

Y al invocar puedes hacer

Código: C
  1. opcion(opc,cant,&agenda[0],arch); ó opcion(opc,cant,agenda,arch);
  2.  
, da igual

3) Para el caso de la funcion alta pasa algo similar

Pero ya que estas trabajando con funciones anidades (desde opcion invocas a alta), aca tendras que redefinir tu funcion usando ahora otro puntero, pero esta ves doble.

Tu funcion podrias definirla asi

Código: C
  1. void alta (treg **agenda,int cant);
  2.  

E invocarla asi

Código: C
  1. alta(&agenda,cant);
  2.  

Y para capturar los datos puedes manipular este puntero doble como una simple matriz...en donde la fila 0 corresponde a toda la informacion de las estructuras anidadas y cada columna el indice de agenda, que asumo para eso usas la variable cant

Puedes entonces capturar tus datos asi:

En el caso de los campos de la estructura principal

Código: C
  1. puts("Nombre y Apellido:n");
  2.          gets(agenda[0][cant].nyap);
  3.  

Y en el caso de os campos de la estructura anidada haces

Código: C
  1. printf("dia:n");
  2.          scanf("%d",&agenda[0][cant].fecha.dia);
  3.  

Cuidado al capturar datos...debes tener presente el simbolo & cada que captures datos diferentes a cadenas de caracteres. Ese era otro error.

Realizando estas correcciones el codigo seria el siguiente

Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 100
  4. #define CANT 1000
  5.  
  6. typedef struct
  7. {
  8.     char nyap [MAX];
  9.     int doc;
  10.     struct
  11.     {
  12.            int dia;
  13.            int mes;
  14.            int anio;
  15.     }fecha;
  16. }treg;
  17.  
  18. int menu();
  19. void opcion(int opc,int cant,treg *agenda, FILE *arch);
  20. void alta (treg **agenda,int cant);
  21. int main ()
  22. {
  23.     FILE *arch;
  24.     treg agenda[CANT];
  25.     int opc=0, cant=0;
  26.     opc=menu();
  27.     opcion(opc,cant,agenda,arch);
  28.     return 0;
  29. }
  30. int menu ()
  31. {
  32.     int op;
  33.     printf("nnn1- Alta personasn2- Baja personasn3- Verificar si el primer nombre es capicuan4- Imprimir datos personan5- Guardar persona en un archivon6- Modificar personan7- Ordenar por Apellidon8- SalirnnElija la Opcion desada:n");
  34.     scanf("%d",&op);
  35.     return op;
  36.  
  37. }
  38. void opcion(int opc,int cant,treg *agenda, FILE *arch)
  39. {
  40.      while(opc!=8)
  41.      {
  42.         if(opc==1)
  43.         {
  44.            alta(&agenda,cant);
  45.         }
  46.         opc=menu();
  47.      }
  48. }
  49.  
  50. void alta (treg **agenda, int cant)
  51. {
  52.      int i;
  53.      while(cant<CANT || i!=-1)
  54.      {
  55.          puts("Nombre y Apellido:n");
  56.          gets(agenda[0][cant].nyap);
  57.          printf("Numero de documento:n");
  58.          scanf("%d",&agenda[0][cant].doc);
  59.          printf("Fecha de Nacimiento:n");
  60.          printf("dia:n");
  61.          scanf("%d",&agenda[0][cant].fecha.dia);
  62.          printf("mes:n");
  63.          scanf("%d",&agenda[0][cant].fecha.mes);
  64.          printf("anio:n");
  65.          scanf("%d",&agenda[0][cant].fecha.anio);
  66.          printf("Presione 1 para continuar, o -1 para finalizarn");
  67.          scanf("%d",&i);
  68.          cant=cant+1;
  69.      }
  70. }
  71.  
  72.  

Con esto compila perfectamente...la logica del codigo te la dejo a vos

S2

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Funcion Alta, estructuras.
« Respuesta #2 en: Sábado 26 de Septiembre de 2009, 18:56 »
0
Se me pasó otra cosa....cuidado con el uso de gets y el manejo del buffer de entrada de datos. Al realizar la captura de datos en la funcion Alta quiza necesites un getchar antes de capturar el nombre y el apellido....esto con el fin de liberar el buffer y no se te salte el codigo a solicitarte el documento

S2

Luciano9

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Funcion Alta, estructuras.
« Respuesta #3 en: Sábado 26 de Septiembre de 2009, 18:57 »
0
Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3. #pragma warning (disable:4996)
  4. #define MAX 100
  5. #define CANT 1000
  6.  
  7.  
  8. typedef struct treg{
  9. int dia;
  10. int mes;
  11. int anio;
  12. char nyap [MAX];
  13. int doc;
  14.  
  15. };
  16.  
  17. int menu();
  18. void opcion(int opc,int cant,treg agenda, FILE *arch);
  19. void alta (treg agenda,int cant);
  20.  
  21. int main (){
  22. FILE *arch;
  23. treg agenda[5];
  24. int opc=0, cant=0;
  25.  
  26.     opc=menu();
  27.     opcion(opc,cant,agenda[CANT],arch);
  28.     return 0;
  29. }
  30.  
  31. int menu (){
  32. int op;
  33.     printf("nnn1- Alta personasn2- Baja personasn3- Verificar si el primer nombre es capicuan4- Imprimir datos personan5- Guardar persona en un archivon6- Modificar personan7- Ordenar por Apellidon8- SalirnnElija la Opcion desada:n");
  34.     scanf("%d",&op);
  35.     return op;
  36. }
  37.  
  38. void opcion(int op,int cant,treg agenda, FILE *arch){
  39.     while(op!=8){
  40.         if(op==1){
  41.         alta(agenda,cant);
  42.     }
  43. op=menu();
  44. }
  45.  
  46.  
  47.  
  48.  
  49.  
  50. }
  51. void alta (treg agenda, int cant){
  52. int i;
  53.     while(cant<CANT || i!=-1){
  54.     puts("Nombre y Apellido:n");
  55.     gets(agenda.nyap);
  56.     printf("Numero de documento:n");
  57.     scanf("%d",agenda.doc);
  58.     printf("Fecha de Nacimiento:n");
  59.     printf("dia:n");
  60.     scanf("%d",agenda.dia);
  61.     printf("mes:n");
  62.     scanf("%d",agenda.mes);
  63.     printf("anio:n");
  64.     scanf("%d",agenda.anio);
  65.  
  66.     printf("Presione 1 para continuar, o -1 para finalizarn");
  67.     scanf("%d",&i);
  68.     cant=cant+1;
  69.     }
  70.  
  71. }
  72.  
Si te fijas, ahí compila... pero de todas formas la lógica no está funcionando muy bien que digamos.
No entiendo muy bien tu programa y no tengo mucho tiempo ahora, pero te doy un consejo. Identá bien las cosas y comentá un poco que hacen tus funciones ya que sino hay que ser un dios para entender lo que vos quisiste pensar!

Saludos espero que te sirva, ahora fijate como arreglarlo :P

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Funcion Alta, estructuras.
« Respuesta #4 en: Sábado 26 de Septiembre de 2009, 19:03 »
0
Cita de: "Luciano9"
Si te fijas, ahí compila... pero de todas formas la lógica no está funcionando muy bien que digamos.
No entiendo muy bien tu programa y no tengo mucho tiempo ahora, pero te doy un consejo. Identá bien las cosas y comentá un poco que hacen tus funciones ya que sino hay que ser un dios para entender lo que vos quisiste pensar!

Saludos espero que te sirva, ahora fijate como arreglarlo :P

Creo que no leiste nada de lo que puse antes, jejeje....yo creo que si esta claro lo que quiere hacer...quiza lo que hace cansino el codigo es el uso de tantas funciones para algo que no da pa tanto y el hecho de que dentro de funciones llame a otras

S2

Luciano9

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Funcion Alta, estructuras.
« Respuesta #5 en: Sábado 26 de Septiembre de 2009, 19:14 »
0
se, postie y no vi nada JEJEJ....

nicksynm

  • Visitante
Re: Funcion Alta, estructuras.
« Respuesta #6 en: Sábado 26 de Septiembre de 2009, 19:17 »
0
Gracias Betopin,

La verdad que al codigo lo tenia mas completo y con cada funcion explicada, pero como no me funcionaba la funcion alta lo rehice rapidamente solo hasta ahi. Estaba seguro que por usar tantas funciones adentro de otras necesitaba punteros, pero como no se usarlos muy bien quise intentarlo si ellos. Seguramente eso era mi mayor error, por que tampoco lo podía corregir con el debugger ya que se me cerraba el programa.

nicksynm

  • Visitante
Re: Funcion Alta, estructuras.
« Respuesta #7 en: Jueves 1 de Octubre de 2009, 16:01 »
0
le hice un par de modificaciones y por alguna razon el contador (cont) de la funcion alta no cuenta. Por lo tanto cando utilizo la funcion imprimir solo imprimer lo que esta en la posicion 0:



#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
#define MAX 100
#define CANT 1000
   
   typedef struct {
    char nyap [MAX];
        int doc;
      int posicion;
       struct
       {
              int dia;
             
      }fecha;
   }treg;
   
   int menu();
   void alta (treg agenda[CANT],int cont);
   void imprimir (treg agenda[CANT], int cont);
   int main ()
   {
       FILE *arch;
       treg agenda[CANT];
       int opc=0, cont=0;
       opc=menu();
      while(opc!=5){
       
           if(opc==1)
           {
              alta(&agenda[cont],cont);
           }
         if(opc==3)
         {
            imprimir(&agenda[cont],cont);
         }
           opc=menu();
        }
       return 0;
   }
   int menu ()
   {
       int op;
       printf("nnn1- Alta personasn2- Baja personasn3- Imprimir datos personan4- Guardar persona en un archivon5- SalirnnElija la Opcion desada:n");
       scanf("%d",&op);
       return op;
   
   }
 
   
   void alta (treg agenda[CANT], int cont)
   {
        int i=0;
        while(cont<CANT && i!=2)
        {
            printf("Nombre y Apellido:n");
            scanf("%s", &agenda[cont].nyap);
            printf("Numero de documento:n");
            scanf("%d",&agenda[cont].doc);
         agenda[cont].posicion=cont;
            printf("Fecha de Nacimiento:n");
            printf("dia:n");
            scanf("%d",&agenda[cont].fecha.dia);
            printf("Presione 1 para continuar, o 2 para finalizarn");
            scanf("%d",&i);
            cont++;
        }
   }
   void imprimir (treg agenda[CANT], int cont){
      int k=0;
      cont;
      while(k<=cont){
         printf("Nombre:%snDocumento:%dnPosicion:%dnFecha:%dn",agenda[k].nyap,agenda[k].doc,agenda[k].posicion,agenda[k].fecha);
         k=k+1;
      }
   }

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Funcion Alta, estructuras.
« Respuesta #8 en: Jueves 1 de Octubre de 2009, 17:14 »
0
¿Por qué no usas las etiquetas de código?  &lt;_&lt;

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Funcion Alta, estructuras.
« Respuesta #9 en: Jueves 1 de Octubre de 2009, 17:23 »
0
Hay dos razones

1) La varible cont es local y no global por ende cada valor que posea esta variable muere al ejecutarse la totalidad de cada funcion

2) Las funciones donde interviene esta variable son tipo void....es decir, no devuelven nada, creeria que la funcion Alta deberia ser tipo int y retornar cont para asi pasar este valor a la funcion de imprimir

S2

Luciano9

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Funcion Alta, estructuras.
« Respuesta #10 en: Jueves 1 de Octubre de 2009, 17:36 »
0
Me maree, qué tiene que ver eso con las etiquetas de código?

:

nicksynm

  • Visitante
Re: Funcion Alta, estructuras.
« Respuesta #11 en: Jueves 15 de Octubre de 2009, 23:10 »
0
Les agradezco a todo, ya lo pude terminar. Pueden cerrar el tema nomas.

Saludos