Kapitel 4
Datenstrukturen
 Information aus der realen Welt werden in einem informationsverarbeitenden System als Daten abgelegt. Diese stellen also eine
(vereinfachte) Abstraktion der Wirklichkeit dar und spiegeln in vielen
Fällen die Strukturen der Wirklichkeit wider.
In diesem Kapitel wird ein Überblick über die wichtigsten abstrakten
Datenstrukturen gegeben, wobei dieser Begriff zum Begriff des
„Datentyps“ erweitert wird.
 Inhalt
1.
2.
3.
4.
Datenstrukturen - Datentypen
Datentypen: Ein Überblick
Konkrete Datentypen
Abstrakte Datentypen
4.1
Datenstrukturen - Datentypen
 In der Literatur wird meist der Begriff „Datenstruktur“ verwendet. In
diesem Unterkapitel soll der Unterschied ziwschen diesem Begriff
und dem Begriff des „Datentyps“ erläutert werden.
 Inhalt
1. Datenstrukturen
2. Datentypen
3. Variablen eines Datentyps
4.1.1 Datenstrukturen
 In der Informatik werden Objekte der realen oder abstrakten Welt
erfasst
 Bei der Erfassung beschränkt man sich möglichst auf die für den
weiteren Transport / Speicherung/Verarbeitung/Umsetzung notwendige
Information
 Zur internen Repräsentation werden diese Objekte abstrahiert
 Zur Abstraktion gehört die Erkennung von Strukturen - im Sinne einer
Aggregation.
 Also
 Aus welchen Teilobjekten bestehen Objekte ?
 In welchem Verhältnis stehen die Teilobjekte zueinander ?
 Welches sind die „atomaren“ Teilobjekte ?
 Anschließend werden diese Objekte typisiert.
 Typisierung ist die Einteilung von abstrakten internen Objekten in
Gruppen mit gleichen oder ähnlichen Eigenschaften.
4.1.2 Datentypen
 Typen sind also nicht die intern repräsentierten Objekte, sondern
beschreiben die Eigenschaft einer Gruppe von Objekten.
 Zu diesen Eigenschaften gehören:
Struktur
Wertebereich
anwendbare Operatoren, Funktionen, Relationen
Beziehungen zu anderen Typen
interne Repräsentationsweise
…
Beispiel:
Imaginäre Zahlen
 Einige Anmerkungen::
 Der Begriff „Datentyp“ ist weitergehend als der Begriff „Datenstruktur“
 In der Objektorientierten Programmierung wird statt „Datentyp“ auch der
Begriff „Klasse“ verwendet (Klassen beschreiben mehr Eigenschaften)
 Konkrete Repräsentanten eines Datentyps werden (u.a) „Variable“ oder
- bei oo-Sprachen - „Instanz“ genannt
4.1.3 Variable eines Datentyps
 Einen speziellen Repräsentanten eines Datentyps bezeichnet man als
Variable. Die Festlegung, von welchem Datentyp eine Variable ist,
bezeichnet man als Variablendeklaration.
 Die Zuordnung eines Typs „Typ“ an eine Variable X wird (zunächst) wie
folgt notiert:
X : Typ;
 Eine Variable hat alle Eigenschaften eines Datentyps.
Zusätzlich dazu hat eine Variable:
 einen konkreten Wert.
 Der Wert muss aus dem Wertebereich des Datentyps sein (oder undefiniert)
 Die Zuweisung eines Wertes „Wert“ an eine Variable X sei (zunächst) wie
folgt notiert:
X <- Wert;
 einen konkreten Speicherplatz
 Dieser Speicherplatz ist so dimensioniert, dass die Struktur der Variable
abgebildet werden kann
 Dieser Speicherplatz wird (meist) implizit durch die Deklaration zugeordnet
 Beispiel:
x : Datentyp; // x ist vom Typ: „Datentyp“
X <- 531;
// Zuweisung von 531 an X
4.2
Datentypen: Überblick
 Nachdem sich nun der Begriff des „Datentyps“ als Oberbegriff der
„Datenstruktur“ erwiesen hat, konzentrieren wir uns im Rest des
Kapitels auf wichtige Datentypen.
In diesem Unterkapitel wird ein Klassifikationssystem für die in der
Informatik verwendeten Datentypen aufgestellt und kurz erläutert
 Inhalt
