Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.

Ähnliche Präsentationen


Präsentation zum Thema: "Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt."—  Präsentation transkript:

1 Strukturen

2 In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt werden.

3 Der Programmierer hat also hier das erste Mal die Möglichkeit neben den fest vorgegebenen Datentypen wie int, char, usw. selbst eigene Datentypen zu basteln bzw. zu entwerfen.

4 Syntax:

5 struct Bezeichner { Datentyp1 Bezeichner1; Datentyp2 Bezeichner2;.... };

6 Beispiel:

7 struct dtadresse{ char strasse[20]; char ort[20]; int plz; }; struct dtdatum{ int tag; int monat; int jahr; }; int main(){ // gleich geht es weiter Deklaration der Struktur dtadresse Es wird noch keine Variable angelegt (Speicher reserviert). Deklaration der Struktur dtdatum Es wird noch keine Variable angelegt (Speicher reserviert). Die Semikolons sind nötig, sonst Fehlermeldung des Compilers.

8 struct dtadresse{ char strasse[20]; char ort[20]; int plz; }; struct dtdatum{ int tag; int monat; int jahr; }; int main(){ // gleich geht es weiter Hier wird an den Anfang eines jeden Strukturnamens dt (wie datentyp) geschrieben. Falls jemand ein besseres Namensvergabesystem vorschlagen will, der wird gebeten, dies bitte zu machen. PS: Dem Compiler ist die Namensvergabe relativ egal!

9 struct dtadresse{ char strasse[20]; char ort[20]; int plz; }; struct dtdatum{ int tag; int monat; int jahr; }; int main(){ // gleich geht es weiter Wir deklarieren alle Strukturen am Anfang (vor allen Funktionen), damit sie allen Funktionen bekannt sind und deshalb von ihnen benutzt werden können (z.B. also lokale Variablen).

10 struct dtadresse a1; struct dtadresse a2 = {"rosenweg","stuttgart",74123}; struct dtdatum d1; struct dtdatum d2 = {7,4,1947}; Deklaration der Variablen a1: Es wird eine Variable angelegt (Speicher reserviert). Deklaration + Initialisierung der Variablen a2: Es wird eine Variable angelegt (Speicher reserviert) + den einzelnen Komponenten Werte zugewiesen Deklaration der Variablen d1: Es wird eine Variablen angelegt (Speicher reserviert). Deklaration + Initialisierung der Variablen d2

11 struct dtadresse a1; struct dtadresse a2 = {"rosenweg","stuttgart",74123}; struct dtdatum d1; struct dtdatum d2 = {7,4,1947}; Welchen Datentyp hat a1 und a2 ? Welchen Datentyp hat d1 und d2 ? dtadresse dtdatum

12 struct dtadresse a1; struct dtadresse a2 = {"rosenweg","stuttgart",74123}; struct dtdatum d1; struct dtdatum d2 = {7,4,1947}; Wie viel Speicher wird für die Variable a1 reserviert ? Speicherplatz char strasse[20] + Speicherplatz char ort [20] + Speicherplatz int plz = 44 Byte Wie viel Speicher wird für die Variable d1 reserviert ? Speicherplatz int tag + Speicherplatz int monat + Speicherplatz int jahr = 12 Byte

13 struct dtadresse a1; struct dtadresse a2 = {"rosenweg","stuttgart",74123}; struct dtdatum d1; struct dtdatum d2 = {7,4,1947}; a1.ort[0]='U'; a1.ort[1]='l'; a1.ort[2]='m'; a1.ort[3]='\0'; Auf die einzelnen Komponenten einer Struktur kann mit dem Punkt. zugegriffen werden Wie speichert man in d1 das Datum von Sylvester 2003 ? Wie speichert man in a1 die Postleitzahl 72631? Wie speichert man in a2 den Ort Urach ? a1.plz = 72631; d1.tag = 31; d1.monat = 12; d1.jahr = 2003; strcpy(a2.ort, "Urach"); oder alternativ: wie oben

14 Strukturen können ihrerseits wieder Strukturen als Komponenten enthalten:

15 struct dtadresse{ char strasse[20]; char ort[20]; int plz; }; struct dtdatum{ int tag; int monat; int jahr; }; struct dtperson{ char name[20]; struct dtadresse adresse; struct dtdatum datum; }; int main(){ Deklaration der Struktur dtperson Die Struktur dtperson enthält die Strukturen dtadresse und dtdatum als Komponenten.

16 struct dtadresse a1; struct dtadresse a2 = {"rosenweg","stuttgart",74123}; struct dtdatum d1; struct dtdatum d2 = {7,4,1947}; struct dtperson p1; struct dtperson p2 = {"maier",{"seeweg","urach", 74324}, {8, 7, 1967}}; Deklaration der Variablen p1: Es wird eine Variable angelegt (Speicher reserviert). Deklaration + Initialisierung der Variablen p2: Es wird eine Variable angelegt (Speicher reserviert) + den einzelnen Komponenten Werte zugewiesen

17 struct dtadresse a1; struct dtadresse a2 = {"rosenweg","stuttgart",74123}; struct dtdatum d1; struct dtdatum d2 = {7,4,1947}; struct dtperson p1; struct dtperson p2 = {"maier",{"seeweg","urach", 74324}, {8, 7, 1967}}; p1.adresse.plz = 72669; Auf die Komponente einer mehrfach verschachtelten Struktur wird mit mehreren Punkten. zugegriffen.

18 struct dtadresse a1; struct dtadresse a2 = {"rosenweg","stuttgart",74123}; struct dtdatum d1; struct dtdatum d2 = {7,4,1947}; struct dtperson p1; struct dtperson p2 = {"maier",{"seeweg","urach", 74324}, {8, 7, 1967}}; p1.adresse.plz = 72669; p1.datum.tag = 24; p1.datum.monat = 12; p1.datum.jahr = 2000; Wie setzt man das Datum in der Variablen p1 auf Weihnachten 2000 ?

19 Funktionen und Strukturen:

20 Eine Struktur kann auch als formaler Parameter in einer Funktion benutzt werden.

21 Beispiel (Input-Parameter)

22 void printDatum(struct dtdatum pd){ printf("Tag=%d\n",pd.tag); printf("Monat=%d\n",pd.monat); printf("Jahr=%d\n",pd.jahr); } Ist der formale Parameter pd ein input- (call by value) oder ein output- (call by reference) Parameter ? Er ist ein input-Parameter, weil über ihn nichts aus der Funktion zurückgeliefert wird. Beispiel mit Aufruf kommt nachher !

23 Die Funktion changeDatum soll den Tag, Monat und das Jahr in einer Strukturvariablen setzen. Welche Parameter werden benötigt und welche Aufgabe (input, output) haben sie ?

24 void changeDatum(struct dtdatum *pd, int t, int m, int j){ (*pd).tag = t; (*pd).monat = m; (*pd).jahr = j; } Input-Parameter Output-Parameter pd (ist eine Adresse) Das Datum der Variablen pd wird verändert: Das Datum wird überschrieben.

25 void changeDatum(struct dtdatum *pd, int t, int m, int j){ (*pd).tag = t; (*pd).monat = m; (*pd).jahr = j; } Stattdessen wird oft: pd->tag = t; pd->monat = m; pd->jahr = j; dieser Ausdruck verwendet Mit dem Operator -> kann genauso auf die einzelnen Elemente der Struktur zugegriffen werden: (*pd).tag ist gleichwertig zu pd->tag

26 Beispiel (Funktion und Aufruf)

27 int main(){ struct dtdatum d2 = {7,4,1947}; } void changeDatum(struct dtdatum *pd, int t, int m, int j){ // siehe frühere Folie } void printDatum(struct dtdatum pd){ // siehe frühere Folie } changeDatum(&d2, 17, 8, 1956); printDatum(d2); Mit welchen 2 Aufrufen (Funktionsaufrufe) wird das Datum in d2 auf den 17.8.1956 gesetzt und dann auf dem Bildschirm ausgegeben ?

28 Welchen kleinen Fehler hat das Programm noch ? Warum meldet der Compiler einen Fehler ?

29 Die Struktur dtdatum muß noch deklariert werden. Diese Deklaration darf aber nicht innerhalb von main geschehen, da diese Deklaration dann nicht der Funktion changeDatum bekannt wäre.

30 Deshalb muß dies außerhalb von main und allen anderen Funktionen geschehen ! Dies gilt genauso für die Deklarationen der Funktionen.

31 struct dtdatum{ int tag; int monat; int jahr; }; void printDatum(struct dtdatum pd); void changeDatum(struct dtdatum *pd, int t, int m, int j); int main(){ struct dtdatum d2 = {7, 4, 1947}; changeDatum(&d2, 7, 8, 1956); printDatum(d2); return 0; } void changeDatum(struct dtdatum *pd, int t, int m, int j){ pd->tag = t; pd->monat = m; pd->jahr = j; } // Was fehlt noch ?

32 void printDatum(struct dtdatum pd){ printf("Tag=%d\n",pd.tag); printf("Monat=%d\n",pd.monat); printf("Jahr=%d\n",pd.jahr); }

33 Die Funktion erhoeheJahr soll das Jahr in einer Strukturvariablen um 1 erhöhen. Welche Parameter werden benötigt und welche Eigenschaften (input, output) haben sie ?

34 void erhoeheJahr(struct dtdatum *pd){ (*pd).jahr = (*pd).jahr + 1; } // (*pd).jahr++; // pd->jahr = pd->jahr + 1; // pd->jahr++; // Alternativ dazu möglich wäre: Dieser Parameter wird als input benötigt, weil man die Komponente jahr in pd um 1 erhöhen will). Dieser Parameter wird auch als output verwendet, weil man hier die veränderte Strukturvariable pd (in der die Komponente jahr um 1 erhöht wurde) zurückgibt. Dieser Parameter ist also ein Input/Output-Parameter.

35 void erhoeheJahr(struct dtdatum *pd){ (*pd).jahr = (*pd).jahr + 1; } // (*pd).jahr++; // pd->jahr = pd->jahr + 1; // pd->jahr++; // Alternativ dazu möglich wäre: Kann z.B. die Klammer bei (*pd).jahr weggelassen werden ? Wie groß ist die Priorität der einzelnen Operatoren ? ( ). –> ++ (Assoziativität: links -> rechts) hat höhere Priorität (bindet stärker) als (siehe Hilfe) * (Assoziativität: rechts -> links)


Herunterladen ppt "Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt."

Ähnliche Präsentationen


Google-Anzeigen