Zum Inhalt springen
Zurück zur Themenübersicht

Algorithmen

Variablen, Datentypen und Wertzuweisung

Warum die Zeile „x wird zu x plus 1“ in der Informatik richtig ist, obwohl sie als Gleichung unmöglich wäre.

Benötigte Grundlagen

Dieses Vorwissen brauchst du für das Kapitel. Schau kurz nach, wenn dir etwas davon nicht mehr präsent ist, sonst leg direkt los.

Einführung

Schreib einmal auf: x=x+1x = x + 1.

Im Mathematikunterricht wäre das eine Gleichung ohne Lösung: Keine Zahl ist um eins größer als sie selbst. In jedem Programm dieser Welt steht diese Zeile trotzdem, und sie ist dort völlig richtig.

Der Grund ist, dass dasselbe Zeichen zwei ganz verschiedene Dinge bedeuten kann. Wer diesen Unterschied einmal sauber verstanden hat, dem lösen sich die meisten Anfangsschwierigkeiten beim Programmieren von selbst auf.

Das kannst du nach diesem Kapitel

  • erklären, was eine Variable in der Informatik ist, und sie von der mathematischen Variablen abgrenzen.

  • eine Wertzuweisung von einer Gleichung unterscheiden und die Leserichtung angeben.

  • die wichtigsten Datentypen nennen und begründen, wozu die Angabe eines Typs dient.

  • den Wert von Variablen in einer Wertetabelle Schritt für Schritt verfolgen.

  • Syntax und Semantik unterscheiden und Beispiele für beide Fehlerarten geben.

Was eine Variable in der Informatik ist

Stell dir einen beschrifteten Karton vor. Auf dem Karton steht ein Name, im Karton liegt ein Wert. Man kann hineinsehen (den Wert lesen) und man kann den Inhalt austauschen (einen neuen Wert hineinlegen). Der Name bleibt dabei derselbe.

Genau das ist eine Variable: ein benannter Speicherplatz, dessen Inhalt sich während der Ausführung ändern darf. Das Wort „variabel“ ist hier wörtlich gemeint.

Ein Name, ein Platz, ein Wert

alterGanzzahl14

Drei Dinge, die man leicht in einen Topf wirft, stehen hier getrennt: Der Name alter klebt als Schild am Kasten, der Datentyp sagt, was hineinpasst, und im Kasten liegt der Wert. Der Kasten bleibt derselbe, auch wenn sich der Wert ändert, genau deshalb kann man ihn überhaupt beim Namen ansprechen.

Der Unterschied zur Mathematik

In der Mathematik ist xx ein Platzhalter für einen festen, noch unbekannten Wert. In 2x+3=112x + 3 = 11 ist xx die ganze Zeit dieselbe Zahl, nämlich 4. Sie ändert sich nicht, man findet sie heraus.

In der Informatik ist xx ein Behälter, dessen Inhalt sich planmäßig ändert. Deshalb ergibt

x:=x+1x := x + 1

Sinn. Man liest die Zeile von rechts nach links:

  1. Berechne die rechte Seite mit dem aktuellen Inhalt von xx.
  2. Lege das Ergebnis in xx hinein und überschreibe damit den alten Inhalt.

Steht vorher 7 in xx, so wird rechts 7+1=87 + 1 = 8 berechnet und danach 8 hineingelegt. Es gibt keinen Widerspruch, weil zwei verschiedene Zeitpunkte gemeint sind: der Wert vorher und der Wert nachher.

Damit das sichtbar bleibt, schreibt man die Zuweisung in Pseudocode meist :=\texttt{:=} und nicht ==. Viele Programmiersprachen benutzen trotzdem das einfache Gleichheitszeichen für die Zuweisung und dafür ein doppeltes (==\texttt{==}) für den Vergleich. Das ist eine der häufigsten Fehlerquellen überhaupt.

