Algorithmen & Datenstrukturen

Größe: px
Ab Seite anzeigen:

Download "Algorithmen & Datenstrukturen"

Transkript

1 Bern University of Applied Sciences Engineering and Information Technology Algorithmen & Datenstrukturen P. Fierz Keywords: Datenstrukturen, Abstrakter Daten Typ (ADT), Algorithmen, Berechenbarkeit, Komplexität, Sortieren, Suchen, Graphen [File had.tex, Date , Version V 3.1] P. Fierz

2 Zusammenfassung In diesem Skript werden wichtige Datenstrukturen wie der Stack, die Queue, der Baum, Graphen usw. als abstrakte Datentypen ADT vorgestellt. Dazu werden viele Algorithmen vorgestellt, die diese Datenstrukturen nutzen. Eine Einführung in die Berechenbarkeitstheorie und in die Komplexitätstheorie sind ebenfalls vorhanden.

3 Kapitel 1 Daten 1.1 Einleitung Der Digital-Computer wurde entwickelt, um komplexe und aufwendige Berechnungen durchzuführen. Dabei werden reelle, ganze und natürliche Zahlen verwendet. Diese Objekte können im Computer auch sehr gut dargestellt und manipuliert werden (die Operationen auf Zahlen stehen auch als Maschineninstruktionen zur Verfügung). Bei den meisten Applikationen steht aber eine andere Eigenschaft des Computers im Vordergrund: seine Fähigkeit, grosse Datenmengen zu speichern. In diesen Fällen stellen die gespeicherten Daten eine Abstraktion eines Teils der realen Welt dar. Mit Abstraktion meinen wir eine Abbildung der realen Welt in ein gegebenes Datenmodell. Wie bei den meisten Modellen können dabei nicht alle Aspekte der Realität berücksichtigt werden, da das Modell dadurch viel zu komplex würde. Daher werden nur diejenigen Aspekte berücksichtigt, die für das zu lösende Problem als wichtig erachtet werden. Beispiel 1.1 [Personaldaten] Als Beispiel vergleichen wir die Personaldaten in einer Arbeitgeberkartei und in einer Arztkartei. Möglichkeiten für diese verschiedenen Abstraktionen sind in der Tabelle 1-1 dargestellt. Aufbau der Arbeitgeberkartei Name Adresse Funktion Gehalt Lohnentwicklung usw. Aufbau der Arztkartei Name Adresse Grösse Gewicht Krankengeschichte usw. Abbildung 1-1: Abstraktion von Personen Die Tabelle zeigt auch, dass Daten, die für den Arbeitgeber unwichtig sind, in der Arbeitgeberkartei einfach weggelassen werden. Dasselbe gilt auch für den Arzt und die Arztkartei. Somit kann also jede Abstraktion auch als Vereinfachung der realen Tatsachen gesehen werden. Bei der Abbildung der realen Welt in ein Datenmodell sind zwei wichtige Aspekte zu berücksichtigen. 1-1

4 Abstraktion Diesen Aspekt haben wir oben schon erwähnt. Es geht darum, von einem realen Objekt die für die Applikation wichtigen Daten zu identifizieren und unwichtige Daten wegzulassen. Darstellung Für die gewählten Daten der Abstraktion muss im Computer nun auch eine Darstellung gewählt werden. Diese Aufgabe ist in vielen Fällen schwierig. Die Wahl der Darstellung der Daten im Computer muss immer in Bezug auf die mit den Daten durchzuführenden Operationen (Algorithmen oder Programme) gesehen werden. Beispiel 1.2 [Darstellung von Zahlen] Wir wollen die Darstellung von Zahlen im kommerziellen und im wissenschaftlich-technischen Bereich betrachten. technische Darstellung Im technisch-wissenschaftlichen Bereich werden von Zahlen folgende Eigenschaften verlangt: Das Rechnen ist die Hauptoperation und muss möglichst effizient sein. Es werden sehr grosse und auch sehr kleine Zahlen benötigt. (Bereich ca bis ) Im allgemeinen genügt eine Genauigkeit von 10 bis 16 signifikante Stellen zur Berechnung und Ausgabe der Resultate. Die Druckoperation ist viel seltener als die Rechenoperationen. Diese Überlegungen legt die floating point-darstellung nahe, die nachstehend erklärt ist. V orzeichen Exponent M antisse Das V orzeichen besteht aus einem Bit, dabei bedeutet 0 eine positive und 1 eine negative Zahl. Der Exponent (zur Basis 2) besteht aus 8 Bits und stellt eine binäre Zahl zwischen 0 und 255 dar. Um den effektiven Exponenten der Zahl zu bekommen, muss von der gespeicherten Zahl 127 abgezogen werden. Anders ausgedrückt: die Zahlen 1 bis 126 stellen die negativen, die Zahlen 127 bis 255 die positiven Exponenten dar. Falls der Exponent 0 ist, so ist die Zahl 0. Die M antisse besteht aus 23 Bits und stellt einen normalisierten Dualbruch dar. Normalisiert heisst, dass die erste signifikante Stelle immer unmittelbar vor dem Komma steht. Da die Stelle vor dem Komma immer 1 ist, wird diese nicht gespeichert. In einer Formel zusammengefasst gilt: kommerzielle Darstellung zahl = V orzeichen (2 (Exponent 127) 1.Mantisse) Im kommerziellen Bereich werden Zahlen vor allem zur Darstellung von Geldbeträgen und Mengenangaben verwendet. Für diese Objekte werden die folgenden Eigenschaften verlangt: Mit den Zahlen wird wenig gerechnet (höchstens Additionen). Dafür werden die Zahlen sehr oft gedruckt. 1-2

