part 4

Published on
Embed video
Share video
Ask about this video

Scene 1 (0s)

9.2 Bäume Listenelement inhalt 22 nachfolger Liste listenkopf Listenelement inhalt nachfolger Listenelement inhalt 43 nachfolger Listenelement inhalt 12 nachfolger null Abbildung 9.1: Die bisherige Listenimplementierung Es wird eine temporäre Variable aktuellesElement vom Typ ListenElement er- zeugt, die anfangs auf den Kopf der Liste zeigt. In der while-Schleife kann nun mit dem jeweiligen Element gearbeitet werden. Am Ende des Schleifenkörpers wird nun die Refe- renz des aktuellen Elements auf seinen Nachfolger geschoben. Erst beim letzten Element wird den Wert dieser Variable dann null und die Schleife wird verlassen, da die Wieder- holungsbedingung nicht mehr erfüllt ist. Bei vielen weiteren Operationen, wie dem Einfügen, Überschreiben oder Löschen von Ele- menten in der Liste gibt es zwei wichtige Dinge zu beachten. Es muss sichergestellt wer- den, dass nach der jeweiligen Operation der Rest der Liste weiterhin intakt ist. So sollen zum Beispiel nach dem Löschen eines Elements nicht alle Element hinter dem gelöschten Element weiterhin in der Liste hängen und nicht mit entfernt werden. Außerdem müssen Ausnahmefälle sorgsam beachtet werden. Das sind Operationen am Kopf sowie am Ende der Liste, bei denen das Vorgehen eventuell angepasst werden muss. Wie bei vielen abstrakten Datentypen gibt es auch bei den Listen diverse Variationen. So gibt es auch Listen mit Listenelementen, die ihren Nachfolger und ihren Vorgänger verlin- ken, oder auch Listen, bei denen das letzte Element wieder auf den Listenkopf zeigt, und somit einen Ring erzeugt. 9.2 Bäume Eine weitere wichtige abstrakte Datenstruktur in der Informatik sind Bäume. Sie sind mit linearen Listen verwandt, jedoch können die Elemente eines Baumes mehr als einen Nach- folger besitzen. Bei Bäumen spricht man meist nicht mehr von Elementen, sondern von Knoten. Eine typische Baumstruktur ist der Binärbaum. Bei ihm besitzt jeder Knoten zwei Nachfolger – jeweils einen linken und einen rechten nachfolgenden Knoten. Eine entspre- chende Implementierung für Knoten eines Baumes für Integer-Werte könnte wie folgt aus- sehen: 1 public class BaumKnoten { 2 int inhalt; 3 BaumKnoten linkerNachfolger; 4 BaumKnoten rechterNachfolger; 5 55.

Scene 2 (2m 36s)

[Audio] Heute werden wir uns mit dem Thema Bäume beschäftigen. Bäume sind eine wichtige abstrakte Datenstruktur mit mehreren Nachfolgern pro Element im Vergleich zu linearen Listen. Besonders werden wir uns mit dem Binärbaum befassen. Zunächst möchten wir den einfachen abstrakten Datentyp BaumKnoten genauer betrachten. Ein BaumKnoten enthält eine beliebige Information und kann ein oder mehrere Nachfolgerknoten haben. Die oberste Knoten, die Wurzel, hat keine Nachfolger. Blattknoten haben den Wert null. Wir werden Ihnen nun zeigen, wie man einen einfachen Baum erstellt. Zuerst werden die Knoten mit den Werten 6, 7 und 9 erzeugt und dann die Nachfolgeknoten angehängt. Eine Rahmenklasse ist wichtig, um bequem mit der Datenstruktur zu arbeiten. Die Wurzel wird als erstes Element gespeichert. Auch Methoden wie Traversieren, Einfügen, Suchen und Löschen von Knoten werden in dieser Rahmenklasse implementiert. Wir hoffen, dass wir Ihnen mit diesem kurzen Einblick in abstrakte Datentypen und Bäume weiterhelfen konnten..

Scene 3 (3m 42s)

[Audio] Dies ist der dritte von insgesamt 18 Folien unserer Präsentation. Heute werden wir Ihnen die abstrakten Datenstrukturen der Bäume näher bringen. Bäume sind eine wichtige alternative Datenstruktur zu linearen Listen, da sie mehrere Nachfolger pro Element besitzen können. In unserem Beispiel sehen wir eine Baum-Klasse, die eine Methode zur Überprüfung enthält, ob ein bestimmter Wert in dem Baum enthalten ist. Wir können diese Klasse nutzen, um einen neuen Baum anzulegen und Knoten hinzuzufügen. Bei der Nutzung von Bäumen müssen wir aufgrund ihrer rekursiven Eigenschaft besonders auf Ausnahmefälle achten, wie beispielsweise Operationen am Listenkopf oder -ende. Um einen Baum vollständig zu traversieren, müssen wir auf das Konzept der Rekursion zurückgreifen. Dabei müssen wir jedoch anders vorgehen als bei linearen Listen, da wir auf eine Methode zurückgreifen, die rekursiv die Nachfolgeknoten eines Knotens auswertet. Dies funktioniert, da jeder Knoten in einem Baum auch eine Wurzel eines Teilbaumes ist. So können wir die rekursive Methode immer auf dem Wurzelknoten des Baumes aufrufen und alle Knoten durchlaufen. In unserem Code-Beispiel können Sie sehen, wie wir mithilfe einer rekursiven Methode den Baum traversieren. Wir hoffen, dass Ihnen dieser Einblick in die Welt der Bäume weitergeholfen hat und freuen uns auf weitere spannende Informationen in unserer Präsentation..

Scene 4 (5m 13s)

[Audio] Wir befinden uns nun auf Folie 4 von insgesamt 18. In dieser Folie geht es um die Verwendung von abstrakten Datentypen und ihre Mächtigkeit im Vergleich zu linearen Listen. Ein Beispiel dafür sind Bäume, die mehrere Nachfolger pro Element haben können im Gegensatz zu Listen. Bei der Nutzung dieser Strukturen müssen wir besondere Aspekte beachten wie Operationen am Listenkopf oder -ende, um sicherzustellen, dass die Liste intakt bleibt und Sonderfälle berücksichtigt werden. Das Gleiche gilt auch für Bäume. Wir möchten Ihnen ein konkretes Beispiel vorstellen, um das Konzept besser zu veranschaulichen. Unser Beispiel beinhaltet einen Baum mit verschiedenen Knoten, die alle durch eine Ordnungsrelation miteinander verbunden sind. Diese ermöglicht eine effiziente Suche im Baum, da jeder rechte Nachfolgeknoten einen größeren Wert als der aktuelle Knoten und jeder linke Nachfolgeknoten einen kleineren oder gleichwertigen Wert enthält. Um das Konzept weiter zu verdeutlichen, betrachten wir die Summierung der Inhalte in unserem Baum. Zuerst wird die Wurzel bearbeitet, dann die Kinder in Schritt 2 und 3 summiert und schließlich im vierten Schritt alle Blätter, wobei aus Platzgründen nur ein Blatt aufgeschrieben ist. Die Ergebnisse werden dann nach oben hin aufsummiert und ergeben in unserem Beispiel eine Gesamtsumme von 22. Suchbäume sind besonders nützlich für die effiziente Suche in großen Datenmengen, da die rekursive Suchmethode immer einen der möglichen Teilbäume auswählen muss, um die Suche fortzusetzen, bis der gesuchte Wert gefunden wird. Dieses Konzept kann auch auf andere abstrakte Datentypen angewendet werden, um leistungsstarke Datenstrukturen zu erhalten. Wir hoffen, dass Sie nun ein besseres Verständnis für abstrakte Datentypen gewonnen haben..

Scene 5 (7m 9s)

[Audio] Bäume sind in der Informatik eine wichtige abstrakte Datenstruktur. Sie ermöglichen eine hierarchische Organisation und effizienten Zugriff auf Daten. Im Gegensatz zu linearen Listen haben Bäume mehrere Nachfolger pro Element. Einer der bekanntesten Baumtypen ist der Binärbaum, bei dem jeder Knoten höchstens zwei Nachfolger besitzt. Bei der Suche in einem solchen Binärbaum beginnen wir an der Wurzel, in diesem Beispiel die Zahl 23. Da der gesuchte Wert kleiner ist, suchen wir im linken Teilbaum weiter. Jedoch ist der Nachfolgeknoten 17 zu groß, daher gehen wir weiter in den linken Teilbaum von 17. Dort finden wir schließlich den Knoten 14, der zu klein ist. Das bedeutet, dass der gesuchte Wert im rechten Teilbaum von 14 liegen muss. Nach einem Schritt finden wir schließlich den gesuchten Knoten. Bäume dienen jedoch nicht nur der Suche, sondern können auch zur Einfügung neuer Elemente verwendet werden. Dabei ist eine gewisse Ordnung wichtig, um die Struktur des Baumes zu erhalten. Wenn z.B. ein neues Element in den Binärbaum eingefügt werden soll, muss die richtige Position gefunden werden, um die Ordnung nicht zu zerstören. Insgesamt sind Bäume eine bedeutende Datenstruktur zur effizienten Verwaltung und Organisation von Daten. Wir haben gesehen, wie sie bei der Suche und Einfügung von Elementen funktionieren und dass eine gewisse Ordnung bei ihrer Verwendung wichtig ist. Im Folgenden werden wir uns weitere wichtige Baumstrukturen wie den Binärbaum genauer ansehen..

Scene 6 (8m 45s)

[Audio] Die sechste Folie unserer Präsentation behandelt das wichtige Thema der abstrakten Datentypen, die für die Datenverwaltung in der Programmierung unerlässlich sind. Sie spielen eine entscheidende Rolle bei der Organisation und Manipulation von Informationen und ermöglichen die Erstellung effizienter und strukturierter Programme. In dieser Folie werden zwei Arten von abstrakten Datentypen genauer betrachtet: Listen und Bäume. Listen sind eine häufig verwendete Datenstruktur, um eine Sammlung von Elementen in bestimmter Reihenfolge zu speichern und darauf zuzugreifen. Die Variable "aktuellesElement" zeigt auf jedes Element der Liste und ermöglicht verschiedene Operationen. Dabei muss jedoch berücksichtigt werden, dass der Rest der Liste intakt bleiben muss und Besonderheiten wie Operationen am Listenkopf oder -ende beachtet werden müssen. Bäume hingegen sind eine weitere wichtige Datenstruktur, die im Vergleich zu linearen Listen mehrere Nachfolger pro Element haben können. Sie sind besonders nützlich bei der Organisation von Daten in hierarchischen Strukturen, wie zum Beispiel beim Binärbaum oder Suchbaum. Sie bieten effiziente Möglichkeiten, auf Daten zuzugreifen und zu verarbeiten. Die Nummer neun auf Folie sechs steht für einfache abstrakte Datentypen und dient als numerische Kennzeichnung für verschiedene Typen, um eine eindeutige Identifikation und Kommunikation zwischen Programmierern zu ermöglichen. Das war ein kurzer Einblick in die Welt der abstrakten Datentypen. In den folgenden Folien werden wir uns genauer mit ihren Eigenschaften und Anwendungsmöglichkeiten befassen..

Scene 7 (10m 27s)

[Audio] In einigen Computerprogrammen können Fehler und Ausnahmesituationen auftreten. Früher sind unsere Programme oft abgestürzt, wenn so etwas passiert ist. Bei größeren Programmen, die von anderen Personen genutzt werden müssen, ist dies jedoch unerwünscht. Bei schwerwiegenden Fehlern sollte zumindest eine Fehlermeldung angezeigt werden und versucht werden, das Programm zu retten. Bei kleineren Fehlern oder Ausnahmesituationen kann das Programm unter Umständen weiterarbeiten. Ein Beispiel dafür ist, wenn der Benutzer eine Zahl eingeben soll, aber stattdessen einen Text eingibt. Anstatt das Programm abstürzen zu lassen, kann die Ausnahme durch erneutes Abfragen der Zahl gelöst werden. Allerdings ist es dafür nötig zu lernen, wie man mit Fehlern und Ausnahmesituationen umgeht. In Java gibt es bereits geeignete Mittel dafür. Wenn in einem Java-Programm ein Fehler auftritt, wird eine sogenannte Exception ausgelöst. Wenn dieser Fehler nicht von einem Teil des Programms abgefangen und behandelt wird, stürzt das Programm einfach mit der Ausgabe dieser Exception ab. Zum Beispiel kann es zu einer NullPointerException kommen, wenn eine Referenz, die genutzt werden soll, auf null zeigt. Ein weiteres Beispiel ist, wenn auf nicht vorhandene Elemente in einem Array zugegriffen wird. Um dies zu verhindern, kann man eine Bedingung einfügen, die überprüft, ob der betreffende Index innerhalb der Größe des Arrays liegt. Insgesamt ist es wichtig, sich mit Fehlern und Ausnahmesituationen in Computerprogrammen auseinanderzusetzen und sie richtig zu behandeln. Java bietet bereits passende Mechanismen dafür, jedoch ist es wichtig, diese auch einsetzen zu können und zu verstehen..

Scene 8 (12m 12s)

[Audio] "Unsere Präsentation befasst sich mit abstrakten Datenstrukturen und Ausnahmefällen in Java. Im Folgenden werden wir die Verwendung von Listen und Bäumen sowie den Umgang mit Exceptions in Java betrachten. Wir befinden uns nun bei Folie 8 von insgesamt 18 Folien. Hier sehen Sie die Verwendung von ListenElementen in Java, die in vielen Operationen den Rest der Liste intakt halten müssen und Ausnahmefälle beachten müssen, wie zum Beispiel Operationen am Listenkopf oder -ende. Im Vergleich zu linearen Listen können Bäume mehrere Nachfolger pro Element besitzen, wie zum Beispiel der Binärbaum. Nun kommen wir zu einem wichtigen Thema - Exceptions. Diese brechen die Ausführung im try-Block ab und Java überprüft, ob direkt nach dem try-Block ein catch-Block für diese spezielle Exception existiert. Wenn dem so ist, wird dieser Block als Fehlerbehandlung ausgeführt. Lassen Sie uns dies anhand eines Beispiels genauer betrachten. Wir lesen mit der parseInt(String)-Methode einen Integer aus einem übergebenen String aus. Sollte der String keinen Integer enthalten, wird eine NumberFormatException geworfen. In unserem Beispiel beträgt der String "42". Der Aufruf der Methode ist erfolgreich und der Integer wird quadriert und ausgegeben. Doch was passiert, wenn unser String beispielsweise "foo" ist? Die parseInt-Methode wird nicht erfolgreich sein und eine NumberFormatException werfen. In diesem Fall wird direkt zur Zeile 8 gesprungen und die Ausgabe lautet "Kein Integer!". Dieser Fehler wird also im catch-Block behandelt, während Zeilen 4 und 5 übersprungen werden. Es ist wichtig zu beachten, dass der restliche try-Block übersprungen wird, wenn eine Exception auftritt. Außerdem ist es wichtig, den Typ der Exception im catch-Block anzugeben, da innerhalb eines try-Blocks theoretisch verschiedene Exceptions auftreten können. Zusammengefasst brechen Exceptions die Ausführung im try-Block ab und werden im entsprechenden catch-Block behandelt. Wir danken Ihnen für Ihre Aufmerksamkeit und werden nun mit Folie 9 fortfahren..

Scene 9 (14m 25s)

[Audio] Fehlerbehandlung ist ein wichtiger Aspekt der Programmierung. In dieser Präsentation werden wir uns mit der Behandlung von Fehlern in Java beschäftigen. Eine wichtige Konstruktion zur Fehlerbehandlung ist der try-catch-Block, welcher es uns erlaubt, Fehler abzufangen und entsprechende Maßnahmen zu ergreifen. Es ist wichtig zu beachten, dass Fehler nicht einfach versteckt, sondern behoben werden sollten. Häufig nutzen Programmierer try-catch-Blöcke, um Fehler zu verbergen, anstatt sie zu beheben. Dies ist besonders bei NullPointerExceptions der Fall. Statt die Scherben zusammenzukehren, sollten wir immer zuerst überprüfen, ob eine Referenz auf null zeigt. Eine weitere bedeutende Fehlerklasse, die abgefangen werden sollte, sind NumberFormatExceptions. Diese können nützlich sein, um Benutzereingaben zu überprüfen. Eine Übersicht über verschiedene Arten von Fehlern finden Sie auf Folie 9. Sie gehören alle zur Menge der Throwable-Fehler, bestehend aus Errors und Exceptions, wobei RuntimeExceptions eine besondere Art von Exception sind. Bei genauerer Betrachtung der Unterscheidung zwischen checked und unchecked Exceptions wird deutlich, dass unchecked Exceptions behandelt werden können, während checked Exceptions behandelt werden müssen. Um zu überprüfen, welche Exceptions zu den RuntimeExceptions gehören, empfehlen wir einen Blick in die API. Es ist wichtig zu beachten, dass alle Exceptions, die keine RuntimeExceptions sind, explizit behandelt werden müssen. Andernfalls gibt es einen Compilerfehler, da der Compiler sicherstellen muss, dass der Code in der Lage ist, auf solche Fehler zu reagieren. Zusammenfassend haben wir gesehen, wie wichtig die Behandlung von Fehlern ist und wie wir mit Hilfe von try-catch-Blöcken und der Unterscheidung zwischen checked und unchecked Exceptions Fehler effektiv abfangen und behandeln können..

Scene 10 (16m 26s)

[Audio] Wir sind nun bei Folie 10 von insgesamt 18 angelangt. Auf dieser Folie geht es um das Thema Ausnahmen. In der Programmierung kann es häufig zu unvorhergesehenen Fehlern kommen, die als Ausnahmen bezeichnet werden. Diese müssen beachtet und behandelt werden, um ein reibungsloses Funktionieren des Programms sicherzustellen. Ein Beispiel dafür ist der Compilerfehler, der auf Folie 10 als "FileNotFoundException" bezeichnet wird. Dieser muss entweder im Programm behandelt oder explizit an den Aufrufer weitergegeben werden. Es gibt auch unbehandelte Ausnahmen vom Typ "RuntimeException", die vom Compiler nicht überprüft werden können und daher in jedem Teil des Programms auftreten können. In solchen Fällen müssen wir nicht für jeden möglichen Fehler einen try-catch-Block schreiben, was die Programmierung erleichtert. Allerdings sollten wir vorsichtig sein und solche Ausnahmen nicht immer unbehandelt lassen. In den meisten Fällen handelt es sich um Programmierfehler, die behoben werden sollten. Nur in bestimmten Situationen, wie wenn Benutzereingaben verarbeitet werden, ist eine Behandlung dieser Ausnahmen sinnvoll. Wir hoffen, dass Sie nun ein besseres Verständnis für das Thema Ausnahmen in der Programmierung haben. Im nächsten Abschnitt werden wir uns mit Bäumen als wichtiger abstrakter Datenstruktur beschäftigen. Vielen Dank für Ihre Aufmerksamkeit..

Scene 11 (17m 51s)

[Audio] Im vorherigen Abschnitt haben wir gesehen, wie man in Java Exceptions erzeugen und behandeln kann. Doch was passiert, wenn eine Methode Exceptions erzeugt, die sie nicht selbst behandeln kann? Diese Situation kann beispielsweise auftreten, wenn eine Methode Zugriff auf Dateien hat und dabei Fehler verursacht. Angenommen, wir möchten diese Methode verwenden, um auf Dateien in unserem Projektverzeichnis zuzugreifen. Diese Dateien können entweder die eigentlichen Arbeitsdaten unseres Programms sein oder eine Konfigurationsdatei. Dabei können auch die von der Methode genutzten Unterfunktionen Exceptions werfen. Doch wie gehen wir mit diesen Fehlern um? Es ist nicht sinnvoll, in der Methode selbst auf die Exceptions zu reagieren, da der Aufrufer möglicherweise etwas anderes tun möchte. Stellen wir uns zum Beispiel vor, dass beim Schreiben der Konfigurationsdatei eine Exception auftritt, die beim Beenden des Programms automatisch gespeichert werden soll. In diesem Fall sollte die Reaktion anders ausfallen als bei einem Fehler beim Öffnen der Arbeitsdaten aufgrund fehlender Rechte. Die Entscheidung, wie mit einer Exception umgegangen werden soll, liegt also beim Aufrufer der Methode. Um dies zu ermöglichen, muss die Methode die Exception mit dem Schlüsselwort "throws" in ihrer Signatur weiterreichen. Ein Beispiel: Nehmen wir an, wir haben eine Methode "zugriff", die eine Datei öffnen und lesen soll. Die Signatur der Methode könnte wie folgt aussehen: void zugriff(/*Parameter*/) throws FileNotFoundException Wie wir sehen, wird die Exception "FileNotFoundException" weitergereicht, da die Methode sie nicht selbst behandeln kann. Der Aufrufer der Methode ist nun dafür verantwortlich, die Exception mit einem "try-catch"-Block abzufangen oder ebenfalls weiterzureichen. Dadurch wird eine saubere Fehlerbehandlung ermöglicht und die Fehler können an der richtigen Stelle abgefangen und behandelt werden. Insgesamt zeigt uns dies, wie wichtig es ist, sich mit den verschiedenen Arten von Exceptions und deren Behandlung in Java auseinanderzusetzen, um robuste Programme zu schreiben..

Scene 12 (20m 3s)

[Audio] Bei der Verwendung von Datenstrukturen wie Listen und Bäumen ist es wichtig, auch mit Ausnahmefällen umzugehen. Wir müssen sicherstellen, dass der Rest der Liste intakt bleibt und bestimmte Aktionen am Listenkopf oder -ende beachtet werden. Eine Möglichkeit, Ausnahmefälle zu behandeln, ist die Verwendung von 'catch (Exception e)', um alle Fehler auf einmal abzufangen. Dies ist jedoch schlechter Stil, da wir so die Möglichkeit verlieren, die Fehler differenziert zu betrachten. Um Exceptions auszulösen, nutzen wir das Schlüsselwort 'throw' (ohne 's' am Ende), um Objekte vom Typ Throwable an den Aufrufer weiterzureichen. Es ist jedoch empfehlenswert, nicht direkt von der Klasse Throwable zu erben, sondern von der Klasse Exception oder davon abgeleiteten Klassen, da Throwable eine besondere Klasse für die virtuelle Maschine darstellt. Ein Beispiel dafür ist die Methode 'division', die einen float-Wert durch einen anderen teilt. Wenn der zweite Wert dabei null ist, wird eine ArithmeticException ausgelöst. Diese Exception ist vom Typ RuntimeException, also eine unchecked Exception. Daher ist es nicht nötig, sie in der Methodensignatur anzugeben. Anders verhält es sich bei checked Exceptions, hier ist es Pflicht, diese in der Signatur anzugeben. Ein Beispiel dafür ist die Methode 'do_something', die eine Exception auslöst, wenn 'everything_ok' false ist. In der Praxis ist es jedoch sinnvoll, diese Beispiele zu verbessern und konkretere Exceptions zu nutzen..

Scene 13 (21m 42s)

[Audio] Wir befinden uns nun bei Folie 13 von insgesamt 18. Bei vielen Operationen müssen wir den Rest der Liste intakt halten und besondere Fälle, wie z.B. Operationen am Listenkopf oder -ende, beachten. Bäume sind eine weitere wichtige abstrakte Datenstruktur. Im Vergleich zu linearen Listen können Bäume mehrere Nachfolger pro Element besitzen. Typische Baumstrukturen, wie der Binärbaum, werden ebenfalls betrachtet. Im Anschluss daran werden wir uns dem Bereich der Dateneingabe widmen. Dabei ist es in vielen Aufgaben notwendig, Daten vom Benutzer einzulesen. Dies ist auch für das Testen des eigenen Programms nützlich, da die Eingabedaten schnell und einfach vom Programm abgerufen werden können, anstatt sie jedes Mal hart in den Quellcode schreiben zu müssen, wenn ein neuer Eingabefall getestet werden soll. Im Anhang finden unerfahrene Programmierer Informationen zum Einlesen von Daten, da dies bereits in einem frühen Stadium benötigt wird. Eine Möglichkeit, Daten einzulesen, ist die Verwendung des Scanners, der direkt in Java eingebaut ist. Dazu muss zuerst in der Datei "import java.util.Scanner" dem Scanner mitgeteilt werden, dass er verwendet werden soll. Anschließend muss angegeben werden, wie der Scanner heißt und von wo er lesen soll. In unserem Beispiel ist der Scanner "scan" und diese Information muss vor dem ersten Einlesen im Programmcode stehen. Dies wird außerhalb von jeglichen Methoden, jedoch vor der Methode "main", wie in Zeile 3 dargestellt, gemacht. Ab diesem Punkt kann der Scanner verwendet werden. Eine Variable des benötigten Typs kann erstellt werden, um den Wert, der vom Scanner eingelesen wurde, zu speichern..

Scene 14 (23m 31s)

[Audio] Bei der Arbeit mit Listen als Datenstruktur gibt es viele wichtige Dinge zu beachten. Man verwendet häufig aktuelle Elemente vom Typ ListenElement. Dabei werden alle Elemente der Liste nacheinander betrachtet und je nach Operation müssen der Rest der Liste intakt gehalten und Ausnahmefälle beachtet werden. Besonders wichtig sind Operationen am Listenkopf oder -ende. Bäume sind eine weitere wichtige Datenstruktur. Im Vergleich zu linearen Listen können Bäume mehrere Nachfolger pro Element haben. Bekannte Beispiele sind der Binärbaum oder der Suchbaum. Für die Dateneingabe gibt es verschiedene Möglichkeiten. Zum Beispiel kann man mit dem Scanner Textzeilen einlesen, indem man die Methode "scan.nextLine()" verwendet. Für spezifische Datentypen wie long oder short gibt es entsprechende Methoden wie "scan.nextLong()" oder "scan.nextShort()". Auch Gleitkommazahlen können mit "scan.nextFloat()" oder "scan.nextDouble()" eingelesen werden. Dabei muss man jedoch beachten, dass der Scanner die Regionaleinstellung des Benutzers beachtet. Wenn also ein deutsches Betriebssystem verwendet wird, muss man bei der Eingabe einer Kommazahl ein Komma anstelle eines Punktes verwenden. Ein Beispiel für die Verwendung des Scanners könnte wie folgt aussehen: 1 import java.util.Scanner; 2 public class BMI_rechner 12 } Ausgabe (Zeile 2 und 4 sind vom Benutzer eingetippt worden, beachte das Komma in Zeile 4): 1 Hi! Wie viel wiegst du in kg? 2 75 3 Bitte verrate mir noch deine Groesse in Metern. 4 1,80 5 Dein BMI betraegt: 23.14815..

