Einführung in die Programmiersprache C 4

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmiersprache C/C++
Advertisements

Imperative Programmierung
Forschungszentrum caesar
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Dynamischer Speicher und Struktur
WHILE - Anweisung.
FOR Anweisung.
DO...WHILE Anweisung.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
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 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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Klausur „Diskrete Mathematik II“
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Zusammenfassung Vorwoche
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
Einführung in die Programmiersprache C 1
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung
Informatik 1 Letzte Übung.
Dynamische Datentypen
2.4 Rekursion Klassifikation und Beispiele
Die Grundidee Funktionsaufruf Funktionsname (Kopf) Code der Funktion
Programmierung 1. Einführung Seite 1
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Algorithmen und Datenstrukturen Übungsmodul 8
Programmieren in C Dynamische Listen / Bäume
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Informatik Grundlagen, WS04, Seminar 7
Vorlesung 5. #include double fv(double x) { return sin(x); } int main(){ int i,N=10; double a=1,b=2,del,x,sum,f,integral; for(i=1,sum=0.0,del = (b-a)/N;i
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Übung 2 - MdMT Methoden der Medizintechnik Übung zur Vorlesung Folge 2 – Basics Vom ersten Befehl zum Plot.
1 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // #include struct Knoten { public: void Erzeuge_Kn (int, char*); char* Get_Marke.
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.
Diskrete Mathematik I Vorlesung 2 Arrays.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
1 // Verkettete Liste 3 // demonstriert verkettete Listen und // Rekursion // (mit Entfernen eines Listenelementes) // #include struct Liste { int Element;
Einführung in die Programmiersprache C 2
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Unterprogramme / Methoden
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Pointer, Arrays und verkettete Listen. Mehrdimensionale Arrays  Pointer auf ein Array von Pointern  int32 **matrix = new int32*[3];  matrix: Zeiger.
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.
Klausur „Diskrete Mathematik II“
Raphael Fischer Informatik II - Übung 05 Raphael Fischer
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:

Einführung in die Programmiersprache C 4 Einführung in die Programmiersprache C 4.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig

Zeiger bei Matrizen Es kann nötig sein, eine Matrix zu kopieren, um bei Veränderungen noch auf die Originaldaten zurückgreifen zu können. Das geht nicht so: double **mat,**copy; ... copy=mat; Hier werden nicht die Inhalte der Matrix kopiert, sondern nur der Zeiger auf den Beginn des Speicherbereichs. Veränderungen von Einträgen von mat führen auch zur Veränderung der Einträge von copy. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zeiger bei Matrizen Institut für Mathematische Optimierung – Technische Universität Braunschweig

Andere Operationen Sollen hingegen zwei Matrizen oder Zeilen von Matrizen getauscht werden, so können auch nur die Zeiger getauscht werden: double **mat; **copy, **temp1, *temp2; ... temp1 = mat; mat = copy; copy = temp1; temp2 = mat[17]; mat[17] = mat[43]; mat[43] = temp2;

Lösung double **mat, **copy; mat=alloc_matrix(zeilen,spalten); Die Inhalte müssen elementweise kopiert werden. Dabei müssen die Matrixdimensionen jeweils gleich sein und Speicher für beide Matrizen besorgt werden: double **mat, **copy; mat=alloc_matrix(zeilen,spalten); copy=alloc_matrix(zeilen,spalten); for... copy[i][j]=mat[i][j]; Institut für Mathematische Optimierung – Technische Universität Braunschweig

Speicher für Matrizen freigeben Der für Matrizen besorgte Speicher muss iterativ wieder freigegeben werden: void freeintmatrix(int **matrix, int zeile) { int i; for(i=0;i<zeile;i++) free(matrix[i]); free(matrix); } Institut für Mathematische Optimierung – Technische Universität Braunschweig

