This commit is contained in:
Binary file not shown.
24
03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore
vendored
Normal file
24
03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
@@ -0,0 +1,23 @@
|
||||
## JavaScript Cafe
|
||||
|
||||
Willkommen beim JavaScript Cafe! Als Entwickler bist du verantwortlich für die Erstellung eines Moduls, das dem Cafe-Manager hilft, die Daten der Speisekarte effizient zu analysieren und zu verwalten. Die Speisekarte ist in verschiedene Kategorien unterteilt (z.B. Getränke, Gebäck), die jeweils mehrere Artikel mit spezifischen Details enthalten.
|
||||
|
||||
In dem Starter-Code ist ein mehrdimensionales Array, das die Speisekarte des Cafés darstellt. Jede Kategorie enthält mehrere Artikel, die jeweils mit einem Namen und einem Preis versehen sind.
|
||||
|
||||
**Die Aufgaben sind**
|
||||
|
||||
1. Liste alle Menüpunkte auf:
|
||||
|
||||
- Schreib eine rekursive Funktion <code>listMenuItems</code>, die das Array menu bekommt und ein flaches Array mit den Namen aller Einträge zurückgibt.
|
||||
|
||||
2. Eintragsdetails destrukturieren:
|
||||
|
||||
- Nutze die Destrukturierung innerhalb der Funktion <code>listMenuItems</code>, um den Namen und den Preis jedes Eintrags herauszuziehen.
|
||||
|
||||
3. Durchschnittlichen Preis berechnen:
|
||||
|
||||
- Nachdem du alle Menüeinträge aufgelistet hast, berechne den Durchschnittspreis für alle Einträge.
|
||||
|
||||
4. Artikel nach Kategorie suchen:
|
||||
|
||||
- Schreib eine Funktion <code>findItemsByCategory</code>, die das Menü-Array und einen Kategorienamen nimmt und ein Array mit allen Einträgen dieser Kategorie zurückgibt.
|
||||
@@ -0,0 +1,17 @@
|
||||
## License and terms of use
|
||||
|
||||
© Web Professional Institute Inc. All rights reserved.
|
||||
|
||||
This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs.
|
||||
|
||||
**Usage Restrictions:**
|
||||
|
||||
- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited.
|
||||
- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope.
|
||||
- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action.
|
||||
|
||||
**Agreement & Rights:**
|
||||
|
||||
As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content.
|
||||
|
||||
For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification.
|
||||
@@ -0,0 +1,33 @@
|
||||
'use strict';
|
||||
(() => {
|
||||
// === DOM & VARS =======
|
||||
const DOM = {};
|
||||
|
||||
// === DATA =============
|
||||
const menu = [
|
||||
{
|
||||
category: 'Beverages',
|
||||
items: [
|
||||
{ name: 'Coffee', price: 3.5 },
|
||||
{ name: 'Tea', price: 2.5 },
|
||||
{ name: 'Juice', price: 4 },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: 'Pastries',
|
||||
items: [
|
||||
{ name: 'Croissant', price: 2.75 },
|
||||
{ name: 'Muffin', price: 2.5 },
|
||||
{ name: 'Bagel', price: 2.25 },
|
||||
],
|
||||
},
|
||||
{
|
||||
category: 'Sandwiches',
|
||||
items: [
|
||||
{ name: 'Ham Sandwich', price: 5.5 },
|
||||
{ name: 'Veggie Sandwich', price: 5 },
|
||||
{ name: 'Turkey Sandwich', price: 6 },
|
||||
],
|
||||
},
|
||||
];
|
||||
})();
|
||||
@@ -0,0 +1,140 @@
|
||||
# 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 <code>weight</code> und <code>drinks</code>.
|
||||
- Der Value von <code>weight</code> ist eine positive Zahl.
|
||||
- Der Value von <code>drinks</code> ist ein Array.
|
||||
- Das drinks-Array enthält seinerseits Objekte — es können beliebig viele sein.
|
||||
- Die Objekte im drinks-Array haben die Keys <code>type</code> und <code>amount</code>.
|
||||
- Der Value von <code>type</code> ist ein String.
|
||||
- Der Value von <code>amount</code> 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 <code>validateRecords</code>, 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. <code>{weight: …, drinks: …}</code> ist genauso korrekt wie <code>{drinks: …, weight: …}</code>
|
||||
- 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 <code>validateRecords</code> 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 <code>bloodAlcoholContentFor</code>, 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 <strong>EBAC</strong> 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.
|
||||
Reference in New Issue
Block a user