Struct in C. Database

1

I have to make a database for the university in C.

struct fecha
{
    int dia;
    int mes;
    int anio;
}; 

typedef struct 
{
    char nombreAsignatura[MAX];
    int creditos;
    float nota;
}registroAsignaturas;

struct registroAlumnos {
    char dni[MAX];
    char nombre[MAX];
    char primerApellido[MAX],
        segundoApellido[MAX];
    struct fecha fechaNacimiento;
    struct registroAsignaturas **listaAsignaturas;
    int numAsignaturas;
} ;
struct registroAlumnos *listaAlumnos[100];

The question is, I have to do a malloc variable dimension in listaAsignaturas , but I do not know how to access it. I do not know if it is listaAlumnos[i].listaAsignaturas[j].nombreAsignatura , being j the number of the subject or otherwise.

I leave the whole code as I take it:

struct fecha
{
    int dia;
    int mes;
    int anio;
}; 

typedef struct 
{
    char nombreAsignatura[MAX];
    int creditos;
    float nota;
}registroAsignaturas;

struct registroAlumnos {
    char dni[MAX];
    char nombre[MAX];
    char primerApellido[MAX],
        segundoApellido[MAX];
    struct fecha fechaNacimiento;
    struct registroAsignaturas **listaAsignaturas;
    int numAsignaturas;
} ;
struct registroAlumnos *listaAlumnos[100];

int cargar_datos(struct registroAlumnos listaAlumnos[], int i) {
    char seguir = 'y';
    int  tamanio, j, flagInit = 0;
    float nota;
    printf("Nombre: "); scanf("%s", &listaAlumnos[i].nombre);
    getchar();
    printf("PrimerApellido: "); scanf("%s", &listaAlumnos[i].primerApellido);
    getchar();
    printf("SegundoApellido: "); scanf("%s", &listaAlumnos[i].segundoApellido);
    getchar();
    printf("Fecha: "); scanf("%02d %02d %d", &listaAlumnos[i].fechaNacimiento.dia, &listaAlumnos[i].fechaNacimiento.mes, &listaAlumnos[i].fechaNacimiento.anio);
    getchar();
    printf("Tamanio: "); scanf("%d", &tamanio);
    registroAsignaturas *listaAsignaturas = (registroAsignaturas **)malloc(tamanio * sizeof(registroAsignaturas*));
    for (j = 0; j < tamanio; j++) {
        getchar();
        scanf("%s %d %.2f", &listaAsignaturas[j].nombreAsignatura, &listaAsignaturas[j].creditos, &listaAsignaturas[j].nota);
    }
}
void imprimirDatos(struct registroAlumnos listaAlumnos[], int numeroAlumnos) {
    int i, j;
    for (i = 0; i < numeroAlumnos && i < 100; i++) {
        printf("%s %s %s %02d/%02d/%d\n", listaAlumnos[i].nombre, listaAlumnos[i].primerApellido, listaAlumnos[i].segundoApellido, listaAlumnos[i].fechaNacimiento.dia, listaAlumnos[i].fechaNacimiento.mes, listaAlumnos[i].fechaNacimiento.anio);
        /*
        for (j = 0; j < sizeof(listaAlumnos[i].listaAsignaturas); j++) {
            printf("%s %d %.2f\n", listaAlumnos[i].listaAsignaturas.nombreAsignatura, listaAlumnos[i].listaAsignaturas.credito, listaAlumnos[i].listaAsignaturas[j].notas);
        }*/
        printf("%d", sizeof(listaAlumnos[i].listaAsignaturas));
    }
}


int main() {
    char seguir = 'Y';
    int i, cantAsignaturas = 0;
    for (i = 0; i < 100 && seguir == 'Y' || seguir == 'y'; i++) {
        cargar_datos(&listaAlumnos, i);
        printf("Continuar (S/N)?\n");
        getchar();
        scanf("%c", &seguir);
    }
    imprimirDatos(&listaAlumnos, i);
    return 0;
}
    
asked by De2 18.12.2016 в 21:14
source

2 answers

0

