Gestión de Estudiantes en C: Tablas, Filtros y Archivos Externos

Informática4,24 KB

Crear tabla de estudiantes

Función crear_tabla: permite ingresar los nombres de los estudiantes y genera de forma aleatoria los valores de Matemática, Lenguaje y NEM. Además, calcula el puntaje ponderado y el promedio.

void crear_tabla(int n, char Nom[50][12], int M[50], int L[50], float NEM[50], int P[50], int PRO[50])
{
    int i;
    for (i = 1; i <= n; i++)
    {
        printf("\n\t Ingrese nombre = ");
        scanf("%s", Nom[i]);
        M[i] = rand() % 601 + 250;
        L[i] = rand() % 601 + 250;
        NEM[i] = (rand() % 61 + 10) / 10.0;
        P[i] = (850 * NEM[i]) / 7.0;
        PRO[i] = (M[i] + L[i] + NEM[i]) / 3;
    }
}

Imprimir tabla en pantalla

Función ver_tabla: muestra en pantalla todos los registros con sus encabezados.

void ver_tabla(int n, char Nom[50][12], int M[50], int L[50], float NEM[50], int P[50], int PRO[50])
{
    int i;
    printf("\n\t %12s %8s %8s %8s %8s %8s ", "Nombre", "Mat", "Len", "NEM", "Pond", "Prom");
    for (i = 1; i <= n; i++)
    {
        printf("\n\t %12s %8d %8d %8.1f %8d %8d ", Nom[i], M[i], L[i], NEM[i], P[i], PRO[i]);
    }
}

Listado de estudiantes con puntaje mayor a X

Función Mayor_X: imprime únicamente los estudiantes cuyo promedio supera el valor X indicado.

void Mayor_X(int n, int X, char Nom[50][12], int M[50], int L[50], float NEM[50], int P[50], int PRO[50])
{
    int i;
    printf("\n\n\n\t Listado estudiantes con puntaje mayor a %d", X);
    printf("\n\t %12s %8s %8s %8s %8s %8s ", "Nombre", "Mat", "Len", "NEM", "Pond", "Prom");
    for (i = 1; i <= n; i++)
    {
        if (PRO[i] > X)
            printf("\n\t %12s %8d %8d %8.1f %8d %8d ", Nom[i], M[i], L[i], NEM[i], P[i], PRO[i]);
    }
}

Crear archivo externo con puntajes mayores a 500

Función crear_AE: genera el archivo Ciencias.txt y guarda únicamente los estudiantes con promedio superior a 500.

void crear_AE(int n, char Nom[50][12], int M[50], int L[50], float NEM[50], int P[50], int PRO[50])
{
    int i;
    FILE *tabla;
    /* Apertura del archivo externo */
    tabla = fopen("Ciencias.txt", "w");
    fprintf(tabla, "\n\t %12s %8s %8s %8s %8s %8s ", "Nombre", "Mat", "Len", "NEM", "Pond", "Prom");
    /* Escribe en el archivo externo */
    for (i = 1; i <= n; i++)
    {
        if (PRO[i] > 500)
            fprintf(tabla, "\n\t %12s %8d %8d %8.1f %8d %8d ", Nom[i], M[i], L[i], NEM[i], P[i], PRO[i]);
    }
    fclose(tabla);
}

Búsqueda por nombre en el archivo externo

Función Buscar_AE: solicita un nombre, recorre el archivo Ciencias.txt y muestra los datos del registro encontrado.

void Buscar_AE()
{
    char NN[12], Nombre[12], xx[12];
    int i, MAT, LEN, PON, PRO;
    float NEM;
    FILE *tabla;
    printf("\n\t Ingrese nombre de la sustancia a buscar = ");
    scanf("%s", NN);
    /* Apertura del archivo externo */
    tabla = fopen("Ciencias.txt", "a+");
    /* Lee el título del archivo e imprime en pantalla */
    printf("\n\n\n\t ");
    for (i = 1; i <= 6; i++)
    {
        fscanf(tabla, "%s", xx);
        printf(" %8s", xx);
    }
    /* Lee del archivo y escribe en pantalla */
    while (!feof(tabla))
    {
        fscanf(tabla, "%s%d%d%f%d%d", Nombre, &MAT, &LEN, &NEM, &PON, &PRO);
        if (strcmp(NN, Nombre) == 0)
            printf("\n\t %12s %8d %8d %8.1f %8d %8d ", Nombre, MAT, LEN, NEM, PON, PRO);
    }
    fclose(tabla);
}

Observaciones importantes

  • En scanf con cadenas no se debe usar el operador &: se escribe scanf("%s", Nom[i]).
  • La variable PRO se declara como int pero el cálculo del promedio produce un valor real; se recomienda usar float para mayor precisión.
  • El bucle while (!feof(tabla)) puede procesar una última línea vacía; conviene verificar el valor devuelto por fscanf.
  • Siempre verificar que fopen no devuelva NULL antes de operar sobre el archivo.

Descargar

PDF Word HTML