Bunte Bits

9. Programmieren


9.2 Programmelemente

Vielleicht hast du dich darüber gewundert, dass ich die Programme bisher nur als einfache Textbeschreibung hingeschrieben, also nur die Algorithmen beschrieben habe. Es scheint noch ein wenig weit weg, diesen Text in Befehle zu gießen, die ein Computer verstehen kann. Warum das gar nicht schwierig ist, will ich dir in diesem Kapitel erklären und im nächsten siehst du dann, wie ein richtiges Programm aussieht.

Um von der Vielfalt der Sprache zu einfachen Befehlen zu kommen, schauen wir doch mal, ob in der Beschreibung der Algorithmen nicht Vorgänge auftauchen, die sich ähneln, die man also mit Befehlen (und dazugehörigen Parametern) vereinfacht darstellen kann.

Eingabe

Das erste was wir in unserem Programm beschreiben, ist die Eingabe und Speicherung einer Zahl. Es lässt sich leicht vorstellen, einen Befehl Eingabe zu realisieren, dem wir als Parameter mitgeben, in welchen Variablen die einzugebenden Werte zu speichern sind. Ein weiterer Parameter könnte vielleicht noch ein Text sein, der dem Benutzer angezeigt wird, damit er weiß was er eingeben soll.

Bedingung

In Schritt 1a unseres Algorithmus wird eine Bedingung abgefragt Wenn ... dann ...! Allein von der Sprache her wäre denkbar, dass auch noch ein sonst hinterherkommt. Nur wenn die Bedingung erfüllt ist sollen bestimmte Programmteile abgearbeitet werden, sonst andere.

Solche Bedingungen sind in der Programmierung sehr wichtig! Man nennt sie auch Verzweigung, weil sich abhängig von der Bedingung der Weg durch das Programm verändert.

Ein Befehl Wenn bräuchte als Parameter die Bedingung und den Programmteil, der ausgeführt werden soll, wenn die Bedingung erfüllt ist, und den der ausgeführt werden soll, wenn sie nicht erfüllt ist. Natürlich kann man sich auch vorstellen, dass eine Bedingung mehr als zwei Auswahlmöglichkeiten zulassen soll. Du kannst dir aber leicht vorstellen, dass man das mit verschachtelten Wenn-Befehlen lösen kann; dafür braucht man also keinen eigenen Befehl.
Ein Beispiel:

Es soll das Gewicht eines Briefes eingegeben und das Porto berechnet werden. Ein Brief bis 20g kostet 0,50€, ein Brief zwischen 20g und 50g kostet 1,00€ und ein Brief über 50g kostet 2,00€:

  1. Eingabe und Speicherung von Gewicht
  2. Wenn Gewicht kleiner oder gleich 20g, dann
       Porto 0,50€ ausgeben.
       Programm beenden.
    sonst weiter mit 3.
  3. Wenn Gewicht kleiner oder gleich 50g, dann
       Porto 1,00€ ausgeben.
       Programm beenden.
    sonst weiter mit 4.
  4. Porto 2,00€ ausgeben.
  5. Programmende

Blöcke

Eine weitere Funktion beim Programmeschreiben ist nicht so offensichtlich, aber es leuchtet irgendwie ein, dass wir etwas brauchen, womit wir Programmteile zu Blöcken zusammenfassen können, damit wir zum Beispiel in einer Bedingung wie oben sagen können, was alles zu dem Programmteil gehört, der beispielsweise dann ausgeführt werden soll, wenn die Bedingung erfüllt ist.

Wir sind immer noch bei Schritt Nummer 1a der Algorithmusbeschreibung und haben schon drei Sachen gefunden, die wir in Befehlen formulieren können!

Vergleiche

Ebenso wie die Blockbildung ist auch die nächste Gruppe von Befehlen eng mit der Möglichkeit Bedingungen zu formulieren verknüpft: Wir müssen vergleichen können! Außerdem wollen wir logisch verknüpfen können. Damit sind die Formulierungen oder, und, nicht in den Bedingungen gemeint. Wenn wir uns das genau überlegen, sind solche Operationen auch nichts anderes als die mathematischen Berechnungen plus und minus: Zwei Größen werden miteinander verknüpft und heraus kommt ein Ergebnis, das von der Definition der Operation abhängt. Der einzige Unterschied ist, dass das Ergebnis keine richtige Zahl sondern sie Aussage wahr oder falsch ist.

Beispiele:

"5 ist größer als 3" hat das Ergebnis wahr.

"7 ist kleiner als 4" hat das Ergebnis falsch.

"Äpfel sind rund und Birnen sind viereckig" hat das Ergebnis falsch.

"Äpfel sind rund oder Birnen sind viereckig" hat das Ergebnis wahr.

"Birnen sind nicht viereckig" hat das Ergebnis wahr.

