Skip to content

L01_Zufallsgedicht

Jirka Dell'Oro-Friedl edited this page Oct 9, 2022 · 31 revisions

Aufgabe

  1. Schreibe ein kleines Programm, welches ein zufällig kreiertes Gedicht von wenigstens fünf Zeilen in der Browserkonsole ausgibt. Die einzelnen Sätze sind primitiv und werden nur aus Subjekt, Prädikat und Objekt gebildet. Beispiel: „Snape braut Zaubertränke“. Die Worte hierfür sollen zu Programmbeginn als literale Initialisierung in drei Arrays definiert sein. Im Gedicht sollen alle Worte verwendet werden, aber keines mehrfach. Bei jedem Programmlauf sollen die Worte zufällig kombiniert werden, so dass die Wahrscheinlichkeit für zwei aufeinanderfolgende identische Gedichte gering ist. Die Zeilen können sich reimen, müssen aber nicht.
  2. Erstelle eine Tracetable zum Programm und verfolge dabei wenigstens die Erstellung der ersten beiden Zeilen des Gedichtes.
  3. Dokumentiere das Programm. Konstruiere hierfür ein ausführliches Aktivitätsdiagramm für den Programmablauf.

Vorgehensweise

Es geht bei dieser Aufgabe darum, Fingerfertigkeit beim Schreiben von Code zu erlangen, bekannte Strukturen zu wiederholen und den technischen Aufbau zu üben. Deswegen ist ein Algorithmus und die einzelnen Schritte zum Lösen der Aufgabe vorgegeben. Das ist der Grund für die große Länge dieser Seite, es wird eine Lösung und Anleitung präsentiert. Die eigentliche Aufgabe eigentliche dagegen ist nur der erste kleine Absatz oben. Bei späteren Aufgaben sollst Du natürlich vordringlich selbst die Lösung entwickeln. Bedenke, dass es neben diesem Algorithmus, der zur Übung erdacht wurde, zur Lösung der Aufgabe noch viele weitere gibt, auch bessere.

Grundstruktur anlegen

  1. Öffne dein EIA2-Ordner in VSCode und führe zuerst eine Pull-Aktion oder Sync-Aktion durch, um den letzten Stand deines Repositories auf deinen lokalen Rechner zu holen. Das solltest Du immer machen, wenn Du dich an die Arbeit machst, vielleicht hattest Du zwischenzeitlich eine Änderung mit Hilfe des Web-Interfaces von Github durchgeführt, die noch nicht bei dir lokal angekommen ist. Wenn Du später in einem Team arbeitest, werden andere das Remote-Repository verändert haben.
  2. Lege in deinem EIA2-Repository einen Ordner für diese Aufgabe an und vergib einen sinnvollen Namen, z.B. A01_RandomPoem
  3. Erstelle eine HTML-Datei, ebenfalls mit sinnvollem Namen. Nutze Pascal-Case (siehe Booklet) und natürlich die Endung ".html"
  4. Fülle sie mit Inhalt, indem Du einfach ein Ausrufezeichen tippst und Enter drückst. VSCode sollte das als Anweisung erkennen, dir ein Muster zu bauen
  5. Ändere den Text im <title>, damit der Browsertab später einen sinnvollen Inhalt anzeigt.
  6. Füge einen kleinen Text auf der Seite ein, der den Betrachter darauf hinweist die Browserkonsole zu öffnen und wie das zu tun ist (z.B. per F12)
  7. Lege eine TypeScript-Datei mit sinnvollem Namen und natürlich der Dateiendung ".ts" an.
  8. Schreibe zum Testen eine Anweisung für die Ausgabe eines beliebigen Textes (z.B. "Expecto Patronum") in die TypeScript-Datei
  9. Starte den Compiler, am besten im Watch-Mode
  10. Prüfe, ob neben deiner TypeScript-Datei nun auch eine JavaScript-Datei (.js) und ein Map-File (.js.map) entstanden ist
  11. Verlinke die JavaScript-Datei im <head> deiner HTML-Datei
  12. Starte die HTML-Datei im Browser und prüfe, ob der Hinweistext auf der Seite und die Ausgabe in der Konsole erscheinen
  13. Passt alles, ist die Grundstruktur angelegt und funktioniert und Du musst nur noch an der TypeScript-Datei arbeiten.