Scene 15 (25m 26s)

[Audio] Die Objektorientierung ist ein bedeutendes Konzept in der Programmierung, das eine alternative Herangehensweise zur rein imperativen Programmierung bietet. Klassen und Objekte spielen dabei eine wichtige Rolle. Es gibt jedoch noch weitere Konzepte, die für die objektorientierte Programmierung von Bedeutung sind. Diese werden in diesem Kapitel genauer betrachtet. Eines davon ist die Vererbung. Dadurch ist es möglich, aus bestehenden Klassen neue Unterklassen abzuleiten und zusätzliche Funktionalitäten hinzuzufügen, ohne Code wiederholen zu müssen. Dies geschieht mithilfe des Schlüsselworts "extends". Durch die Vererbung erbt die neue Klasse alle nicht privaten Eigenschaften und Methoden der Basisklasse. Daher ist es wichtig, bei der Entwicklung von Klassen darauf zu achten, welche Eigenschaften und Methoden wiederverwendet werden können. Zum Beispiel können Mitarbeiter und Abteilungsleiter als Klassen in einem Projekt benötigt werden. Die Klasse "Mitarbeiter" könnte Attribute wie Personalnummer, Name, Vorname und Gehalt haben. Durch die Vererbung von der Klasse "Mitarbeiter" kann die Klasse "Abteilungsleiter" auf diese Attribute zugreifen und spezifische Funktionalitäten für Abteilungsleiter hinzufügen. Ein weiteres wichtiges Konzept der Objektorientierung ist die Polymorphie. Dadurch können Methoden je nach Objekt unterschiedlich ausgeführt werden. Auch von der Basisklasse geerbte Methoden können in den Unterklassen neu implementiert werden, um spezifische Funktionalitäten zu ermöglichen. Zusammenfassend lässt sich sagen, dass Vererbung und Polymorphie wichtige Konzepte der objektorientierten Programmierung sind, die es ermöglichen, Code effizienter und wiederverwendbarer zu gestalten. In den kommenden Kapiteln werden wir weitere Konzepte betrachten und in der Praxis anwenden..

