Feldarbeit
Die meisten Sprachen kennen neben einfachen Variablen sogenannte
Felder oder Arrays.
Ein Array ist gewissermaßen eine Tabelle, die mehrere Einträge
des gleichen Typs enthält.
Index |
Inhalt |
0 |
-5 |
1 |
28 |
2 |
7 |
3 |
0 |
|
Dieses Integer-Array beispielsweise hat 4 Einträge. Diese Einträge
könnt Ihr unter den Index-Nummern 0 bis 3
ansprechen (bei der Programmierung fängt man meistens bei Null zu
zählen an). Mit Arrays könnt Ihr arbeiten wie mit
«normalen» Variablen; Ihr müßt nur den Index in [ ] mit
angeben
// setze den Eintrag mit dem Index 0 auf den Wert 5
das_array[0] = 5;
// gebe den Eintrag mit dem Index 2 aus
print das_array[2];
|
Arrays sind besonders dann praktisch, wenn der Index selbst eine Variable ist
// lasse die gewünschte Bildnummer eingeben
var bildnummer = input();
// hole das gewünschte Bild aus dem Array
var bigPic = bigPictures[bildnummer];
showPicture(bigPic); // zeige das Bild an
Arrays müssen in jedem Fall deklariert werden. Dabei müßt
Ihr angeben, wieviele Einträge das Array haben soll
var das_array = new Array[10]; // definiert ein Array mit 10 Einträgen
String[] das_array = new String[10]; // andere Syntax-Variante
Das Schlüsselwort 'new' wird im Zusammenhang mit Klassen und Objekten
noch eine Rolle spielen.
Unveränderlich
Variablen sind, wie der Name schon sagt, variabel, also veränderlich.
In vielen Fällen jedoch soll ein Wert gerade nicht verändert
werden. Dazu dienen Konstanten.
Konstanten sind im Prinzip Variablen mit einem festen Wert. In einigen
Sprachen müssen Konstanten mit einem bestimmten Schlüsselwort
deklariert werden
final int zahl = 5;
Der Versuch, eine so deklarierte Konstante zu verändern, wird mit einer
Fehlermeldung quittiert. In anderen Sprachen sind Konstanten ganz normale
Variablen, bei denen Ihr selbst darauf achten müßt, daß der
Wert sich nicht ändert.
Die Vorteile von Konstanten soll das folgende Beispiel zeigen
var MAX = 10; // definiere die maximale Bildnummer als Konstante
...
var bildnummer = input(); // gewünschte Bildnummer eingeben
if (bildnummer > MAX) // wenn zu groß
print "Diese Bildnummer gibt es nicht!"; // Fehlermeldung
else // sonst
showPicture(bildnummer); // zeige Bild an
In diesem Fall wird eine Konstante dazu benutzt, die eingegebene Bildnummer
zu überprüfen. Wenn später zusätzliche Bilder
ergänzt werden, müßt Ihr nur die Deklaration der Konstante
ändern
var MAX = 25; // neuer Wert
Da der Wert sonst nur über den Namen 'MAX' angesprochen wird, reicht
diese Änderung völlig aus.
Außerdem werden Konstanten oft benutzt, um sich das Merken von
Werten zu erleichtern. Das soll an einer erweiterten Version des bereits
aufgetauchten Dateityp-Tests gezeigt werden. Diese Version prüft nicht
nur, ob die Datei ein JPEG ist oder nicht. Diese Version liefert eine Zahl
zurück, die den Dateityp angibt (0 -> JPEG, 1 -> GIF, 2 -> PNG etc.)
if (fileTyp(dateiname) == 0)
print "Es ist ein JPEG!";
if (fileTyp(dateiname) == 1)
print "Es ist ein GIF!";
...
Wenn jetzt aber für jeden dieser Werte bereits eine Konstante
definiert ist (beispielsweise schon in der Programmiersprache integriert),
wird der Code gleich deutlich lesbarer
if (fileTyp(dateiname) == TYPE_JPEG)
print "Es ist ein JPEG!";
if (fileTyp(dateiname) == TYPE_GIF)
print "Es ist ein GIF!";
...
Es ist üblich, die Namen von Konstanten durchgehend GROSSZUSCHREIBEN.
Solche Vereinbarungen nennt man auch Konvention:
Die Programme laufen auch ohne sie, aber sie verbessern die Lesbarkeit des
Codes.
Aus der Bibliothek
Zwei Dinge habe ich Euch bisher kommentarlos untergejubelt: Funktionsaufrufe
und eben noch if-Verzweigungen. Zunächst ein paar Worte zu den
Funktionen.
Eine Funktion liefert einen Wert zurück, der
an der Stelle des Aufrufs eingesetzt wird. Als Beispiel nehmen wir die
Funktion 'random()'. Diese Funktion liefert einen zufällig
ausgewählten int-Wert. In folgendem Codeschnippsel landet dieser
Zufallswert in der Variablen 'zahl'
var zahl = random();
Der Rückgabewert einer Funktion ist, ähnlich wie eine Variable, von
einem bestimmten Typ. Prinzipiell kann ein Funktionsaufruf überall
stehen, wo auch ein Wert dieses Typs stehen könnte
zahl = random() + 5; // bei einer Addition
zahl = random()++; // mit einem Inkrement-Operator
if (random() < zahl) // Vergleich
...
Vielen Funktionen kannst du einen oder mehrere
Parameter mitgeben. Die Parameter stehen in den runden Klammern, mit
Kommata getrennt. Bei unserer random-Funktion könnte das der
Bereich sein, aus dem die Zufallszahl stammen soll
var zahl = random(0, 9); // liefert eine Zufallszahl zwischen 0 und 9
Die Anzahl, der Typ und die Reihenfolge der Parameter einer Funktion sind
exakt festgelegt. Unsere neue Beispielfunktion hat zwei Parameter vom Typ
int. Der erste ist die Untergrenze des Zufallsbereiches, der zweite die
Obergrenze. Mit einem Aufruf wie
var zahl = random(9, 0); // 9 > 0 !
handelt Ihr Euch also eine Fehlermeldung ein. In einigen Fällen gibt
es sogenannte optionale Parameter, die Ihr angeben
oder auch weglassen könnt. In solchen Fällen ist die Funktion
einfach mehrfach unter demselben Namen definiert, einmal mit und einmal ohne
optionalen Parameter. Wie Ihr auch selbst Funktionen definieren könnt,
wird später noch Thema sein.
Die Parameter können natürlich auch selbst Variablen sein
var unten = random(0, 4); // untere Grenze
var oben = random(5, 9); // obere Grenze
var ergebnis = random(unten, oben); // Zufallszahl aus diesem Bereich
Ihr könnt auch Funktionen verschachteln
var zahl = random(random(0, 4), random(5, 9));
Dabei müßt Ihr allerdings darauf achten, daß Ihr nicht aus
der Syntax fallt und beispielsweise eine Klammer vergeßt.
Die meisten modernen Sprachen bringen eine umfangreiche
Bibliothek von Funktionen mit, die Ihr benutzen könnt. Ein Buch
zur serverseitigen Sprache PHP beispielsweise behandelt ausdrücklich
nur die wichtigsten Funktionen - 700 an der Zahl. Im Anhang finden sich
noch mal 900 weitere. Dabei gibt es für (fast) jeden Zweck etwas
- Überprüfen, ob ein bestimmtes Zeichen in einem String
enthalten ist.
- Das aktuelle Datum in verschiedenen Formaten zurückliefern
- Daten aus einer Datenbank abfragen
- Zeichne ein Rechteck, eine Ellipse, ...
Derart viele Funktionen kann natürlich niemand im Kopf behalten. Darum
gibt es für jede Sprache sogenannte Manuals,
auch Referenzen genannt, mit Beschreibungen aller
Funktionen. So etwas solltet Ihr beim Programmieren stets in Reichweite
haben.
Ein Beispiel: Mal angenommen, Ihr braucht eine Funktion, die einen
bestimmten Abschnitt eines Strings zurückliefert. Ihr schaut ins Manual
im Kapitel String-Funktionen (darum geht es ja) und findet beispielsweise
folgendes
string substr (string text, int start [, int length])
Substr returns the portion of text specified by the start
and length parameters.
If start is positive, the returned string will start
at the start'th position in text, counting from zero.
For instance, in the string 'abcdef', the character
at position 0 is 'a', the character at position 2 is 'c',
and so forth.
If start is negative, the returned string will start
at the start'th character from the end of text.
(...)
(die meisten Referenzen sind in Englisch).
Dieser Abschnitt enthält am Anfang die
Signatur der Funktion. Das ist die Angabe von Rückgabetyp,
Funktionsname und den verlangten Parametern. In unserem Fall bedeutet
string substr (string text, int start [, int length])
Die Funktion heißt 'substr' und liefert einen String zurück.
An Parametern müßt Ihr einen String und ein int angeben, ein
zweites int ist optional (zu erkennen an den eckigen Klammern).
Danach folgt eine Erklärung, was die Funktion tut und welche Bedeutung
die Parameter haben. In diesem Fall liefert die Funktion den Teil von 'text'
zurück, der mit dem Zeichen Nummer 'start' beginnt und 'length' Zeichen
lang ist
var text = "Programmieren";
var teil = substr(text, 3, 5); // 'teil' enthält jetzt 'gramm' |