Ejercicio 1 - Calculadora

● Introducción

Este ejercicio práctico básico sirve como primer contacto con el lenguaje javascript.
Podés visitar el ejercicio que desarrollaremos aquí.

◆ Descargar Proyecto (.zip).
💻 Ver explicación en video de youtube.

● Preparación

  • Creamos una carpeta y la abrimos con Visual Studio Code.
  • Generamos el archivo index.html , style.css y script.js.
  • Conectamos en el index.html las etiquetas link y script.
  • Correjimos el lenguaje y completamos el título.
  • Agregamos las etiquetas meta según nuestro objetivo con los buscadores y la difusión de este sitio en redes.
  • Nos quedaría el siguiente index.html:
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="description" content="Ejercicio para iniciarse en Javascript">
        <link rel="stylesheet" href="style.css">
        <title>Calculadora - Javascript</title>
    </head>
    <body>
        

        <script src="script.js"></script>
    </body>
    </html>
  • Observamos con Live Server y Live Preview.

● Desarrollo index.html

Armamos el teclado:

<body>
    <main>
        <h1>Mi Calculadora</h1>
        <div class="calculadora">
            <!-- Donde pondremos lo que tecleamos y el resultado -->
            <div class="info"></div>
            <div class="teclado">
                <!-- Son 16 teclas. Escribimos 1 y con alt+shift presionados, tocamos la tecla abajo ↓ y se van generando las demás etiquetas -->
                 <button>7</button>
                 <button>8</button>
                 <button>9</button>
                 <button>C</button>
                 <button>4</button>
                 <button>5</button>
                 <button>6</button>
                 <button>-</button>
                 <button>1</button>
                 <button>2</button>
                 <button>3</button>
                 <button>+</button>
                 <!-- tecla window + punto -->
                 <button>←</button>
                 <button>0</button>
                 <button>.</button>
                 <button>=</button>
            </div>
            <!-- Esa ubicación la determiné yo, practicando. -->
        </div>
    </main>

    <script src="script.js"></script>
</body>

● Desarrollo style.css

Al darle estilo, la calculadora se va a armar.

    /* Configuración básica en todos los casos */
    *{
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        /* Propiedades que aplican a todas las etiquetas */
    }
    body{
        font-family: Verdana, Geneva, Tahoma, sans-serif;
        /* Propiedades heredables */
    }

    /* Específicas de este proyecto */
    main{
        height: 100vh;
        width: 100vw;
    }
    h1{
        text-align: center;
        /* margen arriba y abajo */
        margin-block: 1rem;
        color: darkcyan;
    }
    .calculadora{
        width: 500px;
        border: 0.5px solid gray;
        border-radius: 5px;
        /* Para centrarla */
        margin: 0 auto;
    }
    .info{
        /* Ocupa el 100% del padre, que es la calculadora que mide 500px */
        width: 100%;
        height: 60px;
        /* primer valor arriba/abajo segundo valor laterales */
        padding: 0 30px;
        background-color: darkcyan;
        color: cyan;
        font-size:50px;
        text-align: right;
        overflow: hidden;
    }
    .teclado{
        padding: 30px 0;
        /* los dispone uno al lado del otro */
        display: flex;
        /* Pero como tiene wrap, si no entra, baja a la línea siguiente */
        flex-wrap: wrap;
        justify-content: center;
        align-items: center;
        /* separación entre botones */
        gap: 5px;
    }
    button{
        width: 100px;
        height: 100px;
        background-color: white;
        color: darkcyan;
        font-size: 50px;
        cursor: pointer;
        border: 0.5px solid darkcyan;
        /* La transición de estado normal a hover */
        transition: all 1s ease;

    }
    button:hover{
        background-color: cyan;
        color: darkcyan;
    }

Con esto la calculadora queda armada, pero no hace nada. Falta el script de javascript, que es el objetivo de este ejercicio.

● Desarrollo script.js

Javascript se aplica sobre la estructura lógica del HTML que tiene en la memoria el navegador. Es por ello que debemos aplicarlo al final. El esqueleto de documento debe estar creado. (Puede crearse con javascript, pero este no es el caso.) Identificamos la etiqueta donde escribiremos.

// Identificamos la etiqueta donde escribiremos
const info = document.querySelector('.info');

//es una función que recibe un valor y lo agrega en la etiqueta identificada.
const mostrar = (valor)=>{
    info.innerHTML= info.innerHTML + valor;
}

