deutsch     english     français     Drucken

 

3.3 STRUKTURIERTES PROGRAMMIEREN

 

 

EINFÜHRUNG

 

Für das Programmieren ist das Konzept der Variablen sehr wichtig. Daher musst du dir besondere Mühe geben, es möglichst vollständig zu verstehen. Du weisst bereits, dass eine Variable ein Speicherplatz ist, der mit einem Namen angesprochen wird und in dem sich ein Wert befindet. Du weisst auch, dass Parameter als "flüchtige" Speicherplätze aufgefasst werden können, die beim Aufruf der Funktion einem Wert erhalten, auf den die Funktion während ihrer Abarbeitung zugreifen kann.

PROGRAMMIERKONZEPTE: Konstanten, Prozedurale Programmierung, Wiederverwendbarkeit

 

 

EIN MOSAIK AUS 10x10 STEINEN

 

Du hast die Aufgabe, ein schönes farbiges Mosaik mit quadratischen Steinen zu erstellen. Du erhältst verschiedenfarbige Mosaiksteine mit der Seitenlänge 10 und sollst diese auf einen Boden mit der Grösse 400x400 exakt aneinander legen. Du bist etwas faul und überlässt dem Computer diese Aufgabe, schreibst ihm aber vor, dass er die Steine mit zufälligen Farben zeilenweise legen soll. Damit du ihm beim Legen zusehen kannst, baust du mit delay(1) eine kurze Arbeitspause nach jedem gelegten Stein ein.

 
from gpanel import *
makeGPanel(0, 400, 0, 400)

for y in range(0, 400, 10):
    for x in range(0, 400, 10):
        setColor(getRandomX11Color())
        move(x + 5, y + 5)
        fillRectangle(10, 10)
        delay(1)        
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Immer wenn ein Gitter durchlaufen wird, eignen sich zwei ineinander geschachtelte for-Schleifen. Überlege dir genau, warum tatsächlich die Steine zeilenweise von unten nach oben gelegt werden. Du benötigst bei move() eine Verschiebung, weil die Steine mittig verankert werden.

Die Methode getRandomX11Color() gibt dir (als Wort) eine der Farben aus der X11-Farbpalette zurück, die du dann setColor() übergeben kannst. Du lässt zuerst die Funktion getRandomX11Color() und dann die Funktion setColor() ausführen.

 

 

MAGISCHE ZAHLEN

 

Zwei Wochen später erhältst du eine Lieferung von fünf mal so grossen Steinen, die eine Seitenlänge von 50 aufweisen. Wieder soll sie der Computer auf den gleich grossen Boden legen. Was musst du am Programm ändern? Du siehst dir den früheren Code an, weisst aber natürlich nicht  mehr so genau, was die einzelnen Zeilen bedeuten.

Du denkst: Es wird sicher so sein, dass überall, wo eine 10 stand, diese Zahl in eine 50 verändert werden muss. Machst du das so, so hast du falsch gedacht. Das Mosaik bedeckt leider nicht mehr den ganzen Boden.

 

Jetzt musst du dir wieder den ganzen Programmcode durchgehen und Zeile und Zeile verstehen, um den Fehler zu finden. Wenn das nötig ist, um ein Programm an eine neue Situation anzupassen (Wiederverwendung), so war dein Programm zwar richtig, aber schlecht geschrieben. Du solltest dir einen guten Programmierstil angewöhnen, damit du Programme leicht an neue Situationen anpassen kannst.

Wie musst du vorgehen? Statt die Steingrösse als fixe Zahl in den Code zu schreiben, definierst   du eine Variable size, die du überall, wo die Steingrösse eine Rolle spielt, an Stelle der fixen Zahl einsetst. Um das Programm noch besser zu strukturieren, schreibst du zudem noch für das Legen eines Steins eine eigene Funktion drawStone().

from gpanel import *

def drawStone(x, y):
    setColor(getRandomX11Color())
    move(x + size/2, y + size/2)
    fillRectangle(size, size)

makeGPanel(0, 400, 0, 400)

size = 50

for x in range(0, 400, size):
    for y in range(0, 400, size):
        drawStone(x, y)      
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Die Verwendung fixer Zahlenwerte, die über das Programm verteilt eingesetzt werden, führt zu schlecht wiederverwendbaren Programmen. Statt dessen sollte man Variablen definieren und diese an Stelle der Zahlen verwenden. Um anzudeuten, dass diese nirgends verändert werden dürfen, schreibt man solche Variablen manchmal in Grossbuchstaben und nennt sie Konstanten.

Auf eine Variable, die im Hauptblock definiert wird, kann auch in jeder Funktion lesend zugegriffen werden. Wir nennen eine solche Variable darum auch eine globale Variable.  

Den Code für längere in sich abgeschlossene Aktionen sollte man in eine eigene Funktion verpacken. Dies hat mehrere Vorteile: Zum einen erkennt man am Funktionsnamen, was die Funktion tun soll, zum zweiten kann man sie mehrmals aufrufen, ohne den Code neu schreiben zu müssen und zum dritten wird das Programm damit übersichtlicher und verständlicher. Diese Art der Programmierung nennt man strukturierte Programmierung (oder auch prozedurale Programmierung) und sie ist ein wichtiges Merkmal eines guten Programmierstils.

 

 

AUFGABEN

 
1.

Wie du mit dem Satz von Pythagoras herausfinden kannst, zeichnet der Befehl

fillTriangle(x - math.sqrt(3)/2 * r, y - r/2,
                 x + math.sqrt(3)/2 * r, y - r/2,
                 x, y + r);

ein gleichseitiges Dreieck mit dem Umkreismittelpunkt bei (x, y) und dem Umkreisradius r. Verifiziere dies in einem  GPanel mit dem Koordinatensystem  -1..1 für beide Achsen, das ein Dreieck mit dem Umkreismittelpunkt im Ursprung zeichnet.


2.


Verwende den Code in von Aufgabe 1 und definiere eine Funktion stern(x, y, r), die mit zwei gleichseitigen Dreiecken einen Stern mit Mittelpunkt (x, y) und der Grösse r zeichnet. Zeichne damit einige Sterne.


3.

Erweitere die Funktion stern() mit einem Parameter, der die Farbe des Sterns festlegt. Zeichne damit auf einem grauen Hintergrund ein Sternmosaik mit 50x50 Sternen. Verwende für die Sterngrösse eine Konstante.

Sorge dafür, dass keine Sterne mit der Hintergrundfarbe gezeichnet werden.