5 Der benötigte Bereich ist viel kleiner als im technischen Bereich. Vor allem sind keine sehr kleinen Zahlen notwendig, so dass die Anzahl Stellen nach dem Komma fix vereinbart werden kann (z.b. 4 Stellen). Die Zahlen müssen sowohl beim Rechnen wie auch in der Ausgabe genau sein. Es dürfen also keine signifikanten Stellen verlorengehen. Diese Überlegungen legt die fix point-darstellung nahe, die nachfolgend erklärt ist. n m Vorkommastellen m Nachkommastellen Vorzeichen Dabei sind n und m vereinbarte Konstanten. Der Dezimalpunkt steht somit immer an derselben Stelle. Die Zahlen werden nicht in binärer, sondern in dezimaler Form gespeichert. Jede Dezimalstelle und das Vorzeichen werden durch je 4 Bits dargestellt. Mit diesen vier Bits können nun die Ziffern von 0 bis 9 dargestellt werden. Als Beispiel stellen wir die Zahl dar {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ + Wir wollen am Schluss dieser Einführung versuchen, den Begriff Computer-Daten genauer zu definieren. Definition 1.1 [Computer-Daten] Computer-Daten sind Objekte mit den drei folgenden Eigenschaften 1. Bezeichnung Die Bezeichnung trägt den semantischen Teil (Bedeutung) des Objektes (siehe auch Datentypen). 2. Wertemenge Die Wertemenge legt alle möglichen Werte fest, die ein Objekt dieses Types annehmen kann. Die Wertemenge bestimmt somit die Syntax (Form) eines Objektes. 3. Speicherplatz Der Speicherplatz lokalisiert das Objekt im Speicher und identifiziert dieses eindeutig. Beispiel 1.3 [Computer-Daten] Datenobjekt: "Müller" Bezeichnung: Familienname einer Person. Damit ist die Bedeutung des angegebenen Objekts festgelegt. Wertemenge: Alle Folgen von maximal n alphabetischen Zeichen. Das erste Zeichen muss ein grosser Buchstabe sein. Speicherplatz: Eine Adresse im Speicher, wo die gegebene Zeichenfolge beginnt. Bemerkung 1.1 [Semantik] In der Informatik wird die Semantik durch den Datentyp eines Objektes gegeben. Die Wertemenge ist im Prinzip durch die Anzahl reservierter Bits im Speicher gegeben. 1-3

6 1.2 Datentypen Wie in der Mathematik ist es in der Informatik üblich, Objekte nach bestimmten wichtigen Eigenschaften zu ordnen. In der Mathematik werden genaue Unterscheidungen zwischen einzelnen Werten, Mengen von Werten, Funktionen, Mengen von Funktionen u.s.w. gemacht. In der Informatik werden verschiedene Objekte wie Zahlen, Funktionen, Personaldaten, Wetterdaten, Rechnungen u.s.w. bearbeitet. Bei einer solchen Vielfalt ist es vielleicht noch wichtiger als in der Mathematik, diese Objekte nach ihren Eigenschaften zu ordnen. Dazu führen wir den Begriff des Datentyps ein. Definition 1.2 [Datentyp] Der Datentyp bestimmt eine Menge von Werten, welche die Objekte dieses Typs annehmen können. Diese Menge bezeichnet man als Wertemenge des Datentyps. Die Elemente des Wertebereichs bezeichnet man auch als Konstanten des Datentyps. Der Datentyp bestimmt auch die Operatoren, welche auf dem Wertemenge definiert sind und somit auf Objekte dieses Typs angewandt werden können. Beispiel 1.4 [Datentyp] Wir können die Wertemenge eines Datentyps vollständig beschreiben, indem wir alle Elemente der Menge aufzählen. In der Sprache C++ wird ein solcher Typ folgendermassen definiert: enum Farben {rot, blau, grün, braun; Als Operator ist nur der Vergleich zweier Werte auf Gleichheit definiert. Weiter können in C++ weitere Operatoren wie ++, <,... definiert werden. Bemerkung 1.2 [Syntax und Semantik] Die Wertemenge des Datentyps legt die Syntax fest (Platzbedarf und Codierung). Die Operationen bestimmen den semantischen Teil des Objektes. 1.3 Atomare Typen Als atomare Typen bezeichnen wir Datentypen, die in einer Sprache schon definiert sind. Aus diesen atomaren Typen können mit Hilfe von Typkonstruktoren (siehe 1.4) weitere Typen abgeleitet werden. Die atomaren Typen sind also die Bausteine des ganzen Typsystems einer Programmiersprache. Welche atomaren Typen zur Verfügung stehen, hängt von der gewählten Programmiersprache ab. Im folgenden stellen wir vier wichtige Typen vor, die in den meisten höheren Programmiersprachen existieren Ganze Zahlen (INTEGER) Dieser Typ umfasst ein um die Zahl Null symmetrisches Intervall der ganzen Zahlen. Innerhalb dieses Intervalls können die Zahlen genau dargestellt werden. Als Operationen stehen die Addition, die Subtraktion, die Multiplikation und die ganzzahlige Division zur Verfügung. Die Operationen sind bezüglich der Menge INTEGER nicht abgeschlossen. Das Resultat einer Addition, einer Subtraktion oder einer Multiplikation kann grösser (bzw. kleiner) als die für INTEGER gegebenen Intervallgrenzen sein. Liegt das Resultat einer Operation ausserhalb des gegebenen Intervalls, so spricht man von Overflow. 1-4

7 1.3.2 Reelle Zahlen (REAL) Dieser Datentyp bezeichnet eine Teilmenge der reellen Zahlen. Besonders einschneidende Auswirkungen hat hier die Endlichkeit von mit dem Computer darstellbaren Wertemengen. Während bei den ganzen Zahlen noch gefordert werden konnte, dass jede arithmetische Operation bis auf Overflow-Situationen zu einem korrekten Resultat führt, gilt dies beim Rechnen mit Realzahlen nicht mehr. Der Grund liegt darin, dass jedes noch so kleine Intervall der reellen Zahlenachse unendlich viele Werte enthält. Der Datentyp REAL stellt nun eine endliche Menge von Repräsentanten von Intervallen der Zahlenachse dar. Dadurch wird die reelle Zahlenachse diskretisiert. Aus der Tatsache, dass jede Zahl nur durch einen Repräsentanten dargestellt werden kann, folgt, dass bei Berechnungen nur angenähert richtige Resultate erwartet werden können. Die Abschätzung der entstehenden Fehler ist das Anliegen der numerischen Mathematik. In der Abbildung 1-2 sind die REAL auf der reellen Zahlenachse Dargestellt. Overflowbereich max 0 +max Overflowbereich Underflowbereich Abbildung 1-2: Die REALs auf der reellen Zahlenachse Bemerkung 1.3 [Under- und Overflow] Das Intervall der reellen Zahlen, das durch die REAL-Zahl 0 repräsentiert wird, heisst Underflow-Bereich. Fällt das Resultat einer Operation in diesen Bereich, spricht man von Underflow. Underflow ist für numerische Berechnungen gleich fatal wie Overflow Endliche Arithmetik Im Beispiel 1.2 haben wir gesehen, dass die reellen Zahlen als floating point-zahlen dargestellt werden. Zahl = V orzeichen (2 (Exponent 127) 1.Mantisse) Diese Darstellung der reellen Zahlen nennt man eine endliche Arithmetik. Nachfolgend werden wir die reellen Zahlen mit R und die Menge der Zahlen einer endlichen Arithmetik mit M (M steht für Maschinenzahlen bezeichnen. Nachfolgend sind einige Eigenschaften einer endlichen Arithmetik aufgeführt. 1. Die Wertemenge M des Datentyps REAL ist eine Untermenge der reellen Zahlenmenge R. M R 2. Jeder Zahl x R ist eindeutig ein x M zugeordnet, welches als Repräsentant von x bezeichnet wird. 1-5

8 3. Jedes x M repräsentiert alle Zahlen in einem Intervall um x. Die Grösse des Intervalls ist von der Anzahl signifikanter Stellen (Mantisse) und der Grösse der Zahl selbst abhängig. Aus der Darstellung von floating point-zahlen ergibt sich, dass die Anzahl Repräsentanten von reellen Zahlen in M mit wachsendem x exponentiell abnimmt (siehe Abbildung 1-2). 4. Die reellen Zahlen 0 und 1 können in M exakt dargestellt werden. Es gilt: 0 = 0 und 1 = 1 5. Das Intervall der reellen Zahlen, das durch die REAL-Zahl 0 repräsentiert wird heisst Underflow-Bereich 6. Sind x, y M, dann ist das Resultat der Addition im Allgemeinen nicht mehr in M. Dies gilt auch für die anderen arithmetischen Operatoren (,, /). Damit das Resultat wieder in M zu liegen kommt, muss nach jeder Operation das Resultat auf die gegebene Anzahl Stellen der Mantisse gerundet werden. Aus diesem Grund gelten in einer endlichen Arithmetik nicht alle bekannten Gesetze der gewöhnlichen Arithmetik. Das Assoziativgesetz der Addition gilt in einer endlichen Arithmetik im allgemeinen nicht: (x + y) + z x + (y + z) Ein Zahlenbeispiel, welches das Gesetz verletzt, sei an einer vierstelligen (dezimalen) Arithmetik aufgezeigt. Intern wird mit 5 Stellen gerechnet und nach jeder Operation das Resultat auf 4 Stellen gerundet. x = y = z = (x + y) + z = ( = {{ gerundet=9.100 {{ gerundet=9.100 x + (y + z) = ( ) = {{ gerundet= {{ gerundet=9.101 Das Distributivgesetz gilt in einer endlichen Arithmetik im allgemeinen nicht: x (y + z) (x y) + (x z) Wir illustrieren dies wieder an einem Zahlenbeispiel. x = y = z = x (y + z) = ( ) = {{ gerundet=3.000 {{ gerundet=

9 (x y) + (x z) = ( ) {{ + ( ) {{ gerundet= gerundet=6.000 {{ gerundet=6.001 = Absoluter und relativer Fehler Wir haben schon gesehen, dass nach jeder Operation in M das Resultat auf die Anzahl Stellen der Mantisse gerundet werden muss. Es entsteht also ein Rundungsfehler. Unsere Resultate sind immer nur Approximationen des exakten Resultats. Definition 1.3 [Fehler] Sei x eine Approximation der Zahl x so definieren wir den absoluten Fehler als und den relativen Fehler als x x x x x Beim Rechnen interessiert uns vor allem der relative Fehler Numerische Auslöschung Die numerische Auslöschung ist ein spezieller Rundungsfehler, der auftritt, wenn zwei nahezu gleichgrosse Zahlen voneinander subtrahiert werden. Wir betrachten dazu die folgende Operation = Die Nullen nach dem Dezimalpunkt im Resultat sind nur richtig, wenn die beiden Operanden exakte Zahlen waren. Waren die Operanden schon durch einen Rundungsfehler verfälscht, so ist das exakte Resultat der Operation 1.xxxx 10 4 wobei die mit xxxx bezeichneten Stellen nicht bekannt sind. Das heisst, der absolute Fehler liegt im Bereich 10 5 und der relative Fehler ist im Bereich 10 5 /10 4 = Der relative Fehler der Ausgangsdaten liegt aber im Bereich 10 5 / Mit anderen Worten der relative Fehler wird durch die Subtraktion von zwei fast gleich grossen Zahlen massiv vergrössert Numerische Stabilität Ein stabiler Algorithmus ist ein Algorithmus, der auch in endlicher Arthmetik richtig läuft. Unter richtig meint man dabei, dass die Rundungsfehler den Ablauf nicht zu sehr stören. Die folgende Definition von Stabilität stammt von Wilkinson: Definition 1.4 [Stabilität] Bei stabilen Algorithmen ist das vom Computer berechnete (durch Rundungsfehler verfälschte) Resultat, das exakte Resultat von leicht geänderten Anfangsdaten. 1-7

10 Beispiel 1.5 [Stabilität] Wenn man zur Auflösung von quadratischen Gleichungen der Form die übliche Formel x 2 + px + q = 0 x 1,2 = p 2 ± (p ) 2 q 2 verwendet und p q ist, wird die kleinere der beiden Lösungen ungenau berechnet, weil sie numerischer Auslöschung unterworfen ist. Es gilt dann (p 2) 2 q p 2 und daher werden in der Formel zwei fast gleich grosse Zahlen voneinander subtrahiert. Wir betrachten das folgende Zahlenbeispiel. x x + 1 = 0 Mit einer 7-Stelligen Arithmetik erhalten wir nach obiger Formel das Resultat: Dies ist aber das Resultat der Gleichung x 1 = 10 8 und x 2 = 0 x x = 0 Der relative Fehler von x 1 ist gering (Grössenordnung 10 9 ) das Resultat x 2 ist hingegen wegen numerischer Auslöschung Falsch. Dieser Algorithmus ist also im allgemeinen numerisch nicht stabil. Wir können eine bessere Lösung erhalten, wenn wir die folgende Formel zur Berechnung der betragsmässig kleineren Lösung verwenden. Falls eine Lösung der Gleichung bekannt ist, kann die zweite Lösung mit der Formel x 2 = q x 1 berechnet werden. Mit dieser Formel erhalten wir für x 2 nicht mehr 0 sondern x 2 = 1 x 1 = = 10 8 Wird diese neue Formel angewendet, so ist die Berechnung in jedem Fall numerisch stabil. 1-8

11 Kondition Stabile Algorithmen nützen nichts, wenn ein Problem schlecht konditioniert ist. Definition 1.5 [Schlecht konditioniert] Ein Problem ist schlecht konditioniert (ill posed problem), wenn die Lösung sich stark ändert, wenn man die Anfangsdaten wenig stört. In den Naturwissenschaften sind die Ausgangsdaten von Berechnungen meistens Messdaten. Messdaten sind aber immer ungenau. Ist das zu lösende Problem nun schlecht konditioniert, so wird das Resultat sehr häufig falsch sein. Beispiel 1.6 [Schlecht konditioniert] Das Polynom P(x) = (x 1) 3 = x 3 3x 2 + 3x 1 hat die dreifache Nullstelle x 1 = x 2 = x 3 = 1. Das P benachbarte Polynom hat die Nullstellen Q(x) = x x 2 + 3x x 1 = 1, x und x Die Koeffizienten von P wurden um 10 6 gestört, was die Nullstellen um 10 3 veränderte. Die Störung wurde damit 1000 mal verstärkt. Das Polynom P ist schlecht konditioniert Logische Werte (BOOLEAN) Ein Objekt dieses Typs kann nur die Werte TRUE (wahr) und FALSE (falsch) annehmen. Als Operationen sind die Konjunktion (AND), die Disjunktion (OR) und die Negation (NOT) zugelassen. Man beachte, dass die Vergleichsoperatoren in vielen Sprachen ein Resultat vom Typ BOO- LEAN liefern. Somit kann das Resultat eines Vergleichs einer Variablen des Typs BOOLEAN zugewiesen werden. In der Sprache Java etwa ist die folgende Zuweisung völlig korrekt. boolean Bool = (10 >= 8); Text (CHAR) )Dieser Typ bezeichnet eine Menge von Schriftzeichen (zum Beispiel die ASCII-Zeichen. Von dieser Menge werden folgende Eigenschaften verlangt: Die Menge muss mindestens die grossen und kleinen lateinischen Buchstaben, die 10 arabischen Ziffern, ein Leerzeichen sowie alle Satzzeichen enthalten. Auf der Menge existiert eine totale Ordnung. Bezüglich dieser Ordnung müssen die Teilmengen der Buchstaben und der Ziffern je zusammenhängend und wie üblich geordnet sein. Das heisst, es gilt: A < B < C < Z a < b < c < z 0 < 1 < 2 < 9 1-9

12 Die beiden Funktionen ord und char müssen zur Verfügung stehen. Mit N bezeichnen wir die Anzahl Elemente im gegebenen Zeichensatz. ord : CHAR {0, 1,..., N 1 char : {0, 1,..., N 1 CHAR Für die beiden Funktionen ord und char gelten die folgenden Regeln: x, y CHAR; i {0, 1,..., N x y ord(x) ord(y) x < y ord(x) < ord(y) ord(char(i)) = i char(ord(x)) = x 1.4 Abgeleitete Typen Da ein Datentyp aus einer Wertemenge und dazugehörenden Operationen besteht, können aus bestehenden Datentypen mit Hilfe von Mengenoperationen neue Datentypen generiert werden. Die wichtigsten Mengenoperationen sind die Teilmengenbildung, das Kartesische Produkt und die Bildung der Potenzmenge. Bei der Teilmengenbildung spricht man von Unterbereichstypen oder von Subtypen, beim Kartesischen Produkt und der Potenzmenge von strukturierten Typen. In einigen sprachen kann man auch Funktionsräume als Datentypen definieren. Die Konstanten eines solchen Typs sind dann Funktionen mit einer gegebenen Signatur Unterbereichstypen In vielen Fällen nimmt ein Objekt Werte eines bestimmten Typs nur innerhalb eines gewissen Intervalls an. Für solche Objekte kann ein Unterbereichstyp mit der Angabe der Intervallgrenzen angegeben werden. Dies bedingt natürlich, dass auf dem Obertyp eine totale Ordnung definiert ist. In der Sprache Pascal etwa kann ein Unterbereichstyp folgendermassen definiert werden: TYPE T = min..max Dabei sind min und max Konstanten vom Typ INTEGER oder CHAR. Beispiel 1.7 [Unterbereichstypen] TYPE Grossbuchstabe = A..Z TYPE Ziffer = 0..9 TYPE Kleinezahl = Die Wertemenge eines Unterbereichstypsist nach Definition eine Teilmenge der Wertemenge des Obertyps. Daher sind alle Operatoren, die auf dem Obertyp anwendbar sind auch auf dem Unterbereichstyp anwendbar. Es gilt dabei zu beachten, dass die Resultate der Operationen bezüglich des Unterbereichstyps im allgemeinen nicht abgeschlossen sind. 1-10

13 1.4.2 Subtypen Wir wollen das Konzept des Unterbereichstyps verallgemeinern. Bis jetzt haben wir nur Intervalle eines total geordneten Obertyps zugelassen. Wir können aber auch beliebige Untermengen der Wertemenge eines Obertyps als Datentyp zulassen. Beispiel 1.8 [Subtyp] Wir betrachten als Beispiel den Obertyp CHadr. Die Wertemenge des Typs sind alle existierenden Adressen in der Schweiz. Der Operator PLZ sei auf CHadr definiert und liefert als Resultat die Postleitzahl des Ortes. Wir können nun den neuen Subtyp BEadr folgendermassen definieren: BEadr = {x CHadr PLZ(x) 3000 PLZ(x) 3999 Es ist sofort ersichtlich, dass alle Objekte des Subtyps auch Objekte des Obertyps sind, aber natürlich nicht umgekehrt. Objekte eines so definierten Subtyps sind mit Objekten ihres Obertyps zuweisungskompatibel. Die Operationen, die auf dem Obertyp definiert sind, können auf die Wertemenge des Untertyps eingeschränkt und somit auf diesen wieder angewandt werden. (Achtung: Das Resultat einer Operation angewendet auf zwei Elemente des Subtyps kann aus dem eingeschränkten Wertebreich herausführen) Die Struktur Array Der strukturierte Typ Array wird aus zwei gegebenen Datentypen, dem Grundtyp (GT) und dem Indextyp (ID) konstruiert. Der Grundtyp ist ein beliebiger atomarer oder abgeleiteter Datentyp. Der Indextyp ist ein Unterbereichstyp (Intervall) des Typs INTEGER. Die Wertemenge eines Arrays des Grundtyps GT und des Indextyps ID kann nun folgendermassen definiert werden. Dabei bezeichnen wir mit ID die Anzahl Elemente des Indextyps. Array gtid = GT ID Die Wertemenge des definierten Datentyps besteht aus allen (geordneten) ID -Tupeln von Elementen des Grundtyps. Bei der Definition des Datentyps Array muss sowohl der Grundtyp wie auch der Indextyp angegeben werden. In der Sprache C wird der Datentyp Array folgendermassen definiert: typedef GT MyArray[max]; max ist eine INTEGER Konstante und bestimmt die Anzahl Elemente des Arrays. Der Indextyp ist das Intervall 0..(max-1) der Integerzahlen. Beispiel 1.9 [Array] Definition eines Arrays des Grundtyp REAL und des Indextyps typedef double Myarray[10] Elemente der Wertemenge des definierten Datentyps MyArray sind 10-Tupel von REAL- Zahlen. Das Tupel (1.0, 2.37, 0.5, 22.1, 300.0, 55.2, 18.0, 31.33, 2.5, 1.0) 1-11

14 ist ein möglicher Wert für Objekte des Datentyps MyArray. Auf Arrays ist die Operation Selektor definiert, die es erlaubt, ein einzelnes Element des Arrays zu lesen oder zu schreiben. Das i-te Element des Arrays A wird mit A[i] bezeichnet und repräsentiert ein Objekt des Grundtyps des Arrays, das gelesen oder geschrieben werden kann. x = A[7] + 10; /* Lesen der 7. Komponente des Arrays A */ A[3] = 27; /* Schreiben der 3. Komponente des Arrays A */ Bemerkung 1.4 [Gleichheit von Arrays] Zwei Arrays A und B vom gleichen Grundtyp und vom gleichen Indextyp werden nur dann als gleich bezeichnet, wenn alle Komponenten den gleichen Wert besitzen: A = B A[i] = B[i] i ID Wird der Wert einer Komponente eines Arrays A verändert, so gilt der ganze Array A als verändert. Was den Array besonders auszeichnet, ist die Verwendung von berechenbaren Grössen als Index. Der Zugriff auf eine Komponente kann zur Laufzeit berechnet werden. Dies birgt natürlich auch die Gefahr, dass ein Index ausserhalb des Indexbereichs zu liegen kommt, was einen Programmabsturz zur Folge haben kann. Als Beispiel für das Rechnen mit dem Index wollen wir das binäre Suchen betrachten. Algorithmus 1.1 [Binäres Suchen] Das binäre Suchen kann angewendet werden, um in einem sortierten Array (A[0] A[1] A[n]) ein Element schnell zu finden. Die Idee ist einfach. Es wird getestet, ob der Wert des mittleren Elements gleich dem gesuchten Wert ist. Sind die Werte gleich, kann die Suche abgebrochen werden. Ist der gesuchte Wert kleiner als der Wert des mittleren Elements, wird im linken Teil des Arrays nach der gleichen Methode weitergesucht, sonst im rechten Teil des Arrays. static int binsearch(int[] a, int such) { int left = 0, right = a.length - 1, mid = 0; boolean found = false; while (right >= left && found == false) { //Testen des mittleren Elementes mid = (left + right) / 2; if (a[mid] == such) found = true; else if (a[mid] < such) //Das Element muss rechts der Mitte liegen. left = mid + 1; else // Das Element muss links der Mitte liegen. right = mid - 1; return (found)? mid : -1; 1-12

15 Die maximale Anzahl Vergleiche, die nötig sind, um ein Element im Array zu finden, ist log 2 (max). Dies ist klar, da bei jedem Vergleich die Hälfte der restlichen Elemente ausgeschlossen werden Allgemeine Struktur Die allgemeinste Methode, einen strukturierten Datentyp zu definieren, besteht darin, Elemente von beliebigen Typen zu einer Einheit zusammenzufassen. Ein solcher Typ ist formal gesprochen das kartesische Produkt von beliebigen Datentypen. Structur = DT 1 DT 2 DT 3 DT n Die Datentypen DT 1... DT n können selbst wieder strukturierte Typen sein. In der Sprache Pascal heissen solche Strukturen Record, in der Sprache C werden sie als struct bezeichnet. In der Spache C kann ein solcher Typ folgendermassen definiert werden: typedef struct { DT1 Name_1; DT2 Name_2; DT3 Name_3;.. DTn Name_n; MyStruct; Beispiel 1.10 [Datum] Definition eines Datentyps für das Datum. Der Typ könnte auch als Array of INTEGER mit drei Elementen deklariert werden. Die Form der Struktur ist aber sprechender. Der Ausdruck Tagesdatum.Tag für den Zugriff auf den Tag ist viel klarer als der entsprechende Zugriff Tagesdatum[0] in einem Array. typedef struct { int Tag; int Monat; int Jahr; Datum; Das nächste Beispiel zeigt, dass auch strukturierte Datentypen (Arrays oder Strukturen), als Datentyp der Komponenten einer Struktur zugelassen sind. 1-13

16 Beispiel 1.11 [Person] Wir wollen einen Datentyp Person definieren. Bei dieser Definition benutzen wir den Datentyp Datum aus dem vorhergehenden Beispiel. typedef struct { char Name[30]; char Vorname[20]; Datum Geburtsdatum; char Beruf[30]; double Gehalt; Person; Eine Konstante des Datentyps Person ist ein geordnetes Tupel von Werten der einzelnen Komponenten der Struktur Person. ("Grubauer", "Peter", (1,7,1958), "Koch", ) Beim Beispiel steht "Grubauer" als Abkürzung für das Tupel ( G, r, u, b, a, u, e, r,,,... ). Beim Datentyp struct wird nicht mehr über einen Index auf die einzelnen Komponenten zugegriffen, sondern über festgelegte Namen. Will man auf das Gehalt vom Objekt Hans des Typs Person zugreifen, so steht der Selektor. zur Verfügung. Hans.Gehalt Selektoren können natürlich auch kombiniert werden, wie die zwei nächsten Beispiele zeigen: Hans.Geburtsdatum.Tag Hans.Name[0] Zugriff auf den Tag des Geburtsdatums. Zugriff auf den ersten Buchstaben des Namens. 1.5 Weitere Datenstrukturen Die bisher betrachteten Datenstrukturen sind Bestandteil der meisten Programmiersprachen. Die folgenden Datenstrukturen werden im allgemeinen nicht angeboten und müssen zum Beispiel als Java-Klassen implementiert werden Die Struktur lineare Liste Wie der Array besteht eine lineare Liste aus lauter Elementen vom gleichen Datentyp, dem Grundtyp GT. Anders als beim Array ist die Anzahl Elemente der linearen Liste nicht konstant. Es existieren die Operationen Einfügen eines neuen Elements und Löschen eines Elements. Die möglichen Werte einer linearen Liste sind also alle i-tupel von Elementen vom Grundtyp mit i = 0, 1, 2,... Formal kann die Wertemenge der Struktur Liste folgendermassen definiert werden: Liste GT = GT i i=0 Aus dieser Definition können wir einige Eigenschaften von linearen Listen ableiten. 1-14

17 Da wir i = 0 zulassen, ist eine leere Struktur auch ein legaler Wert für Listen. Die Werte einer Liste sind als geordnete Tupel definiert. Daher können wir vom ersten und letzten Element der Liste sprechen und allgemein vom n-ten Element. Wir können auch vom Vorgänger und vom Nachfolger eines Elements sprechen. Die wichtigsten Operationen auf Listen sind: Schreiben/Lesen des Wertes eines beliebigen Elements der Liste. Einfügen eines Elements an einer beliebigen Stelle in der Liste. Löschen eines beliebigen Elements der Liste. Bestimmen der Länge der Liste Repräsentation von Listen In den meisten klassischen Programmiersprachen wird die Struktur lineare Liste nicht angeboten und muss implementiert werden. Dazu bieten sich zwei Möglichkeiten: 1. Sequentielle Repräsentation: Alle Elemente der Liste werden in aufeinanderfolgenden Speicherplätzen abgelegt. Vorteil: Der Zugriff auf ein Element der Liste ist sehr schnell, da dessen Adresse berechnet werden kann. Nachteil Das Einfügen oder Löschen eines Elements der Liste ist langsam, da alle hinteren Elemente geschoben werden müssen. 2. Verkettete Repräsentation: Zu jedem Element der Liste wird zusätzlich die (physische) Adresse seines Nachfolgers gespeichert. Vorteil: Das Löschen und Einfügen eines Elements der Liste ist schnell, da nur der Zeiger des Vorgängers verändert werden muss. Nachteil: Der Zugriff auf ein beliebiges Element ist langsam, da alle Vorgängerelemente der Liste gelesen werden müssen Spezielle Listen: Stack und Queue Bei der Definition von Subtypen wird die Wertemenge eines Datentyps auf eine Untermenge eingeschränkt. Bei der Definition der beiden nächsten Typen wird nicht die Wertemenge eingeschränkt, sondern die Operationen auf dieser Menge. Beide Typen gehen vom Obertyp lineare Liste aus. 1-15

18 Der Stack Der Stack ist eine lineare Liste, bei der die Operationen Einfügen, Löschen und Lesen eines Elements nur auf das erste Element der Liste erlaubt sind (siehe Abbildung 1-3). Beim Stack haben sich die Namen push und pop für das Einfügen bzw. Löschen eines Elements eingebürgert. Der Stack wird häufig als LiFo-Struktur bezeichnet (LiFo = Last-in-First-out). Mit anderen Worten, das letzte Element, das eingefügt wird, wird als erstes wieder entfernt. Dank dieser Eigenschaft eignet sich der Stack sehr gut für die Bearbeitung von verschachtelten Strukturen (Prozeduraufrufe, arithmetische Ausdrücke usw.). Sami Paul Peter Hans Fritz push(sami) Sami Paul Peter Hans Fritz pop() Paul Peter Hans Fritz Abbildung 1-3: Die Struktur Stack Die Queue Die Queue ist eine lineare Liste, bei der die Operationen Lesen und Löschen eines Elementes nur auf das erste Element der Liste erlaubt sind. Das Einfügen eines neuen Elementes darf nur nach dem letzten Element der Liste erfolgen (Siehe Abbildung 1-4). Paul Peter Hans Fritz write(sami) Sami Paul Peter Hans Fritz read() Sami Paul Peter Hans Fritz Abbildung 1-4: Die Struktur Queue Die Queue wird häufig als FiFo-Struktur bezeichnet (FiFo = First-in-First-out). Mit anderen Worten, das Element, das zuerst eingetragen wird, wird auch als erstes wieder gelöscht. Eine Anwendung für die Queue sind Druckerwarteschlangen Der Baum Eine weitere wichtige Datenstruktur, die wir in diesem Abschnitt behandeln wollen, ist der Baum. Im Gegensatz zu eindimensionalen Strukturen wie der Liste oder dem Array ist der Baum dem Wesen nach eine zweidimensionale, verkettete Struktur. 1-16

19 Definition 1.6 [Baum] Ein Baum ist entweder 1. die leere Menge (leerer Baum) oder 2. eine endliche, nichtleere Menge von Elementen, wovon ein Element Wurzel (engl. root) genannt wird und die restlichen Elemente in m 0 disjunkte Teilmengen eingeteilt sind, wobei jede wieder ein Baum ist (Unterbäume). Im allgemeinen werden Bäume als Graphen dargestellt. Dabei wird die Wurzel durch m Kanten (engl. edges) mit den Wurzeln der m Unterbäume verbunden (siehe Abbildung 1-5). Wurzel A Unterbaum Geschwister B C D Hoehe E F G H I Innere Knoten J Blaetter Abbildung 1-5: Allgemeine Baumstruktur als Graph Nachfolgend noch einige wichtige Begriffe: Die Elemente eines Baumes heissen Knoten (engl. vertices oder nodes). Die Wurzel eines Baumes (oder Unterbaumes) wird oft als Vater (engl. father, parent), ein direkt nachfolgender Knoten als Sohn (engl. son, child) bezeichnet. Oft werden auch die Begriffe Vorgänger (engl. predecessor) und Nachfolger (engl. successor) verwendet. Knoten mit Nachfolger heissen innere Knoten (engl. internal nodes). Knoten ohne Nachfolger heissen Blätter (engl. leaves), äussere Knoten (engl. external node) oder Endknoten (engl. terminal nodes). Die direkten Nachfolger eines Knotens heissen Brüder (engl. brothers) oder Geschwister (engl. siblings). Das Niveau (engl. level) eines Knotens ist folgendermassen definiert: level(root) := 0 level(x) := level(f ather(x))

20 Die Tiefe (engl. depth) oder Höhe (engl. height) eines Baumes ist definiert als: depth(b) := max x b (level(x)) Der Grad (engl. degree) eines Knotens ist gleich der Anzahl Nachfolger dieses Knotens. Der Grad des Baumes ist definiert als: degree(b) := max x b (degree(x)) Eine Menge von Bäumen heisst Wald (engl. forest). Ein geordneter Baum (engl. ordered tree) ist ein Baum, bei dem die Reihenfolge der direkten Nachfolger eines Knotens angegeben ist Binäre Bäume Ein wichtiger Speziallfall von Bäumen sind die sogenannten binären Bäume. Definition 1.7 [Binäre Bäume] 1. Ein binärer Baum (engl. binary tree) ist ein geordneter Baum vom Grad Ein streng binärer Baum (engl. strictly binary tree) ist ein binärer Baum und alle inneren Knoten haben den Grad Ein vollständiger binärer Baum (engl. complete binary tree) ist ein streng binärer Baum und alle Blätter haben das gleiche Niveau. 4. Ein fast vollständiger binärer Baum (engl. allmost complete binary tree) ist ein vollständiger binärer Baum wobei ganz rechts auf der untersten Stufe des Baumes Knoten fehlen dürfen. Die verschiedenen Begriffe aus der Definition 1.7 sind in der Abbildung 1-6 dargestellt. 1 Binaerer Baum 2 Streng binaerer Baum 3 Vollstaendiger binaerer Baum 4 Fast vollstaendiger binaerer Baum Abbildung 1-6: Die verschiedenen binären Bäume Bemerkung 1.5 [Binärbaum ist geordnet] Da wir den binären Baum als geordneten Baum definiert haben, können wir bei jedem Knoten vom linken und vom rechten Unterbaum des Knotens sprechen. 1-18

21 Darstellung von Bäumen Ganz allgemein ist ein Baum durch die Struktur der Knoten definiert. Jeder Knoten enthält beliebige Nutzdaten und eine Menge (bei geordneten Bäumen eine Liste) von Zeigern auf die betreffenden Unterbäume. Wie bei doppelt verketteten Listen kann auch noch ein Zeiger auf den Vorgänger geführt werden, damit kann der Baum auch von Unten nach Oben durchlaufen werden. Nachfolgend ist eine mögliche Definition für den allgemeinen Baum in der Sprache Java. public class TreeNode<Element> { Element info; TreeNode<Element> father; List<TreeNode<Element>> sons; Beim Kreieren eines Knotens muss natürlich die Liste sons für die Nachfolger auch kreiert werden. Bemerkung 1.6 [Keine Kreise] Beachten Sie, dass nach Definition des Baumes (siehe Definition 1.6) kein Knoten auf einen direkten oder indirekten Vorgänger zeigen darf. Diese Eigenschaft muss durch die insert Operation des Datentyps Baum garantiert werden Darstellung von binären Bäumen Bei binären Bäumen kennt man die maximale Anzahl Nachfolger eines Knotens zum Vornherein. Das heisst, ein Knoten enthält beliebige Nutzdaten, sowie einen linken und rechten Zeiger auf die Unterbäume. public class BinTreeNode<Element> { Element info; TreeNode<Element> father; TreeNode<Element> left; TreeNode<Element> rigth; Die angegebene Struktur kann nicht nur für binäre Bäume verwendet werden, sondern auch zur Darstellung von allgemeinen Bäumen. Dabei muss nur die Interpretation der beiden Zeiger left und right geändert werden. Im Zeiger left wird der erste Nachfolger des entsprechenden Knotens gespeichert und im Zeiger right das nächste Geschwister des Knotens. Die Situation ist in der Abbildung 1-7 dargestellt. 1-19

22 A A B C D B C D E F G H I E F G H I J J Abbildung 1-7: Darstellung eines allgemeinen Baumes als binärer Baum Rekursion und traversieren von Bäumen Wir haben bis jetzt nicht beschrieben, wie Bäume traversiert werden (traversieren = besuchen aller Knoten des Baumes). In diesem Abschnitt wollen wir nun dies nachholen. Zu diesem Zweck führen wir zuerst die Rekursion ein. Eine Prozedur (oder Funktion) heisst rekursiv, falls sie sich direkt oder indirekt selbst aufruft. Viele Probleme lassen sich rekursiv einfacher und klarer lösen als ohne Rekursion. Rekursion ist eine häufige Design-Methode für Algorithmen. Achtung Bei einer rekursiven Prozedur sind die folgenden Punkte besonders zu beachten. Die Rekursion darf nicht unendlich sein. Das heisst, es muss in der Prozedur ein Instruktionszweig existieren, der keinen Aufruf der Prozedur enthält. Diesen Teil der Prozedur nennt man den Rekursionsgrund. Bei indirekter Rekursion (Prozedur A ruft Prozedur B auf und B ruft wieder A auf) ist besondere Vorsicht geboten. Es muss sichergestellt sein, dass die Anzahl der hintereinander ausgeführten rekursiven Aufrufen (Rekursionstiefe) vernünftig bleibt, da sonst zu viel Speicher verwendet wird. Wenn beim Sortieren von n Elementen n rekursive Aufrufe der Prozedur nötig sind, ist dies sicher nicht mehr vernünftig. Beim Sortieren wäre eine Anzahl log 2 (n) vernünftig. Rekursion soll nur dann angewandt werden, wenn die Formulierung der Lösung dadurch klarer und kürzer wird. Auch darf der Aufwand der rekursiven Lösung in der Ordnung nicht grösser werden als der Aufwand der iterativen Lösung. Insbesondere kann die Rekursion sehr leicht eliminiert werden, wenn die Prozedur nur einen rekursiven Aufruf enthält und dieser Aufruf die letzte Instruktion der Prozedur ist. Als erstes wollen wir ein schlechtes Beispiel für die Rekursion angeben Berechnen der Fakultät einer Zahl Die Fakultät einer Zahl n! wird in der Mathematik rekursiv definiert. Daher wird in der Informatik häufig dieses Beispiel für die Rekursion gewählt. n! ist für n N folgendermassen definiert: 1-20

23 0! = 1 n! = n (n 1)! für n > 0 Diese Definition kann direkt in dieser Form implementiert werden. Wir erhalten die folgende rekursive Prozedur: Algorithmus 1.2 [Rekursive Berechnung der Fakultät] static long int fac(long int n) { if (n == 0) return 1; else return (n * fac(n - 1)); Dies ist ein schlechtes Beispiel für die Rekursion. Die Funktion wird nur einmal rekursiv aufgerufen und der Aufruf ist die letzte Instruktion der Routine. Wir können die Rekursion sehr einfach durch eine Schleife ersetzen. Diesen Vorgang nennt man End-Recursion Removal. Nachstehend die iterative Lösung zur Berechnung der Fakultät. Algorithmus 1.3 [Iterative Berechnung der Fakultät] static long int fac(long int n) { long result = 1; for (long i = 1; i <= n; i++) result *= i; return result; Traversieren eines binären Baumes Da die Baumstruktur rekursiv definiert ist, liegt es natürlich nahe, die Traversierung eines Baumes rekursiv zu implementieren. Um diese Aufgabe zu lösen betrachten wir die folgenden drei Ansätze: Preorder Traversierung 1. Behandle die Wurzel des Baumes 2. Traversiere den linken Unterbaum in preorder 3. Traversiere den rechten Unterbaum in preorder Postorder Traversierung 1. Traversiere den linken Unterbaum in postorder 2. Traversiere den rechten Unterbaum in postorder 3. Behandle die Wurzel des Baumes 1-21

24 Inorder Traversierung 1. Traversiere den linken Unterbaum in inorder 2. Behandle die Wurzel des Baumes 3. Traversiere den rechten Unterbaum in inorder Algorithmus 1.4 [Inorder Traversierung eines binären Baumes] Der folgende Algorithmus traversiert einen binären Baum in inorder. void inordertraverse(bintreenode bt) { // Rekursionsgrund falls der angegebene Knoten null ist if (bt!= null) { // Rekursiver Aufruf fuer den linken Unterbaum InorderTraverse(bt.left); // ausgeben der Wurzel System.out.println(bt.info); // Rekursiver Aufruf fuer den rechten Unterbaum InorderTraverse(bt.right); Bemerkung 1.7 [Sinnvolle Rekursion] Im Gegensatz zur Berechnung der Fakultät einer Zahl ist der Einsatz der Rekursion bei der Traversierung von Bäumen sinnvoll. Für die iterative Implementation ist ein Stack notwendig. Die iterative Implementation ist auch weniger gut verständlich als die rekursive (siehe??). Nachfolgend noch ein Beispiel zur Baumtraversierung: Beispiel 1.12 [Baumtraversierung] 7 / + c d e a b Abbildung 1-8: Syntaxbaum für den Ausdruck ((a + b) c d/e) 7 Zu jedem arithmetischen Ausdruck gehört ein sogenannter Syntaxbaum. Der Baum wird so aufgebaut, dass in den inneren Knoten des Baumes immer ein Operator (+,,, /) steht. 1-22

25 Im linken Unterbaum steht der 1. Operand im rechten Unterbaum der linke Operand des Operators. In der Abbildung 1-8 ist der Syntaxbaum für den Ausdruck angegeben. ((a + b) c d/e) 7 Traversieren wir den Baum in Preorder, so erhalten wir die folgende Reihenfolge für den Besuch der einzelnen Knoten: + a b c / d e 7 (Polnische Notation) Traversieren wir den Baum in Postorder, so erhalten wir die folgende Reihenfolge für den Besuch der einzelnen Knoten: a b + c d e / 7 (Umgekehrte polnische Notation) Traversieren wir den Baum in Inorder, so erhalten wir die folgende Reihenfolge für den Besuch der einzelnen Knoten: a + b c d / e 7 (Infix Notation ohne Klammern) 1.6 Der Abstrakte Datentyp Definition Der abstrakte Datentyp (abgekürzt ADT) ist eines der wichtigsten Konzepte in der modernen Informatik. Die Philosophie der objektorientierten Sprachen basiert auf diesem Konzept. Der ADT dient dazu, Datentypen (Datenstrukturen) unabhängig von deren Implementation zu definieren. Beispiele solcher Datentypen sind Listen, Stacks und Queues. Neben diesen eher programmiertechnischen Strukturen können aber auch konkrete Objekte der Welt wie Motoren, Schrauben, Maschinen, Personaldaten u.s.w. mit Hilfe von abstrakten Datentypen modeliert werden. Die Idee des ADTs beruht auf zwei wichtigen Prinzipien: Das Geheimnisprinzip und das Prinzip der Wiederverwendbarkeit Das Geheimnisprinzip Das Geheimnisprinzip kann folgendermassen formuliert werden: Definition 1.8 [Geheimnisprinzip] Dem Benutzer eines Datentyps (Moduls) werden nur die auf diesem Datentyp erlaubten Operationen bekanntgegeben. Die Implementation des Datentyps bleibt für den Benutzer verborgen (abstrakt). Die Anwendung dieses Prinzips bringt folgende Vorteile: Der Anwender kann den Datentyp nur im Sinne der Definition verwenden. Er hat keine Möglichkeit, Eigenschaften einer speziellen Implementation auszunutzen. Die Implementation eines Datentyps kann jederzeit verändert werden, ohne dass die Benutzer des Datentyps davon betroffen sind. Die Verantwortung zwischen dem Anwender und dem Implementator des Datentyps sind durch die Interface-Definitionen klar geregelt. Die Suche nach Fehlern wird dadurch erheblich vereinfacht. 1-23

26 Wiederverwendbarkeit Dieses Prinzip kann wie folgt formuliert werden: Definition 1.9 [Wiederverwendbarkeit] Ein Datentyp (Modul) soll in verschiedenen Applikationen wiederverwendbar sein, wenn ähnliche Probleme gelöst werden müssen. Die Idee hinter diesem Prinzip ist klar. Es geht darum, die Entwicklungszeit von Systemen zu reduzieren. Das Ziel ist, Softwaresysteme wie Hardwaresysteme zu bauen. Das heisst, die einzelnen Komponenten eines Systems werden eingekauft, eventuell parametrisiert und zum Gesamtsystem verbunden Formale Spezifikation von ADTs Die Spezifikation eines Datentyps muss vollständig, präzise und eindeutig sein. Weiter wollen wir keine Beschreibung, die auf der konkreten Implemenation des Datentyps basiert, obwohl diese die geforderten Kriterien erfüllt. Eine Beschreibung, die auf der Implementation basiert, führt zu einer Überspezifikation des Datentyps. Beispiel 1.13 [Der Stack als ADT] Wir können den Datentyp Stack als Array mit einem zusätzlichen Zeiger auf das aktuelle oberste Element des Stacks implementieren. Nachstehend ist die Implementation der Struktur und der Prozedur push in der Sprache C angegeben. struct stack { int stack_pointer; DT stack_element[max]; /* DT steht fuer irgend einen Datentyp */ ; void push(stack st, DT x) { ++st.stack_pointer; st.stack_element[st.stack_pointer] = x; Wird nun der Datentyp Stack mit Hilfe dieser internen Struktur beschrieben, so ist der Datentyp überspezifiziert. Der Benutzer weiss, dass der Stack aus einem Array besteht und kann diese Tatsache ausnutzen, um auf beliebige Elemente des Arrays zuzugreifen. Ein solcher Zugriff widerspricht aber der Idee des Stacks. Der abstrakte Datentyp spezifiziert eine Datenstruktur nicht mit Hilfe der Implementation, sondern nur als eine Liste von Dienstleistungen, die der Datentyp dem Anwender zur Verfügung stellt. Die Eigenschaften der Dienstleistungen werden formal beschrieben. Die Dienstleistungen nennt man auch häufig Operationen, Funktionen oder Methoden. Beispiel 1.14 [Stack Spezifikation] Der abstrakte Datentyp Stack wird also als eine Menge von Funktionen wie Eintragen eines Elements (push), Entfernen eines Elements (pop), Lesen des obersten Elements (top) u.s.w. betrachtet. Eine solche Beschreibung berücksichtigt nicht, was ein Stack ist, sondern nur was ein Stack dem Anwender zu bieten hat. Für die formale Spezifikation des Datentyps übernehmen wir die Schreibweise von Bertrand Meyer meyer.88. Nach dieser Schreibweise besteht die Spezifikation aus vier Teilen. Nachstehend ist die Spezifikation eines Integerstacks als Beispiel angegeben. 1-24

27 TYPES StackOf Int FUNCTIONS new : empty : push : pop : top : StackOf Int StackOfInt BOOLEAN IN T EGER StackOf Int StackOf Int StackOfInt StackOfInt StackOfInt INTEGER PRECONDITIONS s StackOfInt : pre pop(s) = (empty(s)) pre top(s) = (empty(s)) AXIOMS i INTEGER; s StackOfInt : 1. empty(new) = T RU E 2. empty(push(i, s)) = F ALSE 3. top(push(i, s)) = i 4. pop(push(i, s)) = s Wir wollen nun die vier Teile der obigen Spezifikation des abstrakten Datentyps näher erläutern TYPES Der Abschnitt TYPES legt die Namen der Datentypen fest, die spezifiziert werden. In unserem Beispiel ist es nur einer, StackOf Int FUNCTIONS Der Abschnitt FUNCTIONS legt die Dienstleistungen fest, die auf den Objekten des Datentyps angeboten werden. Die Dienstleistungen werden als mathematische Konstanten und Funktionen spezifiziert. In unserem Beispiel sind dies new, empty, push, pop und top. Jede Zeile in diesem Abschnitt definiert die Signatur (d.h. Anzahl und Typ der Argumente und des Resultats). Eine Funtion f mit der Signatur f : A 1 A 2 A m B 1 B 2 B n 1-25

28 erwartet m Argumente mit den Typen a 1 A 1,..., a m A m und liefert n Resultate mit den Typen b 1 B 1,..., b n B n. Mindestens eine der Mengen A i oder B j muss gleich dem spezifizierten Typ sein, in unserem Beispiel also StackOfInt. In der Praxis haben die meisten Funktionen nur ein Resultat (das heisst, n = 1). Falls der Definitionsbereich leer ist, handelt es sich um den Namen einer Konstanten. In unserem Beispiel ist new die einzige Konstante. Funktionen mit einem einfachen Pfeil ( ) sind partielle Funktionen (normale Funktionen werden mit angegeben). D.h., sie sind nicht auf dem ganzen Definitionsbereich definiert. In unserem Beispiel sind die Funktionen pop und top solche partielle Funktionen (siehe PRE- CONDITIONS). Wir können die Funktionen eines abstrakten Datentyps T in zwei Kategorien einteilen: Accessoren sind Funktionen bei denen T nur im Definitionsbereich vorkommt. Solche Funktionen liefern Informationen über den aktuellen Wert eines Objekts des abstrakten Datentyps. In unserem Beispiel sind empty und top Accessor-Funktionen. Transformer sind Funktionen bei denen T sowohl im Definitionsbereich wie auch in der Wertemenge der Funktion vorkommt. Solche Funktionen bilden also einen Wert von T auf einen anderen Wert von T ab. In unserem Beispiel sind pop und push Transformer- Funktionen PRECONDITIONS Eine Operation kann nicht immer auf alle Werte des Definitionsbereich angewendet werden. Das berühmteste Beispiel ist die Division durch Null. Partielle Funktionen führen in der Programmierung oft zu Fehlern. Es ist daher wichtig, die Vorbedingungen für die Anwendung einer partiellen Funktion klar zu definieren. Dies ist das Ziel des Abschnitts Preconditions (Vorbedingungen). In unserem Beispiel steht die Precondition: pre pop(s) = (empty(s)) Auf der linken Seite steht der Name der partiellen Funktion, auf der rechten Seite die Vorbedingungen, die erfüllt sein müssen, damit die Funktion angewendet werden kann. Das obige Beispiel bedeutet, dass die Funktion pop auf einen leeren Stack nicht angewendet werden darf. Jede partielle Funktion aus dem Abschnitt Functions muss im Abschnitt Preconditions aufgeführt werden. In unserem Beispiel sind die Vorbedingungen für die Funktionen pop und top dieselben AXIOMS Bis jetzt passt die Beschreibung in unserem Beispiel nicht nur auf die Datenstruktur Stack. Jede Datenstruktur, die ähnliche Dienstleistungen wie der Stack anbietet, würde auch auf diese Beschreibung passen. Zum Beispiel eine Queue, eine lineare Liste u.s.w. Um wirklich die Spezifikation auf den Typ Stack einzuschränken, müssen wir die Semantik der Funktionen beschreiben. Das ist die Rolle der Axiome. Jedes der Axiome (oder eine Gruppe von Axiomen) beschreibt die Eigenschaften der vom Datentyp angebotenen Dienstleistungen. In unserem Beispiel beschreiben die Axiome empty(new) = TRUE 1-26

29 empty(push(i, s)) = FALSE die Eigenschaften der Funktion empty. Diese zwei Axiome sagen aus, dass die Konstante new der leere Stack ist und dass der Wert der Funktion push nie der leere Stack sein kann. Die Axiome top(push(i, s)) = i pop(push(i, s)) = s beschreiben die typische Last-in-First-out (LiFo) Eigenschaft des Stacks. Bemerkung 1.8 [Transformer Funktionen] In der Definition des ADTs sind in unserem Beispiel nur reine transformer Funktionen definiert. Das heisst, die Wertemenge ist gleich dem definierten ADT. Die Funktion pop könnte auch so definiert werden: pop : StackOf Int IN T EGER StackOf Int Die Funktion pop ist dann eine Mischung aus transformer- und accessor- Funktion. Sie verändert den Stack und gibt gleichzeitig das oberste Element zurück. Dies ist der klassische Fall einer Funktion mit Nebeneffekten. Solche Funktionen sind aber sehr häufig Fehler anfällig. Bertrand Meyer verlangt, dass die folgenden Prinzipien eingehalten werden: Eine transformer-funktion verändert den Zustand eines Objektes. Sie gibt keine weiteren Werte zurück. Eine accessor-funktion verändert den Zustand eines Objektes nie. Sie gibt nur Informationen über den Zustand des Objektes zurück. Wird eine accessor-funktion mehrmals hintereinander ausgeführt, so gibt sie immer denselben Wert zurück Spezifikation des ADTs in Java Die formale Spezifikation eines ADT ist eine sehr schwierige Aufgabe, die viel Wissen und Erfahrung erfordert. In vielen Fällen genügt aber eine weniger formale Beschreibung des ADT. Diese Beschreibung kann zum Beispiel in Form eines Java-Interfaces geschehen. Auch dort können wir mit Preconditions und Postconditions vorgehen. Es ist aber auch erlaubt, Teile der Spezifikationen als Kommentare in natürlicher Sprache zu schreiben. Dabei ist darauf zu achten, dass die Aussagen möglichst eindeutig sind. Beispiel 1.15 [Stack Spezifikation in java] Als Beispiel wollen wir auch wieder den Stack von Integers ansehen. Eine Java Interfacedefinition könnte folgendermassen aussehen: /** * Dieses Interface definiert die Schnittstelle zu einem Stack * von Integers. Die Implementation steht noch offen. */ public interface StackOfInt { /** Preconditions: none * Postconditions: none 1-27

Binäre Bäume Darstellung und Traversierung

Binäre Bäume Darstellung und Traversierung Binäre Bäume Darstellung und Traversierung Name Frank Bollwig Matrikel-Nr. 2770085 E-Mail fb641378@inf.tu-dresden.de Datum 15. November 2001 0. Vorbemerkungen... 3 1. Terminologie binärer Bäume... 4 2.

Mehr

Kapiteltests zum Leitprogramm Binäre Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume Kapiteltests zum Leitprogramm Binäre Suchbäume Björn Steffen Timur Erdag überarbeitet von Christina Class Binäre Suchbäume Kapiteltests für das ETH-Leitprogramm Adressaten und Institutionen Das Leitprogramm

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes. Binäre Bäume Definition: Ein binärer Baum T besteht aus einer Menge von Knoten, die durch eine Vater-Kind-Beziehung wie folgt strukturiert ist: 1. Es gibt genau einen hervorgehobenen Knoten r T, die Wurzel

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

368 4 Algorithmen und Datenstrukturen

368 4 Algorithmen und Datenstrukturen Kap04.fm Seite 368 Dienstag, 7. September 2010 1:51 13 368 4 Algorithmen und Datenstrukturen Java-Klassen Die ist die Klasse Object, ein Pfeil von Klasse A nach Klasse B bedeutet Bextends A, d.h. B ist

Mehr

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können. 6. Bäume Lernziele 6. Bäume Lernziele: Definition und Eigenschaften binärer Bäume kennen, Traversierungsalgorithmen für binäre Bäume implementieren können, die Bedeutung von Suchbäumen für die effiziente

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Datenstrukturen & Algorithmen

Datenstrukturen & Algorithmen Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010 Übersicht Binäre Suchbäume Einführung und Begriffe Binäre Suchbäume 2 Binäre Suchbäume Datenstruktur für dynamische Mengen

Mehr

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny Grundlagen der Informatik Prof. Dr. Stefan Enderle NTA Isny 2 Datenstrukturen 2.1 Einführung Syntax: Definition einer formalen Grammatik, um Regeln einer formalen Sprache (Programmiersprache) festzulegen.

Mehr

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10 Binäre Bäume Bäume gehören zu den wichtigsten Datenstrukturen in der Informatik. Sie repräsentieren z.b. die Struktur eines arithmetischen Terms oder die Struktur eines Buchs. Bäume beschreiben Organisationshierarchien

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder Programmieren in PASCAL Bäume 1 1. Baumstrukturen Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder 1. die leere Struktur oder 2. ein Knoten vom Typ Element

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dipl. Inform. Andreas Wilkens aw@awilkens.com Überblick Grundlagen Definitionen Elementare Datenstrukturen Rekursionen Bäume 2 1 Datenstruktur Baum Definition eines Baumes

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert Inhalt Einführung 1. Arrays 1. Array unsortiert 2. Array sortiert 3. Heap 2. Listen 1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert 3. Bäume

Mehr

Programmiersprachen und Übersetzer

Programmiersprachen und Übersetzer Programmiersprachen und Übersetzer Sommersemester 2010 19. April 2010 Theoretische Grundlagen Problem Wie kann man eine unendliche Menge von (syntaktisch) korrekten Programmen definieren? Lösung Wie auch

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

Algorithmen und Datenstrukturen Suchbaum

Algorithmen und Datenstrukturen Suchbaum Algorithmen und Datenstrukturen Suchbaum Matthias Teschner Graphische Datenverarbeitung Institut für Informatik Universität Freiburg SS 12 Motivation Datenstruktur zur Repräsentation dynamischer Mengen

Mehr

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03 Reihungen Martin Wirsing in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03 2 Ziele Die Datenstruktur der Reihungen verstehen: mathematisch und im Speicher Grundlegende Algorithmen auf Reihungen

Mehr

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1 3.2 Binäre Suche Beispiel 6.5.1: Intervallschachtelung (oder binäre Suche) (Hier ist n die Anzahl der Elemente im Feld!) Ein Feld A: array (1..n) of Integer sei gegeben. Das Feld sei sortiert, d.h.: A(i)

Mehr

Computerarithmetik ( )

Computerarithmetik ( ) Anhang A Computerarithmetik ( ) A.1 Zahlendarstellung im Rechner und Computerarithmetik Prinzipiell ist die Menge der im Computer darstellbaren Zahlen endlich. Wie groß diese Menge ist, hängt von der Rechnerarchitektur

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

2 Darstellung von Zahlen und Zeichen

2 Darstellung von Zahlen und Zeichen 2.1 Analoge und digitale Darstellung von Werten 79 2 Darstellung von Zahlen und Zeichen Computer- bzw. Prozessorsysteme führen Transformationen durch, die Eingaben X auf Ausgaben Y abbilden, d.h. Y = f

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Datenstrukturen und Algorithmen

Datenstrukturen und Algorithmen Datenstrukturen und Algorithmen VO 708.031 Bäume robert.legenstein@igi.tugraz.at 1 Inhalt der Vorlesung 1. Motivation, Einführung, Grundlagen 2. Algorithmische Grundprinzipien 3. Sortierverfahren 4. Halden

Mehr

Informationsblatt Induktionsbeweis

Informationsblatt Induktionsbeweis Sommer 015 Informationsblatt Induktionsbeweis 31. März 015 Motivation Die vollständige Induktion ist ein wichtiges Beweisverfahren in der Informatik. Sie wird häufig dazu gebraucht, um mathematische Formeln

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r ) Definition B : Menge der binären Bäume, rekursiv definiert durch die Regeln: ist ein binärer Baum sind t l, t r binäre Bäume, so ist auch t =, t l, t r ein binärer Baum nur das, was durch die beiden vorigen

Mehr

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Zählen und Zahlbereiche Übungsblatt 1 1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Für alle m, n N gilt m + n = n + m. in den Satz umschreiben:

Mehr

Java Einführung Operatoren Kapitel 2 und 3

Java Einführung Operatoren Kapitel 2 und 3 Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren 2 Operatoren Abhängig

Mehr

Binärdarstellung von Fliesskommazahlen

Binärdarstellung von Fliesskommazahlen Binärdarstellung von Fliesskommazahlen 1. IEEE 754 Gleitkommazahl im Single-Format So sind in Gleitkommazahlen im IEEE 754-Standard aufgebaut: 31 30 24 23 0 S E E E E E E E E M M M M M M M M M M M M M

Mehr

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte 50. Mathematik-Olympiade. Stufe (Regionalrunde) Klasse 3 Lösungen c 00 Aufgabenausschuss des Mathematik-Olympiaden e.v. www.mathematik-olympiaden.de. Alle Rechte vorbehalten. 503 Lösung 0 Punkte Es seien

Mehr

Algorithmen & Datenstrukturen 1. Klausur

Algorithmen & Datenstrukturen 1. Klausur Algorithmen & Datenstrukturen 1. Klausur 7. Juli 2010 Name Matrikelnummer Aufgabe mögliche Punkte erreichte Punkte 1 35 2 30 3 30 4 15 5 40 6 30 Gesamt 180 1 Seite 2 von 14 Aufgabe 1) Programm Analyse

Mehr

Überblick. Lineares Suchen

Überblick. Lineares Suchen Komplexität Was ist das? Die Komplexität eines Algorithmus sei hierbei die Abschätzung des Aufwandes seiner Realisierung bzw. Berechnung auf einem Computer. Sie wird daher auch rechnerische Komplexität

Mehr

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl: AVL-Bäume Analyse (Folie 85, Seite 39 im Skript) Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl: 0 falls n = 0 F n = 1 falls

Mehr

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung Kapitel 6 Komplexität von Algorithmen 1 6.1 Beurteilung von Algorithmen I.d.R. existieren viele Algorithmen, um dieselbe Funktion zu realisieren. Welche Algorithmen sind die besseren? Betrachtung nicht-funktionaler

Mehr

Grundlagen der Informatik

Grundlagen der Informatik Mag. Christian Gürtler Programmierung Grundlagen der Informatik 2011 Inhaltsverzeichnis I. Allgemeines 3 1. Zahlensysteme 4 1.1. ganze Zahlen...................................... 4 1.1.1. Umrechnungen.................................

Mehr

WS 2009/10. Diskrete Strukturen

WS 2009/10. Diskrete Strukturen WS 2009/10 Diskrete Strukturen Prof. Dr. J. Esparza Lehrstuhl für Grundlagen der Softwarezuverlässigkeit und theoretische Informatik Fakultät für Informatik Technische Universität München http://www7.in.tum.de/um/courses/ds/ws0910

Mehr

Binäre Suchbäume (binary search trees, kurz: bst)

Binäre Suchbäume (binary search trees, kurz: bst) Binäre Suchbäume (binary search trees, kurz: bst) Datenstruktur zum Speichern einer endlichen Menge M von Zahlen. Genauer: Binärbaum T mit n := M Knoten Jeder Knoten v von T ist mit einer Zahl m v M markiert.

Mehr

Konzepte der Informatik

Konzepte der Informatik Konzepte der Informatik Vorkurs Informatik zum WS 2011/2012 26.09. - 30.09.2011 17.10. - 21.10.2011 Dr. Werner Struckmann / Christoph Peltz Stark angelehnt an Kapitel 1 aus "Abenteuer Informatik" von Jens

Mehr

15 Optimales Kodieren

15 Optimales Kodieren 15 Optimales Kodieren Es soll ein optimaler Kodierer C(T ) entworfen werden, welcher eine Information (z.b. Text T ) mit möglichst geringer Bitanzahl eindeutig überträgt. Die Anforderungen an den optimalen

Mehr

Theoretische Informatik SS 04 Übung 1

Theoretische Informatik SS 04 Übung 1 Theoretische Informatik SS 04 Übung 1 Aufgabe 1 Es gibt verschiedene Möglichkeiten, eine natürliche Zahl n zu codieren. In der unären Codierung hat man nur ein Alphabet mit einem Zeichen - sagen wir die

Mehr

Theoretische Grundlagen der Informatik

Theoretische Grundlagen der Informatik Theoretische Grundlagen der Informatik Vorlesung am 12.01.2012 INSTITUT FÜR THEORETISCHE 0 KIT 12.01.2012 Universität des Dorothea Landes Baden-Württemberg Wagner - Theoretische und Grundlagen der Informatik

Mehr

Grundbegriffe der Informatik

Grundbegriffe der Informatik Grundbegriffe der Informatik Einheit 15: Reguläre Ausdrücke und rechtslineare Grammatiken Thomas Worsch Universität Karlsruhe, Fakultät für Informatik Wintersemester 2008/2009 1/25 Was kann man mit endlichen

Mehr

Erwin Grüner 09.02.2006

Erwin Grüner 09.02.2006 FB Psychologie Uni Marburg 09.02.2006 Themenübersicht Folgende Befehle stehen in R zur Verfügung: {}: Anweisungsblock if: Bedingte Anweisung switch: Fallunterscheidung repeat-schleife while-schleife for-schleife

Mehr

Skript und Aufgabensammlung Terme und Gleichungen Mathefritz Verlag Jörg Christmann Nur zum Privaten Gebrauch! Alle Rechte vorbehalten!

Skript und Aufgabensammlung Terme und Gleichungen Mathefritz Verlag Jörg Christmann Nur zum Privaten Gebrauch! Alle Rechte vorbehalten! Mathefritz 5 Terme und Gleichungen Meine Mathe-Seite im Internet kostenlose Matheaufgaben, Skripte, Mathebücher Lernspiele, Lerntipps, Quiz und noch viel mehr http:// www.mathefritz.de Seite 1 Copyright

Mehr

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany zach@in.tu-clausthal.de. Stammbaum. Stammbaum. Stammbaum

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany zach@in.tu-clausthal.de. Stammbaum. Stammbaum. Stammbaum lausthal Beispiele Stammbaum Informatik II. Zachmann lausthal University, ermany zach@in.tu-clausthal.de. Zachmann Informatik - SS 06 Stammbaum Stammbaum / Parse tree, Rekursionsbaum Parse tree, Rekursionsbaum

Mehr

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007 Fachhochschule Bonn-Rhein-Sieg University of Applied Sciences Fachbereich Informatik Prof. Dr. Peter Becker Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Mehr

3.1. Die komplexen Zahlen

3.1. Die komplexen Zahlen 3.1. Die komplexen Zahlen Es gibt viele Wege, um komplexe Zahlen einzuführen. Wir gehen hier den wohl einfachsten, indem wir C R als komplexe Zahlenebene und die Punkte dieser Ebene als komplexe Zahlen

Mehr

Codes und Informationsgehalt

Codes und Informationsgehalt Aufgaben 2 Codes und Informationsgehalt Auf wie viele Dezimalziffern genau können vorzeichenlose ganze Zahlen in einem binären Code der Länge 32 bit dargestellt werden? 2 Codes und Informationsgehalt Auf

Mehr

Austausch- bzw. Übergangsprozesse und Gleichgewichtsverteilungen

Austausch- bzw. Übergangsprozesse und Gleichgewichtsverteilungen Austausch- bzw. Übergangsrozesse und Gleichgewichtsverteilungen Wir betrachten ein System mit verschiedenen Zuständen, zwischen denen ein Austausch stattfinden kann. Etwa soziale Schichten in einer Gesellschaft:

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dipl. Inform. Andreas Wilkens 1 Organisatorisches Freitag, 05. Mai 2006: keine Vorlesung! aber Praktikum von 08.00 11.30 Uhr (Gruppen E, F, G, H; Vortestat für Prototyp)

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Name, Vorname Matrikelnummer Probeklausur zur Vorlesung Einführung in die Programmierung WS 2008/09 Dauer: 2 Stunden Hinweise: Schreiben Sie Ihren Namen und Ihre Matrikelnummer auf dieses Deckblatt und

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Brückenkurs Mathematik TU Dresden 2015 Lineare Gleichungssysteme Schwerpunkte: Modellbildung geometrische Interpretation Lösungsmethoden Prof. Dr. F. Schuricht TU Dresden, Fachbereich Mathematik auf der

Mehr

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 3 1. Semester ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 3 1. Semester ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN Wir wollen nun die Rechengesetze der natürlichen Zahlen auf die Zahlenmenge der ganzen Zahlen erweitern und zwar so, dass sie zu keinem Widerspruch mit bisher geltenden

Mehr

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren: 4. AUSSAGENLOGIK: SYNTAX 4.1 Objektsprache und Metasprache 4.2 Gebrauch und Erwähnung 4.3 Metavariablen: Verallgemeinerndes Sprechen über Ausdrücke von AL 4.4 Die Sprache der Aussagenlogik 4.5 Terminologie

Mehr

2.11 Kontextfreie Grammatiken und Parsebäume

2.11 Kontextfreie Grammatiken und Parsebäume 2.11 Kontextfreie Grammatiken und Parsebäume Beispiel: Beispiel (Teil 3): Beweis für L(G) L: Alle Strings aus L der Länge 0 und 2 sind auch in L(G). Als Induktionsannahme gehen wir davon aus, dass alle

Mehr

Institut für Programmierung und Reaktive Systeme 25. August 2014. Programmier-Labor. 04. + 05. Übungsblatt. int binarysearch(int[] a, int x),

Institut für Programmierung und Reaktive Systeme 25. August 2014. Programmier-Labor. 04. + 05. Übungsblatt. int binarysearch(int[] a, int x), Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 25. August 2014 Programmier-Labor 04. + 05. Übungsblatt Aufgabe 21: a) Schreiben Sie eine Methode

Mehr

Technische Informatik - Eine Einführung

Technische Informatik - Eine Einführung Martin-Luther-Universität Halle-Wittenberg Fachbereich Mathematik und Informatik Lehrstuhl für Technische Informatik Prof. P. Molitor Ausgabe: 2005-02-21 Abgabe: 2005-02-21 Technische Informatik - Eine

Mehr

7 Rechnen mit Polynomen

7 Rechnen mit Polynomen 7 Rechnen mit Polynomen Zu Polynomfunktionen Satz. Zwei Polynomfunktionen und f : R R, x a n x n + a n 1 x n 1 + a 1 x + a 0 g : R R, x b n x n + b n 1 x n 1 + b 1 x + b 0 sind genau dann gleich, wenn

Mehr

Formale Sprachen und Grammatiken

Formale Sprachen und Grammatiken Formale Sprachen und Grammatiken Jede Sprache besitzt die Aspekte Semantik (Bedeutung) und Syntax (formaler Aufbau). Die zulässige und korrekte Form der Wörter und Sätze einer Sprache wird durch die Syntax

Mehr

Datentypen. Agenda für heute, 4. März, 2010. Pascal ist eine streng typisierte Programmiersprache

Datentypen. Agenda für heute, 4. März, 2010. Pascal ist eine streng typisierte Programmiersprache Agenda für heute, 4. März, 2010 Zusammengesetzte if-then-else-anweisungen Datentypen Pascal ist eine streng typisierte Programmiersprache Für jeden Speicherplatz muss ein Datentyp t (Datenformat) t) definiert

Mehr

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN RALF HINZE Institut für Informatik III Universität Bonn Email: ralf@informatik.uni-bonn.de Homepage: http://www.informatik.uni-bonn.de/~ralf Februar, 2001 Binäre Suchbäume

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Klausur zur Einführung in die objektorientierte Programmierung mit Java Klausur zur Einführung in die objektorientierte Programmierung mit Java im Studiengang Informationswissenschaft Prof. Dr. Christian Wolff Professur für Medieninformatik Institut für Medien-, Informations-

Mehr

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen 1. Quadratische Gleichungen Quadratische Gleichungen lassen sich immer auf die sog. normierte Form x 2 + px + = 0 bringen, in

Mehr

13. Binäre Suchbäume

13. Binäre Suchbäume 1. Binäre Suchbäume Binäre Suchbäume realiesieren Wörterbücher. Sie unterstützen die Operationen 1. Einfügen (Insert) 2. Entfernen (Delete). Suchen (Search) 4. Maximum/Minimum-Suche 5. Vorgänger (Predecessor),

Mehr

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung. Lineare Gleichungen mit einer Unbekannten Die Grundform der linearen Gleichung mit einer Unbekannten x lautet A x = a Dabei sind A, a reelle Zahlen. Die Gleichung lösen heißt, alle reellen Zahlen anzugeben,

Mehr

183.580, WS2012 Übungsgruppen: Mo., 22.10.

183.580, WS2012 Übungsgruppen: Mo., 22.10. VU Grundlagen digitaler Systeme Übung 2: Numerik, Boolesche Algebra 183.580, WS2012 Übungsgruppen: Mo., 22.10. Aufgabe 1: Binäre Gleitpunkt-Arithmetik Addition & Subtraktion Gegeben sind die Zahlen: A

Mehr

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

Mehr

Die reellen Lösungen der kubischen Gleichung

Die reellen Lösungen der kubischen Gleichung Die reellen Lösungen der kubischen Gleichung Klaus-R. Löffler Inhaltsverzeichnis 1 Einfach zu behandelnde Sonderfälle 1 2 Die ganzrationale Funktion dritten Grades 2 2.1 Reduktion...........................................

Mehr

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein. Aufgabe 10 Binäre Bäume a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge, 28, 35, 31, 9, 4,, 17, 37, 25 ein. 1. Einfügen von : 3. Einfugen von 35: 2. Einfügen von 28: 28 28 10. Einfügen

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Vorlesung Diskrete Strukturen Graphen: Wieviele Bäume?

Vorlesung Diskrete Strukturen Graphen: Wieviele Bäume? Vorlesung Diskrete Strukturen Graphen: Wieviele Bäume? Bernhard Ganter Institut für Algebra TU Dresden D-01062 Dresden bernhard.ganter@tu-dresden.de WS 2013/14 Isomorphie Zwei Graphen (V 1, E 1 ) und (V

Mehr

Grundlagen der Informatik I Informationsdarstellung

Grundlagen der Informatik I Informationsdarstellung Grundlagen der Informatik I Informationsdarstellung Einführung in die Informatik, Gumm, H.-P./Sommer, M. Themen der heutigen Veranstaltung. ASCIi Code 2. Zeichenketten 3. Logische Operationen 4. Zahlendarstellung

Mehr

Einführung in die Algebra

Einführung in die Algebra Prof. Dr. H. Brenner Osnabrück SS 2009 Einführung in die Algebra Vorlesung 13 Einheiten Definition 13.1. Ein Element u in einem Ring R heißt Einheit, wenn es ein Element v R gibt mit uv = vu = 1. DasElementv

Mehr

Mathematik für Studierende der Biologie und des Lehramtes Chemie Wintersemester 2013/14. Auswahl vorausgesetzter Vorkenntnisse

Mathematik für Studierende der Biologie und des Lehramtes Chemie Wintersemester 2013/14. Auswahl vorausgesetzter Vorkenntnisse UNIVERSITÄT DES SAARLANDES FACHRICHTUNG 6.1 MATHEMATIK Dipl.-Math. Kevin Everard Mathematik für Studierende der Biologie und des Lehramtes Chemie Wintersemester 2013/14 Auswahl vorausgesetzter Vorkenntnisse

Mehr

Über Arrays und verkettete Listen Listen in Delphi

Über Arrays und verkettete Listen Listen in Delphi Über Arrays und verkettete Listen Listen in Delphi Michael Puff mail@michael-puff.de 2010-03-26 Inhaltsverzeichnis Inhaltsverzeichnis 1 Einführung 3 2 Arrays 4 3 Einfach verkettete Listen 7 4 Doppelt verkettete

Mehr

DHBW Karlsruhe, Vorlesung Programmieren, Klassen (2)

DHBW Karlsruhe, Vorlesung Programmieren, Klassen (2) DHBW Karlsruhe, Vorlesung Programmieren, Klassen (2) Aufgabe 3 Bankkonto Schreiben Sie eine Klasse, die ein Bankkonto realisiert. Attribute für das Bankkonto sind der Name und Vorname des Kontoinhabers,

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen der Theoretischen Informatik, SoSe 2008 1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)

Mehr

Unterrichtsmaterialien in digitaler und in gedruckter Form. Auszug aus: Übungsbuch für den Grundkurs mit Tipps und Lösungen: Analysis

Unterrichtsmaterialien in digitaler und in gedruckter Form. Auszug aus: Übungsbuch für den Grundkurs mit Tipps und Lösungen: Analysis Unterrichtsmaterialien in digitaler und in gedruckter Form Auszug aus: Übungsbuch für den Grundkurs mit Tipps und Lösungen: Analysis Das komplette Material finden Sie hier: Download bei School-Scout.de

Mehr

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen Was bisher geschah abstrakter Datentyp : Signatur Σ und Axiome Φ z.b. ADT Menge zur Verwaltung (Finden, Einfügen, Entfernen) mehrerer Elemente desselben Typs Spezifikation einer Schnittstelle Konkreter

Mehr

Dezimalkomma (decimal point) rechts von Stelle mit Wertigkeit 100 nachfolgende Stellen haben Wertigkeit 10-1, 10-2, etc.

Dezimalkomma (decimal point) rechts von Stelle mit Wertigkeit 100 nachfolgende Stellen haben Wertigkeit 10-1, 10-2, etc. Fixpunktdarstellung Fixed-point numbers Bsp. Dezimaldarstellung Dezimalkomma (decimal point) rechts von Stelle mit Wertigkeit 100 nachfolgende Stellen haben Wertigkeit 10-1, 10-2, etc. Binärdarstellung

Mehr

Diana Lange. Generative Gestaltung Operatoren

Diana Lange. Generative Gestaltung Operatoren Diana Lange Generative Gestaltung Operatoren Begriffserklärung Verknüpfungsvorschrift im Rahmen logischer Kalküle. Quelle: google Operatoren sind Zeichen, die mit einer bestimmten Bedeutung versehen sind.

Mehr

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung

M. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales

Mehr

Informationssysteme Gleitkommazahlen nach dem IEEE-Standard 754. Berechnung von Gleitkommazahlen aus Dezimalzahlen. HSLU T&A Informatik HS10

Informationssysteme Gleitkommazahlen nach dem IEEE-Standard 754. Berechnung von Gleitkommazahlen aus Dezimalzahlen. HSLU T&A Informatik HS10 Informationssysteme Gleitkommazahlen nach dem IEEE-Standard 754 Berechnung von Gleitkommazahlen aus Dezimalzahlen Die wissenschaftliche Darstellung einer Zahl ist wie folgt definiert: n = f * 10 e. f ist

Mehr

Modellierung und Programmierung 1

Modellierung und Programmierung 1 Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut für Informatik Universität Leipzig 19. November 2015 Gültigkeitsbereich (Scope) von Variablen { int m; {

Mehr

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen Programmieren 10. Tutorium 4./ 5. Übungsblatt Inhalt I. Übungsblatt 4 II. III. - Rückgabe und Besprechung - Vorbereitung auf Wiederholung/ Nachtrag - Operatorpräzedenzen IV. Übungsblatt 5 - Vorstellung

Mehr

Binäre Gleitkommazahlen

Binäre Gleitkommazahlen Binäre Gleitkommazahlen Was ist die wissenschaftliche, normalisierte Darstellung der binären Gleitkommazahl zur dezimalen Gleitkommazahl 0,625? Grundlagen der Rechnerarchitektur Logik und Arithmetik 72

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Lineare Gleichungssysteme 1 Zwei Gleichungen mit zwei Unbekannten Es kommt häufig vor, dass man nicht mit einer Variablen alleine auskommt, um ein Problem zu lösen. Das folgende Beispiel soll dies verdeutlichen

Mehr

SEP 114. Design by Contract

SEP 114. Design by Contract Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit

Mehr