Autor Tema: Problema con un arreglo al devolver 5 valores maximos de un ramdom  (Leído 1951 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado navas

  • Trade Count: (0)
  • The newbie
  • *
  • Thank You
  • -Given: 1
  • -Receive: 0
  • Mensajes: 2
Me gustaria me ayudaran con este codigo ya que no veo como resolver el problema planteado aca.

Citar
Ejercicio 3
Elaborar un método que imprima los cinco elementos más grandes de un
arreglo de n enteros

Yo tengo este codigo que hasta ahorita me duelve 2 valores pero no encuentro como hacer para que me devuelva 5 valores distintos y ordenados de mayor a menor.

Código: (Java) [Seleccionar]
/*
 * Ejericio 3
 */
package s9_ejercicio3;

/**
 *
 * @author USUARIO
 */

import java.util.Scanner;

public class S9_Ejercicio3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    Scanner teclado=new Scanner(System.in);
    int longitud=0, v1=0, v2=0, v3=0, v4=0, v5=0;
    int arreglo[] = new int [longitud];
   
     System.out.print("Longitud del arreglo: ");
     longitud = teclado.nextInt();
     arreglo = new int [longitud];
     
      for (int i=0; i<arreglo.length; i++)
       {
          arreglo[i] = 1 + (int)(Math.random()*100);
         }// fin de for
        Sort(arreglo);
        System.out.println("");
       for (int i=0; i<arreglo.length; i++)
       {
             
           //if (v1!=arreglo[i])
           if (arreglo[i] > v1)
           {
               v1=arreglo[i];
               
           }
           if (arreglo[i] < v1)
               {
                   
                   v2=arreglo[i];
               }
            if (arreglo[i]<v1)
            {
                v3=arreglo[i];
            }
           
           // if (v2<v1)
           /*{   
                   v2=arreglo[i];
           }               
           */
       
           
           System.out.println("Los valores mas altos son: "+v1+" "+v2+" "+v3+" "+v4+" "+v5);
   
       
       }// fin de for
       
     
    }//fin de main
   
     public static void Sort(int [] num)
    {
        int j;
        boolean flag = true;
        int temp;
       
        while (flag)
        {
         flag = false;
         for (j=0; j<num.length -1; j++)
         {
             if (num [j] < num[j+1])
             {
                 temp = num[j];
                 num[j] = num[j+1];
                 num[j+1] = temp;
                 flag = true;
             }
         }
        }
       
    }//fin de sort
}

Esto es lo que me devuelve

Citar
Longitud del arreglo: 5

Los valores mas altos son: 96 0 0 0 0
Los valores mas altos son: 96 91 91 0 0
Los valores mas altos son: 96 68 68 0 0
Los valores mas altos son: 96 48 48 0 0
Los valores mas altos son: 96 7 7 0 0
BUILD SUCCESSFUL (total time: 3 seconds)

Gracias por la AYUDA!!!
« Última Modificación: septiembre 14, 2013, 02:21:16 pm por navas »

Desconectado JaiMe

  • Global Moderator
  • Trade Count: (0)
  • The Communiter-
  • *
  • Thank You
  • -Given: 43
  • -Receive: 413
  • Mensajes: 1485
  • λ | h+
Re:Problema con un arreglo al devolver 5 valores maximos de un ramdom
« Respuesta #1 : septiembre 15, 2013, 09:32:43 am »
Como esperas imprimir los 5 resultados mayores cuando prácticamente "machacas" el array que previamente fue ordenado con la función sort y haces comparaciones innecesarias e incompletas? Si te fijas bien, estas tratando de ordenar los valores otra vez adentro del for loop pero nunca las terminas y tampoco asignas valores a v4 y v5.

Lo unico que te falta hacer es imprimir los primeros 5 resultados del arreglo

Código: [Seleccionar]
for (int i=0; i<5; i++){
      System.out.print(" " + arreglo[i]);
}

Aqui te dejo una version que funciona:



pd: lo unico que necesitarías es una manera para evitar valores duplicados, esto lo podrias hacer cuando generas el arreglo de valores random.
Follow members gave a thank to your post:
"Unless you try to do something beyond what you have already mastered, you will never grow."
― Ralph Waldo Emerson

Desconectado navas

  • Trade Count: (0)
  • The newbie
  • *
  • Thank You
  • -Given: 1
  • -Receive: 0
  • Mensajes: 2
Re:Problema con un arreglo al devolver 5 valores maximos de un ramdom
« Respuesta #2 : septiembre 16, 2013, 12:17:38 am »
Gracias tenias razón en ese código no completaba las comparaciones, de todas formas me sirvió de mucho.

Desconectado JaiMe

  • Global Moderator
  • Trade Count: (0)
  • The Communiter-
  • *
  • Thank You
  • -Given: 43
  • -Receive: 413
  • Mensajes: 1485
  • λ | h+
Re:Problema con un arreglo al devolver 5 valores maximos de un ramdom
« Respuesta #3 : septiembre 16, 2013, 07:55:04 am »
Gracias tenias razón en ese código no completaba las comparaciones, de todas formas me sirvió de mucho.

Al parecer estabas haciendo las comparaciones extra para evitar valores duplicados. Java tiene estructuras para valores únicos que te pueden servir cuando estes programando para el mundo real, pero por el momento te toca hacer las cosas manualmente por que estas aprendiendo.

Anteriormente te dije que podias evitar valores duplicados cuando generas el arreglo de valores random, pero esto no es buena idea a menos que sea un requerimiento construir tu propia estructura para valores unicos. Lo que podes hacer es evitar imprimir valores duplicados y viendo bien tu código eso es lo que querias hacer luego de ordenar el arreglo. Como el arreglo ya esta ordenado hacer la comparacion es simple, solamente compara el elemento en el indice i contra contra el siguiente i+1 mientras agregas los valores unicos a un nuevo arreglo. Nota: cuando necesitas variables como v1, v2, v3 ... v10 es mejor usar un arreglo.

Aqui te dejo un ejemplo:



Nota el uso de los keywords break y continue mientras recorro el arreglo ordenado en la función ImprimirMayores. En los resultados nota que el arreglo original tiene 2 100s, 2 94s y 2 92s, pero la función anterior no imprime duplicados.

Tambien, en lugar de usar Arrays.toString para imprimir arreglos como en mi ejemplo, utiliza un for loop.
"Unless you try to do something beyond what you have already mastered, you will never grow."
― Ralph Waldo Emerson