Implementación en C de un Sistema de Gestión de Asistencias con Ficheros y Matrices
Clasificado en Informática
Escrito el en
español con un tamaño de 6,28 KB
Descripción del Ejercicio de Programación en C
El objetivo de este ejercicio es completar un programa en C para gestionar la asistencia de alumnos a sesiones de prácticas, utilizando matrices y manejo de ficheros.
Formato del Fichero de Asistencias
El fichero de entrada, denominado asistencias.txt, contiene datos binarios (0 o 1) donde cada línea representa a un alumno y cada columna a una sesión de práctica. Por ejemplo, en la primera línea se indica si el primer alumno asistió a la primera práctica, si no asistió a la segunda, si asistió a la tercera, etc. Del mismo modo, en las siguientes líneas se indica la información correspondiente al resto de los alumnos.
Funciones Requeridas
Se debe completar el programa en C adjunto, añadiendo e implementando las siguientes funciones:
leer_asistencias: Lee el fichero con el formato indicado (asistencias.txt) y almacena los valores en una matriz que recibe como parámetro. La función debe devolver0si la lectura se realiza con éxito o-1en caso contrario (ej. si el fichero no se puede abrir).sesion_min: Muestra por pantalla la sesión de prácticas a la que han acudido menos alumnos, así como el número exacto de alumnos que asistieron. La función recibirá como parámetro la matriz con las asistencias.faltan: Muestra por pantalla los números de los alumnos (su índice + 1) que han faltado a más de un número x de sesiones. Deberá recibir como parámetros la matriz con las asistencias y el número de faltas máximas permitidas, x. Además, debe retornar el número total de alumnos con más de x faltas.
Por último, se debe completar la función main, que se proporciona parcialmente implementada, para que se realicen las acciones indicadas en la misma (se recomienda descargar la plantilla del ejercicio para trabajar sobre ella).
Implementación del Código Fuente en C
A continuación, se presenta el código base corregido y parcialmente implementado, incluyendo las correcciones sintácticas necesarias en los bucles for y la lógica de la función sesion_min.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Necesario para getch() en entornos Windows/DOS
#define ALUMNOS 8
#define SESIONES 12
/**
* @brief Muestra el menú de opciones.
* @return La opción seleccionada por el usuario.
*/
int menu(){
int op;
system("cls");
printf("1. Sesion con minima asistencia\n");
printf("2. Alumnos con mas de x faltas\n");
printf("3. Salir\n");
printf(" Opcion: ");
scanf("%d", &op);
return op;
}
// Función leer_asistencias: obtiene los datos del fichero
/**
* @brief Lee el fichero 'asistencias.txt' y carga los datos en la matriz A.
* @param A Matriz de asistencias [ALUMNOS][SESIONES].
* @return 0 si éxito, -1 si error de apertura.
*/
int leer_asistencias(int A[][SESIONES]){
FILE *F;
int a, s;
F = fopen("asistencias.txt","r");
if (F==NULL) {
printf("Imposible abrir el fichero asistencias.txt\n");
system("Pause");
return -1;
}
// Bucle corregido
for (a=0; a < ALUMNOS; a++){
// Bucle corregido
for (s=0; s < SESIONES; s++){
fscanf(F, "%d", &A[a][s]);
}
}
fclose(F);
return 0;
}
// Función sesion_min: averigua la sesión de prácticas con menos alumnos
/**
* @brief Determina y muestra la sesión con la menor asistencia.
* @param A Matriz de asistencias.
*/
void sesion_min(int A[][SESIONES]){
int a, s, total, min, smin;
min = ALUMNOS + 1; // Inicialización a un valor mayor que el máximo posible
smin = -1;
printf("\n");
// Bucle corregido
for (s=0; s < SESIONES; s++){
total = 0;
// Bucle corregido
for (a=0; a < ALUMNOS; a++){
if (A[a][s] == 1) total++; // También: total = total + A[a][s];
}
// Lógica corregida: solo actualiza si la asistencia actual es menor que la mínima registrada
if (total < min){
min = total;
smin = s;
}
}
if (smin != -1) {
printf(" Sesion con menos asistencias (%d alumnos): %d\n", min, smin + 1);
} else {
printf(" No se encontraron datos de asistencia.\n");
}
}
// Función faltan: muestra el número de alumnos con más de un número de faltas
// determinadas y devuelve su cantidad
/**
* @brief Identifica y cuenta los alumnos con más de 'nfaltas' ausencias.
* @param A Matriz de asistencias.
* @param nfaltas Número máximo de faltas permitidas.
* @return Número total de alumnos que superan las faltas.
*/
int faltan(int A[][SESIONES], int nfaltas){
int a, s, n, faltas;
n = 0;
printf("\n Alumnos con mas de %d faltas: ", nfaltas);
// Bucle corregido
for (a=0; a < ALUMNOS; a++){
faltas = 0;
// Bucle corregido
for (s=0; s < SESIONES; s++){
if (A[a][s] == 0) faltas++;
}
if (faltas > nfaltas) {
printf("%d ", a + 1); // Muestra el número de alumno (base 1)
n++;
}
}
printf("\n");
return n;
}
// Función principal
int main(){
int Asistencias[ALUMNOS][SESIONES], nal, faltas;
int op, err;
// Llamar a la función leer_asistencias
err = leer_asistencias(Asistencias);
// Si hay error de lectura, finalizar el programa
if (err == -1) return -1;
do{
op = menu();
switch(op){
case 1: // Llamar a la función sesion_min
sesion_min(Asistencias);
break;
case 2: // Solicitar número de faltas y llamar a la función faltan
printf("\n Numero de faltas maximo: ");
scanf("%d", &faltas);
nal = faltan(Asistencias, faltas);
printf(" Han sido %d alumnos en total\n", nal);
break;
}
if (op != 3) {
printf("\n Pulse una tecla para volver al menu...");
getch();
}
} while (op != 3);
return 0;
}