Encuentre el mayor valor en una matriz (en un conjunto de enteros)

Mi amigo me pidió que lo ayudara con la tarea y estoy atascado. Aquí está la tarea:

el usuario debe ingresar en el primer cuadro de solicitud el número de elementos en la matriz. Luego, obtendrá un cuadro de aviso para que ingrese cada número. Ahora, la salida debe ser el mayor número en la matriz. Pero eso simplemente no funciona. Con mi código a continuación, siempre obtengo el elemento que tiene el primer dígito más grande. (no importa si el número es negativo o positivo, el código no funciona como debería)

Aquí está mi código (ni siquiera funciona en jsfiddle, solo en mi archivo)

<button onclick="duzinaNiza()">Do it!</button>

y aquí está JavaScript

function duzinaNiza() {
    var brClanova = prompt("Enter the number of array elements:");

    if (brClanova > 0) {
        var niz = new Array();

        for (i=0; i<brClanova; i++) {
            var redniBr = i+1;
            niz[i] = prompt("Enter "+ redniBr +". array number:");
            \\ prompt for geting each array element
        }


        var maximum = niz[0];

        for (a=0; a<brClanova; a++) {

            if (maximum < niz[a]) {
                maximum = niz[a];
            }
        }

        document.write("Greatest value in array is: " + maximum);   
    }
}

El profesor de mi amigo no quiere usar funciones para ordenar matrices, esto debe hacerse con bucles.

PD: Sí, lo sé... Pero no preguntes sobre document.write cosa, debe estar impreso de esa manera...

preguntado el 12 de abril de 13 a las 19:04

7 Respuestas

Esto se debe a que la entrada es una cadena, debe analizarla en un número entero. Me gusta:

niz[i] = parseInt(prompt("Enter "+ redniBr +". array number:"), 10);

Respondido 12 Abr '13, 20:04

Pensé que la entrada es una cadena, pero no estaba seguro. Por lo tanto, no hay forma de obtener el número desde el aviso sin parseInt? (El profesor es un tonto, no sabe sobre esta función). - Miljan Puzovic

Tienes que analizarlo, porque una comparación de cadenas es diferente a una comparación de enteros. Dado que un Sring compara carácter por carácter. Asi que 11 < 9 con una comparación de cadenas. Porque 1 es más pequeño que 9, y luego se comparará el segundo número. - Niels

Bueno, que sera sera, usaré parseInt() o Number(). Funciona bien ahora. ¡Gracias! - Miljan Puzovic

Si uso Number(). Vea stackoverflow.com/questions/4090518/… para obtener más información acerca de la diferencia. O multiplíquelo por 1 ('dado que la multiplicación supone números, JavaScript convierte la cadena en un número, si es posible. Si eso no es posible, el resultado es NaN'), consulte: quirksmode.org/js/strings.html - GitaarLAB

@Niels Edité para incluir el parámetro radix de parseInt que siempre debe incluirse. - Ian

Prueba esto:

function duzinaNiza() {
    var brClanova = prompt("Enter the number of array elements:");

    if (brClanova > 0) {
        var niz = new Array();

        for (i=0; i<brClanova; i++) {
            var redniBr = i+1;
            niz[i] = parseInt(prompt("Enter "+ redniBr +". array number:"));
            // prompt for geting each array element
        }


        var maximum = niz[0];

        for (a=0; a<brClanova; a++) {

            if (maximum < niz[a]) {
                maximum = niz[a];
            }
        }

        document.write("Greatest value in array is: " + maximum);   
    }
}

Respondido 12 Abr '13, 20:04

El problema es que está comparando dos cadenas, cuando quería comparar dos números. En otras palabras, la siguiente expresión es LEGAL en javascript y se evalúa como verdadera:

if('4' > '393939393'){
    //true! string '4' is greater than string '3' (first char of '393939393')
}

Lo que debe hacer es emitir el valor recibido desde el indicador de la función, por lo que se trata como un número. Puedes hacerlo usando la siguiente función:

parseInt(prompt("Enter "+ redniBr +". array number:"), 10);

El primer parámetro es el valor que desea convertir a un número, mientras que el segundo es la raíz (o "base") del número.

Respondido 12 Abr '13, 20:04

Entonces, el principal problema aquí es que no estás amenazando tus números como "número", sino como una cadena. El método prompt devuelve una cadena, por lo que necesita convertirlos:

 function duzinaNiza() {
    var brClanova = +prompt("Enter the number of array elements:");

    if (!brClanova)
      return;

    var niz = [];

    for (var i=0; i < brClanova; i++) {
        var redniBr = i + 1;
        niz[i] = +prompt("Enter "+ redniBr + ". array number:");
    }

    var max = niz[0]; 

    for (var a = 1; a < brClanova; a++) {

      if (max < niz[a])
         max = niz[a];

    }

    document.write("Greatest value in array is: " + max);
}

