Ver Mensaje Individual
  #4 (permalink)  
Antiguo 10/05/2006, 01:49
Nivel7
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
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;
}