Wiki: Mathe und Info

Unterrichtsmaterialien für Mathematik und Informatik

Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:sek-ii:e2:processing:p3-variablen

Variablen

Aufgabe 1 - Es kommt Bewegung ins Spiel

Finde heraus, was folgender Code bewirkt:

// ???
float x;
 
void setup() {
  size(400, 400); 
 
  // ???
  x = 0;
}
 
void draw() {
  background(255);
 
  // ???
  ellipse(x, 100, 30, 30);
 
  // ???
  x = x + 1;
}

Was bewirkt hier die Variable x? Ergänze passende Kommentare anstelle der drei ???!

Einstieg in Variablen
Was ist eine Variable?1)
Im vorhergehenden Kapitel haben wir bereits sogenannte Systemvariablen benutzt. So wurde beispielsweise der Startpunkt einer Linie nicht durch einen festen Punkt bestimmt, sondern richtete sich variabel nach der jeweiligen Position des Mauszeigers, die durch die Werte für mouseX und mouseY festgelegt wurde. Diese Änderung des Variablenwertes macht das Wesen einer Variable aus.

Rein technisch gesehen ist eine Variable ein benannter Zeiger, der auf einen Ort im Speicher des Computers weist. Im Grunde kann man sich eine Variable vorstellen wie einen Post It auf den man eine Information schreibt, um sie später wieder zu verwenden. Nachdem ein Computer immer nur eine Anweisung auf einmal abarbeitet, ermöglicht eine Variable das Speichern einer Information an einer bestimmten Stelle des Programms. Auf diese Information kann dann zu einem späteren Zeitpunkt wieder zugegriffen werden. Verdeutlichen wir uns dies an folgendem Beispiel:

Während der Endpunkt (100, 100) festgelegt ist und nicht geändert werden kann, können wir die Werte für den Startpunkt (x, y) beliebig festlegen. Dazu müssen wir allerdings zuerst zwei Schritte vorschalten. Wir müssen die Variable deklarieren, d.h. wir müssen ihr einen Namen geben und ihr einen sogenannten Datentyp zuweisen, und wir müssen sie initialisieren, d.h. wir müssen ihr einen Anfangswert zuweisen. Zu diesem Zweck nutzen wir den Zuweisungsoperator (=). Das Gleichheitszeichen hat also hier nicht seine mathematische Bedeutung, sondern heißt: "der Variable x wird der Wert a zugewiesen". In der Praxis sähe das dann aus wie der Code, den ihr oben im Einführungsbeispiel gesehen habt. Wir schauen uns nun dieses Einführungsbeispiel etwas genauer an.

Zunächst wird die Variable mit der Zeile float x; deklariert. Das Schlüsselwort float steht hier dafür, dass die Variable Kommazahlen speichert. Auf diese sogenannten Datentypen gehen wir gleich noch ein. Die nächste spannende Zeile ist x = 0;. Dort wird die Variable initialisiert, es wird also ihr Startwert festgelegt. In Zukunft werden wir die Deklaration und die Initialisierung häufig in einem Schritt machen. Weiterhin genutzt wird die Variable bei ellipse(x, 100, 30, 30);. Hier wird die Ellipse bzw. in diesem Fall der Kreis gezeichnet. Die x-Position wird hier jedoch durch die Variable x festgelegt und nicht durch einen fixen Wert. In der darauffolgenden Zeile x = x+1; wird nun der Wert von x in jedem Aufruf der draw()-Methode um 1 erhöht.

Durchlauf Wert von x
0 (Startzustand) 0
1 1
2 2
3 3

Das Syntax-Diagramm zur Variablendeklaration sieht wie folgt aus:

{Variable = Datentyp Identifier [ "=" Startwert ] ";".}
Aufgabe 2 - Richtung ändern
Ändere das Beispiel von oben so ab, dass der Kreis von rechts nach links läuft.
Zufallszahlen

Processing stellt die Funktion random() zur Verfügung. Diese liefert einen Zufallswert zurück und kann vielfach verwendet werden.

void setup(){
 size(400, 400); 
 background (255);
}
 
void draw(){ 
  float x = random(400);
  float y = random(400);
  ellipse(x, y, 30, 30);
}
Aufgabe 3 - Experimente mit Zufallszahlen
  1. Experimentiere mit dem Codebeispiel rechts. Was bewirken die Zufallszahlen?
  2. Ändere das Programm so ab, dass ein neuer Kreis nur bei einem Mausklick erzeugt wird.
  3. Ändere das Programm so ab, dass jeder Kreis in einer zufälligen Farbe gezeichnet wird. Verwende hierzu z.B. die RGB-Farben (z.B. fill(123, 42, 11)).
Aufgabe 4 - Datentypen

Oben wurde schon kurz erwähnt, dass es in Java so etwas wie Datentypen gibt. Das Konzept ist ein klein wenig umfangreicher, lest euch daher das Fachkonzept: Datentypen durch und bearbeite die folgende Learning App.

