entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Problema con calculadora en JavaScript

Hola compañeros, lo que pasa es que tengo una actividad en JavaScript y después de varios intentos no logro resolverla.
La cosa es que tengo que hacer una calculadora en JavaScript a partir de un HTML que me dan (lo complejo es que no puedo modificar el html), y lo único que logre hacer es que se muestren los números en la pantalla de la calculadora y que al oprimir la tecla ON/C todo vuelva a 0, pero eso es todo, lo que mas se me ha complicado hacer es que al oprimir las teclas de operaciones (+,-,/,*,=) estas no se muestren y lo mas importante es que aun no logro hacer ninguna operación de suma, resta, etc.
Codigo html=

<body>
  <div class="fondo">
    <div class="titulo-container">
      <h1>¡No pierdas <span>la cuenta!</span></h1>
    </div>

    <div class="notas-container">
      <h2>Tus apuntes...</h2>
      <textarea class="nota-input" placeholder="Escribe aquí..."></textarea>
    </div>

    <div id="calculadoraFondo">
      <div class="pantalla">
        <span id="display">0</span>
      </div>

      <div class="teclado">
        <img src="image/ON.png" alt="On" class="tecla" id="on"/>
        <img src="image/sign.png" alt="signo" class="tecla" id="sign"/>
        <img src="image/raiz.png" alt="raiz" class="tecla" id="raiz"/>
        <img src="image/dividido.png" alt="dividido" class="tecla divide" id="dividido"/>

        <img src="image/7.png" alt="7" class="tecla" id="7"/>
        <img src="image/8.png" alt="8" class="tecla" id="8"/>
        <img src="image/9.png" alt="9" class="tecla" id="9"/>
        <img src="image/por.png" alt="por" class="tecla multiplica" id="por"/>

        <img src="image/4.png" alt="4" class="tecla" id="4"/>
        <img src="image/5.png" alt="5" class="tecla" id="5"/>
        <img src="image/6.png" alt="6" class="tecla" id="6"/>
        <img src="image/menos.png" alt="menos" class="tecla resta" id="menos"/>

        <div class="row">
          <div class="col1">
            <img src="image/1.png" alt="1" class="tecla" id="1"/>
            <img src="image/2.png" alt="2" class="tecla" id="2"/>
            <img src="image/3.png" alt="3" class="tecla" id="3"/>

            <img src="image/0.png" alt="0" class="tecla" id="0"/>
            <img src="image/punto.png" alt="punto" class="tecla" id="punto"/>
            <img src="image/igual.png" alt="igual" class="tecla" id="igual"/>
          </div>
          <div class="col2">
            <img src="image/mas.png" alt="mas" class="tecla suma" id="mas"/>
          </div>

        </div>
      </div>
    </div>

    <div class="container-libreta">
      <div class="libreta">
        <div class="contenido-ingresos">
          <h3>Ingresos</h3>
          <ul>
            <li><span>Salario: </span>$1300.00</li>
            <li><span>Bonificación: </span>$200.00</li>
          </ul>
        </div>
        <div class="contenido-egresos">
          <h3>Egresos</h3>
          <ul>
            <li><span>Renta: </span>$300.00</li>
            <li><span>Alimentos: </span>$250.00</li>
            <li><span>Restaurantes: </span>$120.00</li>
            <li><span>Automóvil: </span>$100.00</li>
          </ul>
        </div>
      </div>
    </div>

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

Codigi JavaScript=

//función para mostrar números en pantalla
var numeros = document.querySelectorAll("img");

  for (var i = 0; i < numeros.length; i++) {
    numeros[i].onclick = add;
  }

  function add(e) {
      var pantalla = document.getElementById("display");
      var num = pantalla.textContent += this.getAttribute("alt");

      num = parseFloat(num);

//función para borrar todo de la pantalla y volver al valor inicial 0
  document.getElementById("on").onclick = function(){
    display.innerHTML = 0;
  }
}

1 Respuesta

2votos

pedrourday Puntos1800

Hola @Krev

No puedo decir que vas bien encaminado, la solución que elegiste es la peor, pero no es tu culpa, todos se equivocan al principio y como es algo tan sencillo también es posible rehacer todo de nuevo. Este es un problema clásico de programación para los que recién están aprendiendo a programar y te lleva a llegar a malas soluciones y a cometer errores y te los explico ahora:

Hay un problema con tu forma de resolver el problema y es que no separas el como se ve de como funciona. La programación web depende de 3 lenguajes y tienen responsabilidades diferentes: HTML se encarga de la estructura y el contenido, JavaScript de la lógica y los eventos y CSS del estilo visual.
El contenido de HTML, generalmente, es el resultado de algo que proviene del servidor o de un calculo u operación hecha en JavaScript. O sea, lo primero es hacer los calculos en JavaScript y luego mostrarlos en el contenido. No se debe tomar valores que forman parte del contenido HTML.

En el código que mostraste se nota claramente la mezcla que haces de contenido y lógica y ademas: Porque no tenes un evento onclick por cada boton? Porque tomas valores de elementos HTML, si con el inspector del navegador podes modificar eso y hacer que el calculo falle? Porque no usas variables para almacenar los valores que va presionando el usuario o el resultado de eso?

Es conveniente tener un evento click por cada botón y no solo uno que maneje todo.
Por ejemplo, si presionas el número 0 se invoca la función que maneja el evento que contiene el boton 0 y no tomas su valor de HTML, sino que de una constante en Javascript.
Y no tenes que limitarte a usar variables en Javascript. Por ejemplo, podes usar una para almacenar el ultimo -, +, * o / presionado.

Todo esto es solucionable fácilmente, pero el que te dió esa actividad no se fijó que al agregar las operaciones de multiplicación y división esta agregando 2 problemas que no los resolvería alguien que recién se inicia en la programación y son: precedencia de operadores (* y / se calculan antes que - y +) y errores de redondeo por usar la división y trabajar con dos bases numéricas diferentes: binaria(2) y decimal(10). Yo me enojaría si me dan esa actividad y me doy cuenta.

Espero que te sirva de ayuda.

PD: Para resolver la precedencia de operadores podes usar un arreglo de JavaScript que funciona como una cola y contiene como elementos otras colas. Las de primer nivel sirven para - y + y las de segundo nivel para * y /.

Seguí intentando y no te rindas! y saludos cordiales!

Krev comentado Oct 12

Gracias por tu respuesta amigo, voy a aplicar lo que me dices.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta