Ir al contenido
wannacode

Entrada y salida

En resumen: La entrada es el texto que el programa lee desde el teclado: en Java se lee con Scanner, se convierte en número con Integer.parseInt, y printf muestra los números con un formato.

Problema

El programa solo conoce un nombre

El programa saluda al cliente por su nombre:

String name = "María";
System.out.println("¡Hola, " + name + "!");
Salida
¡Hola, María!

Funciona, pero saluda a todos como María. El nombre está escrito en el código. Para cada cliente nuevo tienes que cambiar el programa y ejecutarlo otra vez. Quieres que el programa pregunte por sí mismo.

La idea

Leer desde el teclado

Cuando el programa lee, se detiene y espera. La persona escribe y pulsa Enter. Lo que escribe es la entrada del programa.

Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("¿Cómo te llamas? ");
String name = in.nextLine();
System.out.println("¡Hola, " + name + "!");
}
}
Entrada
María
Salida
¿Cómo te llamas? ¡Hola, María!

En Java hay un ayudante para leer: Scanner. La línea import java.util.Scanner; de arriba dice de dónde viene. Scanner in = new Scanner(System.in); lo crea y lo conecta con el teclado (System.in). Después in.nextLine() lee una línea, hasta Enter.

Scanner es un objeto, y new crea un objeto. Qué significan lo verás en el módulo «Clases y objetos». Por ahora, estas dos líneas son parte del envoltorio de todo programa que lee. Más adelante, en las lecciones, no mostramos la línea con import.

Aquí la entrada y la salida se muestran por separado. En la consola, el nombre aparece donde lo escribes: después de «¿Cómo te llamas? ». Por eso la pregunta usa print: para que la respuesta quede en la misma línea.

Más precisamente, para curiosos
  • Un solo Scanner basta para todo el programa. Créalo una vez, al principio.

Problema

12 + 30 = 1230

El cajero introduce dos pagos, 12 € y 30 €. El programa tiene que mostrar el total:

Scanner in = new Scanner(System.in);
String first = in.nextLine();
String second = in.nextLine();
String total = first + second;
System.out.println("Total: " + total + " €");
Entrada
12
30
Salida
Total: 1230 €

En lugar de 42 salió 1230. El programa no se equivocó en la cuenta. No hizo ninguna cuenta.

La idea

De texto a número

Escriba lo que escriba la persona, nextLine() devuelve texto. "12" y "30" son dos textos, y + entre textos los pega. Para hacer cálculos, convierte el texto en número:

Scanner in = new Scanner(System.in);
int first = Integer.parseInt(in.nextLine());
int second = Integer.parseInt(in.nextLine());
int total = first + second;
System.out.println("Total: " + total + " €");
Entrada
12
30
Salida
Total: 42 €

Convertir texto en un valor de otro tipo se llama parsear (en inglés, parsing).

  • Integer.parseInt(...) da un int.
  • Double.parseDouble(...) da un double.
  • Los demás tipos tienen lo mismo: Long.parseLong, Boolean.parseBoolean, etc.

La suma de aquí es el primer cálculo del curso. La resta, la multiplicación y la división llegan en la próxima lección.

Scanner in = new Scanner(System.in);
int first = Integer.parseInt(in.nextLine());
int second = Integer.parseInt(in.nextLine());
int total = first + second;
System.out.println("Total: " + total + " €");
Paso a paso, en palabras
  1. La persona escribe 12 y Enter. nextLine() devuelve el texto «12», no un número.
  2. Integer.parseInt convierte el texto en el número 12. Va a first.
  3. 30 sigue el mismo camino: texto, conversión, un número en second.
  4. Ahora + suma números: 12 + 30 = 42.
  5. Se imprime «Total: 42 €».

Scanner también puede leer un número directamente: in.nextInt() o in.nextDouble(). Entonces los números también pueden estar en una sola línea, separados por un espacio:

Scanner in = new Scanner(System.in);
int first = in.nextInt();
int second = in.nextInt();
int total = first + second;
System.out.println("Total: " + total + " €");
Más precisamente, para curiosos
  • Si el texto no es un número (por ejemplo, "doce"), el programa se detiene con un error: NumberFormatException. Cómo capturar un error así lo verás en el módulo «Errores y excepciones».
  • Una trampa: nextInt() lee el número, pero no el Enter que va después. El siguiente nextLine() lee el resto de la misma línea, que es un texto vacío:
Scanner in = new Scanner(System.in);
int age = in.nextInt();
String name = in.nextLine();
System.out.println("Nombre: [" + name + "]");
Entrada
19
María
Salida
Nombre: []

El nombre está vacío. Por eso en este curso leemos líneas con nextLine() y las convertimos con Integer.parseInt. Si usas nextInt(), pon un in.nextLine(); vacío antes de la siguiente lectura de texto.

  • El separador decimal depende de la configuración regional de la computadora. Double.parseDouble siempre quiere un punto: 3.5. Pero in.nextDouble() sigue la configuración, y en una computadora configurada en español de España quiere una coma: 3,5. Los ejemplos del curso usan punto.

Pruébalo

¿Cuántas entradas?

El programa lee cuántos adultos y cuántos niños hay.

Entrada
2
3

¿Qué imprimirá el programa?

Scanner in = new Scanner(System.in);
int adults = Integer.parseInt(in.nextLine());
int children = Integer.parseInt(in.nextLine());
System.out.println("Entradas: " + adults + children);
Respuesta

La idea

Los números como tú quieres

En la lección anterior, el precio 49.90 salió como 49.9. Para un precio siempre quieres dos cifras después del punto decimal. Esto es la salida con formato:

String product = "Auriculares";
double price = 49.9;
int qty = 2;
System.out.printf("%s: %.2f €%n", product, price);
System.out.printf("%d uds. en el carrito%n", qty);
String label = String.format("Precio: %.2f €", price);
System.out.println(label);
Salida
Auriculares: 49.90 €
2 uds. en el carrito
Precio: 49.90 €

printf imprime un texto con marcadores para valores. Cada marcador empieza con %, y los valores van después del texto, en el mismo orden:

  • %s es texto, %d es un número entero;
  • %.2f es un número decimal con exactamente 2 cifras después del punto;
  • %n es una línea nueva (printf no pasa a una línea nueva por sí solo).

String.format hace lo mismo, pero no imprime. Devuelve el texto. Puedes guardarlo en una variable.

El valor de la variable no cambia. El formato solo decide cómo se ve al imprimirlo.

Más precisamente, para curiosos
  • Separador de miles y alineación en columnas:
double total = 1234.5;
System.out.printf("Total: %,.2f €%n", total);
System.out.printf("%-10s|%8.2f%n", "Café", 2.5);
System.out.printf("%-10s|%8.2f%n", "Portátil", 1299.0);
Salida
Total: 1,234.50 €
Café | 2.50
Portátil | 1299.00

, añade un separador de miles. El número entre % y la letra es el ancho: %8.2f ocupa 8 caracteres, alineado a la derecha, y %-10s ocupa 10, alineado a la izquierda.

  • Aquí también importa la configuración regional. En una computadora configurada en español de España, %.2f da 49,90, y el separador de miles es un punto: 1.234,50. La salida de las lecciones usa punto decimal.

Pruébalo

Dos cifras

Una noche en el hotel cuesta 65.5 €. Quieres que salga «Por noche: 65.50 €». ¿Qué va en el espacio en blanco?

System.out.printf("Por noche:  €%n", price);

Pruébalo

Encuentra el error

El programa pregunta cuántas entradas reservar. No compila. ¿En qué línea está el error?

Elige la línea con el error.

Ejercicio

Programas que preguntan

Resuelve las tareas en tu editor. La entrada es una línea por cada valor. No imprimas preguntas como «Introduce un nombre:», para que tu salida coincida con el ejemplo.

1. Saludo por nombre. Lee un nombre y saluda a la persona.

Entrada
María
Salida
¡Hola, María!

2. Suma de dos números. Lee dos números enteros e imprime la cuenta.

Entrada
17
25
Salida
17 + 25 = 42

3. Dos textos en uno. Lee dos textos e imprímelos juntos, con un espacio entre ellos.

Entrada
Buenos
Aires
Salida
Buenos Aires

4. π con dos cifras. Guarda π en una variable como 3.14159265358979 e imprímelo con dos cifras después del punto. El valor ya listo Math.PI llega en la próxima lección.

Salida
3.14

Más tareas

  • Edad. Lee un nombre y una edad (un número entero) e imprime «María tiene 19 años.»
  • Una tarjeta de visita desde el teclado. Lee un nombre, una profesión y un teléfono e imprime con ellos la tarjeta de visita de la lección «Tu primer programa».
  • Un precio con dos cifras. Lee un precio como número decimal e imprímelo con dos cifras y el símbolo del euro: con la entrada 7.5, la salida es Precio: 7.50 €.
  • Suma de dos precios. Lee dos precios decimales e imprime su suma con dos cifras: con la entrada 12.4 y 3.15, la salida es Total: 15.55 €.

Test

Ponte a prueba

1. ¿Qué devuelve in.nextLine()?
2. Lees los textos "12" y "30". ¿Qué da first + second?
3. ¿Qué hace Integer.parseInt("25")?
4. int a = 2; int b = 3; ¿Qué imprime "Suma: " + a + b?
5. ¿Cómo imprimes 7.5 como 7.50?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·