Estructuras de Datos en C: Gestión de Alumnos y Cursos

Clasificado en Informática

Escrito el en español con un tamaño de 4,89 KB

Definición de Constantes y Tipos de Datos

A continuación, se definen las constantes y tipos de datos necesarios para la gestión de información académica:

Constantes

  • MAXCAR: Longitud máxima de una cadena de caracteres (256).
  • MAXASIG: Número máximo de asignaturas por alumno (50).
  • MAXALUM: Número máximo de alumnos por curso (100).

Tipos de Datos

  • Cadena: Tipo de dato para representar cadenas de caracteres (char[MAXCAR]).
  • TablaEnteros: Tipo de dato para representar un array de enteros (int[MAXASIG]).
  • TablaReales: Tipo de dato para representar un array de números reales (double[MAXASIG]).
  • fichero: Tipo de dato para representar un puntero a un archivo (FILE *).
  • Alumno: Estructura que representa un alumno, con los siguientes campos:
    • dni: DNI del alumno (Cadena).
    • codigos: Códigos de las asignaturas en las que se ha matriculado (TablaEnteros).
    • notas: Notas obtenidas en las asignaturas (TablaReales).
    • n: Número de asignaturas en las que se ha matriculado (int).
  • TablaAlumno: Tipo de dato para representar un array de alumnos (Alumno[MAXALUM]).
  • Curso: Estructura que representa un curso, con los siguientes campos:
    • codigo: Código del curso (Cadena).
    • alumnos: Array de alumnos matriculados en el curso (TablaAlumno).
    • n: Número de alumnos matriculados en el curso (int).

Implementación de Funciones

Función 1: Lectura de Datos de Alumno desde Fichero

Alumno ejercicio1 (Cadena nomfich) {
    fichero f;
    Alumno a;
    f = fopen(nomfich, "r");
    if (f == NULL) {
        printf("Error");
    } else {
        fscanf(f, "%d", &a.n);
        for (int i = 0; i < a.n; i++) {
            fscanf(f, "%d", &a.codigos[i]);
            fscanf(f, "%lf", &a.notas[i]);
        }
        strcpy(a.dni, nomfich);
    }
    fclose(f);
    return a;
}

Función 2: Nota Mínima y Código de Asignatura

double ejercicio2 (Alumno a, int *pnota, int *pcod) {
    *pnota = a.notas[0];
    *pcod = a.codigos[0];
    for (int i = 1; i < a.n; i++) {
        if (a.notas[i] < *pnota) {
            *pnota = a.notas[i];
            *pcod = a.codigos[i];
        }
    }
    return *pnota; // Devolver la nota mínima
}

Función 3: Códigos de Asignaturas con Nota Mayor o Igual a un Valor Dado

int ejercicio3 (Alumno a, double vnota, int t[]) {
    int j = 0;
    for (int i = 0; i < a.n; i++) {
        if (a.notas[i] >= vnota) {
            t[j] = a.codigos[i];
            j++;
        }
    }
    return j;
}

Función 4: Obtener Nota de una Asignatura

double ejercicio4 (Alumno a, int cod) {
    double resul = -1.0;
    for (int i = 0; i < a.n; i++) {
        if (a.codigos[i] == cod) {
            resul = a.notas[i];
            break;
        }
    }
    return resul;
}

Función 5: Verificar si Todas las Notas Superan un Valor Dado

bool ejercicio5 (Alumno a, double vnota) {
    bool resul = true;
    for (int i = 0; i < a.n; i++) {
        if (a.notas[i] < vnota) {
            resul = false;
            break;
        }
    }
    return resul;
}

Función 6: Verificar si un Alumno ha Terminado los Estudios

bool ejercicio6 (Alumno a) {
    return ejercicio5(a, 5.0) && a.n >= 40;
}

Función 7: Calcular la Nota Media de un Alumno

double ejercicio7 (Alumno a) {
    double suma = 0.0;
    for (int i = 0; i < a.n; i++) {
        suma = suma + a.notas[i];
    }
    return suma / a.n;
}

Función 8: Contar Asignaturas con Nota Mayor a un Valor Dado en un Curso

int ejercicio8 (Curso c, double vnota) {
    int cont = 0;
    int t[MAXASIG]; // Declarar el array t
    for (int i = 0; i < c.n; i++) {
        cont = cont + ejercicio3(c.alumnos[i], vnota, t);
    }
    return cont;
}

Función 9: Obtener el DNI del Alumno con Máxima Nota en una Asignatura

void ejercicio9 (Curso c, int codAsig, Cadena resul) {
    double max = ejercicio4(c.alumnos[0], codAsig);
    strcpy(resul, c.alumnos[0].dni);  // Inicializar resul con el primer alumno
    for (int i = 1; i < c.n; i++) {
        double notaActual = ejercicio4(c.alumnos[i], codAsig);
        if (notaActual > max) {
            max = notaActual;
            strcpy(resul, c.alumnos[i].dni);
        }
    }
}

Entradas relacionadas: