1
Herramientas

Calculadora

Calculadora con operaciones básicas y científicas (raíz, exponente, porcentaje) y función de memoria.

Calculadora

Descripción

Esta calculadora es una aplicación web interactiva que simula la funcionalidad de una calculadora de escritorio, combinando operaciones aritméticas básicas con funciones científicas avanzadas y una útil capacidad de memoria. Diseñada con una interfaz de usuario limpia y responsiva, permite a los usuarios realizar cálculos complejos, gestionar el historial de memoria de forma visible y cambiar el signo de los números con facilidad. Su desarrollo se centró en la precisión lógica y una experiencia de usuario fluida, adaptando dinámicamente el tamaño de la fuente en el display para números largos y proporcionando un control intuitivo sobre cada operación.

Características clave

  • Operaciones Aritméticas Básicas:

    Realiza sumas, restas, multiplicaciones y divisiones.

  • Operaciones Avanzadas:

    Incluye funciones para porcentaje (%), recíproco (1/x), cuadrado (x^2), y raíz cuadrada (sqrt{x}).

  • Gestión de Signos:

    Permite cambiar el signo de un número (+/-).

  • Manejo de Entrada:

    Admite números con decimales y gestiona la entrada de dígitos de manera intuitiva.

  • Historial de Memoria:

    Implementa una funcionalidad de memoria (M+, M-, MR, MC) con una lista visible de valores guardados, permitiendo al usuario almacenar y recuperar números.

  • Feedback Visual:

    Muestra la operación actual y el resultado en pantallas separadas, mejorando la experiencia del usuario. El tamaño de la fuente del resultado se ajusta dinámicamente según la longitud para asegurar la visibilidad.

  • Controles de Borrado:

    Ofrece opciones para borrar la última entrada (Backspace), borrar la entrada actual (C) o borrar todo (CE).

Aspectos destacados del código

  • Manipulación del DOM:

    Se utiliza document.querySelectorAll y document.querySelector para acceder a los elementos HTML de la calculadora, y se manipulan sus propiedades textContent y style para actualizar la interfaz.

  • const displayResult = document.querySelector('.display-result');
    const buttons = document.querySelectorAll('.calculator-button');
    displayResult.textContent = result;
    displayResult.style.fontSize = adjustFontSize(result.length);
  • Manejo de Eventos:

    Se emplean addEventListener("mousedown", ...) para detectar las interacciones del usuario con los botones, lo que permite ejecutar las funciones correspondientes a cada acción.

  • buttons.forEach(button => {
        button.addEventListener('mousedown', (e) => {
            // Lógica basada en el botón clickeado
            console.log(e.target.textContent);
        });
    });
  • Manejo de entrada de números y actualización del display:

    La función SelectNumberPress maneja la entrada de números y actualiza el display, asegurando que los resultados se borren para nuevas entradas y que los números se añadan de forma incremental.

  • function SelectNumberPress(number) {
        if (displayResult.textContent == 0 || resultObtained) {
            displayResult.textContent = number;
            resultObtained = false;
        } else {
            displayResult.textContent += number;
        }
        newNumberEntered = true;
    }
  • Lógica de Operaciones:

    La función SelectOperation gestiona la lógica central de la calculadora, manejando el estado de los números, operadores y resultados intermedios. Llama a ValidateOperation para realizar cálculos cuando se selecciona una nueva operación después de un número.

  • function SelectOperation(operator) {
        if (numberOne == 0) {
            numberOne = Number(displayResult.textContent);
        } else if (newNumberEntered) {
            numberTwo = Number(displayResult.textContent);
            ValidateOperation();
            displayResult.textContent = numberOne;
        }
        operationRealized = operator;
        newNumberEntered = false;
    }
  • Funcionalidad de Memoria:

    La implementación de la memoria es un punto clave, con funciones para añadir, restar, recuperar y limpiar valores, junto con una interfaz dinámica para ver los elementos guardados. La función AddMemory, por ejemplo, añade un número al array de memoria y actualiza la visualización.

  • function AddMemory(number) {
        memory.push(Number(number));
        UpdateMemoryList(); // Función para actualizar visualmente la lista de memoria
    }

Desafíos técnicos

  • Gestión del Estado de la Calculadora:

    Mantener el control preciso de los números (numberOne, numberTwo), la operación actual y los indicadores (resultObtained, newNumberEntered) para garantizar que las operaciones se encadenen correctamente y el display refleje el estado exacto.

  • Manejo de Precedencia y Encadenamiento de Operaciones:

    Asegurar que operaciones consecutivas (ej. 2 + 3 * 4) o el uso del botón = varias veces sigan la lógica esperada, gestionando cuándo se calcula un resultado intermedio y cuándo se inicia una nueva operación.

  • Dinámica del Display:

    Ajustar el tamaño de la fuente del display de resultado para números muy largos y manejar la visualización de decimales y ceros iniciales de forma coherente.

  • Implementación de Funciones de Memoria:

    Desarrollar un sistema robusto para añadir, restar, recuperar y limpiar elementos de la memoria, incluyendo su visualización en una lista desplegable.

Aprendizajes obtenidos

  • Importancia del Manejo de Estado:

    Comprendí a fondo cómo la gestión de variables de estado es fundamental en aplicaciones interactivas para controlar el flujo y el comportamiento del usuario.

  • Diseño de Lógica Clara:

    Aprendí a descomponer un problema complejo (operaciones de calculadora) en funciones más pequeñas y manejables, lo que mejora la legibilidad y el mantenimiento del código.

  • Interacción con el DOM:

    Reforcé mis habilidades en la manipulación dinámica de elementos HTML y la escucha de eventos para crear una interfaz de usuario responsiva y funcional.

  • Resolución de Casos Extremos:

    La necesidad de manejar situaciones como la división por cero, la entrada de múltiples decimales o secuencias de operaciones no estándar me enseñó sobre la importancia de la validación y el manejo de errores.

Posibles mejoras / Ideas a implementar

  • Historial de Operaciones:

    Podrías añadir un registro visual de las operaciones completadas, similar a cómo algunas calculadoras muestran las últimas ecuaciones.

  • Manejo de Errores:

    Implementar manejo para divisiones por cero o entradas inválidas, mostrando mensajes de error amigables en el displayResult.

  • Teclado Numérico:

    Permitir la interacción con la calculadora a través del teclado físico del usuario para los números y operadores.

  • Más Funciones Científicas:

    Si te interesa, podrías expandirla para incluir funciones trigonométricas, logaritmos, etc.

  • Diseño Responsivo:

    Asegurarse de que la calculadora se vea y funcione bien en diferentes tamaños de pantalla (aunque esto sería más de CSS, complementaría el proyecto).

  • Accesibilidad:

    Mejorar la accesibilidad para usuarios con discapacidades, por ejemplo, añadiendo atributos ARIA.

Información

Herramientas

2023-03-30

JavaScript

Etiquetas

mathcalculatormemoryUI/UXDOM Manipulationevent handlinglogicfrontend