SchreibweiseBedeutungFrage dahinter
a := 5\texttt{a := 5}ZuweisungLege 5 in a.
a = 5\texttt{a = 5} (Mathematik)AussageIst a gleich 5?
a == 5\texttt{a == 5} (viele Sprachen)VergleichIst a gleich 5?

Warum x = x + 1 keine Gleichung ist

nach der Anweisung x = 5xGanzzahl5nimm den Wert aus demKasten, rechne 5 + 1, lege 6zurücknach der Anweisung x = x + 1xGanzzahl6

In der Mathematik hat x=x+1x = x + 1 keine Lösung. In der Informatik ist es keine Gleichung, sondern eine Anweisung und der Pfeil zwischen den beiden Kästen sagt genau, welche: erst lesen, dann rechnen, dann zurücklegen. Das Gleichheitszeichen bedeutet hier „bekommt den Wert“, nicht „ist gleich“. Wer das verwechselt, versteht keine einzige .

Wozu ein Datentyp gut ist

Jede Variable hat einen Datentyp. Er legt fest, welche Werte hineinpassen und welche Operationen erlaubt sind.

TypWerteBeispielTypische Operationen
Ganzzahlganze Zahlenalter := 15\texttt{alter := 15}++, −-, ⋅\cdot, Rest
KommazahlZahlen mit Nachkommastellenpreis := 2.99\texttt{preis := 2.99}++, −-, ⋅\cdot, ::
ZeichenketteTextname := "Lena"\texttt{name := "Lena"}verbinden, Länge, Teilstück
Wahrheitswertwahr oder falschfertig := falsch\texttt{fertig := falsch}und, oder, nicht

Der Typ ist keine Schikane, sondern beantwortet drei Fragen auf einmal:

Wie viel Platz wird gebraucht? Eine Ganzzahl braucht anderen Platz als ein Text.

Wie sind die zu lesen? Dasselbe Bitmuster bedeutet als Ganzzahl etwas anderes als als Zeichen. Das ist genau die Vereinbarung aus dem Codierungskapitel.

Was ist erlaubt? "Lena" - 3\texttt{"Lena" - 3} ergibt keinen Sinn. Der Typ erlaubt es dem System, solche Fehler zu bemerken, statt Unsinn zu berechnen.

Achte besonders auf den Unterschied zwischen der Zahl 7\texttt{7} und der Zeichenkette "7"\texttt{"7"}. Die erste kann man verdoppeln, die zweite kann man an einen anderen Text anhängen. Sie sehen gleich aus und sind verschiedene Dinge.

Drei Datentypen

ZahlTextWahrheits-wertWas passt hinein?42, −7, 0„Anna“,„14“wahr,falschWas macht das Pluszeichen?rechnet: 3+ 4 wird 7hängt an:„3“ + „4“wird „34“gibt esnichtTypischer FehlerText insZahlfeldgetipptZahlen alsTextaddiertmit 1verglichenDerselbe Wert „14“ verhält sichvöllig verschieden, je nachdem,welcher Typ der Platz ist.

Die mittlere Zeile ist der Grund, warum es Datentypen überhaupt gibt: Dasselbe Pluszeichen bedeutet bei Zahlen etwas anderes als bei Text, und bei Wahrheitswerten gar nichts. Der Typ steht also nicht zur Zierde am Platz, er entscheidet, was jede Rechenanweisung darauf tut.

Syntax und Semantik

Syntax ist die Frage nach der Form: Ist der Satz nach den Regeln der Sprache richtig gebaut? Fehlt ein Semikolon oder eine Klammer, ist die Syntax verletzt, und das System meldet das sofort.

Semantik ist die Frage nach der Bedeutung: Tut der Satz das, was gemeint war? Ein syntaktisch einwandfreies Programm kann semantisch völlig falsch sein.

