Anmerkung: In dieser Jahrgangsstufe geht es vor allem um die Programmierung mit Java. Zum Erlernen eignet sich unter anderem das Programm BlueJ.
- Objekte und Klassen
- Klassen
- Objekte
- JAVA-Quelltext mit Erklärungen am Beispiel eines Programmes
- Datentypen
- Kommentierung
- Zugriffsrechte
- Rückgabewerte
- Wertzuweisung
- Kurzformen
- Verzweigungen und Schleifen
- Verzweigungen
- if-Anweisung
- Vergleichsoperatoren
- Mehrfachverzweigungen: Switch-Case-Anweisungen
- Schleifen
- for-Schleife
- while-Schleife
- Arrays (Felder)
- Vererbung und Polymorphie
- Sortierverfahren
- Allgemeines
- Selectionsort, Insertsort, Bubblesort
- Selectionsort
- Grundlagen
- Beispiel
- Insertsort
- Grundlagen
- Beispiel
- Bubblesort
- Grundlagen
- Beispiel mit dem Feld der Abfolge „5, 37, 13, 21, 2, 13“
- 1. Durchlauf
- 2. Durchlauf
- 3. Durchlauf
- 4. Durchlauf
- 5. Durchlauf
- Endliche Automaten
- Beispiel: Schwimmbadautomat
Objekte und Klassen
Klassen
Eine Klasse besteht aus Name, Attributen und Methoden. Nach Konventionen wird der Klassenname groß und die Attribute sowie die Methoden klein geschrieben. Besteht der Begriff aus mehreren „Teilen“, werden die weiteren Wörter groß geschrieben.
KREIS |
durchmesser xPosition yPosition farbe istSichtbar |
sichtbarMachen() horizontalBewegen(int entfernung) farbeAendern(String neueFarbe) groesseAendern(int neuerDurchmesser) |
Objekte
Von einer Klasse können ein oder mehrere Objekte geschaffen werden und mit unterschiedlichen Namen versehen werden. Allen Attributen muss ein Wert zugewiesen werden. Mit Hilfe von Methoden sendet der Benutzer an ein Objekt eine Botschaft, die es veranlasst, die entsprechende Änderung seiner Attribute durchzuführen.
JAVA-Quelltext mit Erklärungen am Beispiel eines Programmes
Klassendefinition: Die Beschreibung der Klasse
public class KREIS {
Definition der Attribute durch Zugriffsrecht (private oder public), Bezeichner und Datentyp (z.B. int, String, boolean).
private int radius;
private int xPosition;
private int yPosition;
private String farbe;
private boolean istSichtbar;
Konstruktor: Hier werden die Anfangswerte der einzelnen Attribute festgelegt.
public KREIS() oder public KREIS(int r, int x, int y) {
Wertzuweisungen
radius = 15 oder r;
xPosition = 20 oder x;
yPosition = 60 oder y;
farbe = "blau";
istSichtbar = false;
Definition einer Methode durch Zugriffsrecht, Rückgabewert (hier void: keine Rückgabe), Bezeichner und ggf. anzugebender Parameter
public void zeichnen() {
...
}
Aufrufen einer weiteren Methode
public void sichtbarMachen() {
istSichtbar = true;
zeichnen();
}
Methode mit nötiger Parametereingabe und Wertzuweisung
public void horizontalBewegen(int entfernung) {
loeschen();
xPosition = xPosition + entfernung;
zeichnen();
}
}
Datentypen
Datentyp | Beschreibung | Werte | Speicherbedarf |
boolean | Wahrheitswert | true oder false | 1 Bit |
int | ganze Zahl | (z.B.) -3; 0; 5 | 32 Bit (4 Byte) |
double | Dezimalzahl | (z.B.) 3.27; -0.05 | 64 Bit (8 Byte) |
char | einzelnes Zeichen | 'a'; '5' | 16 Bit (2 Byte) |
Der Datentyp „String“ ist ein zusammengesetzter Datentyp, der sich aus einzelnen Daten vom Typ „char“ zusammensetzt, z.B. "Abc" = 'A' + 'b' + 'c'.
Kommentierung
Jede Methode sollte vorher kommentiert werden, damit der Leser des Quelltextes eine Chance hat zu verstehen, was mit dieser Methode bewirkt werden soll. Bei einer Zeile verwendet man die Zeichenfolge //.
Bei mehreren Zeilen wird Folgendes benutzt:
/**Diese Methode soll zeigen,
* dass sie sinnlos ist.
*/
Zugriffsrechte
Beim Definieren der Attribute durch Zugriffsrechte gibt es zwei Möglichkeiten:
- private: Attribute oder Methoden, auf die nur Objekte dieser Klasse zugreifen (lesen oder verändern) können.
- public: Attribute oder Methoden, auf die auch Objekte anderer Klassen zugreifen können.
Im Sinne der Datenkapselung (Objekte sollen nicht direkt auf Attributwerte anderer Objekte zugreifen dürfen) werden Attribute üblicherweise als "private" deklariert. Soweit eine Änderung des Attributwerts zugelassen werden soll, wird eine Methode mit dem Zugriffsmodifikator public zur Verfügung gestellt, die diese Änderung (i.d.R. nach Prüfung auf sinnvolle Werte, z.B. Altersangabe zwischen 0 und 100) durchführt.
Rückgabewerte
Verwendet man „void“, ist keine Rückgabe eines Wertes vorgesehen (ein ggf. geändeter Wert ist nur über den Objektinspektor einsehbar). Bei „int“ wird eine integer-Zahl zurückgegeben und kann von einem anderen Objekt weiterverarbeitet werden bzw. über die Konsole betrachtet werden. Analog dazu funktionieren „double, String, boolean“.
Wertzuweisung
Eine Wertzuweisung an eine Variable geschieht durch einen Ausdruck der Form
x = 50;
y = x + 25;
y = (2*x + 3) - 5
Dabei wird der Variablen auf der linken Seite die Zahl oder das Ergebnis des Rechenausdrucks auf der rechten Seite zugewiesen, z.B. y = 5; x = 12; y = 3*x - 6; danach ist y = 30 und x = 12.
Der Ausdruck y = x%3 (sprich: x modulo 3) bedeutet, dass y der Rest zugewiesen wird, der sich bei der Division von x durch 3 ergibt. Mit x = 13; y = x%3; wird y der Wert 1 zugewiesen.
Kurzformen
y++;
bedeutet dasselbe wie y = y + 1;
und y--
dasselbe wie y = y - 1;
.
Möchte man y = y + 3
oder y = y - 3
abkürzen, verwendet man y += 3
bzw.
y -=3
.
Verzweigungen und Schleifen
Verzweigungen
if-Anweisung
Die Syntax für eine if-Anweisung lautet wie folgt:
if(Bedingung) {Anweisungen} else {Anweisungen}
Der else-Teil kann auch entfallen, falls man keine Anweisung definieren möchte, wenn die Bedingung nicht erfüllt ist. Erfolgt zudem nur eine Anweisung, können die geschweiften Klammern weggelassen werden:
if(n > 0) x = x/n;
Vergleichsoperatoren
Folgende Vergleichsoperatoren können verwendet werden:
Bedeutung | Beispiel | |
== | gleich | x == 3 |
!= | ungleich | x != y |
> | größer | 4 > 3 |
>= | größer oder gleich | x >= y |
< | kleiner | x+1 < 0 |
<= | kleiner oder gleich | x <= y |
Es gibt zusätzlich noch diese zusammengesetzten Vergleiche:
- &&: und-Verknüpfung
- ||: oder-Verknüpfung
if(x >= 0 && x <= 10) y = x;
Mehrfachverzweigungen: Switch-Case-Anweisungen
Die Syntax sieht so aus (erklärt an einem Programm zur Ermittlung der Tagesanzahl eines Monats):
switch (monat) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12: tage = 31; break;
case 4: case 6: case 9: case 11: tage = 30; break;
case 2: {if(jahr%4 == 0) tage = 29; else tage = 28;}; break;
}
Der Grundgedanke bei dieser Methode ist der, dass der Rechner zur passenden case-Marke springt und die dort angegebene Anweisung ausführt; passt keine Marke, springt er an das Ende der switch-Anweisung und führt keine Anweisung aus.
Der switch-Ausdruck muss vom Typ integer oder char sein. Die case-Marken müssen Konstanten, d.h. Zahl oder Zeichen, sein (keine Rechenausdrücke). Der Typ der case-Marke muss zum switch-Ausdruck passen, case-Marken müssen voneinander verschieden sein und müssen mit einem break beendet werden.
Schleifen
for-Schleife
Die Syntax sieht wie folgt aus:
for(int i = 0; i <= n; i = i +1) {Anweisungen}
Dabei werden die Laufvariablen durch int i = 0 initialisiert, durch i <= n eine Abbruchbedingung definiert und durch i = i +1 oder i++ die Laufvariable verändert. Statt i kann der Bezeichner anders genannt werden.
Es ist auch möglich abwärts zu zählen, also i = i - 1 oder i--. Die Abbruchbedingung muss dementsprechend angepasst werden. Außerdem kann die Schrittweite beliebig verändert werden, z.B. i = i + 5.
while-Schleife
while(Bedingung) {Anweisungen}
Solange die Bedingung erfüllt ist, führt das Programm die zwischen den geschweiften Klammern aufgelisteten Anweisungen aus.
Arrays (Felder)
Ein eindimensionales Array ist eine Tabelle von gleichartigen Elementen wie z.B. Zahlen, Zeichen oder booleschen Werten. Diese Elemente sind von 0 bis zu einem Endwert nummeriert. Die Nummer nennt man auch Index.
Die Deklaration eines Arrays erfolgt durch int[] a, float[] a oder boolean[] a. Dabei ist a der Name des Arrays, dessen Länge zunächst noch nicht festgelegt ist. Es kann deshalb auch noch nicht mit diesem Feld gearbeitet werden.
Man erzeugt ein Array durch die Anweisung der Art a = new int[5]. Dabei wird a als ein Feld erzeugt, das Platz für 5 Integer-Werte bereit hält. Die einzelnen Werte können mit a[0], a[1], ... , a[4] angesprochen werden. Wichtig ist dabei, dass nicht ab der ersten Stelle gezählt wird, sondern ab der „nullten“.
Mit a = new int[] {1, 4, 9, 16, 25} kann das Feld gleich bei der Erzeugung mit Werten gefüllt werden. Dabei würde a[3] den Wert 16 besitzen.
Vererbung und Polymorphie
Eine Fluglinie könnte ihre Mitarbeiter in Piloten, Flugbegleiter und Bodenpersonal aufteilen. Alle Attribute und Methoden, die alle Mitarbeiter gemeinsam haben, wie z.B. persnr, name, kuendigen() werden in der Oberklasse PERSONAL festgelegt.
Attribute und Methoden, die nur einen Teil der Mitarbeiter betreffen, werden dagegen in der betreffenden Unterklasse aufgenommen (z.B. das Attribut abteilung in BODENPERSONAL). Die Unterklasse erbt sämtliche Attribute und Methoden der Oberklasse. In Java wird der Bezug zur Oberklasse mittels des Schlüsselwortes extends hergestellt, also z.B. class BODENPERSONAL extends PERSONAL. Das zugehörige Klassendiagramm könnte also folgendermaßen aussehen:
Im Beispiel werden die Methoden befoerdern(), gehaltBerechnen() von allen Objekten der drei Unterklassen verstanden, da sie von der gemeinsamen Oberklasse PERSONAL geerbt wurden, allerdings werden diese Methoden z.T. überschrieben. Erst zur Laufzeit dieses Programms entscheidet sich je nach Zugehörigkeit zu einer der drei Unterklassen, welche der verschiedenen Ausprägungen ausgeführt wird.
Da hierbei der gleiche Methodenaufruf bei Objekten verschiedener Klassen eine unterschiedliche Ausführung bewirkt, spricht man von Polymorphie (griech. „Vielgestaltigkeit“). In dem Beispiel bekommt ein Pilot zum Grundgehalt eine Zulage abhängig vom Rang, während das Bodenpersonal für geleistete Überstunden zusätzlich entlohnt werden. Flugbegleiter haben keine Zusätze. Ähnliches gilt für die Methode befoerdern().
Sollten von einer Oberklasse keine Objekte erzeugt werden, z.B. weil jeder Mitarbeiter einer der drei Unterklassen angehört, verwendet man eine abstrakte Oberklasse PERSONAL, die im Diagramm durch {abstract} kenntlich gemacht wird. In Java erhalten abstrakte Klassen das Schlüsselwort abstract. In einer solchen Klasse muss eine Methode wie befoerdern() nicht ausformuliert werden, sondern kann ebenfalls als abstrakt deklariert werden. Das ist quasi nur eine Ankündigung, dass diese Methode existiert und in allen Unterklassen ausformuliert wird.
Sortierverfahren
Allgemeines
Das Sortieren von Daten nach bestimmten Kriterien gehört zu den wichtigsten Problemen der Informatik. Bei großen Datenmengen ist es sehr wichtig, dass effiziente Algorithmen zur Verfügung stehen, die möglichst wenig Zeit zum Sortieren benötigen. Im Folgenden werden „einfachere“ Algorithmen betrachtet, die recht verständlich zu impletieren sind, aber eine relativ lange Laufzeit haben.
Die drei Algorithmen Insertsort (Sortieren durch Einfügen), Selectionsort (Sortieren durch Auswählen) und Bubblesort (Sortieren durch Vertauschen) werden beschrieben und an einem Beispiel erläutert. Auf weitere Algorithmen wie Mergesort oder Quicksort werden dagegen nicht besprochen.
Selectionsort, Insertsort, Bubblesort
Selectionsort
Grundlagen
Selectionsort arbeitet nach dem Prinzip, das kleinste Element des Feldes zu suchen, und dieses dann mit dem ersten Element des zu betrachteten Teils zu tauschen.
Zu Beginn sucht man im ganzen Feld nach dem kleinsten Element und tauscht es mit dem ersten Element. Danach sucht man im Restfeld ohne erstes Element nach dem kleinsten Element und tauscht mit dem zweiten Element bzw. mit dem ersten Element des zu betrachtenden Teils. Dies wiederholt man, bis das zweitgrößte Element an den korrekten Platz Platz gebracht wurde.
Beispiel
Insertsort
Grundlagen
Insertsort arbeitet nach dem Prinzip, das Feld in einen sortierten und einen unsortierten Teil zu teilen und dann das erste Element des unsortierten Teils an die richtige Stelle im sortierten Teil zu schieben. Zunächst besteht der sortierte Teil aus dem ersten Element. Das erste Element des unsortierten Teils ist damit das zweite. Dieses wird solange mit dem vorherigen vertauscht, solange es kleiner als dieses ist oder das Element noch nicht das erste Element des Feldes ist.
Somit vergrößert sich der sortierte Teil jeweils um eins, während sich der unsortierte um eins verringert. Dies wird wiederholt, bis der unsortierte Teil null wird und somit das ganze Feld sortiert vorliegt.
Beispiel
Bubblesort
Grundlagen
Der Sortieralgorithmus Bubblesort (Blasensortierung) arbeitet nach dem Prinzip, dass das Feld durchlaufen wird und dabei so getauscht wird, dass das größte bzw. kleinste Element an der richtigen Stelle steht. Nachfolgend wird die aufsteigende Variante beschrieben, so dass das größte Element nach oben wandert.
Man beginnt dazu am Anfang des Feldes und tauscht benachbarte Elemente aus, wenn das rechte Element kleiner als sein Vorgänger ist. Somit steht das größte Element nach einem Durchlauf am Ende des Feldes. Diese Sortierung wird wiederholt, ohne dass dabei der letzte bereits sortierte Feldteil betrachtet wird. Damit erhält man ein sortiertes Feld.
Beispiel mit dem Feld der Abfolge „5, 37, 13, 21, 2, 13“
1. Durchlauf
2. Durchlauf
3. Durchlauf
4. Durchlauf
5. Durchlauf
Endliche Automaten
Ein endlicher Automat ist eine Art „Black Box“, in die wir etwas eingeben können und der je nach Eingabe in verschiedene Zustände übergeht. Befindet sich die Black Box nach Abarbeitung der Eingabefolge in einem ausgezeichneten Zustand, dem sogenannten Endzustand, so handelt es sich um eine akzeptierte Folge, ansonsten hat sie die Eingabe nicht akzeptiert.
Beispiel: Schwimmbadautomat
Der Eintritt in ein Schwimmbad kostet 2€. Nach Eingabe von Münzen im Gesamtwert von mindestens 2€ öffnet der Automat die Schranke, sonst nicht. Er akzeptiert lediglich Münzen im Wert von 0,50€, 1€ und 2€. Das zugehörige Zustandsdiagramm sieht so aus, wobei q einen Zustand beschreibt:
Die dazugehörige Zustandsübergangstabelle sieht wie folgt aus:
0,5 | 1,0 | 2,0 | |
start | q0,5 | q1 | q2 |
q0,5 | q1 | q1,5 | q2 |
q1 | q1,5 | q2 | q2 |
q1,5 | q2 | q2 | q2 |
q2 | q2 | q2 | q2 |
Häufig werden in der Informatik „Wörter“ als Zeichenketten (häufig nur Zeichen a und b) oder auch „Zahlen“ als Ziffernketten eingegeben und daraufhin untersucht, ob sie eine bestimmte Bedingung erfüllen.