Aufgabe 5 - Übung zu Datentypen
Variablenscopes - Gültigkeitsbereiche
Variablen haben - je nach dem, wo sie deklariert werden - unterschiedliche Gültigkeitsbereiche. Schauen wir uns dazu zwei Beispiele an:
Variante 1
int x = 0;
 
void setup() {
  size(300, 300);
}
 
void draw() {
  x = x + 1;
  circle(x, x, 50);
}
Variante 2
void setup() {
  size(300, 300);
}
 
void draw() {
  int x = 0;
  x = x + 1;
  circle(x, x, 50);
}

Probiere beide Varianten aus. Was ist der Unterschied?

Variablenscopes - Gültigkeitsbereiche
Variablen sind nur in dem Scope gültig, in dem sie deklariert wurden.
  • Die Variable $x$ ist in Variante 1 im globalen Scope deklariert, also "außerhalb" jeder Methode. Das heißt, dass sie für das gesamte Programm gültig ist und nur beim Programmstart deklariert und initialisiert wird.
  • Die Variable $x$ ist in Variante 2 im lokalen Scope der draw()-Methode deklariert, also "innerhalb" der draw()-Methode. Das heißt, dass sie nur innerhalb der draw()-Methode gültig ist, und zwar nur für den jeweils aktuellen Aufruf. Da die draw()-Methode 30x pro Sekunde aufgerufen wird, wird $x$ auch 30x pro Sekunde deklariert, initialisiert und verwendet.

Weitere Informationen zu Scopes:

  • Scopes werden in der Regel durch geschweifte Klammern {} abgegrenzt: Das heißt, dass jede Methode (draw(), setup(), keyPressed(), etc.) ihren eigenen lokalen Scope hat.
  • Wird eine Variable im globalen Scope definiert, ist sie auch für alle untergeordneten Scopes gültig.
Aufgabe 6 - Weitere Funktionen

1. Finde heraus, was die Funktionen translate() und constrain() bewirken. Vollziehe dafür die Beispiele nach:

translate()
void setup() {
  size(600, 400);
}
 
void draw() {
  background(255);
  translate(mouseX, mouseY);
  rect(0, 0, 100, 100);
  ellipse(50, 50, 100, 100);
}
constrain()
void setup() {
  size(600, 400);
}
 
void draw() {
  background(255);
 
  float x = constrain(mouseX, 100, width - 100);
  float y = constrain(mouseY, 100, height - 100);
 
  ellipse(x, y, 30, 30);
}

2. Schreibe ein Programm, bei dem drei senkrechte Linien gleichzeitig mit der Maus von links nach rechts und umgekehrt bewegt werden. Die erste Linie kann komplett zwischen den Seitenrändern bewegt werden, die zweite Linie ist jeweils mindestens 40px vom Rand weg, die dritte Linie jeweils mindestens 80px. Nutze dabei die Systemvariablen width, height, mouseX und die Methode constrain().

Long names are long

Wie sollte man Variablen am besten benennen? Hier ein interessanter Artikel, der einige grundlegenden Regeln aufstellt: Long names are long. Lest den Artikel und überlegt, ob eure Variablen in den vorherigen Beispielen vernünftig benannt sind.

Weitere Übungsaufgaben: Variablen

Entwickle ein Programm, das…

  1. einen Kreis entlang einer der Diagonalen verschiebt. Passe es danach so an, dass es den Kreis entlang der anderen Diagonalen verschiebt.
  2. einen Kreis in der Mitte des Fensters näher kommen2) lässt. Passe es danach so an, dass der Kreis sich entfernt3).
  3. einen großen Kreis in der Mitte des Fensters erscheinen4) lässt. Passe es danach so an, dass der Kreis verschwindet5).
  4. die Helligkeit der Farbe eines Rechtecks von Dunkelrot zu Rot ändert. Passe es danach so an, dass sich nicht Rot sondern Blau / Grün / Gelb / Lila / Grau in ihrer Helligkeit ändern.
  5. einen Winkel von 0° bis hin zu 360° laufen lässt6). Passe es danach so an, dass der Winkel kleiner wird.
  6. die Aufgaben 1, 3, 4 und 5 kombiniert. Also ein größer werdender Kreisbogen, der entlang der Diagonalen läuft, während er eingeblendet wird und seine Farbe ändert.
1)
Quelle: Comenius-Wiki unter CC BY-SA leicht abgewandelt
2)
"größer werden"
3)
"kleiner werden"
4)
"einblenden", Tipp: die Color-Methode color(r, g, b, alpha) kann über den Parameter alpha die Transparenz der eingestellten Farbe anpassen
5)
"ausblenden"
6)
"Tortendiagramm", Tipp: Mit der arc()-Methode kann man einen Kreisbogen zeichnen
info/sek-ii/e2/processing/p3-variablen.txt · Zuletzt geändert: 2023-03-10 11:52 von christian.weber