Zwei deutsche Sätze machen den Unterschied deutlich:

  • „Der Hund bellt laut den.“ ist syntaktisch falsch; man merkt es sofort, ohne über den Inhalt nachzudenken.
  • „Der Hund bellt den Regenbogen an.“ ist syntaktisch einwandfrei und semantisch merkwürdig.

Übertragen auf ein Programm:

flaeche := laenge + breite

Hier ist alles formal richtig. Trotzdem berechnet die Zeile nicht die Fläche, sondern die halbe Umfangslänge. Kein System kann das melden, denn es kennt deine Absicht nicht. Syntaxfehler findet der Rechner, Semantikfehler findest nur du. Das ist der Grund, warum Testen zum Programmieren gehört.

Werte verfolgen: die Wertetabelle

Wenn man nicht sicher ist, was ein Ablauf tut, hilft nur eines: ihn Zeile für Zeile durchspielen und alle Werte mitschreiben.

a := 3
b := 5
a := a + b
b := a - b
Nach Zeileab
13noch leer
235
385
483

Beachte Zeile 4: Rechts steht 8−58 - 5, denn dort gelten die Werte nach Zeile 3. Wer stattdessen mit dem ursprünglichen a=3a = 3 rechnet, erhält ein falsches Ergebnis. Die Reihenfolge der Zuweisungen ist entscheidend, und genau das macht die Wertetabelle sichtbar.

Die Wertetabelle zum Ablaufdiagramm

Schrittisummevor der Schleife10nach dem 1. Durchlauf21nach dem 2. Durchlauf33nach dem 3. Durchlauf46Gerechnet wird je Durchlauf: erstsumme = summe + i, dann i = i + 1.

Das ist der Ablauf aus dem vorigen Kapitel, Zeile für Zeile mitgeschrieben. Rechne die Tabelle einmal selbst nach, statt sie zu glauben: Nach dem dritten Durchlauf steht in summe gerade 1+2+3=61 + 2 + 3 = 6. Wer nicht versteht, warum eine tut, was sie tut, schreibt genau diese Tabelle hin. Sie ist das Werkzeug gegen das Raten.

Zwei Variablen tauschen

Warum vertauscht die Folge a := b\texttt{a := b} und b := a\texttt{b := a} die Werte nicht, und wie geht es richtig?

  1. 1

    Start: a=3a = 3, b=5b = 5.

  2. 2

    Nach a := b\texttt{a := b} gilt a=5a = 5 und b=5b = 5. Der alte Wert von aa ist überschrieben und damit unwiederbringlich weg.

  3. 3

    Nach b := a\texttt{b := a} gilt b=5b = 5. Beide Variablen enthalten jetzt 5. Der Wert 3 existiert nirgendwo mehr.

  4. 4

    Die Ursache: Eine Zuweisung überschreibt. Wer den alten Wert später noch braucht, muss ihn vorher irgendwo hinlegen.

  5. 5

    Richtig mit Hilfsvariable: h := a\texttt{h := a}, dann a := b\texttt{a := b}, dann b := h\texttt{b := h}. Durchgespielt: h=3h = 3, a=5a = 5, b=3b = 3. Getauscht.

Mit einer Hilfsvariablen: h := a; a := b; b := h\texttt{h := a; a := b; b := h}. Ohne sie geht der erste Wert verloren.

Syntax- oder Semantikfehler?