Scene 16 (27m 20s)

[Audio] Die vorliegende Präsentation beinhaltet das Konzept der Liste als abstrakte Datenstruktur sowie die Wichtigkeit der Intakthaltung und die Beachtung von Ausnahmefällen bei Operationen am Listenkopf oder -ende. Im Vergleich zu linearen Listen bieten Bäume den Vorteil mehrere Nachfolger pro Element zu besitzen, wobei der Binärbaum eine typische Struktur darstellt. Im Folgenden möchten wir uns mit der Implementierung von abstrakten Datenstrukturen beschäftigen und ein Beispiel aus dem Bereich der Mitarbeiterverwaltung betrachten. Ein Mitarbeiter der Klasse "Abteilungsleiter" wird angelegt und es wird versucht, auf sein Gehalt zuzugreifen. Hierbei muss beachtet werden, dass das Array von der Basisklasse "Mitarbeiter" erstellt wurde und eine Umwandlung mittels Cast-Operator nötig ist, um auf das Gehalt des Abteilungsleiters zuzugreifen. Das Vererbungsprinzip beinhaltet auch die Vererbung aller Methoden der Basisklasse. In einer erbenden Klasse können diese Methoden für den speziellen Datentyp überschrieben werden, wobei das Schlüsselwort "super" verwendet werden kann, um die Implementierung der Basisklasse zu nutzen und zu erweitern. Der Klasse "Abteilungsleiter" wird eine Methode zum Ausgeben des Gehalts hinzugefügt und ein zusätzlicher Bonus berechnet. Diese Methode kann auf die Methoden der Klasse "Mitarbeiter" zurückgreifen, um das Gehalt des Abteilungsleiters auszugeben..