Programmstruktur implementieren

  1. Lösche die Ausgabeanweisung und lege stattdessen einen namespace mit sinnvollem Namen (siehe Coding-Style) an
  2. Lege drei Arrays gleicher Länge mit literalen Zeichenketten an für
    • Subjekte (z.B. Harry, Hermine, Ron, Hagrid, Snape, Dumbledore)
    • Prädikate (z.B. braut, liebt, studiert, hasst, zaubert, zerstört)
    • Objekte (z.B. Zaubertränke, den Grimm, Lupin, Hogwarts, die Karte des Rumtreibers, Dementoren)
      und weise sie entsprechend sinnvoll benamten Variablen zu.
  3. Lasse dir die Arrays in der Browserkonsole zur Prüfung ausgeben
  4. Erstelle eine for-Schleife, welche eine Laufvariable rückwärts zählen lässt, ausgehend von der Länge der Arrays. Beim letzten Schleifendurchlauf soll diese Variable den Wert 1 aufweisen.
  5. Lasse darin den Wert der Laufvariablen auf der Konsole ausgeben und prüfe, ob die Ausgabe deinen Erwartungen entspricht und korrigiere, falls erforderlich
  6. Erstelle, außerhalb der Schleife, eine Funktion namens getVerse, in deren Signatur festgelegt ist, dass sie drei Werte vom Typ string[] entgegen nimmt und einen Wert vom Typ string zurückliefert. Wähle die Namen der drei formalen Parameter analog zu deinen Array-Variablen, aber entsprechend des Styleguides mit Unterstrich als Präfix
  7. Lasse die Funktion eine literale Zeichenkette zurückliefern, z.B. "Alohomora"
  8. Lasse innerhalb der Schleife deine Funktion mit drei leeren Arrays [] aufrufen und weise den zurückerhaltenen Wert eine Variable von passendem Typ zu
  9. Lasse den Wert auf der Konsole ausgeben
  10. Mit den hier beispielhaft eingesetzten Werten sollte die Ausgabe etwa so aussehen:
(6) ["Harry", "Hermine", "Ron", "Hagrid", "Snape", "Dumbledore"] 
(6) ["braut", "liebt", "studiert", "hasst", "zaubert", "zerstört"] 
(6) ["Zaubertränke", "den Grimm", "Lupin", "Hogwarts", "die Karte des Rumtreibers", "Dementoren"]
6
Alohomora
5
Alohomora
4
Alohomora
3
Alohomora
2
Alohomora
1
Alohomora 

Funktion implementieren

Strukturell arbeitet dein Programm bereits, inhaltlich tut es aber noch nichts sinnvolles. Die Arrays mit den vorgegebenen Worten werden noch gar nicht verwendet und deine Funktion getVerse, die einzelne Verse ausspucken soll, liefert immer den gleichen Wert. Das soll sich jetzt ändern. Ab hier musst Du allerdings auch ein wenig selbst recherchieren und mit überlegen, die Schritte sind nicht mehr in allen Details ausgeführt.

  • Füttere die Funktion nun mit deinen Arrays, nicht mit den leeren
  • Achte darauf, dass innerhalb der Funktion mit den Parametern gearbeitet wird, nicht mit den Variablen, die außerhalb deklariert wurden!
  • Setze Kommentarmarker // vor alle Konsolenausgaben, damit die Konsole wieder überschaubar wird (Shortcut Strg + #)
  • Erweitere den Funktionskörper. Darin...
    • Lege eine Variable vom Typ string, die einen Vers aufnehmen soll und initialisiere sie mit einem leeren String ""
    • Lasse mit der Anweisung Math.random() eine Zufallszahl erzeugen und multipliziere sie mit der Länge des übergebenen Subject-Arrays
    • Schneide mit der Anweisung Math.floor(...) die Nachkommastellen dieser Zufallszahl ab
    • Weise das Ergebnis einer Variablen vom Typ number zu
    • Lasse dir das Ergebnis auf der Konsole ausgeben. Du solltest eine Folge von zufälligen Zahlen im Bereich von 0 bis zur Anzahl der Worte in einem Array weniger 1 sehen.
    • Schneide mit splice(...) ein Wort aus dem übergebenen Array von Subjekten an der Stelle der Zufallszahl heraus und addiere es zur deiner Vers-Variablen. Achte darauf, das splice dir immer ein Array mit den ausgeschnittenen Elementen liefert, Du musst also davon das 0-te nehmen.
    • Addiere noch ein Leerzeichen dazu
    • Wiederhole die Zufallszahlerzeugung und die Schritte danach auch für die Verben und Objekte
    • Lasse deine Vers-Variable von der Funktion zurück geben, nicht mehr einen literalen Wert
    • Deaktiviere die Ausgabe der Zufallszahl in der Funktion
  • Aktiviere wieder die Ausgabe des Funktionsergebnisses in der Schleife

