Foros del Web » Programación para mayores de 30 ;) » C/C++ »

struct dentro de un struct.

Estas en el tema de struct dentro de un struct. en el foro de C/C++ en Foros del Web. Hola de nuevo. Aquí vengo con una nueva duda sobre C, en este caso sobre estructuras. Alguien podría decirme en qué falla mi programa?. Muchas ...
  #1 (permalink)  
Antiguo 09/05/2006, 11:29
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
struct dentro de un struct.

Hola de nuevo. Aquí vengo con una nueva duda sobre C, en este caso sobre estructuras. Alguien podría decirme en qué falla mi programa?. Muchas gracias por su ayuda.

/*struct dentro de un struct.*/

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define N 100

typedef struct
{
int dia;
int mes;
int anyo;
}fnac;

typedef struct
{
char nombre[80];
char apellido[80];
struct fnac;
}tpersonas;


/*Prototipos de las funciones.*/

int numpersonas(void);
tpersonas* asignamemoria(int);
fnac* asignamemoria2(int);
int lee(tpersonas*,fnac*,int);
int menu();
int visualiza(tpersonas*,fnac*,int);
int liberamemoria(tpersonas*,fnac*);

/*Función main.*/

main()
{
int npersonas,op,i;
tpersonas *personas;
fnac *personass;
i=0;
while((op=menu())!=5)
{
switch(op)
{
case 1: numpersonas();
break;

case 2: personas=asignamemoria(npersonas);
if(personas==NULL) return -1;
personass=asignamemoria2(npersonas);
if(personass=NULL) return -1;
break;

case 3: while(i<npersonas)
{
i=lee(personas,personass,i);
}
break;

case 4: clrscr();
visualiza(personas,personass,npersonas);
break;

default: printf("\n Pulse 4 para salir.");
break;
}
}
liberamemoria(personas,personass);
printf("\n Fin de programa. Pulse cualquier tecla para finalizar.");
getch();
}

int menu()
{
int op;
do{
clrscr();
printf("\n\t\t 1.Introducir numero de personas.");
printf("\n\t\t 2.Asignar memoria.");
printf("\n\t\t 3.Entrada de datos.");
printf("\n\t\t 4.Visualizar datos.");
printf("\n\t\t 5.Salir.");
printf("\n\t Seleccion opcion: ");
scanf("%d",&op);
}while(op<1 || op>5);
return op;
}

int numpersonas(void)
{
int ok,np;
do{
clrscr();
printf("\n Introduce numero de personas: ");
ok=scanf("%d",&np);
} while((!ok) || (np<=0));
return np;
}

tpersonas * asignamemoria(int np)
{
tpersonas * q;
q=(tpersonas*)malloc(np*sizeof(tpersonas));
if(q==NULL) return NULL;
return q;
}

fnac * asignamemoria2(int np)
{
fnac * w;
w=(fnac*)malloc(np*sizeof(fnac));
if(w==NULL) return NULL;
return w;
}

int lee(tpersonas *p,fnac *f,int n) //n equivale a i en el main.. sirve para recorrer.
{
char sn[1];
do{
clrscr();
printf("\n Persona %d",n+1);
printf("\n Nombre: "); gets(p[n].nombre);
printf("\n Apellido: "); gets(p[n].apellido);
printf("\n Fecha nacimiento: ");
printf("\n\t Dia: "); scanf("%d",&f[n].dia);
printf("\n\t Mes: "); scanf("%d",&f[n].mes);
printf("\n\t Anyo: "); scanf("%d",&f[n].anyo);
printf("\n Datos correctos(s/n)? ");
scanf("%s",&sn[0]);
} while((sn[0]!='s') || (sn[0]!='S'));
return n+1;
}

int visualiza(tpersonas *p,fnac *f,int np)
{
int i;
for(i=0;i<np;i++)
{
clrscr();
printf("\n Persona %d",i+1);
printf("\n Nombre: "); puts(p[i].nombre);
printf("\n Apellido: "); puts(p[i].apellido);
printf("\n Fecha nacimiento: ");
printf("\n\t Dia: %d",f[i].dia);
printf("\n\t Mes: %d",f[i].mes);
printf("\n\t Anyo: %d",f[i].anyo);
getch();
}
return 0;
}

int liberamemoria(tpersonas *p,fnac *f)
{
free(p);
free(f);
return 0;
}

Última edición por yournightmare86; 09/05/2006 a las 12:42
  #2 (permalink)  
Antiguo 09/05/2006, 14:00
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Otra tentativa fallida ha sido...
/*struct dentro de un struct.*/

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define N 100

struct fnac
{
int dia;
int mes;
int anyo;
}

struct estruct_tpersonas
{
char nombre[80];
char apellido[80];
struct fnac;
}tpersonas;

/*Prototipos de las funciones.*/

int introducenumpersonas(void);
int menu(void);
tpersonas* asignamemoria(int);
struct fnac* asignamemoria2(int);
int lee(tpersonas*,struct fnac*,int);
int visualiza(tpersonas*,struct fnac*,int);
int liberamemoria(tpersonas*,struct fnac*);

