Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Analizando uso de una iteración sobre stdin. Turno a Java

Analizando uso de una iteración sobre stdin. Turno a Java

Paulino Huerta

October 22, 2019
Tweet

More Decks by Paulino Huerta

Other Decks in Technology

Transcript

  1. Juguemos a las ​Preguntas​ (Q, de query) y Respuestas​ (A,

    de answer) Si es necesario, lee más de una vez estas slides. Debes entender, todo lo que se trata aquí, no te permitas ni una sóla duda.
  2. #Tratar n entradas desde stdin JAVA ​import java.util.Scanner; public class

    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
  3. #Analicemos el código de la anterior slide Q: De cuántos,

    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.
  4. #Terminando primera parte del análisis Q: OK, visto, corrijo, en

    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​.
  5. import java.util.Scanner; public class SumaPares { public static void main(String[]

    args) { int unValor; int suma = 0; Scanner objScan = new Scanner(System.in); String line; while(true) { if(objScan.hasNextLine()) { line = objScan.nextLine(); unValor = Integer.valueOf(line); if( (unValor % 2 ) == 0) { suma = suma + unValor; } } else { break; } } System.out.println("Suma de los valores pares es: " + suma); } }
  6. #Analizamos la repetitiva while usando una instancia de la clase

    Console Q: También se puede leer datos desde stdin mediante un objeto Console A: Por supuesto import java.io.Console; public class SumaPares1 { public static void main(String[] args) { int unValor; int suma = 0; String line; Console cons = System.console(); while(true) { if((line = cons.readLine()) != null) { unValor = Integer.valueOf(line); if( (unValor % 2 ) == 0) { suma = suma + unValor; } } else { break; } } System.out.println("Suma de los valores pares es: " + suma); } }
  7. Q: Veo que con un sólo método comprobamos si hay

    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 ¿?
  8. A: En este caso podemos prescindir de ella, retocando la

    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.
  9. #Nos queda una reflexión más, antes de terminar De momento

    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.