Beurteile die drei Zeilen. Der Umfang eines Rechtecks soll berechnet werden. a) umfang := 2 * (laenge + breite\texttt{umfang := 2 * (laenge + breite} b) umfang := 2 * laenge + breite\texttt{umfang := 2 * laenge + breite} c) umfang := laenge * breite\texttt{umfang := laenge * breite}

  1. 1

    a) Die schließende Klammer fehlt. Der Ausdruck ist nach den Regeln der Sprache nicht richtig gebaut, also ein Syntaxfehler. Das System meldet ihn und führt gar nichts aus.

  2. 2

    b) Formal einwandfrei. Wegen Punkt vor Strich wird aber 2⋅laenge2 \cdot \text{laenge} gerechnet und danach die Breite einfach addiert. Bei laenge=5\text{laenge} = 5 und breite=3\text{breite} = 3 kommt 13 heraus statt 16. Ein Semantikfehler.

  3. 3

    c) Ebenfalls formal einwandfrei, berechnet aber die Fläche. Auch ein Semantikfehler, und ein besonders tückischer, weil das Ergebnis plausibel aussieht.

  4. 4

    Nur Fall a) wird gemeldet. Die Fälle b) und c) laufen anstandslos durch und liefern falsche Zahlen.

  5. 5

    Deshalb prüft man neue Programme immer mit einem Beispiel, dessen Ergebnis man unabhängig kennt: Bei 55 und 33 muss der Umfang 16 sein.

a) Syntaxfehler, wird gemeldet. b) und c) Semantikfehler, laufen durch und sind still.

Typischer Fehler

„x:=x+1x := x + 1 kann nicht stimmen, denn keine Zahl ist um eins größer als sie selbst.“

Der Satz stimmt für eine Gleichung. Nur steht hier keine Gleichung, sondern eine Anweisung, und sie hat eine Richtung.

Eine Gleichung ist eine Aussage über einen Zustand: „links und rechts ist dasselbe“. Eine Zuweisung ist eine Handlung in zwei Schritten: erst den Ausdruck rechts mit den aktuellen Werten ausrechnen, dann das Ergebnis links hineinlegen.

Es sind also zwei verschiedene Zeitpunkte gemeint. Sprich die Zeile testweise so aus: „Der neue Wert von xx ist der alte Wert von xx plus eins.“ Der scheinbare Widerspruch verschwindet sofort.

Genau deshalb schreibt man in Pseudocode :=\texttt{:=} statt ==: Das Zeichen erinnert an die Richtung. Wer in einer Programmiersprache arbeitet, die == für die Zuweisung benutzt, sollte diesen Satz beim Lesen im Kopf mitsprechen.

Übung 1

leicht

Welchen Datentyp wählst du?

a) Anzahl der Geschwister b) Körpergröße in Metern c) Vorname d) „Hausaufgabe erledigt?“ e) Postleitzahl

Tipp anzeigen

Zu e): Rechnet man jemals mit einer Postleitzahl? Und was passiert mit einer führenden Null?

Lösung anzeigen

a) Ganzzahl b) Kommazahl c) Zeichenkette d) Wahrheitswert e) Zeichenkette. Postleitzahlen sind Kennungen, keine Größen: Man addiert sie nie, und als Zahl gespeichert verlöre eine PLZ wie 01067 ihre führende Null.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    Die Auswahlfrage stellen: Wird damit gerechnet?

    Der Datentyp folgt nicht daraus, ob etwas „aus Ziffern besteht“, sondern daraus, was mit dem Wert geschehen soll: Wird damit gerechnet? Nur dann ist ein Zahlentyp richtig. Danach entscheidet man, ob Zwischenwerte vorkommen (Kommazahl) oder nicht (Ganzzahl).

  2. 2

    a) bis c): die geradlinigen Fälle

    Geschwister zählt man, halbe gibt es nicht: Ganzzahl. Die Körpergröße in Metern hat Nachkommastellen (1,681{,}68): Kommazahl. Ein Vorname besteht aus Buchstaben, mit denen niemand rechnet: Zeichenkette.

  3. 3

    d) Wahrheitswert: Wenn es nur zwei Antworten gibt

    „Hausaufgabe erledigt?“ kennt genau zwei Antworten: ja oder nein. Dafür gibt es einen eigenen Typ, den Wahrheitswert. Er macht die Absicht im Programmtext sichtbar und schließt unsinnige Werte von vornherein aus.

  4. 4

    e) Der Stolperfall: Ziffern, die keine Zahl sind

    Die Postleitzahl sieht aus wie eine Zahl, ist aber eine Kennung: Man addiert sie nie und bildet keinen Durchschnitt. Als Zahl gespeichert verlöre 01067 zudem die führende Null und würde zu 1067. Richtig ist die Zeichenkette.

