ich war hier: ProzProg10Strukturen

Version [83281]

Dies ist eine alte Version von ProzProg10Strukturen erstellt von ClaudiaMichel am 2017-08-16 15:43:11.

 

 (image: http://wdb.fh-sm.de/uploads/QualipaktLehre/BMBF_Logo_klein.jpg)

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.

 (image: http://ife.erdaxo.de/uploads/ProzProg10Strukturen/pp63.gif)

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.

 (image: http://ife.erdaxo.de/uploads/ProzProg10Strukturen/pp64.gif)


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;
};  


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;
}


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:
  1. legt die Innenstruktur des definierten Types fest,
  1. reserviert keinen Speicherplatz.

 (image: http://ife.erdaxo.de/uploads/ProzProg10Strukturen/pp65.gif)

2) Definition einer Strukturvariable bzw. Variablendefinition:
  1. erzeugt eine Instanz (Variable, Strukturvariable) des Strukturtypes,
  1. belegt Speicherplatz,
  1. initialisiert eventuell die erzeugte Variable.

 (image: http://ife.erdaxo.de/uploads/ProzProg10Strukturen/pp66.gif)


Typdefinition und Variablendefinition. Beispiel


 (image: http://ife.erdaxo.de/uploads/ProzProg10Strukturen/pp67.gif)


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)

 (image: http://ife.erdaxo.de/uploads/ProzProg10Strukturen/pp68.gif)

⇒ Demo 1.


2) Pfeiloperator (Zeigeroperator auf Strukturen):

 (image: http://ife.erdaxo.de/uploads/ProzProg10Strukturen/pp69.gif)

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;  
};  


2) Strukturen können als Elemente ebenfalls wieder Strukturen enthalten (geschachtelte Strukturen), z.B.:

struct Person
{  char name[20];
    Datum geburtsdatum;
};


3) Strukturen können als Elemente zu Feldern zusammengefasst werden, z.B.:

struct Firma
{  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;
}


⇒ Demo 2.

Diese Seite wurde noch nicht kommentiert.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki