Greenfoot: Variablen Nicolas Ruh und Dieter Koch Sicher haben Sie schon mal ein Computerspiel gespielt. Bei den meisten Spielen wird irgendwo der Spielstand angezeigt, z.b. in Form von Punkten oder von erarbeitetem Geld. Dieser Wert ist ja sicher nicht immer der gleiche. Er muss also abgespeichert und verändert werden können. Ebenfalls muss man wieder z.b. für die Ausgabe am Bildschirm darauf zugreifen können. Was tun Sie zu Hause, wenn Sie von Ihrem Götti etwas kriegen, das Sie behalten und später wieder einmal vorzeigen und ev. sogar abändern möchten (oder müssen)? Sie schmeissen es in eine Kiste oder Schachtel, die Sie anschreiben, um den Gegenstand später wieder zu finden. Variablen in einem Computerprogramm kann man sich ebenfalls als solche Kisten vorstellen, wobei jede Kiste die drei folgenden Eigenschaften besitzt: Typ = Form und Grösse der Kiste Name = Aufschrift der Kiste Wert = Inhalt der Kiste Zum Typ: Ein einzelner Buchstabe braucht natürlich viel weniger Speicherplatz als ein ganzer Text, eine kleine Ganzzahl weniger als eine Dezimalzahl mit 12 Nachkommastellen. Deshalb reserviert man nicht für jeden Wert den man abspeichern möchte gleich viel Speicher. Stellen Sie sich ein grosses Containerschiff vor. Es gibt darauf eine ganz grosse Menge von Kisten, alle haben die gleiche Grösse. Darf in jeder Kiste nur höchstens ein Gegenstand sein (also z.b. ein Auto oder eine Banane), so bräuchte es für die gleiche Menge Ware viel mehr Schiffe. Auch im Computer beinhaltet jede Variable nur einen Wert. Um den Speicherplatz effizient zu nutzen, werden also verschieden grosse Kisten benötigt. Die zweite Funktion des Variablentyps ist diejenige, bei der Interpretation des Kistenwertes zu helfen. Beispielsweise ist unter der Variable vornameninitial der Wert 68 zu finden. Falls es sich dabei um eine Variable vom Typ char (Zeichen) handelt, weiss der Computer sofort, dass er bei einem Aufruf nicht die Zahl 68 sondern den Buchstaben D ausgeben soll. Rechts eine kleine Übersicht, später mehr dazu. Zum Namen: Grundsätzlich kann man Variablennamen ziemlich frei aus Buchstaben und Zahlen zusammensetzen. Verboten ist dabei aber der Gebrauch von Spezialzeichen wie Leerzeichen, Umlauten, Akzenten und Satzzeichen. Damit wir den eigenen (und fremden) Quellcode besser lesen können, halten wir uns zudem an folgende Regeln: Wir schreiben Variablen klein; z.b. vorname statt Vorname. Besteht eine Variable aus mehreren Teilwörtern, so schreiben wir bei jedem folgenden Teilwort den ersten Buchstaben gross (= camelcase); z.b. geburtsort statt geburtsort oder geburts_ort. Wir verwenden selbsterklärende Variablennamen, also z.b. alterinjahren statt x.
Zum Wert: Vereinfacht gesagt: Der zu speichernde Wert muss dem Variablentyp entsprechen. Ist dies nicht der Fall, so gibt der Compiler eine Fehlermeldung aus. Das macht auch Sinn, denn wir haben ja sozusagen versucht, einen Tennisball in eine Pralinenschachtel zu stecken. 1. Variablen deklarieren und Werte zuweisen Um eine Variable benutzen zu können, müssen wir sie zunächst deklarieren. Bildlich gesprochen heisst dies, dass wir die Kiste bauen (resp. einen Platz im Gestell reservieren ) und anschreiben. Die Befehlszeile int meinezahl; erstellt nun also eine Variable des Typs int (für integer, Ganzzahl) und gibt ihr den Namen meinezahl. Dabei steht der Typ immer vor dem Namen und das ganze wird mit einem Semikolon (Strichpunkt) abgeschlossen. Der Editor kennt das Schlüsselwort int und stellt es mit roter Farbe dar. Nun kann man dieser Variablen beliebig oft Werte zuweisen. Z.B. mit meinezahl = 2; Dabei gilt: Das was rechts des Gleichheitszeichens steht wird genommen (ev. zuerst berechnet) und als Wert in die Variablen links des Gleichheitszeichens geschrieben. Man kann sich daher ein einzelnes Gleichheitszeichen im Programmcode immer auch als nach links gerichteten Pfeil vorstellen: meinezahl 2. Selbstverständlich kann man rechts des Gleichheitszeichens auch die Namen bereits deklarierter Variablen verwenden. Falls ich also auf der Strasse eine Hunderternote finde, so kann ich den Effekt mit folgender Zuweisung ausdrücken: meinvermoegen = meinvermoegen + 100; Falls ich Röbi überfalle und mir all sein Geld aneigne dann mit meinvermoegen = meinvermoegen + roebisvermoegen; roebisvermoegen = 0; Und wenn ich dann aus Reue die Hälfte der Kirche spende, so wirkt sich auch dies aus: meinvermoegen = 0.5*meinVermoegen; Wenn es sich anbietet, kann man die Deklaration und Zuweisung einer Variable übrigens auch in einer einzigen Zeile erledigen: int meinezahl = 7; 2. Variablen-Werte ausgeben Die Ausgabe kann auf ganz vielfältige Weise geschehen. Wir wollen uns im Moment darauf beschränken, unsere Resultate in ein Text-Fenster zu schreiben. Dafür stellen wir Ihnen ein fast leeres Szenario zur Verfügung, es heisst ausgabe_in_konsole. Speichern Sie es in Ihrem persönlichen Ordner, entpacken sie es gegebenenfalls (wenn die Dateiendung.zip ist) und öffnen Sie es in Greenfoot.
Das Szenario besteht aus einer fast leeren Welt, einzig bestückt mit einer Instanz der Klasse Beispiel (zu erkennen am grünen Symbol links oben). Öffnen Sie die Klasse Beispiel im Editor. Sie sehen, dass die act()-methode im Moment noch leer ist. Wir ergänzen diese nun folgendermassen: public void act() { int meinezahl=2; // Variable deklarieren und Wert zuweisen System.out.println(meineZahl); // Wert in Konsolenfenster ausgeben } Vgl. auch nachfolgende Abbildung: Kompilieren Sie das ganze und klicken Sie auf die > Act -Schaltfläche. Die Methode wird nun aufgerufen und unser Code ausgeführt. Dabei wird ein Fenster geöffnet und die Zahl ausgegeben. Das ist übrigens dasselbe Fenster, in dem ggf. die Fehlermeldungen des Compilers angezeigt werden, die sogenannte Konsole. Sehr spannend ist das Programm jetzt noch nicht, verändern wir daher die Variable vor der Ausgabe noch. Fügen Sie die zusätzliche Zeile ein: public void act() { int meinezahl=2; // Variable deklarieren und Wert zuweisen meinezahl = meinezahl + 1; // Wert verändern System.out.println(meineZahl); // Wert in Konsolenfenster ausgeben } Kompilieren und testen Sie. Jedesmal, wenn wir auf die > Act -Schaltfläche klicken wird die gleiche Zahl ausgegeben. Dies liegt daran, dass die Variable nach dem Klick immer zuerst auf den Wert 2 gesetzt wird.
3. Instanzvariablen verwenden Damit sich die Ausgabe verändert, müssen wir das Neusetzen der Variable verhindern. Wir deklarieren und initialisieren (die allererste Zuweisung nennt man Initialisierung) daher die Variable als sogenannte Instanzvariable direkt in der Beispiel-Klasse also innerhalb des grün hinterlegten Klassen-Blocks, aber nicht in einem der gelb hinterlegten Methoden-Blöcke. Dazu verschieben wir die entsprechende Zeile nach oben (in der Abbildung grün umrahmt). Die Variable erhält ihren Wert jetzt ausserhalb der act()-methode und wird während des Programmablaufes nicht mehr neu initialisiert. Bei jedem Aufruf der act()-methode wird wieder der alte Wert genommen, dann zunächst der Wert der Variablen vergrössert und dann ausgegeben. 4. Aufgaben zu int-variablen 1) Ändern Sie den Code so ab, dass a) nur gerade Zahlen ausgegeben werden: 2, 4, 6, b) die Zahl immer verdoppelt wird: 2, 4, 8, 16 c) die Siebenerreihe ausgegeben wird 2) Was wird ausgegeben, wenn die Veränderung an der Variablen mit meinezahl = -meinezahl; vorgenommen wird? (Zuerst überlegen, dann ausprobieren.) 3) Zuerst überlegen, dann ausprobieren: Führen Sie eine zweite Variable ein: int summand = -1; Welche Ausgabe bewirkt der nachfolgende Code? summand = -summand; meinezahl = -meinezahl+summand; 4) Wie könnte man dann folgende Ausgaben erreichen? a) 2, -4, 6, -8, 10, -12, b) 2, 4, 7, 11, 16, 22, 29, 5) Man kann auch Resultate im Ausgabebefehl direkt berechnen lassen. Testen Sie dies mit meinezahl = meinezahl +1; System.out.println(meineZahl*6); Wie erreicht man dann die Ausgaben 9, 18, 27, 36, resp. 1, 4, 9, 16, 25,?
5. Weitere Variablentypen Nebst den Ganzzahlen sind für uns zunächst vor allem Zeichen und Zeichenketten sowie Fliesskommazahlen wichtig. Ein einzelnes Zeichen wird als char gespeichert. Eine Zeichenkette als String (es kann sein, dass eine Zeichenkette manchmal auch nur aus einem Zeichen besteht). Für Fliesskommazahlen stehen diedatentypen float und double zur Verfügung. Double kann mehr Nachkommastellen speichern, braucht aber doppelt so viel Platz. char meinvornameninitial = 'D'; // Zeichen: einfache Anführungszeichen String meinvorname = "Dieter"; // Zeichenkette: doppelte Anführungszeichen double meineschuhgroesse = 43.5; // Fliesskommazahl doppelter Genauigkeit Achtung: Der Typbezeichner String wird gross geschrieben. Nun kann man Textteile verknüpfen und ausgeben lassen. System.out.println("Mein Vorname lautet " + meinvorname + "."); Der Operator + steht hier nicht für die Addition, sondern für die Verknüpfung zweier Zeichenketten, der sogenannten Konkatenation. Verknüpft man eine Zeichenkette mit einer Zahl, so wird die Zahl vor dem Verketten automatisch in eine Zeichenkette umgewandelt: System.out.println("Meine Schuhgroesse ist " + meineschuhgroesse + "."); 6. Aufgaben zu verschiedenen Variablentypen 6) Ändern Sie das Beispiel so ab, dass der folgende Text ausgegeben wird (Bsp. für meine Angaben): Mein Vorname beginnt mit einem D, er lautet naemlich Dieter. 7) Definieren Sie zwei Variablen: String meinvorname = "James"; String meinnachname = "Bond"; Verketten Sie geeignet, so dass für diese Wahl der Namen folgender Text ausgegeben wird: Mein Name ist Bond, James Bond.. (Setzen Sie danach ihren eigenen Vornamen resp. Nachnamen ein.) 8) Definieren Sie drei Variablen: String person = "Trudi"; String menge = "viel"; String was = "Programme"; Verketten Sie geeignet, so dass für diese Wahl der Namen folgender Text ausgegeben wird: Trudi macht es viel Spass, Progamme zu schreiben. (Setzen Sie danach andere Werte für die Variablen ein.) 9) Es soll im Textfenster ausgegeben werden, wie oft schon auf die > Act -Schaltfläche geklickt wurde.
10) Probieren Sie den nachfolgenden Code aus. Was fällt auf? Können Sie sich die Unterschiede in der Ausgabe erklären? System.out.println("3+4="+3+4); System.out.println("3+4="+(3+4)); System.out.println(3+4+"=3+4"); System.out.println("3*4="+3*4); 11) Schreiben Sie ein Programm, so dass man zu Beginn zwei Zahlenwerte festlegen kann und deren Summe und Produkt und berechnet und ausgegeben werden. Die Ausgabe für die Werte 3 und 5 würde lauten: Die Summe von 3 und 5 beträgt 8, das Produkt 15. 12) Probieren Sie den nachfolgenden Code aus. Was fällt auf? Können Sie sich die Unterschiede in der Ausgabe erklären?. double meinebruchzahl = 7; System.out.println(meineBruchzahl / 2); int meineganzzahl = 7; System.out.println(meineGanzzahl / 2); 13) Welche Ausgaben erhält man, wenn man beide Variablen auf 8 initialisiert? 14) Nutzen Sie ihre Erkenntnisse aus obigen zwei Aufgaben, um mit mehrmaligem Klicken auf die > Act - Schaltfläche folgende Zahlenreihen zu erhalten: a) 1, 1, 2, 2, 3, 3, 4, 4, b) 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, c) 2, 4, 5, 7, 8, 10, 11, 13 (schwierig!) 15) Probieren Sie den nachfolgenden Code aus. Was fällt auf? (Vergleichen Sie mit der ähnlichen Aufgabe weiter oben.) double meinebruchzahl = 7; System.out.println(0.5*meineBruchzahl); int meineganzzahl = 7; System.out.println(0.5*meineGanzzahl);