Übung 2

mittel

Verfolge die Werte:

a := 4
b := 10
c := a
a := b
b := c
c := a + b

a) Erstelle eine Wertetabelle. b) Welche Werte haben a, b und c am Ende? c) Wozu dient c in den Zeilen 3 bis 5?

Tipp anzeigen

Trage nach jeder Zeile alle drei Werte ein, auch die unveränderten.

Lösung anzeigen

a) Wertetabelle:

Nach Zeileabc
14leerleer
2410leer
34104
410104
51044
610414

b) a=10a = 10, b=4b = 4, c=14c = 14.

c) In den Zeilen 3 bis 5 ist cc eine Hilfsvariable für den Tausch von aa und bb. Sie bewahrt den ursprünglichen Wert von aa auf, bevor er in Zeile 4 überschrieben wird. In Zeile 6 wird cc dann für etwas anderes weiterverwendet.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    Die Regel, die alles entscheidet

    Bei jeder Zeile gilt: Zuerst wird die rechte Seite mit den Werten ausgerechnet, die in diesem Moment gelten. Danach erst wird die linke Variable überschrieben.

    Zwischenergebnis

    Rechte Seite lesen, linke Seite schreiben. Immer in dieser Reihenfolge.

    Der häufigste Fehler ist, in Zeile 5 noch mit dem alten a=4a = 4 zu rechnen. Nach Zeile 4 steht dort aber bereits 10.

  2. 2

    Zeilen 1 bis 3: Werte anlegen und sichern

    Die ersten beiden Zeilen legen Startwerte fest. Zeile 3 kopiert den Wert von aa nach cc; aa selbst bleibt dabei unverändert, denn Lesen verändert nichts.

    a = 4,\quad b = 10,\quad c = 4

    Zwischenergebnis

    Der Wert 4 existiert jetzt zweimal.

  3. 3

    Zeilen 4 und 5: der eigentliche Tausch

    Zeile 4 überschreibt aa mit 10. Der alte Wert von aa wäre damit verloren, aber er liegt gesichert in cc. Zeile 5 holt ihn von dort zurück nach bb.

    a := b = 10 \qquad b := c = 4

    Zwischenergebnis

    a=10a = 10, b=4b = 4: getauscht.

  4. 4

    Zeile 6: c bekommt eine neue Aufgabe

    Nach dem Tausch wird cc nicht mehr als Sicherung gebraucht. Die letzte Zeile nutzt den Speicherplatz neu und legt dort die Summe der getauschten Werte ab.

    c := a + b = 10 + 4 = 14

    Zwischenergebnis

    c=14c = 14.

    Dass eine Variable nacheinander verschiedene Aufgaben übernimmt, ist erlaubt, macht ein Programm aber schwer lesbar. In der Praxis nimmt man dafür lieber einen zweiten, passend benannten Namen.

Übung 3

schwer

a) Ein Programm liest eine Zahl aus einem Eingabefeld und rechnet eingabe + 1\texttt{eingabe + 1}. Statt 8 erscheint 71. Erkläre, was passiert ist. b) Handelt es sich um einen Syntax- oder einen Semantikfehler? Begründe. c) Schreibe einen , der drei Zahlen einliest und ihren Mittelwert ausgibt. Achte auf die Datentypen. d) Warum kann ein Programm, das nur mit Ganzzahlen rechnet, beim Mittelwert ein falsches Ergebnis liefern? Gib ein Beispiel.

Tipp anzeigen

Zu a): Was liefert ein Eingabefeld, bevor jemand es umwandelt?

Lösung anzeigen