Aufgabe Schreiben Sie zwei Funktionen, die dynamisch Speicher reservieren und diesen zurückgeben. Eine Funktion soll dabei Speicher für ein eindimensionales Feld (array) freigeben und die andere Speicher für ein mehrdimensionales Feld (Typ Matrix). Implementieren Sie außerdem eine Funktion, die den für mehrdimensionale Felder besorgten Speicher wieder freigibt. Überlegen Sie hierbei welche Parameter Sie den Funktionen übergeben müssen. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zeigerarithmetik Eine weitere Möglichkeit mit Zeigern zu arbeiten ist die Zeigerarithmetik. Zur Verdeutlichung hier ein kleines Beispiel. Bei dem Feld: int a[]={1,2,3}; zeigt a auf a[0] und a+1 zeigt auf a[1]. Statt scanf(" %d",&a[1]); kann man also scanf(" %d",a+1); schreiben, um den zweiten Wert des arrays zu ändern. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zeigerarithmetik Konsequenterweise gibt es auch a++, ++a, a-- und --a. Die Anweisungen: int *p; int a[]={1,2,3,4}; for (p=a; *p != 4; p++) printf(" %d", *p); sind äquivalent zu: int i; for (i=0; a[i] != 4; i++) printf(" %d", a[i]); Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zeigerarithmetik bei Matrizen Bei Matrizen sieht das noch etwas komplizierter aus: double **mat; mat=alloc_matrix(2,2); mat[0][0]=1.0; mat[0][1]=2.0; mat[1][0]=3.0; mat[1][1]=4.0; Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zeigerarithmetik bei Matrizen printf("mat[0][0] = %f\n",mat[0][0]); printf("mat[1][1] = %f\n",mat[1][1]); printf("**mat = %f\n",**mat); printf("*(*mat+1) = %f\n",*(*mat+1)); printf("*(*(mat+1) ) = %f\n",*(*(mat+1))); printf("*(*(mat+1)+1) = %f\n",*(*(mat+1)+1)); Institut für Mathematische Optimierung – Technische Universität Braunschweig

Aufgabe Schreiben Sie eine 3x3 Matrix sukzessive mit den Werten 1,2,3,… voll. D.h. Zeile 1 enthält die Einträge 1,2,3, Zeile 2 die Einträge 4,5,6 und Zeile 3 die Einträge 7,8,9. Geben Sie darauf per Zeigerarithmetik die komplette Matrix am Bildschirm aus. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Strukturen Objekte verschiedenen Datentyps können zu einem neuen Datentyp kombiniert werden. Beispiel: struct student { char[100] vorname; char[100] nachname; int matrikelnummer; char[100] studienfach; }; Definiert den Datentyp struct student. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Aufbau einer Struktur struct Name { Deklaration1; Deklaration2; ... DeklarationN; }; Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zugriff auf Strukturelemente /* Definition von "Koordinaten": */ struct Koordinaten { double x; double y; double z; }; /* Deklaration einer Variable dieses Typs: */ struct Koordinaten p; p.x=3.0; p.y=p.x; /* Zugriff auf die Elemente: */ p.z=0; Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zuweisungen und Vergleiche Man kann Strukturen als Ganzes zuweisen, aber Vergleiche sind nicht als Ganzes erlaubt. struct Koordinaten p1, p2; p1 = p2; /* Zuweisung */ if (p1==p2) ... /* <-- Fehler */ Die if-Bedingung ist in dieser Form nicht erlaubt, sondern es müssten alle Komponenten der Struktur gesondert auf Gleichheit überprüft werden. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Strukturen und Zeiger Eine Struktur darf sich nicht selbst als Element enthalten, aber sie darf einen Zeiger auf eine Variable vom Typ der eigenen Struktur enthalten. struct knoten { int wert; struct knoten *naechster; }; Die Struktur knoten enthält einen Zeiger auf eine Struktur vom Typ knoten. Darüberhinaus können in jeder Struktur andere Strukturen verwendet werden. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Zugriff auf Strukturzeigerinhalte Auf die einzelnen Datenelemente einer Struktur zuzugreifen, deren Adresse man durch eine Zeigervariable kennt, kann auf verschiedene Arten geschehen: struct knoten *p; (*p).wert=0; /* 1. Art */ p[0].wert=0; /* 2. Art */ p->wert=0; /* 3. Art */ Institut für Mathematische Optimierung – Technische Universität Braunschweig

Strukturen als Parameter Strukturen können als Parameter verwendet werden: struct knoten { int wert; struct knoten *naechster; }; void ausgabewert(struct knoten p) printf("%i\n",p.wert); } Dabei werden sie als Kopie übergeben (call-by-value). Institut für Mathematische Optimierung – Technische Universität Braunschweig

Besser … struct knoten *p; p->wert=0; // p[0].wert=0; oder (*p).wert=0; ausgabewert(p); void ausgabewert(struct knoten *p) { printf("%i\n",p->wert); } Verwendung von einem Zeiger (call-by-reference). Institut für Mathematische Optimierung – Technische Universität Braunschweig

Strukturen als Rückgabewert Strukturen können auch als Rückgabewert verwendet werden: struct knoten { int wert; struct knoten *naechster; }; struct knoten generate() struct knoten result; ... return result; } Institut für Mathematische Optimierung – Technische Universität Braunschweig

