In den ersten Jahren wurden die Computer als Rechenmaschinen eingesetzt nach dem simplen Prinzip "Eingabe-Verarbeitung-Ausgabe" (EVA) verwendet.
Selbst in den 70er Jahren war es an der Universität noch üblich, die Programme und ihre Daten auf Lochkarten zu stanzen, sie einlesen zu lassen und auf einen Ausdruck zu warten.
Um das Prinzip darzustellen, soll hier ein einfaches Programm vorgestellt werden, das zwei Zahlen miteinander multipliziert.
Variable a einlesen | Eingabe |
Variable b einlesen |
Produkt berechnen und auf p zuweisen | Verarbeitung |
p ausgeben | Ausgabe |
Zur korrekten Darstellung eines Algorithmus werden auch sogenannte Struktogramme verwendet:
Nun der entsprechende Quelltext in Java unter Verwendung des Paketes myio:
import myio.*;
class sequence01
{
public static void main( String args[] )
{
int a, b, p;
InOut.write( "Bitte 1.Faktor eingeben: " );
a = InOut.readInt();
InOut.write( "Bitte 2.Faktor eingeben: " );
b = InOut.readInt();
p = a*b;
InOut.writeln( "Ergebnis "+p );
}
}
Erklärung der einzelnen Zeilen:
import InOut.*;
Hier wird dem Übersetzer mitgeteilt, dass er auf vordefinierte Befehle zugreifen kann. In diesem Fall stehen in der Datei "InOut.class" die Befehle "write", und "readInt".
class sequence01
Jedes geschriebene Programm gehört in Java zu einer größeren Einheit, die "Klasse" genannt wird. Genaueres dazu steht im Abschnitt über objektorientiertes Programmieren.
Die Definition der Klasse folgt innerhalb von geschweiften Klammern. Deshalb steht in der nächsten Zeile eine geöffnete geschweifte Klammer und am Ende des Programm eine geschlossene - damit wird die Definition der Klasse beendet.
public static void main( String args[] )
Diese Zeile besagt eigentlich nur, dass hier der Teil des Programms folgt, der als erstes ausgeführt werden soll, das Hauptprogramm ("main"). Alle voranstehenden Worte werden im Abschnitt über objektorientierte Programmierung erklärt.
Das Hauptprogramm wird ebenfalls in geschweifte Klammern gesetzt.
int a, b, p;
In dieser Zeile werden alle vom Hauptprogramm benötigten Variablen definiert. Dies ist unter anderem notwendig, damit zur Laufzeit klar ist, wieviel Speicherplatz benötigt wird.
Es folgt der Eingabeteil des Programms:
InOut.write( "Bitte 1.Faktor eingeben: " );
a = InOut.readInt();
InOut.write( "Bitte 2.Faktor eingeben: " );
b = InOut.readInt();
Nach der Ausgabe der jeweiligen Zeichenkette, erwartet das Programm die Eingabe einer Ganzzahl (readInt()).
p = a*b;
Dies ist die eigentliche Berechnung des Produktes.
InOut.writeln( "Ergebnis "+p );
Hier wird das Ergebnis (der Inhalt der Variablen p) auf dem Bildschirm ausgegeben.
Wie man sehen kann, besteht das Programm aus einer Folge von Anweisungen. Durch das sequentielle Abarbeiten entsteht am Schluss (meistens) das gewünschte Ergebnis.
Das sequentielle Abarbeiten (Hintereinanderausführen) von Anweisungen nennt man "Sequenz"
Das Kernstück des Programms war die "Verarbeitung", also die Anweisung:
p = a*b;
So eine Anweisung heißt "Zuweisung", denn die Variable p bekommt einen Wert zugewiesen.
Dieser Text entspricht nicht seiner mathematischen Bedeutung: Dort wäre es eine Aussage, ob p dem Produkt aus a und b entspricht; das Ergebnis dieser Aussage wäre entweder wahr oder falsch.
In Java ist dies eine Anweisung, d.h. der Computer bekommt eine Vorschrift, was zu tun ist. In diesem Fall wird er angewiesen, das Produkt aus a und b zu berechnen und diesen Wert in der Variable p zu speichern.
In PASCAL steht deshalb auch
p := a*b;
Zuweisungen haben immer die Form:
<Variable> "=" <Rechenausdruck|Funktion>
Ein Beispiel für die Verwendung der Zuweisung in einer Sequenz ist der "Variablentausch". Welche Anweisungen werden benötigt, um den Inhalt der Variablen a mit dem der Variablen b zu vertauschen? Der erste Ansatz:
a = b; b = a;
Diese Idee funktioniert nicht, denn nach der Zuweisung von b an a enthalten beide den Inhalt von b und der Inhalt der Variablen a ist verlorengegangen. Deshalb braucht man eine dritte (temporäre) Variable, die als Zwischenspeicher dient:
oder als Quelltext:
tmp = a; a = b; b = tmp;
Hier wurde der Variableninhalt von a zwischengespeichert und am Schluss nach b übertragen.
Die Eingabe der Zahl "371" mittels der Zuweisung:
a = InOut.readInt();
lässt sich selbst als eine Art Sequenz auffassen:
Anweisung | Entstandene Daten | Medium | "Prozessor" |
Start | Vorstellung von 371 | Neuronen | Gehirn |
Wandle in Dezimalform | 371 | Neuronen | Gehirn |
Zerlege in Einzelziffern | "3" "7" "1" | Neuronen | Gehirn |
Übertrage auf die Tastatur | [3] [7] [1] [Enter] | Neuronen | Gehirn und Finger |
Setze zu einer Zeichenkette zusammen | "371" | Speicher | Mikroprozessor |
Wandle in Binärdarstellung | 101110011 | Prozessorspeicher | Mikroprozessor |
Weise es a zu | 101110011 | Speicherplatz von a | Mikroprozessor |
Die einzelnen Teile dieses Prozesses lassen sich wieder weiter zerlegen. Man denke nur an die Anweisung "Übertrage auf die Tastatur". Man kann sich leicht vorstellen welche Komplexität dieses Problem enthält, wenn man sich überlegt, wie man einen Roboter programmieren müsste, der diese Anweisung ausführen soll.
Das rekursive Zerlegen eines Prozesses in Teilprozesse nennt man "Top-Down-Prinzip"
Jede Variable muss in Java zuerst deklariert werden. Eine Deklaration besteht aus einem Typ und einem Variablennamen:
int Alter;
String Name;
boolean weiblich;
Variablendeklarationen können irgendwo zwischen den Anweisungen im Quelltext stehen, meistens stehen sie jedoch am Anfang eines Programms oder direkt vor ihrem Einsatz:
public static void main ( String args[] ){
int count;
String title;
boolean isAsleep;
...
}
Mehrere Variablen gleichen Typs können auch in einer Anweisung deklariert werden:
int x, y, z;
String Vorname, Zuname;
Außerdem kann der Variablen bei der Deklaration gleich ein Startwert zugeordnet werden:
int Alter, Groesse, Schuhgroesse = 42;
String Name = "Hugo";
int x=4, y=6, z=0;
Variablen können von verschiedenen Typen sein. Hier sollen die primitiven Typen vorgestellt werden:
boolean
: enthält nur die zwei Werte true und false
- Ganzzahltypen:
byte
: enthält ganzzahlige Werte zwischen -128 und +127
short
: enthält ganzzahlige Werte zwischen -32768 und +32767
int
: enthält ganzzahlige Werte zwischen -2147483648 und +2147483647
long
: enthält ganzzahlige Werte zwischen -9223327036854775808 und +9223327036854775807
float, double
: enthält Kommazahlen
char
: enthält ein Zeichen nach dem "Unicode Standard"
Primitive Datentypen sind in Kleinschrift notiert um sie von den
nicht-primitiven Typen zu unterscheiden. Für nicht-primitive Typen muss explizit Speicher für diese Variable definiert werden. Die Typen sind:
Klassen oder Schnittstellen
: selbstdefinierte oder in Java vordefinierte Objektdefinitionen. Beispiel String
kann Zeichenketten speichern und verwalten.
Felder
: mehrfache Kopien eines bestimmten Datentyps
Ausdrücke sind Anweisungen, die einen Wert repräsentieren, sie sind im Allgemeinen aus Variablen, Konstanten und Operatoren zusammengesetzt. Beispiel:
4*(7 - a)+ b
Dieser Ausdruck ergibt in Abhängigkeit von den Variablen a und b eine Zahl. Mittels einer Zuweisung kann diese Zahl einer weiteren Variable zugeordnet werden:
int c = 4*(7 - a)+ b
Java besitzt 5 arithmetische Operatoren und verschiedene Bitoperatoren:
Operator | Bedeutung | Beispiel |
+ | Addition | 1 + 2 |
- | Subtraktion | 1 - 10 |
* | Multiplikation | 2 * S3 |
/ | Division | 44 / 11 |
% | Modulo (Restbildung) | 44 % 10 |
Bis auf das Minuszeichen (kann auch als Negation eingesetzt werden) besitzt jeder Operator zwei Operanden. Teilt man zwei ganze Zahlen, so wird das Ergebnis ohne Rest ausgegeben, dieser kann über den Modulo-Operator bestimmt werden:
int a = 54/10;
int b = 54%10;
Ergibt für a=5 und b=4. Das Ergebnis einer Rechenoperation ist immer von dem "ungenauesten" Typen der Rechnung. Also bei Addition einer int mit einer float-Zahl hat das Ergebnis einen float-Wert.
Java besitzt auch die Möglichkeit der Mehrfachzuweisung:
int a, b, c;
a = b = c = -5;
Hier ein komplettes Programm zum Tausch von Variablen.
public static void main(String args[]) {
InOut.writeln( "Vertauschung zweier Variablen..." );
InOut.writeln( "Bitte a eingeben:" );
int a = InOut.readInt();
InOut.writeln( "Bitte b eingeben:" );
int b = InOut.readInt();
InOut.writeln( "a ="+a );
InOut.writeln( "b ="+b );
int tmp = a; a = b; b = tmp;
InOut.writeln( "Hokuspokus" );
InOut.writeln( "a ="+a );
InOut.writeln( "b ="+b );
}
- Schreiben Sie ein Programm, welches zwei Zahlen dividiert.
- Schreiben Sie ein Dummy-Horoskopprogramm: Eingabe von Namen und Geburtsdatum. Ausgabe eines Fantasiehoroskopes, das die eingegebenen Daten wiederverwendet.
- Schreiben Sie ein Programm, welches drei Variablen a, b und c zyklisch vertauscht:
Der Inhalt von a soll nach b, der von b nach c und der von c nach a kopiert werden.
- Schreiben Sie ein Programm, das die Kreisfläche und den Kreisumfang aus seinem Radius berechnet. Dabei lässt sich pi als Konstante definieren:
final pi = 3,1415;
Hier besagt das Schlüsselwort final, dass es sich um eine Konstante handelt. Diese "Variable" ist also nicht änderbar (eben "final").