Informatik 1
Wintersemester 2015/16

Hausaufgabe 3 – Programmieren mit Konstanten und Funktionen

Nach der Bearbeitung dieses Arbeitsblattes haben Sie gelernt

Nach dieser Übung sollen Sie in der Lage sein, selbstständig Funktionen zu definieren, um kleine Programme strukturieren und Ausdrücke einfacher wiederverwenden zu können.

Bearbeiten Sie dieses Hausaufgabenblatt alleine. Stellen Sie dabei sicher, dass Sie die gesetzten Lernziele erreichen.

Viel Erfolg!

(define CHESSBOARD
  (above
   (beside (rectangle 20 20 "solid" "white")
           (rectangle 20 20 "solid" "black")
           (rectangle 20 20 "solid" "white")
           (rectangle 20 20 "solid" "black"))
   (beside (rectangle 20 20 "solid" "black")
           (rectangle 20 20 "solid" "white")
           (rectangle 20 20 "solid" "black")
           (rectangle 20 20 "solid" "white"))
   (beside (rectangle 20 20 "solid" "white")
           (rectangle 20 20 "solid" "black")
           (rectangle 20 20 "solid" "white")
           (rectangle 20 20 "solid" "black"))
   (beside (rectangle 20 20 "solid" "black")
           (rectangle 20 20 "solid" "white")
           (rectangle 20 20 "solid" "black")
           (rectangle 20 20 "solid" "white"))))

(define EXAMPLE-GAME (place-image/align
                      (circle 10 "solid" "red")
                      40 0 "left" "top"
                      (place-image/align
                       (circle 10 "solid" "red")
                       20 40 "left" "top"
                       (place-image/align
                        (circle 10 "solid" "blue")
                        60 60 "left" "top"
                        CHESSBOARD))))

Code verbessern und Wiederholungen vermeiden

5 pt
Es wurden Magic Literals durch Konstanten ersetzt
5 pt
Es wurden geeignete Namen für die Konstanten gewählt
15 pt
Alle wörtlichen Wiederholungen wurden durch geeigente Konstanten ersetzt
15 pt
Es wurden Funktionsdefinitionen sinnvoll zur Vermeidung von nicht-wörtlichen Wiederholungen verwendet
10 pt
Lesbare Formatierung mit Zeilenumbrüchen, Einrückung, ...
5 pt
Es handelt sich um ein Refactoring von CHESSBOARD (d.h. das Verhalten von CHESSBOARD hat sich nicht geändert).
5 pt
Es handelt sich um ein Refactoring von EXAMPLE-GAME (d.h. das Verhalten von EXAMPLE-GAME hat sich nicht geändert).

Sie arbeiten in einer Firma und sollen ein Spiel für zwei Spieler entwickeln. Bisher wurde Ihnen vom Management nur weitergegeben, dass die Spielfläche sehr ähnlich wie bei Schach ist, aber 4 x 4 Flächen hat. Die Spielfiguren sollen rote und blaue Kreise sein. Ein Kollege von Ihnen fängt direkt an darauf los zu programmieren und zeigt Ihnen stolz den obigen Code.

Sie erkennen direkt, dass sich einige Stellen im Code häufiger wiederholen. Schreiben Sie den Code um und versuchen Sie dabei auf folgendes zu achten:

  1. Identifizieren Sie Magic Literals und ersetzen Sie diese durch geeignete Konstantendefinitionen
  2. Identifizieren Sie andere wörtliche Wiederholungen und ersetzen Sie auch diese durch geeigente Konstanten
  3. Verwenden Sie Funktionsdefinitionen, um Wiederholung von Ausdrücken zu vermeiden, die sich in Variationspunkten unterscheiden.

Die Manager aus dem Stockwerk über Ihrem Büro kommen nun zu Ihnen und fordern, dass alle schwarzen Flächen dunkelgrau dargestellt werden.

  1. Beschreiben Sie kurz in einem Kommentar, wie die Umsetzung dieser Anforderung in Ihrer Version des Programms verglichen mit der Version Ihres Kollegen ausfallen würde. Wie hoch schätzen Sie den jeweiligen Aufwand ein?

Eigene Funktionen schreiben

4 pt
generate-image ist definiert und akzeptiert drei Parameter
4 pt
generate-image erzeugt ein Bild
12 pt
generate-image erzeugt unterschiedliche Bilder für unterschiedliche Argumente
8 pt
Lesbare Formatierung mit Zeilenumbrüchen, Einrückung, ...
8 pt
"Don't Repeat Yourself" wurde beachtet
4 pt
Die erzeugten Bilder sind interessant, lustig, beeindruckend, schön oder anderweitig sehenswert

Programmieren Sie eine Funktion, die drei Parameter akzeptiert und ein Bild erzeugt. Die ersten zwei Parameter sind Farben, die im Bild vorkommen sollen. Der dritte Parameter ist eine Zahl zwischen 1 und 100, die Sie im Bild irgendwie verwenden sollen. Definieren Sie die Funktion mit dem Namen generate-image:

(define (generate-image color1 color2 number)
  ...)

Definieren Sie weitere Funktionen und Konstanten, um ein übersichtliches Programm abzugeben.