0

Cuando ejecuto el programa me da valor mínimo = 0, el valor máximo me lo hace correctamente, AYUDA!

import java.util.Scanner;
import java.lang.*;
class EstadisticaBasica{

    private int numero;
    private static Scanner sc = new Scanner(System.in);

    public void setNumero(){
        numero=sc.nextInt();
    }

    public void valorMaximo(){

        int i;
        int cont=0;
        for(i=0;i<10;i++){

            System.out.print("Introduce un valor: ");
            setNumero();

            cont=Math.max(numero, cont);    
        }

        System.out.println("El valor maximo de los 10 valores es: "+cont);
    }

    public void valorMinimo(){

        int cont=0;
        int i;
        for(i=0;i<10;i++){

            System.out.print("Introduce un valor: ");
            setNumero();

            cont=Math.min(numero, cont);
        }

            System.out.println("El valor minimo de los 10 valores es: "+cont);
    }

    public static void main(String[] args) {
        EstadisticaBasica a = new EstadisticaBasica();
        a.valorMaximo();
        a.valorMinimo();
    }
}

Cuando ejecuto el programa me da valor mínimo = 0, el valor máximo me lo hace correctamente, AYUDA!

toledano
  • 5,055
  • 9
  • 33
  • 59
David
  • 9
  • 4
  • 1
    Hola bienvenido. Por favor cambia la imágen por el código para que podamos ayudarte mejor. – Legna Nov 01 '17 at 14:13
  • 2
    David has de saber que aquí un código vale más que mil imágenes. Si puedes edita tu pregunta, borrando la imagen y poniendo el texto del código. Es más fácil para ti y para nosotros y es más útil. Ahora mismo desde el teléfono es imposible analizar tu código. Tenlo en cuenta para futuras preguntas. – A. Cedano Nov 01 '17 at 14:15
  • ¿Has tratado de razonar el problema? ¿Por qué te da 0? ¿Y que te indica esto en cuanto a cómo solucionar el problema? – sstan Nov 01 '17 at 14:25

2 Answers2

1

Estoy de acuerdo con el principio de la respuesta de @Orz, o sea de solo efectuar la comparación del Math.Min a partir del segundo número.

Pero no me gusta el uso de variables globales. No hay necesidad de hacer esto y fácilmente puede introducir defectos díficiles de encontrar. (Ver: ¿Por qué es considerado una mala práctica utilizar variables globales?).

Me parece mucho más sencillo y seguro algo de este estilo:

public void valorMinimo() {
    int cont = 0;
    for (int i = 0; i < 10; i++) {
        System.out.print("Introduce un valor: ");
        int numero = sc.nextInt();

        cont = i == 0 ? numero : Math.min(numero, cont);
    }

    System.out.println("El valor minimo de los 10 valores es: " + cont);
}    

Y aunque tu método para el máximo aparentemente funciona bien, valdría la pena seguir el mismo patrón en ese método también. Porque si el usuario te entra puros números negativos, por ejemplo, entonces también vas a tener un problema.

sstan
  • 16,591
  • 2
  • 21
  • 45
  • Tienes razón con la variable global, simplemente es un parche para que funcione de una manera rápida y fácil de enteder. – Orz Nov 01 '17 at 14:47
  • No entiendo esta parte cont = i == 0 ? numero : Math.min(numero, cont); – David Nov 01 '17 at 14:50
  • @Orz: Es más que eso. ¿Que sucedería si intentaras ejecutar el método `valorMinimo()` una segunda vez? ¿En qué estado estaría la variable `first`? Es mejor evitar esa clase de defecto sutil. – sstan Nov 01 '17 at 14:50
  • 1
    @David: El `?:` se llama *ternery operator* (no sé cómo se dice en español). En este caso, es una forma mas corta de escribir: `if (i == 0) cont = numero; else cont = Math.min(numero, cont);` – sstan Nov 01 '17 at 14:53
  • @sstan first estaría en false – Orz Nov 01 '17 at 15:05
  • @Orz el camino corto por lo general suele terminar siendo larguísimo. Sugeriría que evites recomendar malas prácticas en nombre de la facilidad. Saludos. – A. Cedano Nov 01 '17 at 15:08
  • 1
    @sstan Muy parecido, `Operador ternario`. – Jose Hermosilla Rodrigo Nov 01 '17 at 15:22
  • Gracias @Jose.. – sstan Nov 01 '17 at 15:31
  • @A.Cedano siguiendo el ejemplo de las malas prácticas he admitido que no es una buena práctica, pero también me he leido [¿Cómo escribo una buena respuesta?](https://es.stackoverflow.com/help/how-to-answer) y mi respuesta **Contesta a la pregunta** por lo tanto creo que es el que pregunta el que debe aceptarla o no, sabiendo los riesgos que tiene una variable global... – Orz Nov 01 '17 at 16:43
0

Estás comparando en cont=Math.min(numero, cont) y cont lo inicializas a 0, por lo tanto es el valor mínimo.

Deberías coger el primer número que te den y ponerlo como el mínimo y después comparar los siguientes con ese, si ya lo comparas con 0, este será el menor posible.

Yo haría algo así

Inicializa first a true al principio

import java.util.Scanner;
import java.lang.*;
class EstadisticaBasica{

private int numero;
private boolean first =true;
private static Scanner sc = new Scanner(System.in);

public void setNumero(){
    numero=sc.nextInt();
}

public void valorMaximo(){

    int i;
    int cont=0;
    for(i=0;i<10;i++){

        System.out.print("Introduce un valor: ");
        setNumero();

        cont=Math.max(numero, cont);    
    }

    System.out.println("El valor maximo de los 10 valores es: "+cont);
}

public void valorMinimo(){

    int cont=0;
    int i;
    int minimoActual;
    for(i=0;i<10;i++){

        System.out.print("Introduce un valor: ");
        setNumero();

        if (first){
            setNumero();
            minimoActual = numero;
            first=false;
        } else {
            minimoActual=Math.min(numero, minimoActual);
        }
    }

        System.out.println("El valor minimo de los 10 valores es: "+cont);
}

public static void main(String[] args) {
    EstadisticaBasica a = new EstadisticaBasica();
    a.valorMaximo();
    a.valorMinimo();
}
}
Orz
  • 433
  • 3
  • 14