Scene 17 (28m 48s)

[Audio] C.1 Objektorientierung. C.1.2 Abstrakte Klassen. Der Modifikator ' ' erlaubt es, Methoden und Klassen in Java als abstrakt zu definieren. Dies bedeutet, dass direkte Instanzen der Klasse nicht erstellt werden können. Jedoch erlaubt dies eine Abstraktion von konkreten Klassen, sodass bestimmte grundlegende Eigenschaften definiert werden können, ohne direkt Objekte der Klasse zu erstellen. Erst wenn Unterklassen die abstrakte Klasse erweitern und die als abstrakt definierten Methoden implementieren, können konkrete Objekte erstellt werden. Abstrakte Klassen können, müssen aber nicht, abstrakte Methoden enthalten. Abstrakte Methoden definieren nur die Methodensignatur und enthalten nicht die Implementierung des Körpers. Ebenso können abstrakte Klassen bereits fertige Methoden enthalten, die vererbt werden können. Jetzt mag das alles sehr abstrakt klingen, daher hier ein konkreteres Beispiel mit Fahrzeugen. Nehmen wir an, wir möchten verschiedene Arten von Fahrzeugen in Java erstellen, wie Autos, Busse und Fahrräder. Alle diese Objekte teilen bestimmte Eigenschaften miteinander, haben aber auch ihre Unterschiede. Sie haben alle ein Gewicht und eine Anzahl von Sitzen. Autos und Busse haben auch einen Motor. Neben diesen unterschiedlichen Eigenschaften gibt es auch gemeinsame und unterschiedliche Aktionen. Alle drei Objekte können fahren, aber nur ein Fahrrad kann nicht anhalten, um Passagiere an einer Bushaltestelle aufzunehmen. Der Zweck der Vererbung und abstrakten Klassen ist es, so viele Gemeinsamkeiten wie möglich in die allgemeinere Klasse zu packen..

