header.png
Schulstoff.org
Navigation ein-/ausblenden
Navigation ein-/ausblenden
Schulstoff.org

Informatik: 10. Klasse

Anmerkung: In dieser Jahrgangsstufe geht es vor allem um die Programmierung mit Java. Zum Erlernen eignet sich unter anderem das Programm BlueJ.

Inhaltsverzeichnis [Anzeigen] [Verbergen]

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

DatentypBeschreibungWerteSpeicherbedarf
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:

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; 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:

BedeutungBeispiel
==gleichx == 3
!=ungleichx != y
>größer4 > 3
>=größer oder gleichx >= y
<kleinerx+1 < 0
<=kleiner oder gleichx <= y

Es gibt zusätzlich noch diese zusammengesetzten Vergleiche:

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:

Beispiel für ein Klassendiagramm der Vererbung und Polymorphie
Beispiel für ein Klassendiagramm der Vererbung und Polymorphie

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

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
Beispiel für das Sortieren mit Selectionsort

Insertsort

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
Beispiel für das Sortieren mit Insertsort

Bubblesort

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
Beispiel für das Sortieren mit Bubblesort - Durchlauf 1
Man sieht, wie die größte Zahl 37 wie eine Blase (markiert) nach hinten steigt.
2. Durchlauf
Beispiel für das Sortieren mit Bubblesort - Durchlauf 2
3. Durchlauf
Beispiel für das Sortieren mit Bubblesort - Durchlauf 3
 
4. Durchlauf
Beispiel für das Sortieren mit Bubblesort - Durchlauf 4
5. Durchlauf
Beispiel für das Sortieren mit Bubblesort - Durchlauf 5

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:

Zustandsdiagramm für einen Endlichen Automaten

Zustandsübergangstabelle

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.

Überschriften

Werbung

Werbung