You can improve several things in your code:

  • struct registroAsignaturas **listaAsignaturas you must change it to registroAsignaturas *listaAsignaturas since it declares registroAsignaturas you used typedef , I also understand that in variable you want to place a list of subjects so only the pointer to this structure is necessary.
  • Because of the above you should separate memory for that variable because you should use:

     lista[i].listaAsignaturas = (registroAsignaturas *)malloc(tamanio*sizeof(registroAsignaturas));
    
  • In the variable numAsignaturas you must put the number of subjects, never use sizeof to get the size of an array you could get incorrect values.

This is my solution:

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

struct fecha
{
    int dia;
    int mes;
    int anio;
};

typedef struct
{
    char nombreAsignatura[MAX];
    int creditos;
    float nota;
}registroAsignaturas;

struct registroAlumnos {
    char dni[MAX];
    char nombre[MAX];
    char primerApellido[MAX];
    char segundoApellido[MAX];
    struct fecha fechaNacimiento;
    registroAsignaturas *listaAsignaturas;
    int numAsignaturas;
} ;


struct registroAlumnos listaAlumnos[100];

int cargar_datos(struct registroAlumnos lista[], int i) {
    int  tamanio, j;
    printf("Nombre: ");
    scanf("%s", lista[i].nombre);
    getchar();
    printf("PrimerApellido: ");
    scanf("%s", lista[i].primerApellido);
    getchar();
    printf("SegundoApellido: ");
    scanf("%s", lista[i].segundoApellido);
    getchar();
    printf("Fecha: ");
    scanf("%d %d %d", &(lista[i].fechaNacimiento.dia),
          &(lista[i].fechaNacimiento.mes),
          &(lista[i].fechaNacimiento.anio));
    getchar();
    printf("Tamanio: ");
    scanf("%d", &tamanio);
    lista[i].numAsignaturas = tamanio;
    lista[i].listaAsignaturas = (registroAsignaturas *)malloc(tamanio*sizeof(registroAsignaturas));
    for (j = 0; j < tamanio; j++) {
        getchar();
        printf("Ingrese la asignatura %d\n", j);
        scanf("%s %d %f", lista[i].listaAsignaturas[j].nombreAsignatura,
              &(lista[i].listaAsignaturas[j].creditos),
              &(lista[i].listaAsignaturas[j].nota));
    }

    return 0;
}

void imprimirDatos(struct registroAlumnos lista[], int numeroAlumnos) {
    int i, j, tamanio;
    for (i = 0; i < numeroAlumnos; i++) {
        printf("%s %s %s %02d/%02d/%d\n", lista[i].nombre,
               lista[i].primerApellido, lista[i].segundoApellido,
               lista[i].fechaNacimiento.dia,
               lista[i].fechaNacimiento.mes,
               lista[i].fechaNacimiento.anio);
        tamanio = lista[i].numAsignaturas;
        for(j = 0; j < tamanio; j++){
            printf("%s %d %.2f\n", lista[i].listaAsignaturas[j].nombreAsignatura,
                   listaAlumnos[i].listaAsignaturas[j].creditos,
                   listaAlumnos[i].listaAsignaturas[j].nota);
        }
    }
}


int main() {
    char seguir = 'Y';
    int i;
    while (i < 100) {
        cargar_datos(listaAlumnos, i);
        i++;
        printf("Continuar (S/N)?\n");
        getchar();
        scanf("%c", &seguir);
        if (seguir != 'Y' || seguir != 'y')
            break;
    }
    imprimirDatos(listaAlumnos, i);
    return 0;
}

Exit:

Nombre: luis
PrimerApellido: perez
SegundoApellido: perez
Fecha: 10 10 10
Tamanio: 2      
Ingrese la asignatura 0
matematica 5 12
Ingrese la asignatura 1
lenguaje 4 11
Continuar (S/N)?
N
luis perez perez 10/10/10
matematica 5 12.00
lenguaje 4 11.00
    
answered by 18.12.2016 в 23:45
0

I have already solved the problem, thanks for the contribution. I have applied an improvement that allows students to look for the DNI and print the average note in addition to the note and credits. I hope you find it useful. Greetings

