Estructura repititiva while

Iniciado por TickTack, 30 Agosto 2018, 11:47 AM

0 Miembros y 3 Visitantes están viendo este tema.

TickTack

Hola a todos,

Yo quería ingresar un conjunto de n alturas de personas por teclado y luego mostrar la altura promedio de las personas. Para eso hice este código:


import java.util.Scanner;

public class Clase1 {
public static void main(String[] ar) {
Scanner teclado = new Scanner(System.in);
int cantidad;
System.out.print("Escriba la cantidad de alturas a ingresar: ");
cantidad = teclado.nextInt();
int x = 1;
float altura, promedio;
float alturas = 0;
while (x <= cantidad) {
System.out.print("Altura: ");
altura = teclado.nextFloat();
alturas = alturas + altura;
}
promedio = alturas / cantidad;
System.out.print("La cantidad promedio de alturas de personas es: " + promedio);
}
}


Lo que pasa es que cuando ingreso 2.02 me larga la excepción java.util.InputMismatchException. Y no entiendo porque se me larga esta excepción porque creí que 2.02 era un float.

Alguien sabe a que se debe esta excepción?


Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Serapis

#1
Probablemente el problema radique en el carácter separador de decimales...

Usa locale (con Scanner), para averiguar que idioma está colocado (seguramente el español), usa uselocale, para cambiarlo.

También con getDecimalSeparator,  que te señala qué carácter estás usando actualmente como separador decimal, puedes saber rápidamente si es ese el problema...



Para cuestiones simples con el lenguaje, antes revisa la documentación del lenguaje...
https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextFloat()

TickTack

Hola NEBIRE,

El carácter del idioma actualmente colocado que estoy usando actualmente como separador decimal es ,.

Pero al ingresar 2,02 me sigue largando el mismo error... :(

Adonde esta el problema?

Gracias y saludos

PD.: Ya revise la documentación pero no me ayudó mucho :(
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Serapis

Pero has usado "getDecimalSeparator", para saber cual es?.
Es que una cosa es que tu creas que es tal o cual y otra el que realmente se usa...
todo esto está relacionaco con "Locale".

El caso es que la documentación es muy específica y clara...
Citar
public float nextFloat()

Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that matched.

Los modos por los que no pueda ser parseado en un float, es que no los delimitadores no sean los correctos (al margen de la entrada tenga valores no numéricos o esté vacía o se alcance el final), o esté fuera de rango por el tipo... vamos me inclino por el fallo en los separadores si insistes en que has entrado "2.02" ó "2,02" ó "2'02"...

Citar
public class InputMismatchException
extends NoSuchElementException

Thrown by a Scanner to indicate that the token retrieved does not match the pattern for the expected type, or that the token is out of range for the expected type.

El caso es que sin saber el locale que tienes indicado ni los separadores no se puede adivinar exactamente el problema. El genérico es lo que te he señalado.

prueba el siguiente código y dime si te funciona, y espero que esto solvente tus dudas...
Código (java) [Seleccionar]

string valor = "9.3 * 3.0 vaya calor";
string resultado = valor + "= 27.9";

//lo tomamos de un string, en vez del teclado, para asegurarme que el error no esté en lo que entres...
Scanner scanKb = new Scanner(resultado);
scanKb.useLocale(Locale.US); // el de USA que usan punto...

// Ahora observa que como la entrada está 'sucia'... debemos ir saltando...
while (scanKb.hasNext()) {
   scanKb.next();  //obtenemos un token... (el separador por defecto de tokens es el espacio).
       
   if (scanKb.hasNextFloat()) { //si no puede ser parseado como un número flotante, pasamos por alto...
       System.out.println(scanKb.nextFloat());
   }
}

scanKb.close();


Y debería escupir estos valores:
9.3
3.0
27.9

aleman026

tenes que definir la variable altura y alturas como Double.
y colocar teclado.nextDouble()

TickTack

Hola NEBIRE,

Citar
vamos me inclino por el fallo en los separadores si insistes en que has entrado "2.02" ó "2,02" ó "2'02"...

Si. Yo he entrado 2.02. No es un float eso? Entonces, que es?

Mi locale es: de_DE
Yo use getDecimalSeparator. Y mi separador es: ,.

Probé tu código y me larga entre otros los errores que string no puede estar resuelto a un tipo.

Gracias y saludos


Hola aleman026,

Lo que tu dices ya lo probé y me larga el mismo error que me larga el programa cuando tengo las variables definidas como float y colocado teclado.nextFloat().

Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Eleкtro

Parece un problema del símbolo de separador de decimales, como ya han dicho.

Sigue las directrices de este ejemplo de aquí abajo (que es basicamente lo mismo que puedes ver en el ejemplo de NEBIRE):


saludos








Serapis

CitarMi locale es: de_DE

Eso es alemán (Deutsche)...

rub'n

#8
Hola,

muestra el codigo que tienes actual y con geshi por favor, con esta linea expuesta por NEBIRE deberia aceptar el punto

Código (java) [Seleccionar]
teclado.useLocale(Locale.US);

Código (java) [Seleccionar]
public class TestForo {

   private static final Scanner TECLADO = new Scanner(System.in);

   public TestForo() {

       int cantidad;

       TECLADO.useLocale(Locale.US); // Habilita la lectura del .

       System.out.print("Escriba la cantidad de alturas a ingresar: ");
       cantidad = TECLADO.nextInt();

       int x = 1;
       float altura, promedio;
       float alturas = 0;

       while (x <= cantidad) {
           System.out.print("Altura: ");
           altura = TECLADO.nextFloat(); //
           alturas = alturas + altura;
           x++; //añadiendo contador con postIncremento
       }

       promedio = alturas / cantidad;
       System.out.print("La cantidad promedio de alturas de personas es: " + promedio);

   }
    public static void main(String ...blablablg) {
     new TestForo();
   }

}


Outpud:

Código (bash) [Seleccionar]
Escriba la cantidad de alturas a ingresar: 3
Altura: 2.32
Altura: 1.80
Altura: 1.75
La cantidad promedio de alturas de personas es: 1.9566666
Process finished with exit code 0


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

TickTack

Hola Elektro,

Al link que posteaste lo entendi que tengo que escribir Float en mayusculas.

Al primer float lo puedo escribir en mayusculas. Pero al segundo no porque me larga el
siguiente error: Tipo desajuste: No se puede convertir de int a Float.

Gracias y saludos


Hola rub'n,

De alguna manera no puedo correr tu programa. Es por eso que tuve que modificar el
codigo para que tuviera la posibilidad de correrlo. Porque cuando le daba en el
boton para correr me corria otro proyecto.


import java.util.Locale;
import java.util.Scanner;

public class TestForo {
public static void main(String[] ar) {
private static final Scanner TECLADO = new Scanner(System.in);

public TestForo() {
int cantidad;

       TECLADO.useLocale(Locale.US); // Habilita la lectura del .

       System.out.print("Escriba la cantidad de alturas a ingresar: ");
       cantidad = TECLADO.nextInt();

       int x = 1;
       float altura, promedio;
       float alturas = 0;

       while (x <= cantidad) {
           System.out.print("Altura: ");
           altura = TECLADO.nextFloat(); //
           alturas = alturas + altura;
           x++; //añadiendo contador con postIncremento
       }

       promedio = alturas / cantidad;
       System.out.print("La cantidad promedio de alturas de personas es: " + promedio);
}
}
}


Y me larga los errores que se pueden ver en la imagen:


Gracias y saludos

Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."