TransWikia.com

Problema con algoritmo para calcular ceros y numeros pares

Stack Overflow en español Asked by Concord on November 10, 2021

Estoy haciendo un ejercicio para la facultad que me piden que cuando el usuario ingrese una serie de valores realice unos cálculos determinados. Si bien pude realizar la mayoría, estoy teniendo problemas en cuanto a contar la cantidad de ceros que aparecen en los números ingresados y la cantidad de números pares que fueron ingresados.

¿Cuál es el problema, dirán?: No encuentro lógica en ingresar un condicional dentro de un while donde hay otro condicional if-else; porque ya lo intente y no termina resultando como se espera. He tratado de resolver esto durante 5 horas y no he llegado a ningún lado, a ver si me pueden ayudar a entenderlo, les dejo el código amigos.

function mostrar(){

let array = ["sumaPositivos", "sumaNegativos", "ceros", "numerosPares", "promedioPositivos", "promedioNegativos", "diferenciaPosNeg"];
let numeros;
let respuesta;

respuesta = "si";

numeros = 1;
numerosPares = 0
array [0] = 0; //sumaPositivos
array [1] = 0; //sumaNegativos
array [2] = 0; //ceros
array [3] = 0; //numerosPares
array [4] = 0; //promedioPositivos
array [5] = 0; //promedioNegativos
array [6] = 0; //diferenciaPosNeg

while(respuesta != "no")
{
    numeros++;
    numeros = parseFloat(prompt("Ingrese un número"));
    respuesta = prompt("Desea continuar? Escriba 'si' para continuar, 'no' para salir");

    if(numeros >=0)
    {
    array[0] = array [0] + numeros;
    array [4] = array [4] + numeros;
    }
    else
    {
    array [1] = array [1] + numeros;
    array [5] = array [5] + numeros;
    }
    /*
    if (numbers % 2 == 0) {
        return array [3];
    }
    else
    {}
    */

    array [6] = array[0] - array [1];
}   

document.write("<h1>Resultados:</h1>");
document.write("<br>");
document.write("La suma de los números positivos es :" + array[0]);
document.write("<br>");
document.write("La diferencia entre los números negativos es: " + array [1]);
document.write("<br>");
document.write("Hay " + array [2] + " ceros.");
document.write("<br>");
document.write("La cantidad de números pares es: " + array [3]);
document.write("<br>");
document.write("El promedio entre los números positivos es: " + array [4] / numeros);
document.write("<br>");
document.write("El promedio entre los números negativos es: " + array [5] / numeros);
document.write("<br>");
document.write("La diferencia entre números positivos y negativos es: " + array [6]);}

mostrar();

2 Answers

No es necesario realizar los cálculos mientras se van ingresando datos, eso solo debe hacerse hasta el final y, aparte, creo que se puede simplificar al usar solo un prompt.

Con array.filter() se pueden obtener "sub arreglos" con los elementos que cumplen la condición especificada.

Con array.reduce() se pueden sumar los valores de un arreglo.

let numeros = [];

while(true) {
    let respuesta = prompt('Ingresa un número o teclea "No" para terminar');
    // Se hizo clic en cancelar o respuesta es "No"?
    if(respuesta === null || respuesta.toLowerCase() === 'no') {
        // Salir del ciclo
        break;
    }
    // Agregar respuesta a números
    numeros.push(parseInt(respuesta));
}
// Obtener pares e impares
let par = numeros.filter(v => (v % 2) == 0);
let non = numeros.filter(v => v % 2);

// Suma de pares e impares
let parSum = par.reduce((a, b) => a + b, 0);
let parNon = par.reduce((a, b) => a + b, 0);


// Total de ceros
console.log(numeros.filter(v => v == 0).length);
// Total y suma de pares
console.log(par.length, parSum);
// Total y suma de impares
console.log(non.length, nonSum);

// Obtener positivos y negativos
let pos = numeros.filter(v => v > 0);
let neg = numeros.filter(v => v < 0);

Si quieres seguir haciendo las operaciones dentro del ciclo, no es necesario anidar condiciones, porque cada número puede entrar hasta en 3 2 categorías (0 = cero, par y ¿positivo?, -2 = par, negativo)

let array = [0, 0, 0, 0, 0, 0];

    while(true) {
        let respuesta = prompt('Ingresa un número o teclea "No" para terminar');
        // Se hizo clic en cancelar o respuesta es "No"?
        if(respuesta === null || respuesta.toLowerCase() === 'no') {
            // Salir del ciclo
            break;
        }
        // Agregar respuesta a números
        let num = parseInt(respuesta.replace(/D/g,'')) || 0;
        // Es par?
        if((num % 2) == 0) array[1] ++;

        if(num == 0) {
            // Es cero?
            array[0] ++;
        } else if(num > 0) {
            // Positivo
            array[2] += num; // suma
            array[3] ++; // contador
        } else {
            // Negativo
            array[4] += num; // suma
            array[5] ++; // contador
        }
    }
/*
array [0] = 0; //ceros
array [1] = 0; //numerosPares
array [2] = 0; //sumaPositivos
array [3] = 0; //contadorPositivos
array [4] = 0; //sumaNegativos
array [5] = 0; //contadorNegativos
  //promedioPositivos
  //promedioNegativos
  //diferenciaPosNeg
*/
// Total de números ingresados (para calcular promedios)
let totalNum = array[3] + array[5];
console.log('Ceros ingresado:', array[0]);
console.log('Pares ingresados:', array[1]);
console.log('Suma positivos:', array[2]);
console.log('Positivos ingresados:', array[3]);
console.log('Suma negativos:', array[4]);
console.log('Negativos ingresados:', array[5]);
console.log('Promedio positivos:', array[3] / totalNum * 100);
console.log('Promedio negativos:', array[5] / totalNum * 100);
console.log('Diferencia:', array[2] - array[4]);

Answered by Triby on November 10, 2021

Efectivamente tienes problemas con la lógica que esta aplicando, sin embargo, es un problema básico de acumuladores y contadores, con los acumuladores sumas las coincidencias que quieres sumar normalmente es del tipo acum = acum + num, y luego dado que tienes que sacar promedios debes poder contar cada coincidencia de forma separada, los contadores son del tipo, cont = cont + 1. Y por último, nada te impide que dentro de una decisión uses otra para segregar los 0 de los mayores a 0. Saludos!

Answered by Luis Higuera on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP