Zum Inhalt
wannacode

Eingabe und Ausgabe

Kurz gesagt: Die Eingabe ist der Text, den ein Programm von der Tastatur liest: In Java liest du ihn mit Scanner, Integer.parseInt wandelt ihn in eine Zahl um, und printf zeigt Zahlen in einem Format.

Problem

Das Programm kennt nur einen Namen

Das Programm begrüßt die Kundin mit Namen:

String name = "Maria";
System.out.println("Hallo, " + name + "!");
Ausgabe
Hallo, Maria!

Es funktioniert, aber es begrüßt alle als Maria. Der Name steht im Code. Für jede neue Kundin musst du das Programm ändern und neu starten. Du willst, dass das Programm selbst fragt.

Die Idee

Von der Tastatur lesen

Wenn das Programm liest, hält es an und wartet. Die Person tippt und drückt Enter. Was sie tippt, ist die Eingabe des Programms.

Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Wie heißt du? ");
String name = in.nextLine();
System.out.println("Hallo, " + name + "!");
}
}
Eingabe
Maria
Ausgabe
Wie heißt du? Hallo, Maria!

In Java gibt es zum Lesen einen Helfer: Scanner. Die Zeile import java.util.Scanner; ganz oben sagt, woher er kommt. Scanner in = new Scanner(System.in); erzeugt ihn und verbindet ihn mit der Tastatur (System.in). Danach liest in.nextLine() eine Zeile, bis Enter.

Scanner ist ein Objekt, und new erzeugt ein Objekt. Was das bedeutet, lernst du im Modul „Klassen und Objekte“. Vorerst gehören diese zwei Zeilen zur Hülle jedes Programms, das liest. Später in den Lektionen zeigen wir die Zeile mit import nicht mehr.

Eingabe und Ausgabe sind hier getrennt gezeigt. In der Konsole erscheint der Name dort, wo du ihn tippst: nach „Wie heißt du? “. Deshalb steht die Frage mit print: Die Antwort soll in derselben Zeile stehen.

Genauer, für Neugierige
  • Ein Scanner reicht für das ganze Programm. Erzeuge ihn einmal, am Anfang.

Problem

12 + 30 = 1230

Der Kassierer gibt zwei Zahlungen ein, 12 € und 30 €. Das Programm soll die Gesamtsumme zeigen:

Scanner in = new Scanner(System.in);
String first = in.nextLine();
String second = in.nextLine();
String total = first + second;
System.out.println("Gesamt: " + total + " €");
Eingabe
12
30
Ausgabe
Gesamt: 1230 €

Statt 42 kam 1230 heraus. Das Programm hat sich nicht verrechnet. Es hat überhaupt nicht gerechnet.

Die Idee

Vom Text zur Zahl

Was die Person auch tippt, nextLine() gibt Text zurück. „12“ und „30“ sind zwei Texte, und + zwischen Texten klebt sie zusammen. Um zu rechnen, wandle den Text in eine Zahl um:

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("Gesamt: " + total + " €");
Eingabe
12
30
Ausgabe
Gesamt: 42 €

Text in einen Wert eines anderen Typs umzuwandeln heißt Parsen (parse).

  • Integer.parseInt(...) liefert einen int.
  • Double.parseDouble(...) liefert einen double.
  • Für die anderen Typen gibt es dasselbe: Long.parseLong, Boolean.parseBoolean und so weiter.

Die Summe hier ist die erste Rechnung im Kurs. Subtraktion, Multiplikation und Division kommen in der nächsten Lektion.

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("Gesamt: " + total + " €");
Schritt für Schritt, in Worten
  1. Die Person tippt 12 und Enter. nextLine() gibt den Text "12" zurück, keine Zahl.
  2. Integer.parseInt wandelt den Text in die Zahl 12 um. Sie kommt in first.
  3. 30 nimmt denselben Weg: Text, Parsen, eine Zahl in second.
  4. Jetzt addiert + Zahlen: 12 + 30 = 42.
  5. Ausgegeben wird „Gesamt: 42 €“.

Scanner kann auch direkt eine Zahl lesen: in.nextInt() oder in.nextDouble(). Dann dürfen die Zahlen auch in einer Zeile stehen, durch ein Leerzeichen getrennt:

Scanner in = new Scanner(System.in);
int first = in.nextInt();
int second = in.nextInt();
int total = first + second;
System.out.println("Gesamt: " + total + " €");
Genauer, für Neugierige
  • Ist der Text keine Zahl (zum Beispiel „zwölf“), stoppt das Programm mit einem Fehler: NumberFormatException. Wie man so einen Fehler abfängt, siehst du im Modul „Fehler und Exceptions“.
  • Eine Falle: nextInt() liest die Zahl, aber nicht das Enter danach. Das nächste nextLine() liest den Rest derselben Zeile, also einen leeren Text:
Scanner in = new Scanner(System.in);
int age = in.nextInt();
String name = in.nextLine();
System.out.println("Name: [" + name + "]");
Eingabe
19
Maria
Ausgabe
Name: []

Der Name ist leer. Deshalb lesen wir im Kurs Zeilen mit nextLine() und wandeln sie mit Integer.parseInt um. Wenn du nextInt() nutzt, setze ein leeres in.nextLine(); vor das nächste Lesen von Text.

  • Das Dezimaltrennzeichen hängt von den regionalen Einstellungen des Computers ab. Double.parseDouble will immer einen Punkt: 3.5. in.nextDouble() folgt aber den Einstellungen und will auf einem Computer mit deutschen Einstellungen ein Komma: 3,5. Die Beispiele im Kurs nutzen einen Punkt.