Für alle diese Operationen brauchen wir also Befehle, die als Parameter die beiden (oder manchmal auch mehr) verknüpften Größen, man nennt sie die Operanden, erhalten und die ein Ergebnis liefern.

Wertzuweisung

Und wohin dann mit dem Ergebnis? Auch dafür brauchen wir einen Befehl! Das sieht man sehr schön im Schritt 2 oder noch besser im Schritt 2a: Dort wird einer Variablen ein Wert zugewiesen. Bei diesem Befehl muss man ein wenig aufpassen, wie man ihn nennt! Man könnte ja, wie ich das in der Textbeschreibung auch getan habe, das Gleichheitszeichen benutzen und sagen "Variable = Wert".

Wie schreibe ich dann aber meine Vergleichsoperation, mit der ich prüfe, ob zwei Größen gleich sind, wenn ich also Frage: "Ist Variable1 = Variable2 ?"

Es gibt Programmiersprachen die dafür das selbe Zeichen benutzen, aber man muss sich immer klar machen, dass das unterschiedliche Dinge sind!

Ausgabe

Wir haben im Schritt Nummer 1a noch zwei Arten von Befehlen ausgelassen! Das eine ist die Ausgabe. Man kann sich relativ leicht vorstellen, daraus einen Befehl zu formulieren, der als Parameter mitbekommt, was er ausgeben soll, und vielleicht noch wohin (Bildschirm, Drucker, Datei, ...) und in welchem Format.

Sprünge

Wichtiger ist da schon der Sprungbefehl: Ganz am Ende von Schritt Nummer 1a steht doch, wo das Programm weitermachen soll, nachdem der Befehlsblock für die erfüllte Bedingung abgearbeitet ist. Ein solcher Befehl lässt sich sehr einfach realisieren, als Parameter hat er nur das Sprungziel. Wenn du dich an Kapitel 3.6 erinnerst und was dort so beiläufig über das Befehlszähler-Register erzählt wurde, dann kannst du dir vorstellen, dass ein Sprungbefehl nichts anderes tut, als eine neue Adresse ins Befehlszähler-Register zu schreiben.

Schleifen

Die letzte wichtige Sorte von Befehlen, die wir noch brauchen, ist auf den ersten Blick in unserem Beispielalgorithmus nicht so ohne weiteres zu erkennen, aber trotzdem drin enthalten: Betrachte noch einmal die Schritte Nummer 3 bis 6! Dort wird ein Block von Befehlen mehrmals durchlaufen, und zwar so lange bis eine bestimmte Bedingung erfüllt ist.

Eine solche Konstruktion nennt man eine Schleife. Dabei unterscheidet man drei Typen: Bei der ersten weiß man vor Beginn der Schleife, wie oft sie durchlaufen werden soll. Bei den anderen beiden ergibt sich die Anzahl der Durchläufe aus den Berechnungen, die in der Schleife gemacht werden. Man unterscheidet dann nur noch, ob die Bedingung vor Eintritt in den Schleifenkörper überprüft wird, oder erst danach. Im ersten Fall kann es sein, dass die Befehle, die zur Schleife gehören, gar nicht durchlaufen werden, im zweiten Fall werden sie mindestens einmal durchlaufen.

Erkennst du, welchen Schleifentyp unser Algorithmus verwendet?

Es hängt vom eingegebenen Dividenden ab, wie viele Divisoren wir ausprobieren, also wie oft wir die Schleife durchlaufen. Der erste Schleifentyp kann es also nicht sein.

Die Prüfung, ob wir die Schleife verlassen können, findet am Ende statt! Die Schritte 3 bis 6 werden also mindestens einmal durchlaufen.

Das war jetzt ziemlich viel Text, der dir eigentlich nur zeigen sollte, welche Arten von Befehlen wir brauchen, um unseren Computer programmieren zu können. Deshalb fasse ich das noch einmal kurz zusammen: Wir brauchen:

Das sind die Werkzeuge, die eine Programmiersprache uns zur Verfügung stellen muss, damit wir ein Programm schreiben können - eigentlich nicht viel, oder?

Leider sind das noch nicht die Befehle, die der Computer versteht! Wenn du dich an das Beispiel eines Assemblerbefehls aus Kapitel 4.5 erinnerst, passt das noch nicht ganz zusammen.

Der Rest ist aber ganz einfach: Es gibt Programme, die Befehle der oben beschriebenen Kategorien verstehen und für den Computer übersetzen. - Wieder kommt das altbewährte Prinzip zum Einsatz, Aufgaben, die für den Computer zu schwierig sind, in kleinere Teilaufgaben zu zerlegen. In diesem Fall tut das ein Programm für uns.



9.1.2 Verbessern des Algorithmus Inhaltsverzeichnis
Index
9.3 Programmierumgebungen