====== Variablen ======
===== Variablen in der Mathematik =====
Ihr kennt das Wort "Variable" sicher aus der Mathematik. Dort ist eine Variable ein **Platzhalter**, für den beliebige Elemente einer Menge ("Grundmenge") eingesetzt werden können, z.B.
$$x\in \mathbb{R}$$
Oft interessiert man sich in der Mathematik dafür, für welche Belegungen der Variable $x$ eine Aussage, z.B.
$$ 3\cdot x + 2 = x + 10$$
wahr ist. Die Menge dieser Zahlen nennt man **Lösungsmenge** $\mathbb{L}$. Im gegebenen Beispiel ist $\mathbb{L} = \{4\}$. \\ \\
Jetzt, wo Ihr Euch in Erinnerung gerufen habt, was der Begriff "Variable" in der Mathematik bedeutet, kann ich viele von Euch auch gleich wieder beruhigen: ;-)
**Variablen in der Informatik unterscheiden sich deutlich von Variablen in der Mathematik und sie sind viel einfacher zu verstehen!**
===== Variablen in der Informatik =====
Eine **Variable** ist ein Speicherplatz mit einem **Bezeichner** (also einen Namen) und einen **Datentyp**. Der Datentyp legt fest, welche Werte in der Variable gespeichert werden können. \\ \\
Vor der ersten Verwendung einer Variable müssen wir sie **deklarieren**. Dazu schreiben wir einfach den Datentyp der Variablen und dahinter den Bezeichner. \\ \\
**Beispiel:**
int a;
Die hier deklarierte Variable trägt den Bezeichner ''a'' und hat den Datentyp **int**. \\ **int** ist eine Kurzform für "integer number", also "ganze Zahl".
==== Beispiel 1: Wertzuweisung, Berechnung von Termwerten ====
Führe das Programm in Einzelschritten aus ("Step over": {{:klassen1:anwenden:step_over.png?nolink|}}), und zwar
* zunächst mit offenem Tab "Ausgabe" auf der rechten Seite
* dann mit offenem Tab "Variablen" auf der rechten Seite.
Beobachte genau, was jede einzelne der Programmanweisungen bewirkt!
== Erklärung der einzelnen Anweisungen ==
int a;
Diese Anweisung **deklariert** die Variable ''a'' mit dem **Datentyp** int. Der Computer reserviert genug Speicherplatz zum Speichern einer ganzen Zahl (''int'') und merkt sich, dass dieser Speicherplatz ''a'' heißt. Als "Startwert" schreibt der Computer bei Variablen vom Datentyp ''int'' die Zahl 0 in den Speicherplatz. Wir sagen: "''a'' hat den Wert 0.".
a = 12;
Diese Anweisung hat es in sich: Das Gleichheitszeichen ''='' bewirkt in Java **nicht**, dass die Terme auf der rechten und linken Seite verglichen werden, sondern es ist der **Wertzuweisungsoperator** dieser Programmiersprache. Das bedeutet: Der Computer wertet den Term rechts vom ''='' aus und schreibt den Termwert (in diesem Fall einfach die Zahl 12) in die Variable ''a''. Der vorherige Wert der Variable wird dabei **überschrieben**.
Möchte man in Java den Wert zweier Terme **vergleichen**, so muss man dafür den **Vergleichsoperator** ''=='' benutzen, mehr dazu später.
println(a);
Diese Anweisung schreibt nicht den Buchstaben a in die Ausgabe, sondern den **Wert des Terms** ''a''. Zum Zeitpunkt der Ausführung dieser Anweisung steht in der Variable ''a'' der Wert 12, also wird 12 ausgegeben. \\
Will man den Buchstaben a ausgeben, dann verwendet man die Anweisung ''println("a");''
Ist ein Text in Gänsefüßchen (''"'') eingeschlossen, dann stellt er für Java eine **Zeichenkette** dar. ''"a"'' ist so eine Zeichenkette. Zeichenketten werden durch die Anweisung ''println'' einfach wörtlich ausgegeben. \\
Schreibt man etwas nicht in Anführungszeichen, so ist es für Java entweder eine Anweisung oder ein Term. Der Computer versucht diesen Text dann auszuwerten und gibt einen Fehler aus, wenn er ihn nicht versteht.
println(3*a + 5);
Der Text ''3*a + 5'' ist nicht in Anführungszeichen eingeschlossen. Java interpretiert ihn also als Term und bestimmt seinen Wert, in diesem Fall $3 \cdot 12 + 5 = 41$.
println("a");
println("3*a + 5");
Die Texte ''"a"'' und ''"3*a + 5"'' sind jetzt in Anführungszeichen eingeschlossen. Es handelt sich also um **Zeichenketten**, die wörtlich ausgegeben werden.
==== Beispiel 2: Rätsel ====
Schau' Dir das Programm zuerst an, ohne es zu starten. Überlege Dir bei jedem Programmschritt:
* Welche Variablen gibt es gerade?
* Welche Werte haben sie gerade?
Was meinst Du: Welche Werte geben die ''println''-Anweisungen in der Ausgabe aus?
Führe dann das Programm in Einzelschritten aus ("Step over": {{:klassen1:anwenden:step_over.png?nolink|}}) und überprüfe, ob Du richtig vermutet hast!
== Erklärung der einzelnen Anweisungen ==
In der folgenden Tabelle zeige ich Dir, welche Variablen es nach Ausführung der einzelnen Anweisungen gibt und welche Werte sie tragen.
^Anweisung^Variablen und deren Werte^Erklärung^
|int a; | a: 0 | ''a'' wird deklariert und erhält den Wert 0.|
|a = 5; | a: 5 | Der Variablen ''a'' wird der Wert 5 zugewiesen. Jetzt steht die Zahl ''5'' in der Variablen ''a''.|
|int b; | a: 5 \\ b: 0 | ''b'' wird deklariert und erhält den Wert 0.|
|b = a + 3; | a: 5 \\ b: 8 | Der Term ''a + 3'' wird ausgewertet. Sein Wert (8) wird der Variablen ''b'' zugewiesen.|
|println(a) | a: 5 \\ b : 8 | Der Wert von ''a'' (also die Zahl 5) wird ausgegeben. |
|println(b) | a: 5 \\ b : 8 | Der Wert von ''b'' (also die Zahl 8) wird ausgegeben. |
|a = b * 2; | a: 16 \\ b: 8 | Der Term ''b * 2'' wird ausgewertet. Sein Wert (16) wird der Variablen ''a'' zugewiesen.|
|println(a) | a: 16 \\ b : 8 | Der Wert von ''a'' (also die Zahl 16) wird ausgegeben. |
|println(b) | a: 16 \\ b : 8 | Der Wert von ''b'' (also die Zahl 8) wird ausgegeben. |
===== Wie kann ich mir eine Variable vorstellen? =====
Stell Dir eine Variable am besten als beschriftete Schachtel vor, in der **genau ein** Wert (im Fall einer Variablen vom Typ ''int'' genau eine ganze Zahl) reinpasst:
{{ :einstieg:pasted:20200618-181452.png?300 }} \\ \\
Eine Wertzuweisung (z.B. '' a = b * 2.5'') bewirkt, dass der alte Wert weggeworfen und der neue reingetan wird. Nach der Wertzuweisung liegt ein **neuer Zustand** vor:
{{ :einstieg:pasted:20200618-181816.png?300 }}
==== Beispiel 3: Erhöhung des Wertes einer Variablen ====
Jetzt wird es geheimnisvoll: Welchen Wert gibt das folgende Programm aus?
Bei der Ausführung der Anweisung ''a = a + 1;'' wird zunächst den Wert des Terms ''a + 1'' auf der rechten Seite ausgewertet. Der Termwert ist $37 + 1 = 38$. Dieser Wert wird dann der Variablen ''a'' zugewiesen, so dass nach der Ausführung der Anweisung die Variable ''a'' den Wert ''38'' enthält. \\ \\
Die Anweisung '' a = a + 1; '' erhöht den Wert der Variablen ''a'' also um ''1''. \\ \\
**Wichtig:** \\
Der Computer versucht **nicht**, die Gleichung $a = a + 1$ zu lösen (deren Lösungsmenge leer ist), denn ''='' ist nicht der Vergleichsoperator, sondern der **Wertzuweisungsoperator**, der einfach nur bewirkt, dass der Wert des Terms ''a + 1'' in die Variable ''a'' geschrieben wird.
Beim Programmieren kommt es sehr oft vor, dass der Wert einer Variable um einen konstanten Wert erhöht werden muss, daher gibt es dafür eine Kurzschreibweise. Statt ''a = a + 5;'' kann man beispielsweise kurz schreiben: ''a += 5;''. \\ \\
**Spezialfall:** \\
Soll der Wert einer Variablen um ''1'' erhöht werden, so kann man noch kürzer schreiben: ''a++;''. \\ \\
Das Erniedrigen einer Variable geht übrigens entsprechend. ''b = b - 12;'' erniedrigt den Wert von ''b'' um ''12'', kurz: ''b -= 12;''. Auch das Erniedrigen um ''1'' gibt es als Ultrakurzversion:
b--;
=== Probiere es gleich hier aus: ===
===== Deklaration und Wertzuweisung in einem Aufwasch =====
Oft deklariert man eine neue Variable und weist ihr gleich danach ihren Startwert zu, z.B.
int k;
k = 14;
Diese beiden Anweisungen darf man zu einer einzigen zusammenfassen:
int k = 14;
**Form der Bezeichner:** \\
Die Namen der Variablen (wir Informatiker sagen **Bezeichner** dazu, //englisch: identifier//) sind nicht nur auf einzelne Kleinbuchstaben beschränkt, sondern dürfen Kleinbuchstaben, Großbuchstaben, Ziffern und Unterstriche (''_'') enthalten. Auch Umlaute (ä, ö, ü, ...) sind erlaubt. Ein Variablenbezeichner darf **nicht** mit einer Ziffer beginnen. \\ \\
**Beispiele für gültige Variablenbezeichner:** \\
''Anzahl'', ''K'', ''a12_x'', ''f1'' usw.
===== Tastatureingabe =====
Mit der Anweisungen ''Input.readInt("Gib eine Zahl ein:")'' kann man eine Zahl per Tastatureingabe vom Benutzer entgegennehmen.\\ ;-) Kommt Dir die Punktschreibweise noch bekannt vor?
===== Ein letztes Beispiel =====
Zum Schluss nochmal ein Rätsel: Welche Zahl gibt das Programm aus?