Sistema de Control y Cálculo de Calificaciones Escolares en Java con Arrays

Informática5,44 KB

Gestión de Calificaciones de Alumnos y Generación de Boletines en Java

El siguiente programa implementa en Java la recopilación interactiva de notas para un grupo de 30 alumnos matriculados en 7 asignaturas diferentes (típicas del ciclo formativo de Informática: Sistemas, Marcas, Bases, Entornos, Programación, FOL e Inglés). El algoritmo valida la entrada por teclado, acumula las puntuaciones de cada materia y calcula tanto la media como los valores máximos, mínimos y el balance de asignaturas aprobadas y suspensas.

Código Fuente Corregido y Estructurado

import java.lang.*;
import java.util.*;

public class A30410 {
    public static void main(String[] args) throws Exception {
        final int NROALUMNOS = 30;
        int nroAlumnos;
        final int ELEMENTOS = 7;
        int[] vContExamAsig = new int[ELEMENTOS];
        int[] vAcuNotasExamAsig = new int[ELEMENTOS];
        int indice;
        String nombreAlumno;
        String[] nombreAsig = {"Sistemas", "Marcas", "Bases", "Entornos", "Programación", "FOL", "Inglés"};
        int codAsig, notaExamen;
        char res;
        int notaAsig, contAsigSuspAlu = 0, contAsigAproAlu = 0, notaMaxAlu = 0, notaMinAlu = 0;
        Scanner teclado = new Scanner(System.in);

        for (nroAlumnos = 1; nroAlumnos <= NROALUMNOS; nroAlumnos++) {
            for (indice = 0; indice < vContExamAsig.length; indice++) {
                vContExamAsig[indice] = 0;
            }
            for (indice = 0; indice < vAcuNotasExamAsig.length; indice++) {
                vAcuNotasExamAsig[indice] = 0;
            }

            System.out.print("\nTeclee el nombre del alumno: ");
            nombreAlumno = teclado.nextLine();

            do {
                System.out.print("\n\nTeclee el código de la asignatura: ");
                codAsig = teclado.nextInt();
                while (codAsig < 1 || codAsig > 7) {
                    System.out.printf("\n\nCódigo de asignatura: %d erróneo. Teclee otro código entre 1 y 7: ", codAsig);
                    codAsig = teclado.nextInt();
                }

                System.out.print("\n\nTeclee la nota del examen: ");
                notaExamen = teclado.nextInt();
                while (notaExamen < 1 || notaExamen > 10) {
                    System.out.printf("\n\nNota del examen: %d errónea. Teclee otra nota entre 1 y 10: ", notaExamen);
                    notaExamen = teclado.nextInt();
                }

                (vContExamAsig[codAsig - 1])++;
                vAcuNotasExamAsig[codAsig - 1] += notaExamen;

                System.out.println("\n\n¿Desea dar la nota de otro examen?");
                System.in.skip(System.in.available());
                res = (char) System.in.read();
                res = Character.toUpperCase(res);
            } while (res == 'S');

            System.out.printf("\n BOLETÍN DE NOTAS DE D./Dña.: %s", nombreAlumno);
            System.out.printf("\nCÓD. ASIG     NOMBRE ASIGNATURA    NOTA");
            System.out.printf("\n---------     ------------------   ----");

            for (indice = 0, contAsigSuspAlu = 0, contAsigAproAlu = 0; indice < vContExamAsig.length; indice++) {
                if (vContExamAsig[indice] != 0) {
                    notaAsig = vAcuNotasExamAsig[indice] / vContExamAsig[indice];
                    System.out.printf("\n  %1d           %-20s %2d", (indice + 1), nombreAsig[indice], notaAsig);

                    if (contAsigSuspAlu == 0 && contAsigAproAlu == 0) {
                        notaMaxAlu = notaAsig;
                        notaMinAlu = notaAsig;
                    } else if (notaAsig < notaMinAlu) {
                        notaMinAlu = notaAsig;
                    } else if (notaAsig > notaMaxAlu) {
                        notaMaxAlu = notaAsig;
                    } else;

                    if (notaAsig < 5) {
                        contAsigSuspAlu++;
                    } else {
                        contAsigAproAlu++;
                    }
                }
            }

            System.out.printf("\nNº de Asignaturas Suspensas: %1d | Nº de Asignaturas Aprobadas: %1d", contAsigSuspAlu, contAsigAproAlu);
            System.out.printf("\nNota Menor: %2d | Nota Mayor: %1d", notaMinAlu, notaMaxAlu);

            teclado.nextLine();
            System.in.skip(System.in.available());
        }
    }
}

Elementos Clave del Programa

  • Estructuras de datos unidimensionales (arrays): Se utilizan vContExamAsig para registrar la cantidad de exámenes introducidos por materia y vAcuNotasExamAsig para sumarizar los puntos totales por materia.
  • Validación rigurosa de entradas: Mediante bucles while anidados, se impide que el usuario introduzca códigos de asignaturas fuera del rango [1, 7] o calificaciones no comprendidas entre [1, 10].
  • Manejo del buffer de entrada: Se hace uso de System.in.skip(System.in.available()) para vaciar caracteres sobrantes (como saltos de línea) antes de leer respuestas de tipo carácter (char).
  • Estadísticas por estudiante: En cada iteración se calculan dinámicamente la nota media por asignatura procesada, el recuento de materias aprobadas y suspensas, así como la calificación máxima y mínima obtenida.

Descargar

PDF Word HTML