Mini-Projekt: Trinkgeldrechner
Dauer: 45-60 Minuten
- Arithmetische Operatoren anwenden
- Vergleichs- und logische Operatoren nutzen
- Bedingungsoperator einsetzen
- Eingabe mit
readline-sync - Ausgabe mit
console.logund Template-Strings
Ziel: Bisherige Konzepte in einem kleinen Projekt anwenden
In diesem Mini-Projekt entwickeln wir schrittweise einen Trinkgeldrechner. Die Aufgaben bauen aufeinander auf und werden zunehmend anspruchsvoller.
Wichtig: Bei diesen Übungen sollen nur die bisher besprochenen Konzepte eingesetzt werden:
- Variablen und Konstanten (
let,const) - Ein- und Ausgabe (
console.log,readline-sync) - Datentypen (
number,string,boolean) - Operatoren (arithmetische, Vergleichs-, logische, Bedingungsoperator)
Insbesondere verwenden wir hier noch kein if —
für einfache Fallunterscheidungen nutzen wir den Bedingungsoperator (? :).
Zur Festigung der bisher besprochenen Konzepte sollte noch kein Coding-Agent eingesetzt werden. Ein KI-Chat kann bei Bedarf für gezielte Fragen genutzt werden — aber nicht für komplette Lösungen.
Wir erstellen eine neue Datei trinkgeld.js im Projektordner.
Nicht vergessen, readline-sync zu importieren, wenn wir
Benutzereingaben verwenden möchten.
Tipp: Da die Aufgaben aufeinander aufbauen, empfiehlt es sich,
für jede Aufgabe eine eigene Datei anzulegen (trinkgeld-1.js,
trinkgeld-2.js, …). So bleiben alle Zwischenlösungen erhalten.
Aufgabe 1: Grundberechnung (Einstieg)
Schreibe ein Programm, das:
- Einen Rechnungsbetrag vom Benutzer einliest
- Ein Trinkgeld von 10% berechnet
- Den Trinkgeldbetrag und den Gesamtbetrag ausgibt
Beispielausgabe:
Rechnungsbetrag: 50
Trinkgeld (10%): 5
Gesamtbetrag: 55Hinweis: Für die Eingabe von Zahlen mit Nachkommastellen
können wir questionFloat aus readline-sync einsetzen:
import { questionFloat } from 'readline-sync';
let input = questionFloat("Betrag: ");Aufgabe 2: Verschiedene Prozentsätze (Einstieg)
Das Programm wird so erweitert, dass es drei verschiedene Trinkgeld-Optionen berechnet und ausgibt:
- 5% (sparsam)
- 10% (normal)
- 15% (großzügig)
Beispielausgabe:
Rechnungsbetrag: 80
--- Trinkgeld-Optionen ---
Sparsam (5%): 4.00 → Gesamt: 84.00
Normal (10%): 8.00 → Gesamt: 88.00
Großzügig (15%): 12.00 → Gesamt: 92.00Tipp: Template-Strings eignen sich für eine übersichtliche Ausgabe:
console.log(`Normal (10%): ${tip10} → Gesamt: ${total10}`);Bonus: Die Ausgabe der Zahlen lässt sich auf zwei
Nachkommastellen formatieren. Dazu kann die
Methode toFixed(2) verwendet werden:
let number = 17.1919;
console.log(number.toFixed(2)); // Ausgabe: "17.19"toFixed gibt einen Text (String) zurück und rundet dabei.
Aufgabe 3: Aufteilung auf Personen (Übung)
Das Programm wird um die Möglichkeit erweitert, den Gesamtbetrag auf mehrere Personen aufzuteilen:
- Zusätzlich nach der Anzahl der Personen fragen
- Betrag pro Person berechnen (bei 15% Trinkgeld)
- Betrag pro Person ausgeben
Beispielausgabe:
Rechnungsbetrag: 120
Anzahl Personen: 4
--- Aufteilung ---
Gesamtbetrag (inkl. 15% Trinkgeld): 138.00
Betrag pro Person: 34.50Tipp: Für die Eingabe von ganzen Zahlen (ohne Nachkommastellen)
kann questionInt verwendet werden:
import { questionFloat, questionInt } from 'readline-sync';
let persons = questionInt("Anzahl Personen: ");Aufgabe 4: Service-Bewertung (Übung)
Wir nutzen den Bedingungsoperator, um basierend auf dem gewählten Trinkgeld-Prozentsatz eine Bewertung auszugeben:
- Den Benutzer nach dem gewünschten Trinkgeld-Prozentsatz fragen
- “Großzügig!” ausgeben, wenn der Prozentsatz >= 15 ist
- “Normal” ausgeben, wenn der Prozentsatz < 15 ist
Beispielausgabe:
Rechnungsbetrag: 50
Trinkgeld-Prozentsatz: 18
Trinkgeld: 9.00
Bewertung: Großzügig!Erinnerung: Der Bedingungsoperator hat folgende Struktur:
let result = condition ? valueIfTrue : valueIfFalse;Aufgabe 5: Eingabevalidierung (Vertiefung)
Mit Vergleichs- und logischen Operatoren werden die Eingaben überprüft und entsprechende Meldungen ausgegeben:
- Der Rechnungsbetrag muss größer als 0 sein
- Der Trinkgeld-Prozentsatz muss zwischen 0 und 100 liegen
- Eine Warnung ausgeben, wenn eine Eingabe ungültig ist
Beispiel für gültige Eingabe:
Rechnungsbetrag: 75
Trinkgeld-Prozentsatz: 15
Eingaben gültig: true
Trinkgeld: 11.25
Gesamtbetrag: 86.25Beispiel für ungültige Eingabe:
Rechnungsbetrag: -10
Trinkgeld-Prozentsatz: 15
Eingaben gültig: false
Warnung: Ungültige Eingaben!Hinweis: Logische Operatoren eignen sich, um mehrere Bedingungen zu verknüpfen:
let isValid = amount > 0 && percent >= 0 && percent <= 100;Die Ausgabe der Warnung lässt sich mit dem Bedingungsoperator lösen.
Aufgabe 6: Komplettlösung (Vertiefung)
Alle bisherigen Elemente werden zu einem vollständigen Trinkgeldrechner kombiniert mit folgenden Features:
- Eingabe von Rechnungsbetrag, Prozentsatz und Personenanzahl
- Validierung aller Eingaben
- Berechnung von Trinkgeld, Gesamtbetrag und Betrag pro Person
- Bewertung des Trinkgelds (sparsam/normal/großzügig)
- Übersichtliche, formatierte Ausgabe
Regeln zur Bewertung des Trinkgelds:
- Unter 10%: “Sparsam”
- 10% bis unter 15%: “Normal”
- Ab 15%: “Großzügig”
Tipp: Für drei Fälle können Bedingungsoperatoren verschachtelt werden:
let rating = percent >= 15 ? "Großzügig"
: percent >= 10 ? "Normal"
: "Sparsam";Lies das so: „Wenn >= 15, dann Großzügig, sonst (wenn >= 10, dann Normal, sonst Sparsam).”
Beispielausgabe:
=== Trinkgeldrechner ===
Rechnungsbetrag: 95.50
Trinkgeld (%): 18
Anzahl Personen: 3
--- Ergebnis ---
Rechnungsbetrag: 95.50
Trinkgeld (18%): 17.19
Gesamtbetrag: 112.69
Pro Person: 37.56
Bewertung: Großzügig!Optionale Aufgaben (Bonus)
Falls noch Zeit zur Verfügung steht, kann die letzte Aufgabe mit folgenden Ideen erweitert werden. Die Reihenfolge der Aufgaben ist hierbei egal.
Ausgabe in Spalten ausrichten
Formatiere die Ausgabe so, dass Beschriftungen und Zahlen sauber untereinander in Spalten stehen (wie in einer Tabelle):
- Nutze
padEnd(...)für die Texte (links) - Nutze
padStart(...)für die Zahlen (rechts) - Zahlen weiterhin mit
toFixed(2)formatieren
Tipp: padEnd füllt einen String rechts auf, padStart links:
"Hallo".padEnd(10); // "Hallo " (10 Zeichen, rechts aufgefüllt)
"17.19".padStart(8); // " 17.19" (8 Zeichen, links aufgefüllt)
// Kombiniert für tabellarische Ausgabe:
let label = "Trinkgeld:";
let value = 17.19;
console.log(label.padEnd(18) + value.toFixed(2).padStart(8));
// "Trinkgeld: 17.19"Beispielausgabe:
--- Ergebnis ---
Rechnungsbetrag: 95.50
Trinkgeld (18%): 17.19
Gesamtbetrag: 112.69
Pro Person: 37.56Aufrunden auf „schöne“ Beträge
Erweitere das Programm so, dass der Gesamtbetrag (inkl. Trinkgeld) auf einen „schönen“ Betrag aufgerundet wird:
- Auf den nächsten vollen Euro (z.B. 112.69 → 113.00)
- Gib zusätzlich aus, wie viel extra Trinkgeld dadurch entsteht
Beispielausgabe:
Gesamtbetrag (inkl. Trinkgeld): 112.69
Aufgerundet auf: 113.00
Extra Trinkgeld durch Aufrunden: 0.31Mindest-Trinkgeld
Erweitere das Programm so, dass ein Mindest-Trinkgeld gilt:
- Wenn das berechnete Trinkgeld unter 1.00 liegt, setze es auf 1.00
- Nutze dafür den Bedingungsoperator (
? :)
Beispielausgabe:
Rechnungsbetrag: 5
Trinkgeld (%): 10
Trinkgeld: 1.00
Gesamtbetrag: 6.00Komma als Dezimaltrenner
Erweitere die Eingabe so, dass Beträge auch mit Komma eingegeben
werden können (z.B. 12,50):
- Betrag als String einlesen
,durch.ersetzen- Danach in eine Zahl umwandeln
Beispielausgabe:
Rechnungsbetrag eingeben: 12,50
Rechnungsbetrag (Zahl): 12.50Farbige Ausgabe mit util.styleText
Erweitere den Trinkgeldrechner so, dass bestimmte Ausgaben farbig und/oder formatiert (z.B. fett, unterstrichen) erscheinen:
-
Importiere
styleTextausnode:util -
Gib die Überschrift
=== Trinkgeldrechner ===z.B. blau + fett aus -
Gib die Warnung bei ungültigen Eingaben rot + fett aus
-
Färbe die Bewertung abhängig vom Prozentsatz (nur mit Bedingungsoperator):
- Sparsam (< 10) → rot
- Normal (< 15) → gelb
- Großzügig! (>= 15) → grün
Beispielausgabe (Farben im Terminal sichtbar):
=== Trinkgeldrechner === (blau, fett)
--- Ergebnis ---
Warnung: Ungültige Eingaben! (rot, fett)
Bewertung: Großzügig! (grün)Tipp: styleText kann ein Format oder ein Array aus Formaten bekommen:
import { styleText } from 'node:util';
console.log(styleText(['underline', 'italic'], 'My italic underlined message'));Zusammenfassung
In diesem Mini-Projekt haben wir folgende Konzepte angewendet:
- Variablen und Konstanten für Zwischenergebnisse
- Arithmetische Operatoren (
*,/) für Berechnungen - Vergleichsoperatoren (
>,>=,<=) für Validierungen - Logische Operatoren (
&&) zum Verknüpfen von Bedingungen - Bedingungsoperator (
? :) für einfache Fallunterscheidungen - Template-Strings für formatierte Ausgaben
- Ein- und Ausgabe mit
readline-syncundconsole.log
Info für Dozent: Lösung siehe trinkgeld.js im Repository exercises.