main()
{
int npersonas,op,i=0;
tpersonas *personas;
struct fnac *personas2;
while((op=menu())!=5)
{
switch(op)
{
case 1: introducenumpersonas();
break;

case 2: personas=asignamemoria(npersonas);
if(personas==NULL) return -1;
personas2=asignamemoria2(npersonas);
if(personas2==NULL) return -1;
break;

case 3: while(i<npersonas)
{
i=lee(personas,personas2,i);
}
break;

case 4: clrscr();
visualiza(personas,personas2,npersonas);
break;
}
}
liberamemoria(personas,personas2);
getch();
}

int menu()
{
int op;
do{
printf("\n\t\t 1.Introducir numero de personas.");
printf("\n\t\t 2.Asignar memoria.");
printf("\n\t\t 3.Entrada de datos.");
printf("\n\t\t 4.Visualizar datos.");
printf("\n\t\t 5.Salir.");
printf("\n\t Seleccione opcion: ");
scanf("%d",&op);
}while(op<1 || op>5);
return op;
}

int numpersonas(void)
{
int ok,np;
do{
clrscr();
printf("\n Introduce numero de personas: ");
ok=scanf("%d",&np);
}while((!ok) || (np<=0));
return np;
}

tpersonas * asignamemoria(int np)
{
tpersonas * q;
q=(tpersonas*)malloc(np*sizeof(tpersonas));
if(q==NULL) return NULL;
return q;
}

struct fnac * asignamemoria2(int np)
{
struct fnac * w;
w=(struct fnac*)malloc(np*sizeof(struct fnac));
if(w==NULL) return NULL;
return w;
}

int lee(tpersonas *p,struct fnac *p2,int n) //n equivale al i del main
{
char sn[1];
do{
clrscr();
printf("\n Persona %d.",n+1);
printf("\n\t Nombre: "); gets(p[n].nombre);
printf("\n\t Apellido: "); gets(p[n].apellido);
printf("\n\t Fecha de nacimiento: ");
printf("\n\t\t Dia: "); scanf("%d",&p[n].p2[n].dia);
printf("\n\t\t Mes: "); scanf("%d",&p[n].p2[n].mes);
printf("\n\t\t Anyo: "); scanf("%d",&p[n].p2[n].anyo);
printf("\n Datos correctos(s/n)? ");
scanf("%s",&sn);
}while((sn[0]!='s') || (sn[0]!='S'));
return n+1;
}

int visualiza(tpersonas *p,struct fnac *p2,int np)
{
int i;
for(i=0;i<np;i++)
{
clrscr();
printf("\n Persona %d."i+1);
printf("\n Nombre: "); puts(p[i].nombre);
printf("\n Apellido: "); puts(p[i].apellido);
printf("\n Fecha de nacimiento: ");
printf("\n\t Dia: %d",p[i].p2[i].dia);
printf("\n\t Mes: %d",p[i].p2[i].mes);
printf("\n\t Anyo: %d",p[i].p2[i].anyo);
getch();
}
return 0;
}

int liberamemoria(tpersonas *p,struct fnac *p2)
{
free(p);
free(p2);
return 0;
}
  #3 (permalink)  
Antiguo 09/05/2006, 15:46
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 6 meses
Puntos: 52
Bueno, estas usando de manera erronea las estructuras.

Cuando declaras una estrctura, el nombre de arriba es el nombre de la estructura, y el nombre de abajo es solo cono si declararas una variable, y veo como en los prototipos de funcionjes usas la variable como tipo.....

struct fnac
{
int dia;
int mes;
int anyo;
}

struct estruct_tpersonas
{
char nombre[80];
char apellido[80];
struct fnac;
}tpersonas;

/*Prototipos de las funciones.*/

int introducenumpersonas(void);
int menu(void);
estruct_tpersonas* asignamemoria(int);
struct fnac* asignamemoria2(int);
int lee(estruct_tpersonas*,struct fnac*,int);
int visualiza(estruct_tpersonas*,struct fnac*,int);
int liberamemoria(estruct_tpersonas*,struct fnac*);

Algo asi seria lo correcto. Porque tpersonas seria solo una variable del tipo estruct_tpersonas.

Saludos
  #4 (permalink)  
Antiguo 10/05/2006, 01:49
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
en cuanto a las estructuras anidadas, las estas declarando muy bien ya que esta usando typedef, esto es creas tipo de los cuales puedes crear variables estructura sin usar struct.(en C).

tu error es en la declaracion del 3er campo de la estructura tpersonas.

si usas C el primer ejemplo es correcto e ideal. pero es mejor hacer:

typedef struct
{
char nombre[80];
char apellido[80];
fnac fecha;
}tpersonas;


te paso el codigo con unas correcciones comentadas:
espero te ayude:

#include<stdio.h>
//#include<conio.h> //Es mejor no usarlo
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define N 100