Eigene Datentypen Mit dem Schlüsselwort typedef kann man Datentypen mit einem eigenen Namen versehen. Mit: struct knoten_s { int wert; struct knoten_s *naechster; }; typedef struct knoten_s knoten; kann man eine Variable vom Typ struct knoten_s jetzt durch knoten p; deklarieren und das mitunter lästige struct weglassen. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Verkürzte Schreibweise Verkürzte Schreibweise durch Kombination der Deklarationen: typedef struct knoten_s { int wert; struct knoten_s *naechster; } knoten; Andere Anwendungsbeispiele für typedef: typedef unsigned int uint; typedef double real; /* typedef float real; */ (leichter Wechsel zwischen float und double) Institut für Mathematische Optimierung – Technische Universität Braunschweig

Einfach verkettete Listen Mit Hilfe von Strukturen lassen sich Listen erzeugen. Jedes Element (Knoten) der Liste hat einen Zeiger auf seinen Nachfolger. Das erste Element wird Kopf genannt, das letzte Element hat NULL als Nachfolger: Institut für Mathematische Optimierung – Technische Universität Braunschweig

Elemente einfügen Um ein neues Element nach einem Listenelement einzufügen, müssen die Nachfolgezeiger geändert werden: Institut für Mathematische Optimierung – Technische Universität Braunschweig

Elemente einfügen Die Anweisungen dazu sind: knoten *kopf, *vorgaenger, *neuer_knoten; neuer_knoten->naechster=vorgaenger->naechster; vorgaenger->naechster=neuer_knoten; Institut für Mathematische Optimierung – Technische Universität Braunschweig

Elemente am Kopf einfügen Folgende Anweisungen hängen ein neues Element am Kopf an die Liste an: knoten *kopf, *neuer_knoten; neuer_knoten->naechster = kopf; kopf = neuer_knoten; Institut für Mathematische Optimierung – Technische Universität Braunschweig

Elemente entfernen Beim Entfernen eines Elementes muss wiederum der Zeiger des Vorgängerelementes geändert werden. Institut für Mathematische Optimierung – Technische Universität Braunschweig

Elemente entfernen Die Anweisungen dazu sind: knoten *kopf, *vorgaenger, *zu_loeschen; vorgaenger->naechster = zu_loeschen->naechster; free(zu_loeschen); oder beim Entfernen des ersten Elements: kopf = zu_loeschen->naechster; Institut für Mathematische Optimierung – Technische Universität Braunschweig

Durchlaufen einer Liste Listen können z.B. mittels For-Schleife durchlaufen werden: knoten *p; int max_wert; ... max_wert = head->wert; for (p=head; p!=NULL; p=p->naechster) { if (p->wert > max_wert) max_wert = p->wert; } Institut für Mathematische Optimierung – Technische Universität Braunschweig

Rekursion Ruft eine Funktion sich selbst auf, so wird das Rekursion genannt. Diese muss immer eine Abbruchbedingung haben. Beispiel: #include <stdio.h> void printnumbers(int a) { printf("%d ",a); if (a > 0) printnumbers(a-1); } int main() printnumbers(10); return 0;

Schlechtes Beispiel für eine Rekursion Berechnung der Fakultät einer Zahl: unsigned int fakultaet(unsigned int); int main() { printf("%u\n",fakultaet(5)); return 0; } Institut für Mathematische Optimierung – Technische Universität Braunschweig

Schlechtes Beispiel für eine Rekursion unsigned int fakultaet(unsigned int n) { if(n>0) return n*fakultaet(n-1); /* n!=n*(n-1)!*/ else return 1; /* 0!=1 */ } Institut für Mathematische Optimierung – Technische Universität Braunschweig

Besser: Iterative Lösung int main() { int n=5,i,fakultaet=1; for(i=2;i<=n;i++) fakultaet*=i; /* fakultaet=fakultaet*i; */ printf("%d\n",fakultaet); return 0; } Institut für Mathematische Optimierung – Technische Universität Braunschweig

Bäume Analog zu Listen lassen sich auch baumartige Daten- strukturen erzeugen: Institut für Mathematische Optimierung – Technische Universität Braunschweig

Traversierung von Bäumen Sollen alle Knoten eines Baumes abgearbeitet werden, wird oft Rekursion verwendet. Beispiel: double maxwert; // globale Variable void traverse(knoten* r) { if (r->wert > maxwert) maxwert = r->wert; if (r->rechts!=NULL) traverse(r->rechts); if (r->links!=NULL) traverse(r->links); }

Nochmal ohne globale Variable int traverse(knoten* r) { double h; double maxwert; maxwert = r->wert; if (r->rechts!=NULL) { h = traverse(r->rechts); if (h > maxwert) h = maxwert; } if (r->links!=NULL) { h = traverse(r->links); }