innerHTML: Es una propiedad de javascript que permite modificar el código HTML que se encuentra dentro de un elemento de la página web. En este caso el elemento identificado como info

  • Etiqueta sería div, elemento es la etiqueta con su contenido, es decir todo.

  • Agregamos esta función a cada button

    <main>
        <h1>Mi Calculadora</h1>
        <div class="calculadora">
            <!-- Donde pondremos lo que tecleamos y el resultado -->
            <div class="info"></div>
            <div class="teclado">
                <!-- Son 16 teclas. Escribimos 1 y con alt+shift presionados, tocamos la tecla abajo ↓ y se van generando las demás etiquetas -->
                 <button onclick="mostrar(7)">7</button>
                 <button onclick="mostrar(8)">8</button>
                 <button onclick="mostrar(9)">9</button>
                 <button onclick="">C</button>
                 <button onclick="mostrar(4)">4</button>
                 <button onclick="mostrar(5)">5</button>
                 <button onclick="mostrar(6)">6</button>
                 <button onclick="mostrar('-')">-</button>
                 <button onclick="mostrar(1)">1</button>
                 <button onclick="mostrar(2)">2</button>
                 <button onclick="mostrar(3)">3</button>
                 <button onclick="mostrar('+')">+</button>
                 <!-- tecla window + punto -->
                 <button>←</button>
                 <button onclick="mostrar(0)">0</button>
                 <button onclick="mostrar('.')">.</button>
                 <button>=</button>
            </div>
            <!-- Esa ubicación la determiné yo, practicando. -->
        </div>
    </main>

● Función Borrar()

//Para borrar todo lo que hay
const borrar = ()=>{
    info.innerHTML="";
}

En el index.html

<button onclick="borrar()">C</button>
  • Para el caso, de solo borrar un dígito.
//Para borrar solo un dígito
const borrarUnDigito =()=>{
    info.innerHTML = info.innerHTML.slice(0,-1);
}
  • Esta línea de código elimina el último carácter del contenido visual (HTML) que está dentro de un elemento con el nombre info
  • Empieza desde el principio (posición 0) y se detiene exactamente un carácter antes del final (-1), borrando la última letra, número o espacio. En el index.html
<button onclick="borrarUnDigito()">←</button>

● Función Calcular()


// Para calcular

const calcular = ()=>{
    //Se escribe esta sentencia por si sucede algún error, esté bajo control.
    try {
        if(!info.innerHTML){
            // si no hay nada 
            info.innerHTML = "0";
        }else{
            //sino
            info.innerHTML = eval(info.innerHTML);
        }
        
    } catch (error) {
        info.innerHTML = "Error";
    }
}
 <button onclick="calcular()">=</button>

Pero después de calcular, debemos reiniciar el proceso automáticamente.

  • Pondremos una bandera, que nos indique cuando se inicia un cálculo y cuando finaliza.

1- Identificamos la variable

const info = document.querySelector('.info');
let bandera = 'inicio';
...

2- Modificamos la función mostrar()

    const mostrar = (valor)=>{
        if(bandera === 'inicio'){
            info.innerHTML= valor;
        }else{

        info.innerHTML= info.innerHTML + valor;
        }
        // la primera vez que se muestra un número, cambia, hasta que se calcule el resultado.
        bandera = "yainicio";
    }

3- Tanto si calculamos o si borramos todo, volvemos la bandera a inicio

const calcular = ()=>{
    //Se escribe esta sentencia por si sucede algún error, esté bajo control.
    try {
        if(!info.innerHTML){
            // si no hay nada 
            info.innerHTML = "0";
        }else{
            //sino
            info.innerHTML = eval(info.innerHTML);
        }
        
    } catch (error) {
        info.innerHTML = "Error";
    }
    bandera='inicio';
}

const borrar = ()=>{
    info.innerHTML="";
    bandera='inicio';
}

Verificaciones

//Verificaciones. Hay muchas, pero como es solo un ejercicio de presentación de javascript, solo haremos las básicas.

function formatearNumero(num){
    //Si es entero y no está en notación científica.
    if(Number.isInteger(num) && Math.abs(num) < 1e21){
        return num.toString();
    }
    // si es muy grande o tiene muchos decimales
    return Number(num).toPrecision(6);
}

Formateamos el resultado.

const calcular = ()=>{
    //Se escribe esta sentencia por si sucede algún error, esté bajo control.
    try {
        if(!info.innerHTML){
            // si no hay nada 
            info.innerHTML = "0";
        }else{
            //sino
            //formateo el resultado
            info.innerHTML = formatearNumero(eval(info.innerHTML));
        }
        
    } catch (error) {
        info.innerHTML = "Error";
    }
    bandera='inicio';
}

La función eval() en JavaScript evalúa o ejecuta un texto (String) como si fuera código de programación real.