struct fecha
{
    int dia;
    int mes;
    int anio;
}; 

    struct registroAsignaturas
    {
        char nombreAsignatura[MAX];
        int creditos;
        float nota;
    };

    struct registroAlumnos {
        char dni[10];
        char nombre[MAX];
        char primerApellido[MAX],
            segundoApellido[MAX];
        int numAsignaturas;
        struct fecha fechaNacimiento;
        struct registroAsignaturas *listaAsignaturas;
    } ;

    void cargar_datos(struct registroAlumnos listaAlumnos[], int i) {
        char seguir = 'y';
        int  j;
        float nota;
        scanf("%s %s %s %s %02d %02d %d %d", listaAlumnos[i].dni, listaAlumnos[i].nombre, listaAlumnos[i].primerApellido, listaAlumnos[i].segundoApellido, &listaAlumnos[i].fechaNacimiento.dia, &listaAlumnos[i].fechaNacimiento.mes, &listaAlumnos[i].fechaNacimiento.anio, &listaAlumnos[i].numAsignaturas);
        getchar();
        listaAlumnos[i].listaAsignaturas = (struct registroAsignaturas*)malloc(listaAlumnos[i].numAsignaturas * sizeof(struct registroAsignaturas));
        for (j = 0; j < listaAlumnos[i].numAsignaturas; j++) {
            scanf("%s %d %f", listaAlumnos[i].listaAsignaturas[j].nombreAsignatura, &listaAlumnos[i].listaAsignaturas[j].creditos, &listaAlumnos[i].listaAsignaturas[j].nota);
            getchar();
        }
    }
    void imprimirDatos(struct registroAlumnos listaAlumnos[], int numeroAlumnos) {
        int j;
        float media = 0;
            printf("%s %s %s %02d/%02d/%d\n", listaAlumnos[numeroAlumnos].nombre, listaAlumnos[numeroAlumnos].primerApellido, listaAlumnos[numeroAlumnos].segundoApellido, listaAlumnos[numeroAlumnos].fechaNacimiento.dia, listaAlumnos[numeroAlumnos].fechaNacimiento.mes, listaAlumnos[numeroAlumnos].fechaNacimiento.anio);
            for (j = 0; j < listaAlumnos[numeroAlumnos].numAsignaturas; j++) {
                printf("%s %d %.2f\n", listaAlumnos[numeroAlumnos].listaAsignaturas[j].nombreAsignatura, listaAlumnos[numeroAlumnos].listaAsignaturas[j].creditos, listaAlumnos[numeroAlumnos].listaAsignaturas[j].nota);
                media += listaAlumnos[numeroAlumnos].listaAsignaturas[j].nota;
            }
            printf("Media: %.2f\n", media / listaAlumnos[numeroAlumnos].numAsignaturas);
            return;
    }


    int main() {
        char seguir = 's', DNI[50];
        int flagError = 0;
        int i, j, x, numAlumnos;
        struct registroAlumnos listaAlumnos[100];
        for (i = 0; i < 100 && seguir == 'S' || seguir == 's'; i++) {
            cargar_datos(&listaAlumnos, i);
            printf("Continuar (S/N)?\n");
            scanf("%c", &seguir);
            getchar();
        }
        numAlumnos = i;
        printf("DNI?\n");
        for (seguir = 'S'; seguir == 'S' || seguir == 's'; )
        {
            scanf("%s", DNI);
            getchar();
            for (j = 0; j < numAlumnos ; j++)
                if (strcmp(listaAlumnos[j].dni, DNI) == 0) {
                    imprimirDatos(&listaAlumnos, j);
                    flagError = 0;
                    break;
                }
                else flagError = 1;
            if (flagError == 1) printf("ERROR - DNI no encontrado.\n");
            printf("Mas (S/N)?\n");
            scanf("%c", &seguir);
            getchar();
        }
        //liberando memoria
        for (j = 0; j < numAlumnos; j++) {
            free(listaAlumnos[j].listaAsignaturas);
        }
        return 0;
    }
    
answered by 19.12.2016 в 17:55