# Projektarbeit 2: Fahrtüchtigkeitstester ## Einleitung Dein Auftraggeber arbeitet an einer App, die es Anwendern erlaubt, eine grobe Einschätzung ihres jeweiligen Blutalkoholgehalts vorzunehmen. Die Anwendung hat natürlich keine Rechtsverbindlichkeit — möglicherweise hält sie jedoch manch angetrunkenen Partygast davon ab, sich ans Steuer zu setzen, um Schlangenlinien zu erproben und Schafe zu überfahren. Mit Sicherheit wird die App der Hit auf der nächsten Party. Das Ganze funktioniert folgendermaßen: Anwender geben zunächst ihr Gewicht in der App an und loggen danach bei Bedarf Getränke ein. Die App errechnet daraus den geschätzten aktuellen Blutalkoholgehalt (EBAC) und gibt diesen in Promille aus — inkl. eines Warnhinweises zur Fahrtauglichkeit. Der mobile Client ist bereits fertig. Deine Aufgabe besteht nun darin, den Kern der Anwendung zu entwickeln, die später auf dem Server laufen soll. Du bekommst fertige JSON-Datensätze geliefert, kannst dich aber nicht unbedingt darauf verlassen, dass sie komplett fehlerfrei sind und der Spezifikation entsprechen. Um Fehler zu vermeiden, müssen die Datensätze zunächst auf ihre Richtigkeit überprüft, d. h. validiert werden. Erst anschließend kümmerst du dich um die eigentliche Berechnung des Blutalkoholgehalts und die Ausgabe einer Empfehlung. ## Technologien Setze JavaScript – ECMAScript 2015 (ES6) oder neuer ein. Externe JavaScript-Bibliotheken (oder aus Drittquellen übernommener Code) sind nicht zugelassen. Überprüft wird die Aufgabe im aktuellen Chrome-Browser. ## Arbeitsschritt 1: Validierung entstandener Datensätze Die mobile App produziert Datensätze nach folgendem Format: - Es handelt sich um ein Objekt mit den Keys weight und drinks. - Der Value von weight ist eine positive Zahl. - Der Value von drinks ist ein Array. - Das drinks-Array enthält seinerseits Objekte — es können beliebig viele sein. - Die Objekte im drinks-Array haben die Keys type und amount. - Der Value von type ist ein String. - Der Value von amount ist eine positive Ganzzahl. ## Beispiel Jemand, der 89,5 Kilogramm wiegt und 5 Gläser Wein, dann 3 Flaschen Bier und später noch mal 2 Gläser Wein getrunken hat … dem ist vermutlich ziemlich übel. Außerdem erhält er den nachfolgenden Datensatz (oder zumindest einen inhaltlich vergleichbaren): ```js { weight: 89.5, drinks: [ {type: "wine", amount: 5}, {type: "beer", amount: 3}, {type: "wine", amount: 2}, ] } ``` ​ Schreibe eine Funktion validateRecords, die einen Datensatz entgegennimmt und Fehler feststellt, wenn der Datensatz von folgenden Vorgaben abweicht: - Der Datensatz hat das korrekte Format (siehe Auflistung oben). - Die benötigten Keys sind in den Objekten vorhanden. Es spielt dabei keine Rolle, in welcher Reihenfolge die Keys hinterlegt sind, d. h. {weight: …, drinks: …} ist genauso korrekt wie {drinks: …, weight: …} - Die Anzahl der Keys ist nicht festgelegt, d. h. es dürfen neben den verlangten Keys noch weitere vorhanden sein. - Das Gewicht enthält eine valide (positive) Zahl (62.5 wäre beispielsweise zulässig). - Die Anzahl der Flaschen oder Gläser ist eine valide (positive) Ganzzahl (1.5 Flaschen wären beispielsweise nicht zulässig). - Deine Funktion validateRecords soll ein Array zurückliefern, das alle gefundenen Fehler enthält. Gib das Array zur Kontrolle aus — jeweils eine Zeile pro Fehlermeldung. **Beispiel** ```js { weight: "sixty", drinks: [ {type: "wine", amount: 2.5}, {type: "beer", amount: 3} ] } { weight: "sixty", drinks: [ {type: "wine", amount: 2.5}, {type: "beer", amount: 3} ] } // > ['sixty is not a valid weight', // '2.5 is not a valid number of bottles or glasses'] ``` ​ ## Arbeitsschritt 2: Berechnung des Blutalkoholgehalts Schreibe eine Funktion bloodAlcoholContentFor, die einen Datensatz (wie in Teil 1 beschrieben) entgegennimmt, den Blutalkoholgehalt berechnet und anschließend in Promille zurückgibt. Gib den berechneten Wert anschließend in der Konsole aus. Hier sind die Formeln, die du benötigst: Die sogenannte Widmark-Formel für den EBAC in % (estimated peak blood alcohol concentration – Blutalkoholgehalt; siehe https://en.wikipedia.org/wiki/Blood_alcohol_content). ```js ebac = (0.806 * Anzahl der Standarddrinks * 1.2) / (0.5 * Gewicht) ``` Beachte, dass es sich hier um eine vereinfachte Formel handelt — Geschlecht und Zeitraum werden nicht beachtet. Zur Berechnung des EBACs benötigst du neben dem Gewicht die Anzahl der Standarddrinks. Deswegen musst du zunächst die Menge des reinen Alkohols im Datensatz berechnen und diese dann in eine Anzahl von Standarddrinks umrechnen. Dazu dient folgende Formel: ```js Anzahl der Standarddrinks = Alkoholmenge in L * 1000 / STANDARD_DRINK_ALCOHOL_CONTENT ``` Hier noch die Formeln zur Berechnung der Alkoholmenge: ```js Alkoholmenge im Wein = Anzahl der Gläser * WINE_GLASS_SIZE * WINE_ALC_PERCENTAGE / 100 Alkoholmenge im Bier = Anzahl der Flaschen * BEER_BOTTLE_SIZE * BEER_ALC_PERCENTAGE / 100 ``` Außerdem gelten folgende (vereinfachte) Vorgaben: ```js const WINE_GLASS_SIZE = 0.2; const WINE_ALC_PERCENTAGE = 14; const BEER_BOTTLE_SIZE = 0.7; const BEER_ALC_PERCENTAGE = 5; const STANDARD const WINE_GLASS_SIZE = 0.2; const WINE_ALC_PERCENTAGE = 14; const BEER_BOTTLE_SIZE = 0.7; const BEER_ALC_PERCENTAGE = 5; const STANDARD_DRINK_ALCOHOL_CONTENT = 17; ``` ​ Denke auch daran, für die Ausgabe den EBAC von % in Promille umzurechnen. ## Arbeitsschritt 3: Ausgabe der Empfehlung Gib eine Bemerkung zum übergebenen Datensatz in der Konsole aus. Die Bemerkung soll sich dabei am berechneten Blutalkoholgehalt orientieren. Ein Beispiel zeigt die folgende Tabelle. Du kannst aber natürlich eigene Werte und eigene Texte verwenden. Wichtig ist, dass du wenigstens fünf Abstufungen unterscheidest. BAC in Promille | Ausgabe --- | --- bis 0.29 | Sie sind vermutlich noch fahrtüchtig. Diese Angabe ist nicht rechtsverbindlich! ab 0.3 | Sie haben vermutlich schon Konzentrationsschwierigkeiten. Sie sollten nicht mehr fahren. ab 0.6 | Fahren Sie nicht, das könnte Sie sonst den Führerschein kosten. Denken Sie auch an die armen Schafe. ab 1.0 | Wie viele Handys halten Sie in der Hand? ab 5.0 | Sie sind vermutlich tot — oder haben sich vertippt. **Hinweise** Du musst die Daten nicht vom Anwender per Prompt, Formular oder ähnlichem erfragen. Gehe einfach davon aus, dass du die JSON-Daten fertig geliefert bekommst. Die in der Aufgabe genannten Angaben zur API sind grundsätzlich verpflichtend. D. h. du verwendest die in der Aufgabenstellung genannten Funktionsnamen, Argumente, Argumentnamen, Rückgabewerte, usw. Dazu gehört auch der beschriebene Aufbau der JSON-Datensätze. **Tipps zur Vorgehensweise** Schreibe nicht den kompletten Validierungscode innerhalb von validateRecords. Entwickle stattdessen kleinere Funktionen, die Teile der Funktionalität erledigen. Selbstverständlich kannst du die Implementierung der verlangten Funktionen jederzeit wieder in weitere Funktionen unterteilen. Schreibe kleine Einzelfunktionen, z. B. zur Berechnung der Alkoholmenge in einem Weindatensatz. Diese sollten auch jede Formel als eigene Funktion repräsentieren.