a) Ein Eingabefeld liefert eine Zeichenkette, nicht eine Zahl. Der Operator ++ bedeutet bei Zeichenketten „aneinanderhängen“. Aus "7"\texttt{"7"} und "1"\texttt{"1"} wird deshalb "71"\texttt{"71"}. Richtig wäre, die Eingabe zuerst in eine Zahl umzuwandeln und danach zu addieren.

b) Ein Semantikfehler. Die Zeile ist formal einwandfrei gebaut, das System meldet nichts. Nur die Bedeutung ist eine andere als beabsichtigt, weil ++ je nach Datentyp verschieden wirkt.

c) Algorithmus:

LIES a, b, c (als Kommazahlen) summe := a + b + c mittelwert := summe / 3 SCHREIBE mittelwert

d) Weil die Division zweier Ganzzahlen in vielen Sprachen wieder eine Ganzzahl liefert und der Rest abgeschnitten wird. Für a=1a = 1, b=2b = 2, c=2c = 2 ist die Summe 5, und 5:35 : 3 ergibt dort 1 statt 1,671{,}67. Der Ausweg ist, mindestens einen Wert als Kommazahl zu führen; dann rechnet das System mit Nachkommastellen weiter.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    a) Die Ausgabe 71 rückwärts lesen

    Aus 7 und 1 wird 71. Das ist kein Rechenergebnis, sondern ein Aneinanderhängen. Ein Eingabefeld liefert nämlich eine Zeichenkette, keine Zahl, und bei Zeichenketten bedeutet ++ „aneinanderhängen“. Aus "7"\texttt{"7"} und "1"\texttt{"1"} wird deshalb "71"\texttt{"71"}.

  2. 2

    b) Syntax- oder Semantikfehler: Wer beschwert sich?

    Ein Semantikfehler. Die Zeile ist formal einwandfrei gebaut, das System meldet nichts. Nur die Bedeutung ist eine andere als beabsichtigt, weil ++ je nach Datentyp verschieden wirkt.

  3. 3

    c) Den Mittelwert-Algorithmus mit passenden Typen aufschreiben

    Drei Zahlen einlesen, summieren, durch 3 teilen, ausgeben. Entscheidend ist die Typwahl: Die Werte werden als Kommazahlen eingelesen, damit die Division Nachkommastellen liefern kann.

    summe := a + b + c\texttt{summe := a + b + c}; mittelwert := summe / 3\texttt{mittelwert := summe / 3}

  4. 4

    d) Warum reines Ganzzahlrechnen den Mittelwert verfälscht

    Weil die Division zweier Ganzzahlen in vielen Sprachen wieder eine Ganzzahl liefert und der Rest abgeschnitten wird. Für a=1a = 1, b=2b = 2, c=2c = 2 ist die Summe 5, und 5:35 : 3 ergibt dort 1 statt 1,671{,}67. Der Ausweg: mindestens einen Wert als Kommazahl führen.

    5:3=15 : 3 = 1 (Ganzzahl) gegen 5:3=1,675 : 3 = 1{,}67 (Kommazahl)

Zusammenfassung

Eine Variable in der Informatik ist ein benannter Speicherplatz, dessen Inhalt sich planmäßig ändert, und nicht der feste Platzhalter aus der Mathematik. Eine Wertzuweisung liest man von rechts nach links: erst den Ausdruck mit den aktuellen Werten berechnen, dann das Ergebnis in die Variable legen und den alten Inhalt überschreiben. Deshalb ist x:=x+1x := x + 1 widerspruchsfrei, und deshalb braucht ein Tausch zweier Werte eine Hilfsvariable. Der Datentyp legt fest, welche Werte hineinpassen, wie die zu lesen sind und was erlaubt ist; die Zahl 7 und die Zeichenkette mit der Ziffer 7 sind zwei verschiedene Dinge. Syntaxfehler betreffen die Form und werden gemeldet, Semantikfehler betreffen die Bedeutung und bleiben still, weshalb jedes Programm an einem Beispiel mit bekanntem Ergebnis geprüft werden muss.