31 - Estructura de datos tipo registro (con campos int, float, vector, registros anidados etc.)


Hemos visto ya varias estructuras de datos fundamentales en el lenguaje C:

vectores

matrices

registros

También hemos visto que podemos definir vectores y matrices cuyos elementos sean de tipo registro.

En este concepto veremos que los campos de un registro pueden ser también de tipo registro, es decir anidar un registro dentro de otro registro.

Problema 1:

Se tienen las siguientes declaraciones de registros:

struct fecha {
    int dd;
    int mm;
    int aa;
};

struct producto {
    int codigo;
    char descripcion[41];
    float precio;
    struct fecha fechavencimiento;
}; 

Definir un vector de 3 elementos de tipo producto, realizar su carga e impresión.

Programa: programa139.c

Ver video

#include<stdio.h>
#include<conio.h>

#define TAMANO 3

struct fecha {
    int dd;
    int mm;
    int aa;
};

struct producto {
    int codigo;
    char descripcion[41];
    float precio;
    struct fecha fechavencimiento;
};

void cargar(struct producto vec[TAMANO])
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("Ingrese codigo del producto:");
        scanf("%i",&vec[f].codigo);
        fflush(stdin);
        printf("Ingrese descripcion:");
        gets(vec[f].descripcion);
        printf("Ingrese precio:");
        scanf("%f",&vec[f].precio);
        printf("Fecha de vencimiento.\n");
        printf("Dia:");
        scanf("%i",&vec[f].fechavencimiento.dd);
        printf("Mes:");
        scanf("%i",&vec[f].fechavencimiento.mm);
        printf("Año:");
        scanf("%i",&vec[f].fechavencimiento.aa);
    }
}

void imprimir(struct producto vec[TAMANO])
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("%i %s %0.2f %i/%i/%i\n",vec[f].codigo, vec[f].descripcion, vec[f].precio,
               vec[f].fechavencimiento.dd, vec[f].fechavencimiento.mm, vec[f].fechavencimiento.aa);
    }
}


int main()
{
    struct producto vec[TAMANO];
    cargar(vec);
    imprimir(vec);
    getch();
    return 0;
}

En este problema declaramos dos registros, el orden en que se los declara es importante en el lenguaje C, primero debemos declarar el struct fecha ya que el struct producto tiene un campo de tipo fecha:

struct fecha {
    int dd;
    int mm;
    int aa;
};

struct producto {
    int codigo;
    char descripcion[41];
    float precio;
    struct fecha fechavencimiento;
}; 

Si los declaramos al revés aparecerá un error sintáctico.

Cuando definimos un campo de un registro que es de otro tipo de dato registro debemos anteceder la palabra clave struct y el nombre de tipo registro:

    struct fecha fechavencimiento;

Cuando procedemos a cargar el vector y como sabemos cada campo de cada registro debe cargarse por separado:

void cargar(struct producto vec[TAMANO])
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("Ingrese codigo del producto:");
        scanf("%i",&vec[f].codigo);
        fflush(stdin);
        printf("Ingrese descripcion:");
        gets(vec[f].descripcion);
        printf("Ingrese precio:");
        scanf("%f",&vec[f].precio);
        printf("Fecha de vencimiento.\n");
        printf("Dia:");
        scanf("%i",&vec[f].fechavencimiento.dd);
        printf("Mes:");
        scanf("%i",&vec[f].fechavencimiento.mm);
        printf("Año:");
        scanf("%i",&vec[f].fechavencimiento.aa);
    }
}

Como vemos cuando cargamos el campo fechavencimiento que es un campo del struct producto debemos hacerlo también campo a campo:

        scanf("%i",&vec[f].fechavencimiento.dd);
        printf("Mes:");
        scanf("%i",&vec[f].fechavencimiento.mm);
        printf("Año:");
        scanf("%i",&vec[f].fechavencimiento.aa);

En la función main definimos un vector con componentes de tipo producto, en ningún momento definimos un vector o registro de tipo fecha:

int main()
{
    struct producto vec[TAMANO];
    cargar(vec);
    imprimir(vec);
    getch();
    return 0;
}

Lo mismo para imprimir todos los datos de los productos e inclusive el día, mes y año de vencimiento de cada producto debemos indicarlos uno por uno:

void imprimir(struct producto vec[TAMANO])
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("%i %s %0.2f %i/%i/%i\n",vec[f].codigo, vec[f].descripcion, vec[f].precio,
               vec[f].fechavencimiento.dd, vec[f].fechavencimiento.mm, vec[f].fechavencimiento.aa);
    }
}

Problema propuesto

Solución
programa140.c

#include<stdio.h>
#include<conio.h>

struct punto {
    int x;
    int y;
};

struct triangulo {
    struct punto punto1;
    struct punto punto2;
    struct punto punto3;
};


struct triangulo cargar()
{
    struct triangulo triangulo1;
    triangulo1.punto1.x=10;
    triangulo1.punto1.y=10;
    triangulo1.punto2.x=20;
    triangulo1.punto2.y=20;
    triangulo1.punto3.x=0;
    triangulo1.punto3.y=20;
    return triangulo1;
};

void imprimir(struct triangulo tri)
{
    printf("Coordeandas de los vertices de un triangulo.\n");
    printf("Punto1 coordenada(%i,%i)\n",tri.punto1.x, tri.punto1.y);
    printf("Punto2 coordenada(%i,%i)\n",tri.punto2.x, tri.punto2.y);
    printf("Punto3 coordenada(%i,%i)\n",tri.punto3.x, tri.punto3.y);
}


int main()
{
    struct triangulo triangulo1;
    triangulo1=cargar();
    imprimir(triangulo1);
    getch();
    return 0;
}

Retornar