Übersicht
Worum geht es?
In diesem Buch bringen wir euch die Themen [i]Schleifen, Methoden[/i], [i]Arrays, Klassen & Vererbung [/i]aus der Programmierung in [b]Java [/b]näher und bieten euch Übungsaufgaben zum besseren Verständnis, aber auch zum selbst durcharbeiten an.[br][br]Warum gerade diese drei Themen? Wir haben im Zuge einer Lehrveranstaltung an der Johannes Kepler Universität Linz eine Befragung der Studierenden durchgeführt und diese drei Themen wurden beim Programmiereinstieg als besonders schwierig befunden.[br][br]Deshalb haben wir jedes Kapitel auch mit Videos zu den entsprechenden Themen gefüllt - ihr findet also alles Wichtige direkt hier im GeoGebra-Buch.
Warum COOL?
Die Aufgabenstellungen basieren auf dem Konzept COOL Informatics (Cooperative, Computer-Science-supported and Cross-curricular Open Learning), welches sich auf vier Grundprinzipien stützt: discovery, cooperation, individuality, activity. Das COOL Informatics Konzept wurde auf der Grundlage von neuro-didaktischen Prinzipien sowie der Analyse bereits bekannter effektiver Lehr- und Lernformen entwickelt wurde. Dieses Konzept wurde zunächst für das Fach Informatik konzipiert, ist aber inhaltlich flexibel und kann problemlos für alle Fächer und Altersgruppen adaptiert werden. [br][br]Wir vom [url=https://www.jku.at/schule/cool-lab/]COOL Lab[/url] freuen uns, dass ihr eine andere Art des Programmier-Lernens versuchen wollt! Versucht euch doch mal im Team-Coden - denn das ist hier auch erlaubt und keinesfalls schummeln...
Darstellung von Algorithmen
Hier werden anhand eines einfachen Beispiels der Berechnung von [i]Mehrwertsteuer und Bruttobetrag[/i] unterschiedliche Darstellungsarten von Algorithmen gezeigt. Lies wieder erst den Algorithmus in natürlicher Sprache und ordne die einzelnen Schritte den jeweiligen Entsprechungen im Flussdiagramm sowie im Programmcode zu (z.B. durch Nummerieren oder farbliches Hervorheben).
Einführung
In diesem Kapitel werden [i]Schleifen [/i]behandelt, deren Verständnis für den Programmierstart von essentieller Wichtigkeit ist. Sie dienen dazu, einzelne Befehle, die öfter ausgeführt werden müssen, zusammenzufassen, damit ihnen eine gemeinsame Bedingung auferlegt werden kann.
Was ist eine while-Schleife?
Was ist eine for-Schleife?
In Java gibt es auch noch eine "do-while" Schleife. Der Anweisungsteil einer solchen Schleife wird mindestens einmal ausgeführt, sonst gibt es aber keinen Unterschied zur "while-Schleife", weshalb wir sie hier nicht näher behandeln.
Leseecke: Methoden/Funktionen
Die Leseecke zeigt wieder anhand des einfachen Beispiels der Berechnung der Potenz wie Methoden bzw. Funktionen in Java definiert und aufgerufen werden.[br]
Der [color=#0B5394][b]Funktion power [/b][/color]werden beim Aufruf zwei Werte (2 und 10) vom Typ int [b]als Argumente übergeben[/b]. Nach der Berechnung der Potenz in der Funktion [i]power [/i]wird das Ergebnis mittels [color=#0B5394][b]return [/b][/color][b]zurückgegeben[/b]. Es handelt sich bei power somit um eine [color=#0B5394][b]Funktion (= Methode mit Rückgabewert)[/b][/color]. Das Ergebnis wird wieder in einer Variable (result) gespeichert und dann auf der Konsole ausgegeben.
Teste nun das fertig implementiere Programm im kooperativen Online-Editor repl.it:[br][br][list][*][url=https://repl.it/@IrisGroher/PowerCalculation]https://repl.it/@IrisGroher/PowerCalculation[/url][/*][/list]
ENTDECKEN – Arrays
Arrays werden auch eindimensionale Felder genannt.[br][br]Die Funktion static boolean isPalindrom(char[] text) soll überprüfen, ob es sich beim Inhalt von [i]text [/i]um ein Palindrom handelt. Ein Palindrom ist ein Wort, das von vorne und von hinten gelesen gleich lautet (z.B. UHU, ANNA, OTTO).
Zuerst überprüfen wir, ob das übergebene Feld null ist oder ein Feld der Länge 0 (oder mit negativer Länge) übergeben wurde. Du solltest immer auf eine korrekte Behandlung solcher Sonder- bzw. Fehlerfälle zu Beginn der Methode/Funktion achten!
[justify]Jetzt wollen wir schrittweise jeweils vorne und hinten im Feld alle Buchstaben miteinander vergleichen.[/justify][br]Dazu legen wir uns zwei Variablen an, in denen wir die Indizes der Elemente speichern, die wir gerade vergleichen. Die erste Variable i startet bei 0 (ganz vorne im Feld), die zweite Variable j startet bei text.length-1 (ganz hinten im Feld).
Die Vergleiche der Buchstaben machen wir so lange, bis die beiden Indizes sich überkreuzen.
Sobald wir zwei Buchstaben entdecken, die nicht gleich sind, wissen wir, dass es sich um kein Palindrom handelt. Dazu vergleichen wir den Wert des Elements an der Stelle i mit dem Wert des Elements an der Stelle j.
Für den nächsten Schritt müssen wir den Wert von i erhöhen und den von j verringern (i und j „wandern“ einander entgegen).[br]
Wurden am Ende alle Buchstaben verglichen und wurde kein unterschiedlicher Buchstabe entdeckt, sind wir fertig und können den Wert true zurückliefern.[br]
Nun wollen wir die Funktion [i]isPalindrom[/i] noch testen. Dazu legen wir uns einige Beispiel-Felder in der main Methode an und rufen mit diesen Feldern als Parameter jeweils die Funktion [i]isPalindrom [/i]auf.[br]
Teste nun das fertig implementiere Programm im kooperativen Online-Editor repl.it:[br][br][url=https://repl.it/@IrisGroher/Palindrom]https://repl.it/@IrisGroher/Palindrom[/url]
ENTDECKEN: mehrdimensionale Arrays (Felder)
In einem zweidimensionalen Feld sind die Raumkapazität und die Raumbelegung (z.B. einer Jugendherberge oder eines Seminarhotels) gespeichert. Es soll für jeden Raum eine Raumnummer, die Kapazität und die aktuelle Belegung ausgegeben werden.[br][br]Dazu wird in der main-Methode zuerst ein zweidimensionales Feld [i]room [/i]angelegt und mit Werten befüllt. Die erste Zeile der Matrix repräsentiert die Raumnummer, die zweite Zeile die Kapazität des Raumes und die dritte Zeile die aktuelle Belegung. Die sechs Spalten der Matrix repräsentieren die sechs Räume. Der 1. Raum hat zum Beispiel die Nummer 11 und vier Plätze, wovon derzeit zwei belegt sind.
Um die Werte der einzelnen Räume auszugeben, durchlaufen wir die erste Zeile und greifen dabei auch auf die anderen beiden Zeilen zu. Wichtig ist, dass alle Zeilen gleich viele Werte enthalten, was noch gesondert überprüft werden könnte/sollte.
Ausgabe
Um bei einer Matrix alle Elemente durchzulaufen, werden typischerweise zwei ineinander verschachtelte Schleifen verwendet. So könnten wir beispielsweise alle Zahlen der Matrix ausgeben:[br][br]https://repl.it/@IrisGroher/RoomAdmin
Ausgabe
Auf ähnliche Weise lässt sich die Summer aller Zahlen berechnen:[br]
Ausgabe
Teste nun das fertig implementiere Programm im kooperativen Online-Editor repl.it:[br][br][url=https://repl.it/@IrisGroher/RoomAdmin]https://repl.it/@IrisGroher/RoomAdmin[/url]
ENTDECKEN: Klassen und Objekte
Die Klasse [b]Fraction[/b], dient zur Verwaltung von Brüchen mit Zähler und Nenner. Die Klasse enthält zwei [i]Konstruktoren [/i]und Methoden zur Addition, Subtraktion, Multiplikation, sowie Division von Brüchen.
Die Verwendung der Klasse [b]Fraction [/b]erfolgt in der Klasse [b]Test Fraction[/b] in einer neuen Java-Datei.[br][br]Es wird eine neue Variable [i]f1 [/i]vom Typ [i]Fraction [/i]angelegt. Mit [i]f1 = new Fraction()[/i] wird der Variable ein neues [i]Fraction [/i]Objekt zugewiesen. Wird kein Parameter übergeben, wird der parameterlose Konstruktor aufgerufen. Bei der Variable [i]f2 [/i]wird mittels f2 = new Fraction(3, 5) Konstruktor 2 aufgerufen und Zähler und Nenner werden mit 3 bzw. 5 initialisiert. [i]f2 [/i]repräsentiert den Bruch [math]\frac{3}{5}[/math][br][br]Die einzelnen Methoden der Klasse[b] Fraction (add, subtract, multiply, divide)[/b] können für jedes Objekt mit dem [b].[/b] Operator aufgerufen werden. f2.add(f3) ruft die add-Methode für das Objekt f2 auf und übergibt f3 als Parameter.
Ausgabe
Teste nun das fertig implementiere Programm im kooperativen Online-Editor repl.it:[br][br][url=https://repl.it/@michvier/Fraction]https://repl.it/@michvier/Fraction[/url]
ENTDECKEN – Vererbung in Java
Bei einer Vererbung in Java wird zwischen einer [b]Super- und einer Subklasse[/b] (auch Ober- und Unterklasse genannt) unterschieden. Die Superklasse ist in der Regel eine Zusammenfassung von allgemeinen [b]Attributen (Instanzvariablen) und Methoden[/b] unterschiedlicher aber ähnlicher Objekte.[br][br]Die [b]Subklasse[/b] bekommt von ihrer [b]Superklasse[/b] sämtliche Attribute und Methoden [b]vererbt[/b] (als wären sie in der Subklasse deklariert). Typischerweise wird die Subklasse um eigene Attribute und Methoden erweitert. Man spricht hier von einer[b] Spezialisierung der Subklasse [/b]von der Superklasse. Eine Vererbung in Java findet über das Schlüsselwort [i]extends[/i] statt.[br][br]Die [b]Klasse Vehicle[/b] besitzt [b]Attribute (Instanzvariablen)[/b] die auf alle Arten von Fahrzeugen anwendbar sind (noTires, id). Die [b]Klassen Car[/b] und [b]Bike[/b] [b]erben[/b] alle Attribute der [b]Klasse Vehicle[/b]. Wir fassen alle Klassen im Kontext der Fahrzeuge [b]in einem Paket vehicles[/b] zusammen.[br][br]Die [b]Methode [i]toString()[/i][/b] verwendet eine [b]Methode getVehicleType()[/b], die in allen Subklassen überschrieben wird, und kann somit den richtigen Typ für jedes Fahrzeug bei der textuellen Repräsentation voranstellen.
Superklasse Vehicle
Die [b]Klasse Car[/b] ist eine [b]Sub[/b]klasse der [b]Klasse Vehicle[/b] ([i]Car extends Vehicle[/i]), und verfügt somit auch über deren Attribute [i]noTires[/i] und [i]id[/i]. [br][br]Im Konstruktor der [b]Klasse Car[/b] wird mittels [b][i]super(id, 4)[/i][/b] der Konstruktor der Superklasse Vehicle aufgerufen (der super Aufruf muss immer die erste Anweisung sein). Diesem wird die Variable [i]id[/i] übergeben, sowie 4 für die Variable [i]noTires[/i] (wir nehmen an, dass in unserem Beispiel alle Autos 4 Reifen haben). [br][br]Zusätzlich zu den bereits geerbten Attributen der [b]Super[/b]klasse können in der [b]Sub[/b]klasse weitere Attribute definiert werden. Im Fall von Car sind dies die Attribute manufacturer und model.
Subklasse Car
Neben der [b]Klasse Car[/b] kann eine weitere [b]Sub[/b]klasse der [b]Klasse Vehicle[/b] ([i]Bike extends Vehicle[/i]) definiert werden. In Java kann man durch Vererbung eine Klassenhierarchie bilden. [br][br]Die [b]Klasse Bike[/b] unterscheidet sich insofern von Car, dass sie zwar die Attribute der Superklasse vererbt bekommt ([i]id, noTires[/i]), jedoch andere zusätzliche Elemente besitzt: [i]type[/i] und [i]noGears[/i] anstatt [i]manufacturer[/i] und [i]model[/i]. [br][br]Geerbte Attribute und Methoden werden unverändert übernommen. Man kann geerbte Methoden in Java aber auch überschreiben, d.h. mit gleicher Schnittstelle neu deklarieren, und somit eine eigene Version der Methode implementieren. Die geerbte Methode wird somit ersetzt. [br][br]Die [b][i]toString[/i] Methode[/b] der [b]Klasse Vehicle[/b] wird in der [b]Klasse Bike[/b] überschrieben. Dabei wird auf eine Methode der Superklasse zugegriffen: mittels [i][b]super.toString()[/b][/i] kann die toString-Methode der Klasse Vehicle aufgerufen werden.
Klasse Bike
In der [b]Test-Klasse VehiclesTest [/b]werden nun alle vorher definierten Klassen verwendet: Variablen vom [b]Typ Vehicle[/b] können sowohl [b]Objekte[/b] vom [b]Typ Car[/b] (siehe v1), als auch [b]Objekte[/b] vom [b]Typ Bike[/b] (siehe v5) zugewiesen werden. [br][br]Methoden, die in der [b]Klasse Vehicle[/b] als [i]public[/i] markiert sind, können auch von Objekten einer Subklasse aufgerufen werden. Zum Beispiel, [b][i]car3.setId(..) [/i][/b]ruft die setter-Methode der Instanzvariable [i]id[/i] auf, die in Vehicle definiert wurde.
Klasse VehiclesTest
Ausgabe
Teste nun das fertig implementiere Programm im kooperativen Online-Editor repl.it:[br][br][list][*][url=https://repl.it/@IrisGroher/Vehicles]https://repl.it/@IrisGroher/Vehicles[/url][/*][/list]