Ergebnis überprüfen und veröffentlichen

Im unwahrscheinlichen Fall, dass alles optimal verlaufen ist, erhältst Du nun Ausgaben analog zu dieser, aber immer unterschiedliche

Snape liebt Lupin
Harry zaubert Dementoren
Dumbledore zerstört Zaubertränke
Hagrid braut Hogwarts
Ron hasst die Karte des Rumtreibers
Hermine studiert den Grimm

Synchronisiere dein lokales Repository mit Github, prüfe die Veröffentlichung auf Github-Pages und poste den Link in deinen Steckbrief. Achte auf das target-Attribut des Links, damit sich dein Programm in einem eigenen Tab öffnet.

Tracetable zeichnen

Wahrscheinlich aber ist irgendwo etwas schief gelaufen... macht nichts. Jetzt sollst Du ohnehin die Tracetable zeichnen, dabei findest Du sicher den Fehler. Nutze den Debugger, um die Werte tatsächlich zu verfolgen, der kann das richtig gut. Außerdem musst Du üben, den Debugger zu nutzen, er ist dein wichtigster Helfer.
Falls dein Programm weiterhin fehlerhaft sein sollte, zeig es deinem Betreueri deinen Code und tüftelt gemeinsam! Poste auch die Tracetable als PDF-Datei zusammen mit deiner Lösung und verlinke sie im Steckbrief.

Aktivitätsdiagramm zeichnen

Bei der Erstellung der Tracetable solltest Du den Algorithmus nun gut durchdrungen haben. Bringe ihn jetzt in die Form eines Aktivitätsdiagrammes. Nutze dafür das EIA2-Booklet und orientiere dich am Beispiel aus der ersten Lektion.
Beachte, dass hier nachträglich dokumentiert wird. In Zukunft musst Du aber mit der Diagrammarbeit beginnen und erst danach mit der Implementation. Dann hast Du bereits einen Algorithmus angedacht, der noch implementiert werden muss und das Diagramm dient hinterher, entsprechend korrigiert, immer noch als Dokumentation. Poste auch das Aktivitätsdiagramm als PDF-Datei und verlinke es im Steckbrief.

Mitnehmen

Nach der Bearbeitung dieser Aufgabe und der Beschreitung des vorgegebenen Lösungsweges sollte dir klar sein

  • wie Du in Zukunft weitere Unterprojekte zu den folgenden Aufgaben in deinem Repository aufsetzt
  • wie Du Variablen unterschiedlichen Typs deklarierst und definierst
  • was eine Schleife macht und wie Du sie implementieren kannst
  • wie Du eine Funktion mit formalen Parametern und Rückgabewert definierst
  • was bei der Übergabe von Werten komplexen Typs an eine Funktion passiert (Value vs. Reference)
  • wie Du Zufallszahlen erzeugen und nutzen kannst
  • wie Du Element aus einem Array an einer beliebigen Stelle herausschneidest
  • wie Du mit dem Debugger arbeitest
  • wie ein Aktivitätsdiagramm aufgebaut ist und welche Bedeutung die grundlegendsten grafischen Elemente haben

Sollte davon etwas noch unklar sein: bitte hake unbedingt bei deinem Betreueri nach!

Clone this wiki locally