SumaPares { public static void main(String[] args) { int unValor; int suma = 0; Scanner objScan = new Scanner(System.in); String line; while(objScan.hasNextLine()) { line = objScan.nextLine(); unValor = Integer.valueOf(line); if( (unValor % 2 ) == 0) { suma = suma + unValor; } } System.out.println("Suma de los valores pares es: " + suma); } } Q: Usa una estructura repetitiva A: Sí, un while Q: Por qué usa un bucle while A: Para dar solución a leer y tratar “n” valores de entrada (desde stdin) Q: Qué resuelve A: Obtener la suma de todos los valores pares suministrados
cuantos valores pares suma A: n valores, n significa, que pueden ser ninguno, dos, cinco, noventa, *aquellos que se den* Q: Y, hay que indicar de alguna forma cuántos se van a dar A: No; se acuerda que cuando el programa lea EOF, se acabaron, no hay más. Q: Entonces la estructura repetitiva while tiene como condición ‘mientras haya datos por leer’ A: Si Q: Cómo planteamos en Java, usando un objeto Scanner la condición en el while “haya datos” A: método ‘hastNextLine’ sería una opción, este método devuelve *falso* si se acabaron los datos OK, OK, entonces: Q: sería correcto lo siguiente (preguntamos antes de codificar, estamos aprendiendo ;-)) while(<haya datos>) { <tratamos ese dato> } A: No; casi bien, pero *no* Q: Uhhh, ohh, descolocado he quedado. Qué me falta, qué está mal¿? A: Saber que hay datos, es decir saber que hay un nuevo dato, no significa, haber leído ese dato.
el bloque while debe existir un “leer dato” entiendo yo A: Si, correcto, eso es lo que falta. Q: Finito con el siguiente código, ya puesto en java¿? while(objScan.hasNextLine()) { line = objScan.nextLine(); <más instrucciones para tratar el dato leído> } A: Si Q: Hasta aquí, quedaría claro cómo tratar n datos suministrados desde stdin. Ahora habría que aclarar el proceso para obtener la suma de los valores pares (sólo los pares, los impares se ignoran). A: No podemos pasar todavía a ese análisis, hay más que saber sobre cómo plantear el bucle repetitivo. En la próxima slide vemos un bucle while equivalente, también podríamos usarlo, pero preferimos el de la primera slide.
datos y también leemos A: Exacto, readLine() método de la clase Console, nos sirve para leer desde stdin y si el retorno es null significa EOF (no hay más datos) Q: Vaya, estará claro en la documentación ¿? A: Indudablemente, consulta la docu de la clase Console, es lo suyo Q: Se podrá expresar como hicimos antes, poniendo el bucle más compacto y no usar break ¿? A: Seguro, procedamos import java.io.Console; public class SumaPares { public static void main(String[] args) { int unValor; int suma = 0; String line; Console cons = System.console(); line = cons.readLine(); while(line != null) { unValor = Integer.valueOf(line); if( (unValor % 2 ) == 0) { suma = suma + unValor; } line = cons.readLine(); } System.out.println("Suma de los valores pares es: " + suma); } } Q: Veo una lectura antes del bucle, es necesaria ¿?
condición. Pues quedará aún más compacto, veamos… import java.io.Console; public class SumaPares { public static void main(String[] args) { int unValor; int suma = 0; String line; Console cons = System.console(); while( (line = cons.readLine()) != null ) { unValor = Integer.valueOf(line); if( (unValor % 2 ) == 0) { suma = suma + unValor; } } System.out.println("Suma de los valores pares es: " + suma); } } Q: Pues sí, lo veo debería probar, por ejemplo si no hay datos, va bien¿? A: Prueba, si no hay datos la primera vez, va bien, ya que readline devuelve null y la condición del bucle es false, con lo cual no realiza iteración ninguna.
en clase, codificando en Python, no hemos trabajado igual La estructura repetitiva la hemos planteado: Leer un dato y procesarlo mientras no se reciba una línea vacía, esto es un *return* sin caracteres. No nos han explicado más, de momento trabajamos no sobre EOF, sí, sobre línea vacía, será interesante *saber justificar* la razón.