1. Klassifikation der Datentypen
2. Erläuterung der Klassifikation
4.2.1 Klassifikation der Datentypen
Datentypen
Konkrete
Einfache
Ordinale
Boolean
(Wahrheitswert)
Integer
(Ganzzahl)
Abstrakte
Pointer(Zeiger)
Real
(Fließkomma)
Char
(Zeichen)
Array
(Feld)
Idealisierte
Strukturierte
Record
Union
(Verbund) (Variantenverb.)
...
Enumeration
(Aufzählung)
4.2.2 Erläuterung der Klassifikation
 Idealisierte Datentypen
 aus der Mathematik bekannte Datentypen: ℕ, ℤ, ℝ, ℂ,...
 Variablen dieser Typen sind oft nicht endlich darstellbar (Bsp: 2)
 In einem Computer-Algebra-System symbolisch darstellbar (Bsp: 2^( 1/2))
 Konkrete Datentypen
 in einem Rechner von Hard- oder Software bereitgestellte Datentypen
 entweder vordefiniert oder durch den Benutzer definierbar
 Abstrakte Datentypen
 verbergen ihren inneren Aufbau vor dem Benutzer
 bestehen aus beliebigen Strukturen über konkrete/idealisierte Datentypen,
sowie aus Zugriffsfunktionen bzw. Prozeduren
 Beispiel: Baum
13
insert (Element)
6
2
61
12
15
delete (Element)
79
search (Element)
4.3
Konkrete Datentypen
 Die am häufigsten abstrahierten Objekte der realen Welt sind,
zumindest was die für eine weitere Verarbeitung notwendigen
Informationen betrifft, einfach strukturiert und lassen sich demnach
mit konkreten Datentypen abbilden.
Dieses Unterkapitel gibt einen Überblick über alle konkreten
Datentypen und beschreibt diese.
 Inhalt
1.
2.
3.
4.
Einfache Datentypen
Strukturierte Datentypen
Zeiger-Datentypen
Beispiel: Kombinierte Datentypen
4.3.1 Einfache: boolean (Wahrheitswert)
 zur Darstellung von Wahrheitswerten
 Wertebereich: true, false
 intern in manchen Programmiersprachen als 1 bzw 0 dargestellt
 Operatoren: und, oder, nicht, Vergleiche, ...
 Operatoren entsprechend der bool‘schen Algebra
 oft auch allgemeine arithmentische Operationen möglich
 Vorsicht vor Integer-Arithmetik mit boolean-Variablen
 Notation:
 Beispiel:
type booleanVar = boolean;
type switch = boolean;
switch = false;
switch = not(switch);
switch = switch and not(switch);
switch = switch or not (switch);
//
//
//
//
=
=
=
=
0
not(0) = 1
1 and 0 = 0
0 or 1 = 1
4.3.1 Einfache: integer (Ganzzahl)
 zur Darstellung ganzer Zahlen mit oder ohne Vorzeichen
 Wertebereich: Unterschiedlich
 unsigned integer: Ganze Zahlen ohne Vorzeichen ( 0... 65535 )
 oft 16 bit bzw. 32 bit als shortInt bzw. longint bezeichnet
 Vorsicht:
