Gestión de Estudiantes en C: Tablas, Filtros y Archivos Externos
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
scanfcon cadenas no se debe usar el operador&: se escribescanf("%s", Nom[i]). - La variable
PROse declara comointpero el cálculo del promedio produce un valor real; se recomienda usarfloatpara mayor precisión. - El bucle
while (!feof(tabla))puede procesar una última línea vacía; conviene verificar el valor devuelto porfscanf. - Siempre verificar que
fopenno devuelvaNULLantes de operar sobre el archivo.