Scene 18 (30m 32s)

[Audio] Die Hierarchie von abstrakten Datenstrukturen ist ein bedeutender Teil der Programmierung, der es uns ermöglicht, komplexe Probleme effizient zu lösen. Wir haben bereits gesehen, wie lineare Listen genutzt werden können, um Elemente nacheinander zu listen. Jedoch gibt es noch komplexere Strukturen wie Bäume, die mehrere Nachfolger pro Element haben können. Eine wichtige Unterscheidung besteht darin, dass bei vielen Operationen an einer Liste der Rest der Liste erhalten bleiben muss und auch Ausnahmefälle, wie beispielsweise Operationen am Anfang oder Ende der Liste, beachtet werden müssen. Im Verlauf dieser Präsentation haben wir uns mit verschiedenen Konzepten und Methoden auseinandergesetzt, wie beispielsweise dem Verwalten von Listen und dem Erstellen von konkreten Unterklassen. Wir haben dabei gelernt, dass es nicht möglich ist, direkt Objekte aus einer abstrakten Klasse zu erzeugen. Stattdessen müssen konkrete Unterklassen erstellt werden, wie beispielsweise Fahrräder oder PKWs, die von der abstrakten Klasse erben. Vererbung ist dabei ein bedeutendes Konzept, um Hierarchien und Beziehungen zwischen verschiedenen Objekten zu schaffen. Durch das Erstellen von Unterklassen können wir Eigenschaften und Methoden von der Oberklasse erben und gleichzeitig spezifisches Verhalten implementieren, das für die jeweilige Klasse relevant ist. Ein Beispiel hierfür ist die Klasse MotorFahrzeug, die von der abstrakten Klasse Fahrzeug erbt. Durch Vererbung werden Methoden wie das Ein- und Aussteigen automatisch von der Oberklasse geerbt, während spezifische Methoden wie das Anhalten und Bremsen in der konkreten Klasse implementiert werden müssen. Letztendlich ermöglicht uns Vererbung komplexe Strukturen in der Programmierung zu erschaffen und effizient damit zu arbeiten. Wir haben gesehen, wie abstrakte Datenstrukturen wie Listen und Bäume genutzt werden können und wie Vererbung uns dabei hilft, Hierarchien und Beziehungen zwischen Objekten zu schaffen. Damit endet unsere Präsentation über abstrakte Datenstrukturen und Vererbung. Wir hoffen, dass Sie ein besseres Verständnis für diese wichtigen Konzepte gewonnen haben und sie erfolgreich in Ihrer eigenen Programmierung anwenden können. Vielen Dank für Ihre Aufmerksamkeit..