He utilizado el Operador Unary Plus para eso.

Solo para saber, en JS puedes evitar el último ciclo usando Math.max para obtener el máximo de una matriz de números. Así que en lugar de:

    var max = niz[0]; 

    for (var a = 1; a < brClanova; a++) {

      if (max < niz[a])
         max = niz[a];

    }

    document.write("Greatest value in array is: " + max);

Usted tendrá:

    var max = Math.max.apply(null, niz);

    document.write("Greatest value in array is: " + max);

En ese caso, ni siquiera necesita el operador unario más porque Math.max se encarga de eso.

Respondido 12 Abr '13, 20:04

tratan este fuera, [Consejo: acabo de utilizar el '+' operator por arrojar el valor a number (valores de prompt.). los '+' operator regresará NaN, si el valor ingresado no se pudo convertir en un número. así que en esa situación, deberías usar isNan función para deshacerse de eso.]

  duzinaNiza = function () {
    var brClanova = prompt("Enter the number of array elements:");

    if (brClanova > 0) {
        var niz = new Array();
        var maximum;

        for (i=0; i<brClanova; i++) {
            var temp = +prompt("Enter "+ i+1 +". number:");
            if(i===0) { maximum = temp }
            else { maximum = (temp > maximum)?temp:maximum; }

        }

        alert("Greatest value in array is: " + maximum);   
    }
}

Respondido 12 Abr '13, 20:04

@MiljanPuzović ups, enlace erróneo, ahora funciona como esperabas. De todos modos obtuviste tu respuesta. :) - Rajaprabhu Aravindasamy

No necesita parseInt: si resta cadenas que se pueden convertir en números, se convierten. Entonces puedes restar el máximo del siguiente número y ver si deja un resto.

Además, parseInt destruirá los decimales, por lo que no sabrá que 1.5 es mayor que 1.

Tu comentario usó los caracteres incorrectos: `('\' debería ser '//')

function duzinaNiza(){
    var brClanova= prompt("Enter the number of array elements:");
    if(brClanova>0){
        var niz= new Array();
        for(var i= 0;i<brClanova;i++){
            var redniBr= i+1;
            niz[i]= prompt("Enter "+ redniBr +". array number:");
            //prompt for geting each array element
        }
        var maximum= niz[0];
        for(var a= 0;a<brClanova;a++){
            if(niz[a]-maximum>0){
                maximum= niz[a];
            }
        }
        document.write("Greatest value in array is: " + maximum);
    }
}

Respondido 12 Abr '13, 21:04

Gracias. Conozco los caracteres de los comentarios, he editado el código sobre la marcha para pegar el código aquí. El código original no tenía comentarios y estaba en idioma serbio :) - Miljan Puzovic

Código modificado JSFDDLE

function duzinaNiza() {
    var brClanova = prompt("Enter the number of array elements:")*1; //convert string to intger

    if (brClanova > 0) {
        var niz = new Array();

        for (i=0; i<brClanova; i++) {
            var redniBr = i+1;
            niz[i] = prompt("Enter "+ redniBr +". array number:")*1;
            // prompt for geting each array element
        }


        var maximum = niz[0];

        for (a=0; a<brClanova; a++) {

            if (maximum < niz[a]) {
                maximum = niz[a];
            }
        }

        document.write("Greatest value in array is: " + maximum);   
    }
}

Respondido 12 Abr '13, 20:04

Multiplicar una cadena por 1 para convertirla en un número entero no es la forma de hacerlo: tom

@Tom, hay muchas personas que no estarían de acuerdo. Esto siempre ha funcionado. 'Dado que la multiplicación asume números, JavaScript convierte la cadena en un número, si es posible. Si eso no es posible, el resultado es NaN.' ver: quirksmode.org/js/strings.html - GitaarLAB

@Tom para un artículo, ¿cuál sería la diferencia? No creo que el rendimiento deba ser un criterio para no usar *1. - Anoop

Sé que todos los navegadores son compatibles con parseInt. Pero todos los navegadores también admiten la multiplicación. Lo uso con frecuencia y nunca tuve ningún problema de este tipo. Anoop

Mi enlace jsperf estaba destinado principalmente a brindar una descripción general ponderada de la velocidad. @Tom, me tienes intrigado. Podrías por favor, especifique un navegador (versión) donde esto no funciona? Acabo de comprobar el estándar ES5 y hay especificado que valores izquierda y derecha a la * operador en un MultiplicativeExpression se pasan automáticamente ToNumber (ES5 seg 11.5). Así que también parece estar dentro de las especificaciones. - GitaarLAB

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.