16 bit Integer ist verdammt wenig ((± 32267)
Speicherplatz ist nicht mehr teuer  benutzen Sie longInt
(Ausnahmen bestätigen die Regel)
 Operatoren: Grundrechenarten, Vergleiche
 Operatoren entsprechend der „klassischen“ Algebra
 Notation:
 Beispiel:
type integerVar = integer;
type i = integer;
i = 1;
i = i + 32;´
i = i / 17;
i = i + 65535;
//
//
//
//
= 1
= 1 + 32 = 33
= 33 / 17 = 1 !
bei unsigned Int.: Fehler !
4.3.1 Einfache: char (Zeichen)
 zur Darstellung von Zeichen
 Vorsicht: Typischerweise wird die ASCII-Codierung zugrundegelegt,
kann aber auch Unicode sein
 Wertebereich: Alle Zeichen
 Intern codiert als ASCII oder - neuerdings immer öfter - als Unicode
ASCII: 8 Bit (7 benutzt), Unicode: 16 Bit
 Intern oft als integer repräsentiert
 Operationen: Vergleich
 oft auch allgemeine arithmentische Operationen möglich
 Vorsicht vor Integer-Arithmetik mit boolean-Variablen
 Notation:
 Beispiel:
type charVar = char;
type symbol = char;
symbol = „A“;
symbol = symbol + 32;´
symbol = symbol - 128;
// = „A“
// = „A“ + 32 = „a“
// = „a“ - 128 = Fehler
4.3.1 Einfache: enum (Aufzählung)
 zur Darstellung endlicher benutzerdefinierter Wertebereich
 Es ist guter Stil, Mengen mit (garantiert) kleiner Mächtigkeit (<10) als
enum-Type zu deklarieren, anstatt sie z.B. als Integer zu kodieren.
 Intern werden enum-Werte oft als integer abgelegt
 Operatoren: Vergleich
 oft auch allgemeine arithmentische Operationen möglich
 Vorsicht vor Integer-Arithmetik mit enum-Variablen
 Notation:
 Beispiel:
type enumVar = enum { Wertemenge };
type ampelfarbe = enum {rot,gelb,gruen} ;
ampelfarbe = gruen;
// = gruen
ampelfarbe = ampelfarbe +1 ; ´ // = gruen + 1 = gelb
ampelfarbe = ampelfarbe +1 ; ´ // = gelb + 1 = rot
ampelfarbe = ampelfarbe +1 ; ´ // = rot + 1 = Fehler !
4.3.1 Einfache: real (Fließkomma)
 zur näherungsweisen Darstellung reeller Zahlen
 Wertebereich: Unterschiedliche Genauigkeiten und Wertebereiche
 Wertebereich entspricht typischerweise der IEEE 754 Norm, also:
 Float: 32 bit
 Double: 64 bit
 Operationen: Grundrechenarten, erweiterte Arithmetik, Vergleich
 Notation: type realVar = real;
 Beispiel: //--- Variable-declaration -------------------------type pi, flaeche, radius = real;
// all real !
//--- Initialisation -------------------------------pi
= 3,141; // needs not to be more accurate
radius = 5;
// might be changed by user
//--- Computation of surface -----------------------flaeche = 2 * pi * (radius ^ 2);
// common formula
4.3.2 Strukturierte: Array (Feld)
 Arrays sind eine Aggregationen von Daten des gleichen Typs
(des „Basistyps“)
 Die Grenzen des Arrays sind (meist) statisch bestimmt
 Operation: Auswahl
 Die Auswahl eines Datenelemtes über erfolgt über einen ganzzahligen
Index über den (Auswahl-)Operator „ [ ] “
 Vorsicht: Zugriff außerhalb des deklarierten Bereiches führt zu Fehlern
 Notation:
 Beispiele
type ArrayVar = array[min .. max] of Datentyp
 Eindimensionales array:
 Zweidimensionales array:
type Vektor = array[1..4] of real
 Operator
m : Matrix; v : Vektor;
v[3] <- 5,03; v[4] <- 4,12;
m[1][2] <- v[3] * 12 - v[4];
type Matrix = array[1..3] of
array[1..2] of real
4.3.2 Strukturierte: Record (Verbund)
 Verbunde sind Aggregationen von Daten möglicherweise unterschiedlichen Typs
 manchmals auch „structure“ oder „struct“ genannt
 Operation: Auswahl
 Die Auswahl erfolgt durch Angabe den des Komponentennamens
(durch einen Punkt vom Variablennamen getrennt)
 Notation:
type recordVar =
 Beispiel:
type Datum = record
{
tag
: Integer;
monat : Integer;
}
record
{
komponent1 : type1;
...
}
d : Datum;
d.monat <- 10;
d.tag
<- 20;
4.3.2 Strukturierte: Variant Record (Variantenverb.)
 Verbunde, deren Struktur mögliche Alternativen zulassen
 manchmals auch „union“ genannt
 lassen „Varianten“ eines Record-Types zu
 Operation: Auswahl (wie bei records über Punkt-Operator)
 Notation: type varrecVar = record {
komponent1 : type1;
...;
case variant (var1,...) of {
var1: {Typedefs};
...
}
tagged type
}
 Beispiel:
type human = record {
name : array [1..20] of char;
case sex (m,f) of {
f: {IQ: integer};
m: {muscle: real}; // in cm
}
adam,eva:human;
adam.sex <- m;
eva.sex <- f;
eva.IQ <- 132;
adam.muscle <- 20,5;
4.3.3 Pointer (Zeiger)
 Zeiger-Datentypen sind durch folgende Eigenschaften gekennzeichnet:
 Die Struktur ist identisch der eines Integer-Datentyp (alos oft 16,32,... Bit)
 Der Wertebereich ist der des Adressbereiches eines Rechnersystems,
der zusätzliche Wert „nil“ bezeichnet einen ungültigen Zeiger.
 Operatoren sind:
 Erzeugen eines Zeigers (Referenzierung)
 Zugriff auf verwiesenen Bereich (Dereferenzierung)
 Notation:
 Beispiel:
pointerVar : ^Type;
x : ^Integer;
y : Integer; z : Integer;
y <- 5; // Initialisierung
x <- ^y; // Referenzieren:
x^ <- 2; // Derefenzierung:
// Deklaration
// Deklarationen
der Variablen y
x ist Zeiger auf y
das worauf x zeigt
wird zu 2
z <- y; // Variable z bekommt den Wert von
Variable y zugewiesen.
// z hat jetzt den Wert 2
4.3.3 Pointer: Beispiel
Vorsicht:
Werte oft undefiniert
 Bsp.: x : ^Integer;
y : Integer;
1
y
<- 5;
1
x
2
2
5
6
7
8
9
2
x^ <- 2;
1
2
<- 2;
1
2
23 24 25 26 27 28
0
...
// Initialisierung der Variablen y
3 4
nil
5
6
7
8
9
<- ^y; // Referenzieren:
1
x
3 4
nil
// Deklaration
// Deklaration
3 4
23
5
6
7
8
9
23 24 25 26 27 28
5
...
x ist Zeiger auf y
23 24 25 26 27 28
5
...
// Derefenzierung: das worauf x zeigt
3 4
23
5
6
7
8
9
23 24 25 26 27 28
2
...
// Zuweisung ohne Dereferenzierung !
3
2
4
5
6
7
8
9
23 24 25 26 27 28
2
...
4.3.3 Pointer: Dynamische Datentypen
 Mit einfacher Datentypen und mit den konkreten Datentypen „Liste“
und „Verbund“ lassen sich nur statische Struktur aufbauen
 d.h. Strukturen, deren Speicherbedarf beliebig aber fest sind
 Bem.: Die Beliebigkeit ist begrenzt durch die Gesamtspeicherkapazität
 Mit Zeiger-Datentypen lassen sich Strukturen aufbauen, die sich
dynamisch auf- und abbbauen lassen
 d.h. Strujturen, deren Speicherbedarf sich dynamisch verändern kann
 Bem.: Auch hier ist die Beliebigkeit begrenzt durch die Gesamtspeicherkapazität
Huffman
 Beispiel: knoten = record
(Bsp. aus Kap.2)
{
symbol : char;
links : ^knoten; // 1
rechts : ^knoten; // 0
B
}
C
E
D
A
4.3.4 Beispiel: Kombinierte Datentypen
 Um nun beliebig komplexe Strukturen der „realen“ Welt in einem
Rechensystem abbilden zu können, kann man die vorgestellten
Datentypen beliebig miteinander Kombinieren
 Beispiel.:
Person : record {
surname : array [1..20] of char;
forename : array [1..20] of char;
birthday : Date;
next
: ^Person;
previous : ^Person;
}
Date : record {
year : integer;
month : enum (jan,feb,...};
day
: integer;
}
4.4
Abstrakte Datentypen
 Grundsätzlich lassen sich alle Objekte der realen Welt ausschließlich
mit Hilfe einfacher Datentypen abbilden. Diese Abbildung ist aber
meist „unnatürlich“, weil sie die Struktur realer Objekte nicht ausreichend berücksichtigt. Abhilfe schaffen hier strukturierte Datentypen,
die allerdings grundsätzlich nur endliche Objektmengen repräsentieren können. Hier schaffen Zeigertypen Abhilfe.
 Kann man nun mit diesen Mitteln Strukturen realer Objekt natürlich
abbilden, so fehlen diesen Datentypen einige der Eigenschaften, die
Datentypen von Datenstrukturen unterscheiden, dies sind insb.
 Operationen und
 Beziehungen zu anderen Typen.
 Einen vertieften Einblick in die bunte Welt abstrakter Datentypen
bietet die Vorlesung des 2. Semesters
Datenstrukturen
4.5
Zusammenfassung des Kapitels
Datentypen
Konkrete
Einfache
Ordinale
Abstrakte
Pointer(Zeiger)
Real
(Fließkomma)
Idealisierte
Strukturierte
Array Record Union
(Feld) (Verbund) (Variantenverb.)
...
Enumeration
Boolean
Integer
Char
(Wahrheitswert) (Ganzzahl) (Zeichen) (Aufzählung)
 Wir sind damit auch an die Grenzen dessen gelangt, was in dieser
Vorlesung über die „Statik“ von Objekten gesagt werden soll und
wenden uns einem noch spannenderem Themenbereich zu ;-)
Übung 4.1
1. Beschreiben Sie Gemeinsamkeiten und Unterschiede von
„Datenstruktur“, „Datentyp“ und „Variable“.
2. Was sind die Vor- und Nachteile von Arrays gegenüber verketteten
Listen
3. Definieren Sie einen Datentyp für das Objekt „Schachspiel“.
Berücksichtigen Sie dabei:
1. Beide Namen der Spieler
2. Alle Züge
3. Den Gewinner
4. Betrachten Sie den Stundenplan auf meiner Homepage
1. Skizzieren Sie einen Datentyp für das Objekt „Stundenpläne“
2. Welchen Speicherplatz benötigt eine Variable dieses Typs ?
3. An welchen Stellen sehen Sie Alternativen zu Ihrer Typdefinition ?