Este sistema implementa una calculadora de ejercicios aritméticos interactiva en Java, diseñada para generar problemas adaptados a diferentes niveles educativos. La arquitectura utiliza herencia de clases para extender las funcionalidades de manera escalable.
Descripción General
El programa presenta un menú principal con opciones para configurar parámetros, realizar ejercicios de tres niveles de dificultad y gestionar un registro de errores. Los parámetros configurables incluyen la cantidad de ejercicios y el rango numérico de los operandos.
Especificaciones por Nivel Educativo
Nivel Primario Básico (Grado 2): Genera ejercicios con dos operandos, utilizando operaciones de suma, resta, multiplicación y división entera. Los números se mantienen dentro de un límite de 100.
Nivel Intermedio (Grado 3): Hereda del nivel básico y amplía el número máximo de operandos a cuatro, con el mismo rango numérico.
Nivel Avanzado (Grado 4): Extiende el nivel intermedio permitiendo hasta cinco operandos e incluyendo operaciones con paréntesis.
Implementación en Código
A continuación se presentan las clases principales del sistema, con nombres de variables y estructura modificados para ilustrar una implementación alternativa.
Clase Principal de la Aplicación
package com.educativo.calc;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class AplicacionCalculadora {
static List<ExpresionMatematica> bancoExpresiones = new ArrayList<>();
static List<EntradaHistorial> historialRespuestas = new ArrayList<>();
public static void main(String[] args) {
InterfazMenu interfaz = new InterfazMenu();
Scanner lector = new Scanner(System.in);
while (true) {
interfaz.desplegarOpciones();
NivelEducativoDos nivelDos = new NivelEducativoDos();
NivelEducativoTres nivelTres = new NivelEducativoTres();
NivelEducativoCuatro nivelCuatro = new NivelEducativoCuatro();
int opcionSeleccionada = lector.nextInt();
switch (opcionSeleccionada) {
case 1:
System.out.println("Definir número de problemas:");
int numProblemas = lector.nextInt();
NivelEducativoDos.configurarCantidad(numProblemas);
NivelEducativoTres.configurarCantidad(numProblemas);
NivelEducativoCuatro.configurarCantidad(numProblemas);
System.out.println("Establecer límite numérico:");
int limiteNumerico = lector.nextInt();
NivelEducativoDos.configurarLimite(limiteNumerico);
NivelEducativoTres.configurarLimite(limiteNumerico);
NivelEducativoCuatro.configurarLimite(limiteNumerico);
break;
case 2:
nivelDos.ejecutarSesion();
break;
case 3:
nivelTres.ejecutarSesion();
break;
case 4:
nivelCuatro.ejecutarSesion();
break;
case 5:
mostrarLibroErrores();
break;
}
}
}
public static void mostrarLibroErrores() {
for (EntradaHistorial entrada : historialRespuestas) {
if (entrada.contadorFallos > 0) {
System.out.println(entrada.expresion + "=");
Scanner sc = new Scanner(System.in);
double respuestaUsuario = sc.nextDouble();
if (Math.abs(respuestaUsuario - entrada.resultadoCorrecto) < 0.001) {
System.out.println("¡Correcto!");
entrada.contadorFallos = 0;
} else {
System.out.println("Incorrecto");
entrada.contadorFallos++;
System.out.println("Fallos acumulados: " + entrada.contadorFallos);
System.out.println("Respuesta esperada: " + entrada.resultadoCorrecto);
}
}
}
}
public static double evaluarExpresion(String expr) {
// Lógica de evaluación recursiva de expresiones con paréntesis
// Implementación simplificada para demostración
return 0.0; // Placeholder
}
}
Clase de Interfaz de Menú
package com.educativo.calc;
public class InterfazMenu {
public void desplegarOpciones() {
System.out.println("=== MENÚ PRINCIPAL ===");
System.out.println("1. Ajustar configuración");
System.out.println("2. Ejercicios nivel básico");
System.out.println("3. Ejercicios nivel intermedio");
System.out.println("4. Ejercicios nivel avanzado");
System.out.println("5. Revisar errores");
}
}
Clase Base para Nivel Educativo
package com.educativo.calc;
import java.util.Random;
import java.util.Scanner;
public class NivelEducativoDos {
protected static int cantidadProblemas = 30;
protected static int limiteNumerico = 100;
protected int maxOperandos = 2;
protected boolean permiteParentesis = false;
public void ejecutarSesion() {
Random generador = new Random();
int errores = 0;
for (int i = 0; i < cantidadProblemas; i++) {
StringBuilder problema = new StringBuilder();
EntradaHistorial registro = new EntradaHistorial();
int primerOperando = generador.nextInt(limiteNumerico);
problema.append(primerOperando);
for (int j = 1; j < maxOperandos; j++) {
char operador = seleccionarOperador(generador);
problema.append(operador);
int siguienteOperando = generador.nextInt(limiteNumerico);
problema.append(siguienteOperando);
}
registro.expresion = problema.toString();
registro.resultadoCorrecto = evaluarExpresion(problema.toString());
System.out.println((i+1) + ". " + problema.toString() + "=");
Scanner sc = new Scanner(System.in);
double respuesta = sc.nextDouble();
if (Math.abs(respuesta - registro.resultadoCorrecto) < 0.001) {
System.out.println("Correcto");
} else {
System.out.println("Incorrecto");
registro.contadorFallos++;
errores++;
System.out.println("Respuesta: " + registro.resultadoCorrecto);
}
AplicacionCalculadora.historialRespuestas.add(registro);
}
double tasaAcierto = ((cantidadProblemas - errores) * 100.0) / cantidadProblemas;
System.out.println("Precisión: " + String.format("%.1f", tasaAcierto) + "%");
}
private char seleccionarOperador(Random rnd) {
char[] ops = {'+', '-', '*', '/'};
return ops[rnd.nextInt(ops.length)];
}
public static void configurarCantidad(int c) {
cantidadProblemas = c;
}
public static void configurarLimite(int l) {
limiteNumerico = l;
}
protected double evaluarExpresion(String expr) {
return AplicacionCalculadora.evaluarExpresion(expr);
}
}
Clases Derivadas por Herencia
package com.educativo.calc;
public class NivelEducativoTres extends NivelEducativoDos {
{
maxOperandos = 4;
permiteParentesis = false;
}
}
package com.educativo.calc;
public class NivelEducativoCuatro extends NivelEducativoTres {
{
maxOperandos = 5;
permiteParentesis = true;
}
}
Clases de Soporte
package com.educativo.calc;
public class ExpresionMatematica {
private String formula;
private int semillaAleatoria;
public ExpresionMatematica(String f, int s) {
this.formula = f;
this.semillaAleatoria = s;
}
// Getters y setters omitidos por brevedad
}
package com.educativo.calc;
public class EntradaHistorial {
String expresion;
double resultadoCorrecto;
int contadorFallos = 0;
public EntradaHistorial() {
this.expresion = "";
this.resultadoCorrecto = 0.0;
}
}
Flujo de Ejecución
Al iniciar, el sistema muestra el menú principal. Los usuarios pueden ajustar parámetros globales que afectan a todos los niveles educativos. Durante la resolución de ejercicios, el sistema genera expresiones aleatorias según las reglas del nivel seleccionado, evalúa las respuestas en tiempo real y actualiza el historial de errores. Finalmente, los estudiantes pueden revisar sus fallos y repetir ejercicios específicos.