Version [83281]
Dies ist eine alte Version von ProzProg10Strukturen erstellt von ClaudiaMichel am 2017-08-16 15:43:11.
Prozedurale Programmierung - Kapitel 10 - Strukturen
Inhalte von Dr. E. Nadobnyh
10.1 Begriffsdefinition
Einführung
Manchmal möchte man mehrere Datenwerte zu einer Einheit zusammenfassen.
1. Die Datenstruktur Array bzw. Feld erlaubt lediglich das Speichern von Datenobjekten des gleichen Typs.
Es ist nicht möglich, in einem Array Daten vom Typ „int“ und Daten vom Typ „char“ gemischt abzulegen.
2. Sollen z. B. in einem Programm Kundendaten wie Name, Ort, PLZ, Strasse usw. zusammengefasst werden, reicht die Datenstruktur Array nicht mehr aus. Eine Struktur kann im Gegensatz zu einem Array aus Datenobjekten unterschiedlicher Datentypen zusammengefasst werden.
Grundidee
1. Eine Struktur (Record, Datenverbund, struct) ist eine Ansammlung von mehreren Variablen (Elementen, Komponenten, Feldern) mit verschiedenen Typen unter einem einzigen Namen.
2. Strukturen sind benutzerdefinierte (selbstdefinierte) Datentypen. Der Name einer Struktur kann wie jeder anderer Typname verwendet werden. Vom Datentyp können Variablen (Strukturvariablen) angelegt werden.
Legende:
v –eine Strukturvariable
Beispiel:
Eine Struktur kann man sich wie eine Karteikarte vorstellen:
1) Auf einer solchen Karteikarte werden Daten, die logisch zusammengehören zusammengefasst.
2) Eine Karteikarte enthält mehrere Elemente, die verschiedene Datentypen besitzen können.
Struktur als Abstraktion
Strukturen sind ein Mittel zur Abstraktion: Man kann auf einer höheren Programmebene von den einzelnen Komponenten (Elementen, Attributen) der Struktur abstrahieren. Man behandelt hier die Struktur als Ganzes.
Die einzelnen Elemente einer Struktur werden dann als unwichtige Details betrachtet.
Bei der Anwendung muss man nicht wissen, welche innere Konstruktion die Struktur hat.
Beispiel
Die einzelnen Elemente einer Struktur werden als unwichtige Details betrachtet.
struct Bruch
{ int zaehler;
int nenner;
};
{ int zaehler;
int nenner;
};
Auf der Anwendungsebene muss man nicht wissen, welche innere Konstruktion die Struktur „Bruch“ hat.
int main()
{ Bruch a, b, c;
a= scanBruch();
b= scanBruch();
c= addBruch(a, b);
printBruch(c);
return 0;
}
{ Bruch a, b, c;
a= scanBruch();
b= scanBruch();
c= addBruch(a, b);
printBruch(c);
return 0;
}
Vorteile
1. Durch die Zusammenfassung inhaltlich zusammengehöriger Daten zu Verbunden wird ein Programm verständlicher und wartungsfreundlicher.
2. Die Verwaltung von mehreren Datenobjekten unterschiedlichen Datentypen ohne Strukturen ist sehr umständlich.
3. Eine Strukturvariable kann als Ganzes verwalten werden, z.B.: erfassen, ausgeben, suchen usw.
4. Eine Strukturvariable kann als Ganzes an Funktionen übergeben und als Funktionsergebnis geliefert werden.
5. Mehrere Strukturvariablen können in einem Array verwaltet werden.
6. Strukturen werden in C++ zu Klassen erweitert.
Typdefinition und Variablendefinition
1) Strukturdefinition bzw. Typdefinition:
- legt die Innenstruktur des definierten Types fest,
- reserviert keinen Speicherplatz.
2) Definition einer Strukturvariable bzw. Variablendefinition:
- erzeugt eine Instanz (Variable, Strukturvariable) des Strukturtypes,
- belegt Speicherplatz,
- initialisiert eventuell die erzeugte Variable.
Typdefinition und Variablendefinition. Beispiel
Operationen mit Strukturvariablen
1. Initialisierung von Strukturvariablen:
Bruch a={5, 3}, b, c;
2. Zuweisung:
b=a;
3. Kopieren bei der Parameterübergabe und bei der Rückgabe per Wert:
c= addBruch (a, b);
4. Referenzierung und Dereferenzierung:
Bruch* p=& c; Bruch d= *p;
5. Dynamische Reservierung:
Bruch* p1 = new Bruch;
6. Kein Vergleich und keine Konvertierung.
Zugriff auf Komponenten
Bei Bedarf kann man natürlich immer noch auf die Komponenten zugreifen. Für den Zugriff auf Komponenten (Elementzugriff) gibt es zwei eigene Operatoren:
1) Punktoperator (Strukturoperator, Element-Operator)
⇒ Demo 1.
2) Pfeiloperator (Zeigeroperator auf Strukturen):
Die beide Operatoren sind gegenseitig ersetzbar:
(*p).k entspricht p->k
v.k entspricht (&v)->k
10.2. Verwendung von Strukturen
Komplexe Daten zusammenfassen
1) Komplexe Daten, auch Felder, können sehr effektiv in einer Struktur zusammenfasst werden, z.B.:
struct Datum
{ short tag;
char monat[10];
int jahr;
};
{ short tag;
char monat[10];
int jahr;
};
2) Strukturen können als Elemente ebenfalls wieder Strukturen enthalten (geschachtelte Strukturen), z.B.:
struct Person
{ char name[20];
Datum geburtsdatum;
};
{ char name[20];
Datum geburtsdatum;
};
3) Strukturen können als Elemente zu Feldern zusammengefasst werden, z.B.:
struct Firma
{ Person bestand[20];
int anzahl;
};
{ Person bestand[20];
int anzahl;
};
Übergabe von Strukturen an Funktionen
Es gibt dafür wenigstens drei Möglichkeiten:
a) Komponenten getrennt übergeben, z.B.:
void f1(short tag, char monat[10], int jahr ){ }
b) Eine gesamte Strukturvariable durch call-by-value übergeben, z.B.:
void f2(Datum d ){ }
c)eine gesamte Strukturvariable durch call-by-reference übergeben, z.B.:
void f3(Datum & d ){ }
Eigenschaften:
1) Bei der Struktur-Übergabe ist die Parameterliste kürzer als bei der Komponenten-Übergabe.
2) Im Gegensatz zu Arrays werden Strukturen bei der call-by-value kopiert. Die Wertekopie kostet insbesondere bei
großen Strukturen Zeit und Speicherplatz.
Strukturen als Rückgabewert von Funktionen
Anders als Arrays können Strukturen auch Rückgabetyp von Funktionen sein, z.B.:
struct Person
{ char name[20];
int geburtsjahr;
};
Person scanPerson()
{ Person tmp;
cout<<"Name und Geburtsjahr: ";
cin>>tmp.name;
cin>>tmp.geburtsjahr;
return tmp;
}
{ char name[20];
int geburtsjahr;
};
Person scanPerson()
{ Person tmp;
cout<<"Name und Geburtsjahr: ";
cin>>tmp.name;
cin>>tmp.geburtsjahr;
return tmp;
}
⇒ Demo 2.