Probier es aus

Wie viele Tickets?

Das Programm liest, wie viele Erwachsene und wie viele Kinder es sind.

Eingabe
2
3

Was gibt das Programm aus?

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

Die Idee

Zahlen so, wie du sie willst

In der letzten Lektion kam der Preis 49.90 als 49.9 heraus. Bei einem Preis willst du immer zwei Stellen nach dem Dezimalpunkt. Das ist formatierte Ausgabe:

String product = "Kopfhörer";
double price = 49.9;
int qty = 2;
System.out.printf("%s: %.2f €%n", product, price);
System.out.printf("%d Stück im Warenkorb%n", qty);
String label = String.format("Preis: %.2f €", price);
System.out.println(label);
Ausgabe
Kopfhörer: 49.90 €
2 Stück im Warenkorb
Preis: 49.90 €

printf gibt Text mit Platzhaltern für Werte aus. Jeder Platzhalter beginnt mit %, und die Werte kommen nach dem Text, in derselben Reihenfolge:

  • %s ist Text, %d ist eine ganze Zahl;
  • %.2f ist eine Kommazahl mit genau 2 Stellen nach dem Punkt;
  • %n ist eine neue Zeile (printf wechselt nicht von selbst in eine neue Zeile).

String.format macht dasselbe, gibt aber nichts aus. Es gibt den Text zurück. Du kannst ihn in einer Variable speichern.

Der Wert in der Variable ändert sich nicht. Das Format entscheidet nur, wie er bei der Ausgabe aussieht.

Genauer, für Neugierige
  • Tausendertrennzeichen und Ausrichten in Spalten:
double total = 1234.5;
System.out.printf("Gesamt: %,.2f €%n", total);
System.out.printf("%-10s|%8.2f%n", "Kaffee", 2.5);
System.out.printf("%-10s|%8.2f%n", "Laptop", 1299.0);
Ausgabe
Gesamt: 1,234.50 €
Kaffee | 2.50
Laptop | 1299.00

, fügt ein Tausendertrennzeichen hinzu. Die Zahl zwischen % und dem Buchstaben ist die Breite: %8.2f belegt 8 Zeichen, rechtsbündig, und %-10s belegt 10, linksbündig.

  • Auch hier zählen die regionalen Einstellungen. Auf einem Computer mit deutschen Einstellungen ergibt %.2f den Wert 49,90, und das Tausendertrennzeichen ist ein Punkt: 1.234,50. Die Ausgabe in den Lektionen nutzt einen Punkt.

Probier es aus

Zwei Stellen

Eine Nacht im Hotel kostet 65.5 €. Es soll „Pro Nacht: 65.50 €“ herauskommen. Was gehört in die Lücke?

System.out.printf("Pro Nacht:  €%n", price);

Probier es aus

Finde den Fehler

Das Programm fragt, wie viele Tickets es reservieren soll. Es lässt sich nicht kompilieren. In welcher Zeile ist der Fehler?

Wähle die Zeile mit dem Fehler.

Übung

Programme, die fragen

Löse die Aufgaben in deinem Editor. Die Eingabe ist eine Zeile pro Wert. Gib keine Fragen wie „Gib einen Namen ein:“ aus, damit deine Ausgabe mit dem Beispiel übereinstimmt.

1. Begrüßung mit Namen. Lies einen Namen und begrüße die Person.

Eingabe
Maria
Ausgabe
Hallo, Maria!

2. Summe zweier Zahlen. Lies zwei ganze Zahlen und gib die Rechnung aus.

Eingabe
17
25
Ausgabe
17 + 25 = 42

3. Zwei Texte in einem. Lies zwei Texte und gib sie zusammen aus, mit einem Leerzeichen dazwischen.

Eingabe
Veliko
Tarnovo
Ausgabe
Veliko Tarnovo

4. π mit zwei Stellen. Speichere π als 3.14159265358979 in einer Variable und gib es mit zwei Stellen nach dem Punkt aus. Den fertigen Wert Math.PI gibt es in der nächsten Lektion.

Ausgabe
3.14

Weitere Aufgaben

  • Alter. Lies einen Namen und ein Alter (eine ganze Zahl) und gib „Maria ist 19 Jahre alt.“ aus.
  • Eine Visitenkarte von der Tastatur. Lies einen Namen, einen Beruf und eine Telefonnummer und gib damit die Visitenkarte aus der Lektion „Dein erstes Programm“ aus.
  • Ein Preis mit zwei Stellen. Lies einen Preis als Kommazahl und gib ihn mit zwei Stellen und dem Eurozeichen aus: Bei der Eingabe 7.5 ist die Ausgabe Preis: 7.50 €.
  • Summe zweier Preise. Lies zwei Preise als Kommazahlen und gib ihre Summe mit zwei Stellen aus: Bei der Eingabe 12.4 und 3.15 ist die Ausgabe Gesamt: 15.55 €.

Test

Teste dich

1. Was gibt in.nextLine() zurück?
2. Du liest die Texte "12" und "30". Was ergibt first + second?
3. Was macht Integer.parseInt("25")?
4. int a = 2; int b = 3; Was gibt "Summe: " + a + b aus?
5. Wie gibst du 7.5 als 7.50 aus?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·