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

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

Funktionen, Felder und Parameter-übergabe
Funktionen.
der Universität Oldenburg
der Universität Oldenburg
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
SWITCH - Anweisung.
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
ARRAY oder FELD oder VEKTOR
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
Ein Beispiel in Java.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Dynamischer Speicher und Struktur
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
ARRAY oder FELD oder VEKTOR
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 5 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Einführung in Visual C++
14StrukturKlasse1 Von der Struktur zur Klasse von C zu C++ Von Jens Hoffmann
Arrays,Strings&Pointer in C/C++
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Klassen und Objekte
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Wichtige Fachausdrücke in C
Einführung in die Programmiersprache C 1
Java programmieren mit JavaKara
Informatik Grundlagen, WS04, Seminar 11
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Einführung in die Programmiersprache C 4
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Programmierung 1. Einführung Seite 1
Variablenkonzept Klassisch, in Java Basistyp
Programmbereich, zu dem eine Deklaration gehört Arten von Gültigkeitsbereichen -Namespace : Deklarationen von Klassen, Interfaces, Structs, Enums, Delegates.
Prof. Dr.-Ing. Franz-Josef Behr
Agenda für heute, 12. Mai, 2005 ProzedurenProzeduren Funktionsprozeduren Prozedurparameter Lokale und globale Variablen Datentypen: Ordinaltypen.
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Variablen und Operatoren. C++ Teil 2: Grundstrukturen Variablen Operatoren Kontrollstrukturen Funktionen Header-Dateien Pointer und Referenzen.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Konstruktoren.
Programmieren in C Wie speichert C
Einführung in die Programmierung
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
 Präsentation transkript:

Strukturen

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

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.

Syntax:

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

Beispiel:

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.

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!

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).

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

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

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

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

Strukturen können ihrerseits wieder Strukturen als Komponenten enthalten:

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.

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

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.

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 ?

Funktionen und Strukturen:

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

Beispiel (Input-Parameter)

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 !

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 ?

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.

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

Beispiel (Funktion und Aufruf)

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 gesetzt und dann auf dem Bildschirm ausgegeben ?

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

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.

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

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 ?

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

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 ?

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.

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)