typedef struct
{
int dia;
int mes;
int anyo;
}fnac;

typedef struct
{
char nombre[80];
char apellido[80];
fnac fecha;
}tpersonas;


/*Prototipos de las funciones.*/

int numpersonas(void);
tpersonas* asignamemoria(int);
//fnac* asignamemoria2(int);
void lee(tpersonas*,int);
int menu();
int visualiza(tpersonas*,int);
int liberamemoria(tpersonas*);

/*Función main.*/

int main()
{
int npersonas;
int op;
int i;
tpersonas *personas;
//fnac *personass;// personas ya contiene una estructura fecha............de Nivel7
i=0;
while((op=menu())!=5)
{
switch(op)
{
case 1: //Es mejor dejar libre los case......de Nivel7
npersonas = numpersonas();// En tu codigo olvidas hacer la asignacion.....de Nivel7
break;
case 2:
personas=asignamemoria(npersonas);
if(personas==NULL) return -1;
//personass=asignamemoria2(npersonas); //No se utiliza........de Nivel7
//if(personass=NULL) return -1;
break;

case 3:
lee(personas,npersonas); //Es mejor que la funcion lee se encarge de su cuenta....Nivel7
break;

case 4:
system("cls");// Sustitui el clrscr()......de Nivel7
visualiza(personas,npersonas);
break;

default: printf("\n Pulse 4 para salir.");
break;
}
}
liberamemoria(personas);
printf("\n Fin de programa. Pulse cualquier tecla para finalizar.");
fflush(stdin);
getchar(); //Para no usar conio.h mejor usa esta que es estandar................De Nivel7
}

int menu()
{
int op;
do{
system("cls");
printf("\n\t\t 1.Introducir numero de personas.");
printf("\n\t\t 2.Asignar memoria.");
printf("\n\t\t 3.Entrada de datos.");
printf("\n\t\t 4.Visualizar datos.");
printf("\n\t\t 5.Salir.");
printf("\n\t Seleccion opcion: ");
scanf("%d",&op);
}while(op<1 || op>5);
return op;
}

int numpersonas(void)
{
int ok;
int np;
do{
system("cls");
printf("\n Introduce numero de personas: ");
ok = scanf("%d",&np);
} while((!ok) || (np<=0));
return np;
}

tpersonas * asignamemoria(int np)
{
tpersonas * q;
q=(tpersonas*)malloc(np*sizeof(tpersonas));
if(q==NULL) return NULL;// Esto es redundante..........de Nivel7
return q;
}
/*
fnac * asignamemoria2(int np)
{
fnac * w;
w=(fnac*)malloc(np*sizeof(fnac));
if(w==NULL) return NULL;// Esto es redundante..........de Nivel7
return w;
}
*/
void lee(tpersonas *p,int n) //n equivale a i en el main.. sirve para recorrer.
{
char sn;//Si solo es un caracter es mejor usar char sn................de Nivel7
int i = 0;
while(i < n)// No es bueno delegar tareas entre dos bloques. whiel-funcion.....Nivel7
{
do{
system("cls");
printf("\n Persona %d",i+1);
printf("\n Nombre: "); scanf("%s", p[i].nombre);
printf("\n Apellido: ");scanf("%s",p[i].apellido);
printf("\n Fecha nacimiento: ");
printf("\n\t Dia: "); scanf("%d", &p[i].fecha.dia);// Recuerda que tpersonas ya tienen una estructura fnac
printf("\n\t Mes: "); scanf("%d", &p[i].fecha.mes);
printf("\n\t Anyo: "); scanf("%d", &p[i].fecha.anyo);
fflush(stdin);
printf("\n Datos correctos(s/n)? ");
scanf("%c",&sn);
} while((sn =='n') || (sn =='N'));//puedes precionar cualquier tecla en caso de estar seguro.....Nivel7
i++;
}
}

int visualiza(tpersonas *p,int np)
{
int i;
for(i=0;i<np;i++)
{
system("cls");
printf("\n Persona %d",i+1);
printf("\n Nombre: "); puts(p[i].nombre);
printf("\n Apellido: "); puts(p[i].apellido);
printf("\n Fecha nacimiento: ");
printf("\n\t Dia: %d",p[i].fecha.dia);
printf("\n\t Mes: %d",p[i].fecha.mes);
printf("\n\t Anyo: %d",p[i].fecha.anyo);
fflush(stdin);
getchar();
}
return 0;
}

int liberamemoria(tpersonas *p)
{
free(p);
//free(f);//No se utilizo
return 0;
}
  #5 (permalink)  
Antiguo 10/05/2006, 11:46
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 6 meses
Puntos: 52
No habia visto el typedef......
Saludos
  #6 (permalink)  
Antiguo 10/05/2006, 14:25
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Muchas gracias por vuestra ayuda. Ya se que revisar todo ese código es una tarea tediosa pero creo que ya lo tengo claro. Tenía algunas lagunas de conceptos...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:23.