Ein- und Ausgabe
Dauer: 45 Minuten
- Ausgaben erzeugen
- Eingaben für Programme
Ziel: Programme für Berechnungen schreiben
Am Anfang schreiben wir zunächst nur kleinere Programme. Damit aber etwas Sinnvolles oder Interessantes berechnet werden kann, benötigen wir Mechanismen, um vom Benutzer etwas zu erfragen (z. B. Zahlen oder Text) und die berechneten Werte auszugeben.
Ausgaben
Um in JavaScript etwas als Text auf dem Bildschirm auszugeben, verwenden wir meistens eine Hilfsmethode:
console.log()console.log() ergänzt die Ausgabe um einen Zeilenumbruch, d.h.
die nachfolgende Ausgabe erscheint auf der nächsten Zeile.
Mit dieser Methode kann im Prinzip „alles“ ausgeben werden: Text bzw. Strings, Zahlen, Ausdrücke, Variableninhalte, Rückgabewerte von Funktionen, usw.
Der Code im folgenden Beispiel kann angepasst werden und stellt die
Ausgaben mit console.log() automatisch unterhalb des Codes dar:
Manchmal ist es nützlich, console.log mit zwei Parametern zu
verwenden, um in der Ausgabe zusätzliche Informationen zu haben:
.('Answer to everything:', 42);
Answer to everything: 42Bemerkung: Zur console-API gibt es einen „living standard“, der noch viel mehr Möglichkeiten mit console beschreibt, sodass viele Browser und auch Node.js diese implementieren können (siehe console.spec.whatwg.org )
Ein Beispiel ist console.table, womit Arrays oder
Objekte als Tabelle angezeigt werden:
console.table([
{ city: 'Basel', temp: 7.8 },
{ city: 'Berlin', temp: 3.4 },
{ city: 'Freiburg', temp: 8.2 },
]);Folgende Ausgabe wird dargestellt:
┌─────────┬────────────┬────────┐
│ (index) │ city │ temp │
├─────────┼────────────┼────────┤
│ 0 │ 'Basel' │ 7.8 │
│ 1 │ 'Berlin' │ 3.4 │
│ 2 │ 'Freiburg' │ 8.2 │
└─────────┴────────────┴────────┘Ausgabe formatieren
In der MDN-Dokumentation zu console.log
wird beschrieben, wie mit %c Styling-Anweisungen definiert werden können:
console.log(
"This is %cMy stylish message",
"color: yellow; font-style: italic; background-color: blue;padding: 2px",
);Leider wird dies von Node.js (noch?) nicht unterstützt (funktioniert aber im Browser).
In Node.js gibt es eine API util.styleText
mit der Ausgaben Styles erhalten können:
import { styleText } from 'node:util';
const errorMessage = styleText('red', 'Error! Error!');
console.log(errorMessage);Es ist auch möglich, mehrere Styles als Array zu definieren:
import { styleText } from 'node:util';
const warnMessage = styleText(['yellow','italic'], 'Warning!');
console.log(warnMessage);Mit speziellen „ANSI escape codes“ kann die Ausgabe u.a. farbig gestaltet werden.
Mit \x1b wird eine „Escape-Sequenz“
eingeleitet, auf die dann nach [ verschiedene „Anweisungen“ zur
Formatierung folgen.
const orange = "33";
const underline = "4";
const format = "\x1b[" + orange + ";" + underline + "m";
console.log(format + "Hello orange underline!" + "\x1b[0m");
console.log("wieder ohne Formatierung");Dies ist ein überraschend mächtiges Konzept, mit dem sich nicht nur optische Formatierungen von Text darstellen lassen, sondern das auch weitere Möglichkeiten bietet wie z. B. die Cursor-Position zur Ausgabe zu setzen. Dadurch werden rein textbasierte Anwendungen optisch aufgewertet und interessanter.
Diese „ANSI escape codes“ beeinflussen die Textausgabe in Anwendungen, die in einem Terminal (Eingabeaufforderung) laufen und funktionieren auch in Strings mit Python.
Mehr zu diesen Formatierungen auf folgenden Webseiten:
Allgemeine Erläuterung und Funktionsweise:
notes.burke.libbey.me/ansi-escape-codes/
Farbsteuerung:
stackoverflow.com/questions/4842424/list-of-ansi-color-escape-sequences
Liste der escape codes:
gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
Hilfsbibliothek für farbige Ausgabe im Terminal: github.com/alexeyraspopov/picocolors
Eingabe mit readline-sync
Um die Eingabe von der Tastatur einfacher zu handhaben, installieren wir eine Hilfsbibliothek namens
readline-sync.
Vorbemerkung: Die Bibliothek readline-sync ist ein öffentliches Archiv auf GitHub und wird
nicht mehr weiterentwickelt. Dennoch verwenden wir sie hier zu Beginn, da sie einfach, stabil und relativ
weit verbreitet ist. Wir nutzen sie hier, um die Eingabe von der Tastatur zu vereinfachen.
Leider ist die Dokumentation von readline-sync veraltet (z. B. require statt import). Für die Verwendung von readline-sync
im eigenen Code kann es hilfreich sein, KI bzw. GitHub Copilot zu
fragen — vermeiden Sie jedoch die Generierung von Lösungen!
Um readline-sync zu installieren, müssen wir zunächst das Projekt initialisieren. Dazu das Terminal in VS Code öffnen und folgenden Befehl ausführen:
npm init -y→ Hierdurch wird die Datei package.json erzeugt.
Dann readline-sync installieren:
npm install readline-syncDadurch wird readline-sync heruntergeladen und installiert (siehe node_modules und package.json).
In package.json ggf. folgenden Eintrag hinzufügen, um
eine lästige Warnung bei Ausführung des Programms zu unterbinden:
"type": "module",Mit npm (Node Package Manager) können Bibliotheken
mit fertigem Code installiert werden. Dazu wird die
Bibliothek in einem Verzeichnis node_modules im
Projekt abgelegt und kann dann im eigenen Code
verwendet werden. In package.json wird die
Bibliothek als Abhängigkeit eingetragen.
JavaScript hat viele Bibliotheken, die für verschiedene
Zwecke in Projekten mit npm installiert werden können.
Jede Programmiersprache hat eine Möglichkeit, Bibliotheken zu installieren und zu verwenden. Hier gibt es einige Unterschiede.
Nun kann readline-sync in einem Programm verwendet werden:
import { question } from 'readline-sync';
let name = question("Name eingeben: ");Mit import können wir aus der Bibliothek oder Modulen (anderen Dateien)
Funktionen laden. In diesem Fall laden wir die Funktion question aus der
Bibliothek readline-sync. Dazu werden wir später noch mehr erfahren. Diese
Import-Anweisung sollte am Anfang des Programms stehen.
Name eingeben erscheint und es kann etwas per Tastatur
eingegeben werden.
Die Ausführung des Programms hält an, Text kann eingegeben werden
und nach Drücken von Enter/Return wird der Text der Variablen
zugewiesen (im Beispiel oben name).
Wie kann eine Eingabe einer ganzen Zahl für Berechnungen erfolgen?
import { questionInt } from 'readline-sync';
let num = questionInt("Bitte eine Zahl eingeben: ");
console.log(`Die eingegebene Zahl ist: ${num}`);Wenn questionInt mit einem String aufgerufen wird, der nicht aus
Ziffern besteht, dann wird eine Fehlermeldung ausgegeben und es
wird erneut nach einer Zahl gefragt.
Wir entwickeln gemeinsam eine Wetter-App, um die besprochenen Konzepte durch beispielhafte Verwendung zu veranschaulichen.
Es gibt bereits eine umfangreiche Version der Wetter-App auf GitHub unter https://github.com/behrends/weather-node . Wir werden in den nächsten Terminen Schritt für Schritt eine ähnliche Anwendung entwickeln.
Zunächst verwenden wir nur Variablen und Konstanten, um einen gewünschten Ort über die Tastatur einzulesen und eine zufällige Temperatur für den Ort anzuzeigen:
Willkommen zur Wetter-App!
Für welche Stadt willst du das Wetter wissen? Basel
Temperatur in Basel um 16:37:16: 2 GradWir könnten die Temperatur in blauer Textfarbe anzeigen
und den Umgang mit Date kurz besprechen.
In den folgenden Lektionen wird gemeinsames Live Coding an der Wetter-App durch blaue Textboxen mit diesem Emoji beschrieben: 👨🏻💻
Bemerkungen
In einer späteren Lektion finden sich Infos zu weiteren nützlichen Hilfsbibliotheken.
Leute mit Windows-Rechnern berichten davon,
dass die Eingabe von Umlauten in cmd.exe
in Node.js problematisch ist.
Dies kann ggf. dadurch behoben werden, dass auf UTF-8 umgestellt wird:
chcp 65001