Übungspaket 32 Einfach verkettete, sortierte Liste
|
|
- Günter Schäfer
- vor 7 Jahren
- Abrufe
Transkript
1 Übungspaket 32 Einfach verkettete, sortierte Liste Übungsziele: Skript: 1. Aufbau einer einfach verketteten, sortierten Liste 2. Traversieren von Listen 3. Vereinfachung durch ein Dummy-Element Kapitel: 75 und insbesondere Übungspaket 29 und 31 Semester: Wintersemester 2015/16 Betreuer: Matthias, Kevin und Ralf 2 Synopsis: In diesem Übungspaket werden wir endlich eine einfach verkettete, sortierte Liste programmieren. Dabei orientieren wir uns an der in der Vorlesung vorgestellten Wirth schen Variante, die das Programmieren deutlich vereinfacht. Da das Programmieren sortierter Listen erst mal recht komplex ist, werden wir die wesentlichen Aspekte wiederholen bzw. gezielt darauf hin arbeiten. Also, nicht verzweifeln, sondern einfach probieren...
2 Teil I: Stoffwiederholung Aufgabe 1: Allgemeine Fragen zu Listen Erkläre mit eigenen Worten, was eine einfach verkettete, sortierte Liste ist. Eine Liste besteht aus Elementen, die hintereinander aufgereiht sind. Der Begriff linear besagt, dass es in dieser Liste keinerlei Verzweigungen oder dergleichen gibt. Mit Ausnahme von Anfang und Ende gibt es also immer genau einen Nachfolger sowie einen Vorgänger. Schließlich besagt sortiert, dass die einzelnen Elemente hinsichtlich irgendeines Kriteriums auf- oder absteigend sortiert sind. Was versteht man unter Traversieren? Traversieren bedeutet, dass man eine komplexe Datenstruktur elementweise abarbeitet. Ein Beispiel wäre, dass man eine lineare Liste Element für Element ausgibt. Traversieren könnte aber auch sein, dass man Element für Element löscht. Was ist der Unterschied zwischen einer linearen, sortierten Liste und einem Stack? Von der Struktur her sind beide identisch. Ausgehend von einem Startzeiger folgt Element nach Element, bis man das Ende der Liste erreicht hat. Der einzige Unterschied betrifft die Stelle, an der man neue Elemente einfügt (und wieder entfernt). Bei einem Stack wird immer vorne eingefügt und auch wieder entfernt, weshalb man einen Stack auch mit dem Begriff FIFO für first in first out attributiert. In einer sortierte Liste hingegen, werden die neuen Elemente immer nur dort eingefügt, wo sie die Eigenschaft sortiert aufrecht erhalten; dies kann prinzipiell also an jeder beliebigen Stelle der Liste sein. Aufgabe 2: Detailfragen zu Listen Die folgenden Fragen beziehen sich immer auf eine einfach verkettete, sortierte Liste oder deren Elemente. Wie viele Nachfolger hat jedes Element? Wie viele Vorgänger hat jedes Element? Woran erkennt man das Listenende? Wie findet man den Listenanfang? Wie kann man eine Liste ausgeben? Wie kann man sie invertiert ausgeben? Wie muss man sich das vorstellen? Eines, mit Ausnahme des letzten Elementes Eines, mit Ausnahme des ersten Elementes Der next -Zeiger ist ein Null-Zeiger Mittels eines Startzeigers Am einfachsten mit einer for-schleife Am einfachsten rekursiv Erst den Rest, dann das aktuelle Element 32-1 Wintersemester 2015/16, Einführung in die Praktische Informatik
3 Aufgabe 3: Einfügen neuer Elemente in eine Liste Im Skript haben wir recht ausführlich über die algorithmische Umsetzung des sortierten Einfügens geschrieben. Zur Rekapitulation haben wir eine Reihe von Fragen zusammengetragen. Welche vier Fälle muss man beim Einfügen neuer Elemente beachten? 1. Die Liste kann leer sein; der Startzeiger ist ein Null-Zeiger 2. Das neue Element kommt vor das erste Element 3. Das neue Element kommt irgendwo mitten drin hinein 4. Das neue Element muss an das Ende angehängt werden In wie vielen Fällen wird der Startzeiger verändert? Ist das programmiertechnisch gut oder schlecht? Warum? 2 (zwei) It s: Pain in the Ass Man benötigt Zeiger auf Zeiger In den meisten Fällen benutzt man eine Schleife, um diejenige Stelle zu finden, an der man einfügen möchte. Welches Programmierproblem ergibt sich dadurch? In der Regel bleibt man ein Element zu spät stehen. Daher benötigt man entweder einen zweiten Zeiger, der ein Element hinterher hinkt, oder muss bei der Schleifenbedingung ein weiteres Element vorausschauen. Beides ist nicht besonders schön, lässt sich aber im Standardalgorithmus nicht vermeiden. Aufgabe 4: Die Wirth sche Variante Im Skript haben wir auch die Variante von Wirth diskutiert. Was ist die wesentliche Idee? Es gibt ein zusätzliches Element, das immer am Ende der Liste zu finden ist. Dieses Element gehört zwar technisch zur Liste, ist aber nicht Bestandteil der Datenelemente. Die Wirth sche Idee hat einige Besonderheiten und Vorteile. Hierzu folgende Fragen: Wird der Startzeiger verändert? Wie viele Fälle werden unterschieden? Wofür ist das Dummy Element? Wo bleibt der Suchzeiger stehen? Wie wird dann aber eingefügt? Welchen Algorithmus nehmen wir? Nein, nie, er zeigt immer auf das selbe Element Es gibt nur einen Fall Der Suchzeiger bleibt spätestens hier stehen Ein Element zu spät Durch geschicktes Vertauschen 100-pro den Wirth schen: intelligent und einfach Einführung in die Praktische Informatik, Wintersemester 2015/
4 Teil II: Quiz Aufgabe 1: Positionierung innerhalb von Listen Nehmen wir an, wir haben die folgende Definition einer Liste sowie die folgende Funktion zur Positionierung eines Zeigers. 1 typedef struct user { int i; } DATA ; 2 3 typedef struct _element { 4 struct _element * next ; 5 DATA data ; 6 } ELEMENT, *EP; 7 8 EP position ( EP listp, int val ) 9 { 10 while ( listp -> data.i < val ) 11 listp = listp -> next ; 12 return listp ; 13 } Nun gehen wir davon aus, dass wir bereits die folgende Liste (in unserem Hauptprogramm) aufgebaut haben: start i : 1 i : 3 i : 5 i : 7 Auf welche Elemente zeigen die Zeiger start und p nach folgenden Funktionsaufrufen: Funktionsaufruf start p Anmerkung p = position( start, 3 ) Element 3 p = position( start, -1 ) Element 1 p = position( start->next, -1 ) Element 3 p = position( start, 6 ) Element 7 p = position( start, 7 ) Element 7 p = position( start, 8 ) Programmabsturz: Dereferenzieren eines Null-Zeigers Schlussfolgerung: Programmabsturz, falls val größer als der größte Listenwert ist Wintersemester 2015/16, Einführung in die Praktische Informatik
5 Aufgabe 2: Positionierung: zweiter Versuch Aufgrund des vorherigen Programmabsturzes bei Suchwerten, die größer als das größte Element der Liste waren, haben wir unser Programm wie folgt verändert: 1 typedef struct user { int i; } DATA ; 2 3 typedef struct _element { 4 struct _element * next ; 5 DATA data ; 6 } ELEMENT, *EP; 7 8 EP position ( EP listp, int val ) 9 { 10 while ( listp ->next -> data.i < val ) 11 listp = listp -> next ; 12 return listp ; 13 } Wir betrachten wieder die gleiche Liste sowie die gleichen Funktionsaufrufe: start i : 1 i : 3 i : 5 i : 7 Funktionsaufruf start p Anmerkung p = position( start, 3 ) Element 1 p = position( start, -1 ) Element 1 p = position( start->next, -1 ) Element 3 p = position( start, 6 ) Element 5 p = position( start, 7 ) Element 5 p = position( start, 8 ) Programmabsturz: Dereferenzieren eines Null-Zeigers Schlussfolgerung: Wieder Programmabsturz, falls val größer als der größte Listenwert ist. Der Versuch ging nach hinten los, meint unser Team von Star-Programmierern ;-)) Einführung in die Praktische Informatik, Wintersemester 2015/
6 Aufgabe 3: Positionierung: dritter Versuch So richtig schön waren die beiden vorherigen Versuche nicht. Versuchen wir es also nochmals, diesmal mit einem etwas modifiziertem Algorithmus sowie einer modifizierten Liste. 1 typedef struct user { int i; } DATA ; 2 3 typedef struct _element { 4 struct _element * next ; 5 DATA data ; 6 } ELEMENT, *EP; 7 8 EP position ( EP listp, int val ) 9 { 10 while ( listp -> data.i < val && listp -> next!= 0 ) 11 listp = listp -> next ; 12 return listp ; 13 } start i : 1 i : 5 i : 7 i : BIG Auf welche Elemente zeigen die Zeiger start und p nach folgenden Funktionsaufrufen: Funktionsaufruf start p Anmerkung p = position( start, 3 ) Element 5 p = position( start, -1 ) Element 1 p = position( start, 6 ) Element 7 p = position( start, 7 ) Element 7 p = position( start, 8 ) Element BIG Spätestens bei diesem Element bleibt p stehen. Schlussfolgerung: Kein Programmabsturz :-) Position von p: Beim gesuchten oder nächstgrößeren Element 32-5 Wintersemester 2015/16, Einführung in die Praktische Informatik
7 Aufgabe 4: Speicherallokation Gegeben sei folgendes Programmstück: 1 typedef struct user { int i; } DATA ; 2 3 typedef struct _element { 4 struct _element * next ; 5 DATA data ; 6 } ELEMENT, *EP; 7 8 EP newelement ( int val, EP next ) 9 { 10 EP new = malloc ( sizeof ( ELEMENT ) ); 11 if ( new ) 1 13 new -> data.i = val ; new -> next = next ; 14 } 15 return new ; 16 } Vervollständige das Speicherbild für die folgenden beiden Aufrufe von newelement(). Wie bei fast allen Übungen gehen wir davon aus, dass sowohl int-werte als auch Zeiger immer vier Bytes im Arbeitsspeicher belegen. Ferner nehmen wir an, dass der Aufruf der Funktion newelement() die Adresse 0xFA00 liefert. 1. EP p = newelement( 4711, 0 ); Segment: Stack Adresse Variable Wert 0xFE7C EP p: 0xFA00 Segment: Heap Adresse Wert 0xFA xFA00 0x ELEMENT el; EP p = newelement( 815, & el ); Segment: Stack Adresse Variable Wert 0xFE7C el.data.i: xFE78 el.next : xFE74 EP p : 0xFA00 Segment: Heap Adresse Wert 0xFA xFA00 0xFE78 Vielen hilft es beim Verstehen, wenn sie zusätzlich noch die Zeiger in die Speicherbildchen einzeichnen. Einführung in die Praktische Informatik, Wintersemester 2015/
8 Aufgabe 5: Elemente einfügen Für die beiden letzten Quizaufgaben haben wir den Positionierungsalgorithmus aus Aufgabe 3 um ein paar Zeilen erweitert. Der erste Parameter dieser neuen Funktion ist die bisher im Arbeitsspeicher aufgebaute Liste. Der zweite Parameter ist ein Zeiger auf ein neues Element, wie wir es gerade eben in der vorherigen Aufgabe gesehen haben: 1 void insertelement ( EP list, EP new ) 3 DATA tmp ; 4 while ( list -> data.i < new -> data.i && list -> next!= 0 ) 5 list = list -> next ; 6 tmp = new -> data ; 7 * new = * list ; 8 list -> next = new ; 9 list -> data = tmp ; 10 } In den beiden folgenden Aufgaben wird die Funktion insertelement() immer mit der selben Liste aufgerufen. Sie hat nur ein Datenelement. Beim ersten Mal wird das Datenelement 5, beim zweiten Mal 13 eingefügt. Der in den Abbildungen verwendete start-zeiger ist der im Hauptprogramm verwaltete Startzeiger der Liste. Er dient nur zur Illustierung und wird nicht weiter verwendet. Bearbeite nun die beiden Fälle: 1. Einfügen des Datenelementes 5: Zeile 3: start new i : 9 i : 5 i : BIG Ende Zeile 9: list start new i : 5 i : 9 i : BIG 32-7 Wintersemester 2015/16, Einführung in die Praktische Informatik
9 2. Einfügen des " Datenelementes\ 13: Zeile 3: start new i : 9 i : 13 i : BIG Ende Zeile 9: list start new i : 9 i : BIG i : 13 Damit wären wir jetzt für den Anwendungsfall gerüstet. Einführung in die Praktische Informatik, Wintersemester 2015/
10 Teil III: Fehlersuche Aufgabe 1: Ausgabe von Listen Die meisten Fehler- und Problemfälle haben wir bereits besprochen. Doch Dr. L. Ist- Wirth hat das Ausgeben Wirth scher Listen noch nicht im Griff. Was lief hier schief...? 1 void prtlist ( EP p ) 3 printf ( " Liste :" ); 4 do { 5 p = p-> next ; 6 printf ( " %i", p-> data.i ); 7 } while ( p!= 0 ); 8 printf ( "\n" ); 9 } Leider erscheinen hier einige Anweisungen in genau der falschen Reihenfolge. Zeile Fehler Erläuterung Korrektur 7 Hier wird bereits zum nächsten Element weiter gegangen. Das wäre eigentlich nicht so schlimm, doch ist bis hier beim ersten Schleifendurchlauf noch nicht ausgegeben worden. Insofern würde das erste Datenelement verborgen bleiben. auf später verschieben Die Schleife läuft so lange, wie der Zeiger p kein Null- Zeiger ist. Dadurch wird auch das letzte Element der Liste ausgeben. In einer Wirth schen Liste ist dies aber das Dummy-Element und gehört nicht zum Datenbestand und sollte auch nicht ausgegeben werden. Programm mit Korrekturen: 1 # include <stdio.h> 2 3 void prtlist ( EP p ) 4 { 5 printf ( " Liste :" ); 6 for ( ; p-> next ; p = p-> next ) 7 printf ( " %i", p-> data.i ); 8 printf ( "\n" ); 9 } p->next!= Wintersemester 2015/16, Einführung in die Praktische Informatik
11 Teil IV: Anwendungen Aufgabe 1: Definition einer geeigneten Datenstruktur 1. Aufgabenstellung Definiere eine Datenstruktur für lineare Listen, in der jedes Element ein einzelnes Zeichen aufnehmen kann. 2. Kodierung In Anlehnung an Übungspaket 31 definieren wir folgende Datenstruktur: 1 typedef struct user { 2 char c; 3 } DATA, *DP; // the user data 4 5 typedef struct _list_element { 6 struct _list_element * next ; // the admin part 7 DATA data ; // the user data part 8 } ELEMENT, *EP; Aufgabe 2: Allokation eines neuen Elementes 1. Aufgabenstellung Entwickle eine Funktion, die dynamisch ein neues Listenelement generiert. 2. Entwurf Deklaration: neues Element alloziieren: EP newelement( char c, EP next ); 3. Kodierung 1 EP newelement ( char c, EP next ) 3 EP p = malloc ( sizeof ( ELEMENT ) ); 4 if ( p ) // do we have a new element? 5 { 6 p-> data.c = c; p-> next = next ; // initialize 7 } 8 return p; 9 } Einführung in die Praktische Informatik, Wintersemester 2015/
12 Aufgabe 3: Sortiertes Einfügen eines neuen Elementes 1. Aufgabenstellung Nun wird s ernst. Entwickle eine Funktion, die ein neues Element an der richtigen Stelle in die Liste einfügt. Wir gehen wieder davon aus, dass die Elemente der Liste aufsteigend sortiert werden sollen. 2. Entwurf Vervollständige zunächst die Funktionsdeklaration: Neues Element einfügen: void insertelement( EP oldlist, EP newelement ); 3. Kodierung 1 void insertelement ( EP oldlist, EP newelement ) 3 DATA tmp = newelement - > data ; 4 while ( oldlist -> next 5 && newelement -> data.c > oldlist -> data.c ) 6 oldlist = oldlist - > next ; 7 * newelement = * oldlist ; 8 oldlist - > next = newelement ; 9 oldlist -> data = tmp ; 10 } Um später die Daten leichter einfügen zu können, schreiben wir uns gleich noch eine kleine Hilfsfunktion, die das Ausgeben möglicher Fehlermeldungen kapselt. Damit können wir uns jederzeit ein paar sinnvolle Testausgaben generieren, um beispielsweise den aktuellen Zustand der Liste zu erfragen. 1 int insertdata ( EP list, char c ) 3 EP p = newelement ( c, 0 ); // a new element 4 if ( p == 0 ) // ran out of memory? 5 { 6 fprintf ( stderr, " can t insert %c", c ); 7 fprintf ( stderr, "; no space available \ n" ); 8 } 9 else insertelement ( list, p ); // ok, all clear 10 return p!= 0; 11 } Durch den Ausdruck der return-anweisung in Zeile 10 erfährt die aufrufende Stelle, ob die Daten eingefügt werden konnten Wintersemester 2015/16, Einführung in die Praktische Informatik
13 Aufgabe 4: Ausgabe der Liste 1. Aufgabenstellung Entwickle eine Funktion, die nacheinander alle Elemente einer übergebenen Liste ausgibt. 2. Entwurf Vervollständige zunächst die Funktionsdeklaration: Liste ausgeben: void prtlist( EP list ); 3. Kodierung Diese Funktion ist sehr einfach. Wir müssen nur alle Elemente außer dem letzten in einer Schleife ausgeben. Das letzte Element erkennen wir daran, dass sein next-zeiger ein Null-Zeiger ist. 1 void prtlist ( EP p ) 3 printf ( " Liste :" ); 4 for ( ; p-> next ; p = p-> next ) 5 printf ( " %c", p-> data.c ); 6 printf ( "\n" ); 7 } Aufgabe 5: Initialisierung der Liste 1. Aufgabenstellung Jetzt fehlt noch die richtige Initialisierung einer neuen Liste. Im Skript haben wir gesehen, dass der konkrete Datenwert des Dummys unerheblich ist. Wichtig ist hingegen, dass der Next-Zeiger ein Null-Zeiger ist. Dies lässt sich einfach realisieren. 2. Kodierung 1 EP first = newelement ( x, 0 ); // dummy element Zur Erinnerung: Bei der Wirth schen Alternative ist es egal, was für ein Wert im letzten Element steht. Wir haben hier völlig willkürlich ein x gewählt; es hätte auch jeder beliebige andere Wert sein können. Der entscheidende Punkt ist, wie bereits mehrfach gesagt, dass der Next-Zeiger ein Null-Zeiger ist. Einführung in die Praktische Informatik, Wintersemester 2015/
14 Aufgabe 6: Ein Hauptprogramm zum Testen Den bereits erlernten argc/argv Mechanismus (siehe auch Übungspaket 25) können wir hier sehr gut zum intelligenten Testen unseres Listen-Programms verwenden. Wenn wir auf diesen Mechanismus zurückgreifen, brauchen wir nicht alles fest im Hauptprogramm zu kodieren und können leicht und umfangreich testen. 1. Aufgabenstellung Entwickle ein Hauptprogramm, mit dessen Hilfe wir unsere Listen-Funktionen in geeigneter Art und Weise testen können. Mit Hilfe des argc/argv-mechanismus soll das Hauptprogramm die folgenden Funktionalitäten anbieten: 1. Egal, wie wir unser Programm aufrufen, soll es die Liste direkt nach der Initialisierung sowie vor dem Programmende ausgeben. 2. Das erste Argument (argv[1]) soll alle Zeichen enthalten, die wir in die Liste aufnehmen. Beispiel:./myListe vacation soll am Ende zu folgender Ausgabe führen: a a c i n o t v 3. Sollte noch ein zweites Argument (argv[2]) angegeben werden, dann soll die Liste nach jedem Einfügen ausgegeben werden. Mittels der bisherigen Vorübungen, insbesondere Übungspaket 25, sollte die Umsetzung keine größeren Schwierigkeiten bereiten. 2. Kodierung 1 int main ( int argc, char ** argv ) 3 char *p; 4 EP first = newelement ( x, 0 ); // dummy element 5 prtlist ( first ); // check after initialization 6 if ( argc > 1 ) 7 { 8 for ( p = argv [ 1 ]; *p; p++ ) 9 { 10 insertdata ( first, * p ); 11 if ( argc > 2 ) // debug mode 12 prtlist ( first ); 13 } 14 prtlist ( first ); 15 } 16 else printf ( " sorry, keine Daten vorhanden \ n" ); 17 } Die nächsten beiden Seiten geben das Programm nochmals vollständig wieder Wintersemester 2015/16, Einführung in die Praktische Informatik
15 Definition der Datenstrukturen: 1 # include <stdio.h> // for I/O 2 # include < stdlib. h > // for malloc () 3 4 typedef struct user { 5 char c; 6 } DATA, *DP; // the user data 7 8 typedef struct _list_element { 9 struct _list_element * next ; // the admin part 10 DATA data ; // the user data part 11 } ELEMENT, *EP; Allokation eines neuen Elementes: 13 EP newelement ( char c, EP next ) 14 { 15 EP p = malloc ( sizeof ( ELEMENT ) ); 16 if ( p ) // do we have a new element? 17 { 18 p-> data.c = c; p-> next = next ; // initialize 19 } 20 return p; 21 } Einfügen eines neuen Elementes: 23 void insertelement ( EP oldlist, EP newelement ) 24 { 25 DATA tmp = newelement - > data ; 26 while ( oldlist - > next 27 && newelement -> data.c > oldlist -> data.c ) 28 oldlist = oldlist - > next ; 29 * newelement = * oldlist ; 30 oldlist - > next = newelement ; 31 oldlist -> data = tmp ; 32 } Einführung in die Praktische Informatik, Wintersemester 2015/
16 Einfügen neuer Daten: 34 int insertdata ( EP list, char c ) 35 { 36 EP p = newelement ( c, 0 ); // a new element 37 if ( p == 0 ) // ran out of memory? 38 { 39 fprintf ( stderr, " can t insert %c", c ); 40 fprintf ( stderr, "; no space available \ n" ); 41 } 42 else insertelement ( list, p ); // ok, all clear 43 return p!= 0; 44 } Ausgabe der Liste: 46 void prtlist ( EP p ) 47 { 48 printf ( " Liste :" ); 49 for ( ; p-> next ; p = p-> next ) 50 printf ( " %c", p-> data.c ); 51 printf ( "\n" ); 52 } Das Hauptprogramm: 54 int main ( int argc, char ** argv ) 55 { 56 char *p; 57 EP first = newelement ( x, 0 ); // dummy element 58 prtlist ( first ); // check after initialization 59 if ( argc > 1 ) 60 { 61 for ( p = argv [ 1 ]; *p; p++ ) 6 63 insertdata ( first, * p ); 64 if ( argc > 2 ) // debug mode 65 prtlist ( first ); 66 } 67 prtlist ( first ); 68 } 69 else printf ( " sorry, keine Daten vorhanden \ n" ); 70 } Endlich fertig :-) Wintersemester 2015/16, Einführung in die Praktische Informatik
17 Nachlese Die meisten werden froh sein, die Listenverarbeitung halbwegs hinbekommen zu haben. Wenn man sich aber die Lösung mit etwas zeitlichem Abstand nochmals anschaut, wird man die eine oder andere Stelle finden, die nicht ganz so schön geworden ist. Dies betrifft insbesondere die Funktionen newelement() und insertelement(). Warum? Ganz einfach. Ein Teil dieser Funktionen ist recht generisch, d.h. auch bei anderen Aufgaben einsetzbar. Andererseits sind einige Komponenten genau auf die gestellte Aufgabe zugeschnitten. Also nix da mit Kopieren, wenn man die Algorithmen für die nächste Aufgabe verwenden möchte. Im Umkehrschluss heißt das: Für die Wiederverwendbarkeit wäre es schön, wenn wir einen aufgabenspezifischen und einen generellen (auch generisch genannten) Teil hätten. Und das ist gar nicht so schwer. Wenn man erst einmal die richtige Position hat (Zeiger pos wie im Quiz), kann man das Erzeugen und Einfügen eines neuen Elementes wie folgt realisieren: 1 EP newelement ( DATA data, EP next ) // generic 3 EP p = malloc ( sizeof ( ELEMENT ) ); 4 if ( p ) // do we have a new element? 5 { 6 p-> data = data ; p-> next = next ; // initialize 7 } 8 return p; 9 } int insertelement ( EP pos, DATA data ) // generic 1 13 EP new = newelement ( pos ->data, pos -> next ); 14 if ( new ) 15 { 16 pos -> next = new ; 17 pos -> data = data ; 18 } 19 return new!= 0; 20 } Für unsere Zeichen-Liste ist das Finden der richtigen Position sehr einfach: 1 EP findposition ( EP liste, char c ) // specific : based on c 3 while ( liste -> data.c < c && liste -> next ) 4 liste = liste -> next ; 5 return liste ; 6 } Einführung in die Praktische Informatik, Wintersemester 2015/
18 Um ein neues Zeichen in die Liste einzufügen, müssen wir nun alle drei Funktionen in der richtigen Art und Weise verknüpfen. Dabei nutzen wir aus, dass wir das neue Element nicht mit irgendwelchen Daten vorinitialisieren sonder das gefundene Element einfach duplizieren: 1 int insertdata ( EP list, char c ) // specific 3 DATA data = { c }; // wrapping into struct 4 if (! insertelement ( findposition ( list, c ), data )) 5 { 6 fprintf ( stderr, " can t insert %c", c ); 7 fprintf ( stderr, "; no space available \ n" ); 8 return 0; 9 } 10 return 1; 11 } Und der Rest bleibt unverändert: 1 void prtlist ( EP p ) 3 printf ( " Liste :" ); 4 for ( ; p-> next ; p = p-> next ) 5 printf ( " %c", p-> data.c ); 6 printf ( "\n" ); 7 } 8 9 int main ( int argc, char ** argv ) 10 { 11 char *p; 12 DATA data = { x }; 13 EP first = newelement ( data, 0 ); // dummy element 14 prtlist ( first ); // check after initialization 15 if ( argc > 1 ) 16 { 17 for ( p = argv [ 1 ]; *p; p++ ) 18 { 19 insertdata ( first, * p ); 20 if ( argc > 2 ) // debug mode 21 prtlist ( first ); 22 } 23 prtlist ( first ); 24 } 25 else printf ( " sorry, keine Daten vorhanden \ n" ); 26 } Wintersemester 2015/16, Einführung in die Praktische Informatik
19 Aufgabe 7: Doppelt verkettete Listen In dieser letzten Übungsaufgabe geht es um doppelt verkettete Listen. Die Bearbeitung ist vor allem theoretischer Natur, weshalb das Implementieren und Testen am Rechner freiwillig sind. Wohin zeigen die Zeiger bei doppelt verketteten Listen? Bei einer doppelt verketteten Liste benötigt man immer zwei Zeiger, einer zeigt zum Nachfolger, der andere zum Vorgänger. Definiere eine Datenstruktur für ein Element einer doppelt verketteten Liste, die ein int und zwei double Variablen aufnehmen kann. 1 typedef struct user 3 int i; 4 double d1, d2; 5 } DATA, *DP; 6 7 typedef struct _element 8 { 9 struct _element * previous, * next ; 10 DATA data ; 11 } D_LIST, * DLP ; Skizziere an einem Beispiel, welche Zeiger beim Einfügen eines neuen Elementes in eine bereits vorhandene Liste in welcher Form umgehängt werden müssen. Die Grafik zeigt zwei Elemente einer doppelt verketteten Liste. Der Zeiger q zeigt auf das neue Element, das hinter das Element eingefügt werden soll, auf das p zeigt. Die Nummern beziehen sich auf folgendem Programmausschnitt. p q (4) (3) (2) (1) 1 p->next -> previous = q; 2 q-> previous = p; 3 q-> next = p-> next ; 4 p-> next = q; Einführung in die Praktische Informatik, Wintersemester 2015/
Übungspaket 32 Einfach verkettete, sortierte Liste
Übungspaket 32 Einfach verkettete, sortierte Liste Übungsziele: Skript: 1. Aufbau einer einfach verketteten, sortierten Liste 2. Traversieren von Listen 3. Vereinfachung durch ein Dummy-Element Kapitel:
MehrÜbungspaket 29 Dynamische Speicherverwaltung: malloc() und free()
Übungspaket 29 Dynamische Speicherverwaltung malloc() und free() Übungsziele Skript In diesem Übungspaket üben wir das dynamische Alloziieren 1. und Freigeben von Speicherbereichen 2. von Zeichenketten
MehrÜbungspaket 20 Zeiger und Zeigervariablen
Übungspaket 20 Zeiger und Zeigervariablen Übungsziele: Skript: 1. Definition von Zeigervariablen 2. Verwendung von Zeigern 3. Arrays und Adressberechnungen Kapitel: 45 und 46 Semester: Wintersemester 2017/18
MehrÜbungspaket 29 Dynamische Speicherverwaltung: malloc() und free()
Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free() Übungsziele: Skript: In diesem Übungspaket üben wir das dynamische Alloziieren 1. und Freigeben von Speicherbereichen 2. von Zeichenketten
MehrÜbungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)
Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks) Übungsziele: Skript: 1. Definieren einer dynamischen Datenstruktur 2. Dynamische Speicher Speicherallokation 3. Implementierung eines
MehrÜbungspaket 22 Rekursive Funktionsaufrufe
Übungspaket 22 Rekursive Funktionsaufrufe Übungsziele: Skript: 1. Technische Voraussetzungen für rekursive Funktionsaufrufe 2. Umsetzung mathematisch definierter Rekursionen in entsprechende C-Programme
MehrÜbungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)
Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks) Übungsziele: Skript: 1. Definieren einer dynamischen Datenstruktur 2. Dynamische Speicher Speicherallokation 3. Implementierung eines
MehrÜbungspaket 20 Zeiger und Zeigervariablen
Übungspaket 20 Zeiger und Zeigervariablen Übungsziele: Skript: 1. Definition von Zeigervariablen 2. Verwendung von Zeigern 3. Arrays und Adressberechnungen Kapitel: 45 und 46 Semester: Wintersemester 2017/18
MehrÜbungspaket 23 Mehrdimensionale Arrays
Übungspaket 23 Mehrdimensionale Arrays Übungsziele: Skript: Deklaration und Verwendung mehrdimensionaler Arrays Kapitel: 49 Semester: Wintersemester 2016/17 Betreuer: Kevin, Matthias, Thomas und Ralf Synopsis:
MehrÜbungspaket 14 Eindimensionale Arrays
Übungspaket 14 Eindimensionale Arrays Übungsziele: Skript: Deklaration und Verwendung eindimensionaler Arrays Kapitel: 33 Semester: Wintersemester 2016/17 Betreuer: Kevin, Matthias, Thomas und Ralf Synopsis:
MehrÜbungspaket 23 Mehrdimensionale Arrays
Übungspaket 23 Mehrdimensionale Arrays Übungsziele: Skript: Deklaration und Verwendung mehrdimensionaler Arrays Kapitel: 49 Semester: Wintersemester 2016/17 Betreuer: Kevin, Matthias, Thomas und Ralf Synopsis:
MehrÜbungspaket 25 Kommandozeilenargumente
Übungspaket 25 Kommandozeilenargumente Übungsziele: Skript: 1. Umgang mit argc/argv 2. argc/argv als Schnittstelle von Programm und Betriebssystem 3. Vereinfachtes Testen mit argc/argv Kapitel: 51 und
MehrVariablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes
Variablen Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes v ist Stück im Speicher, der 4 Bytes lang ist Speicherzugriff? Über Adressen!
MehrÜbungspaket 9 Logische Ausdrücke
Übungspaket 9 Logische Ausdrücke Übungsziele: Skript: 1. Umgang mit logischen Vergleichs- und Verknüpfungsoperatoren 2. Bilden einfacher und komplexer logischer Ausdrücke Kapitel: 22 Semester: Wintersemester
MehrK Ergänzungen zur Einführung in C
K Ergänzungen zur Einführung in C K Ergänzungen zur Einführung in C K.1 Zeiger, Felder und Zeichenketten Zeichenketten sind Felder von Einzelzeichen (char), die in der internen Darstellung durch ein \0
MehrÜbungspaket 17 Der gcc Compiler
Übungspaket 17 Der gcc Compiler Übungsziele: Skript: 1. Sicherer Umgang mit gemischten Ausdrücken 2. Herleiten der unterschiedlichen Datentypen in gemischten Ausdrücken 3. Kenntnis über die implizite Durchführung
MehrÜbungspaket 12 Der Datentyp char
Übungspaket 12 Der Datentyp char Übungsziele: Skript: 1. Umgang mit dem Datentyp char, 2. Deklarationen von char-variablen, 3. char-konstanten 4. und char-rechenoperationen. Kapitel: 29 bis 31 sowie 24,
Mehr7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});
S. d. I.: Programieren in C Folie 7-1 7 Funktionen 7.1 Definition Prototyp-Syntax: Speicherklasse Typ Name (formale Parameter); der Funktions-Prototyp deklariert eine Funktion, d.h. er enthält noch nicht
MehrÜbungspaket 10 Fallunterscheidungen
Übungspaket 10 Fallunterscheidungen Übungsziele: Skript: 1. Umgang mit der einfachen Fallunterscheidung, 2. sowie mehrfachen Fallunterscheidung und 3. problemangepasster Auswahl Kapitel: 24 und 25 Semester:
MehrAdvanced Programming in C
Advanced Programming in C Pointer und Listen Institut für Numerische Simulation Rheinische Friedrich-Wilhelms-Universität Bonn Oktober 2013 Überblick 1 Variablen vs. Pointer - Statischer und dynamischer
MehrÜbungspaket 7 Angemessenes Formatieren von C-Programmen
Übungspaket 7 Angemessenes Formatieren von C-Programmen Übungsziele: Skript: 1. Gute Layout-Struktur durch Einrücken. Richtiges Verwenden von Kommentaren Kapitel: 19 Semester: Wintersemester 016/17 Betreuer:
MehrÜbungspaket 8 Datentyp int
Übungspaket 8 Datentyp int Übungsziele: Skript: 1. Umgang mit dem Datentyp int, 2. Deklarationen von int-variablen, 3. int-konstanten 4. und int-rechenoperationen. Kapitel: 21 Semester: Wintersemester
MehrC- Kurs 09 Dynamische Datenstrukturen
C- Kurs 09 Dynamische Datenstrukturen Dipl.- Inf. Jörn Hoffmann jhoffmann@informaak.uni- leipzig.de Universität Leipzig InsAtut für InformaAk Technische InformaAk Flexible Datenstrukturen Institut für
MehrÜbungspaket 13 Der Datentyp double
Übungspaket 13 Der Datentyp double Übungsziele: Skript: 1. Umgang mit dem Datentyp double, 2. Deklarationen von double-variablen, 3. double-konstanten 4. und double-rechenoperationen. Kapitel: 32 Semester:
MehrGrundlagen der Informatik
Grundlagen der Informatik Klausur 1. August 2008 1. Dynamische Datenstrukturen und objektorientierte Programmierung (45 Punkte) Gegeben sei eine Datenstruktur mit folgendem Aufbau struct lelem { int w;
MehrAlgorithmen und Datenstrukturen (für ET/IT)
Algorithmen und Datenstrukturen (für ET/IT) Wintersemester 2012/13 Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Wiederholung: Ziele der Vorlesung Wissen: Algorithmische
MehrKlausur Kompaktkurs Einführung in die Programmierung Dr. T. Weinzierl & M. Sedlacek 25. März 2011
Kompaktkurs Einführung in die Programmierung Klausur Seite 1/10 Name, Vorname, Unterschrift: Matrikelnummer: Wichtig: Klausur Kompaktkurs Einführung in die Programmierung Dr. T. Weinzierl & M. Sedlacek
MehrÜbungspaket 22 Rekursive Funktionsaufrufe
Übungspaket 22 Rekursive Funktionsaufrufe Übungsziele: Skript: 1. Technische Voraussetzungen für rekursive Funktionsaufrufe 2. Umsetzung mathematisch definierter Rekursionen in entsprechende C-Programme
MehrÜbungspaket 12 Der Datentyp char
Übungspaket 1 Der Datentyp char Übungsziele: Skript: 1. Umgang mit dem Datentyp char,. Deklarationen von char-variablen, 3. char-konstanten 4. und char-rechenoperationen. Kapitel: 9 bis 31 sowie 4, 5 und
MehrLineare Liste. struct list_element { float f; /* weitere Elemente */ struct list_element *next; /* Zeiger auf Nachfolger-Element */ }; Peter Sobe
Lineare Liste Zeigertechnik zum dynamischen Herstellen und Lösen von Verbindungen zwischen Datenelementen Einsatz des Verbundtyps struct {...} in Kombination mit Zeigern. Da das Element selbst eine Struktur
MehrAlgorithmen und Datenstrukturen (für ET/IT) Wiederholung: Ziele der Vorlesung. Wintersemester 2012/13. Dr. Tobias Lasser
Algorithmen und Datenstrukturen (für ET/IT) Wintersemester 2012/13 Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Wiederholung: Ziele der Vorlesung Wissen: Algorithmische
MehrGrundlagen der Informatik
Grundlagen der Informatik Musterklausur 1. Dynamische Datenstrukturen und objektorientierte Programmierung Zur Verwaltung einer digitalen Fotogalerie sollen Techniken der objektorientierten Programmierung
MehrÜbungspaket 21 Funktionen mit Zeigern und Arrays als Parameter
Übungspaket 21 Funktionen mit Zeigern und Arrays als Parameter Übungsziele: Skript: 1. Funktionen mit Zeigern als Parameter 2. Emulation von Variablenparametern 3. Funktionen mit Arrays als Parameter 4.
MehrAlgorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine
MehrProbeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten
Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, 13.00-14.45 Uhr Bearbeitungszeit: 105 Minuten Schalten Sie ihr Mobiltelefon aus. Bei der Klausur ist als einziges
MehrÜbungen zu Programmierung I - Blatt 8
Dr. G. Zachmann A. Greß Universität Bonn Institut für Informatik II 1. Dezember 2004 Wintersemester 2004/2005 Übungen zu Programmierung I - Blatt 8 Abgabe am Mittwoch, dem 15.12.2004, 15:00 Uhr per E-Mail
MehrProbeklausur Name: (c)
Einführung in die Praktische Informatik 30.1.2013 Probeklausur Name: Teil I: Datentypen (20 Punkte) Lösen sie die Probleme, indem sie die korrekten Lösungen ankreuzen bzw. in die vorgesehenen Freiräume
MehrÜbungspaket 4 Funktionszeiger
Übungspaket 4 Funktionszeiger Übungsziele: Literatur: 1. Verstehen von Funktionszeigern. 2. Anwenden von Funktionszeigern. C-Skript 1, Kapitel: 85 Semester: Wintersemester 2017/18 Betreuer: Kevin, Peter
MehrPraxis der Programmierung
Dynamische Datentypen Institut für Informatik und Computational Science Universität Potsdam Henning Bordihn Einige Folien gehen auf A. Terzibaschian zurück. 1 Dynamische Datentypen 2 Dynamische Datentypen
MehrÜbungen zu Systemprogrammierung 1
Übungen zu Systemprogrammierung 1 Ü1-2 Speicherverwaltung Sommersemester 2018 Christian Eichler, Jürgen Kleinöder Lehrstuhl für Informatik 4 Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl
MehrVorlesung Datenstrukturen
Vorlesung Datenstrukturen Lineare Listen (1) Einfach verkettete Listen Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 148 Wiederholung Felder Vorteil Der Zugriff auf ein beliebiges
MehrÜbungen zu Systemprogrammierung 1 (SP1)
Übungen zu Systemprogrammierung 1 (SP1) Ü1-2 Speicherverwaltung Andreas Ziegler, Stefan Reif, Jürgen Kleinöder Lehrstuhl für Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität
MehrÜbungspaket 28 Module und getrenntes Übersetzen
Übungspaket 28 Module und getrenntes Übersetzen Übungsziele: Skript: 1. Verteilen von Programmteilen auf mehrere Dateien 2. Richtige Verwendung der Header-Dateien 3. Richtiger Umgang mit dem C-Compiler
MehrInformatik I (D-MAVT)
Informatik I (D-MAVT) Übungsstunde 7 simon.mayer@inf.ethz.ch Distributed Systems Group, ETH Zürich Ablauf Nachbesprechung Übung 5 Besprechung/Vertiefung der Vorlesung Vorbesprechung Übung 7 Aufgabe 1:
Mehreinlesen n > 0? Ausgabe Negative Zahl
1 Lösungen Kapitel 1 Aufgabe 1.1: Nassi-Shneiderman-Diagramm quadratzahlen Vervollständigen Sie das unten angegebene Nassi-Shneiderman-Diagramm für ein Programm, welches in einer (äußeren) Schleife Integer-Zahlen
MehrNachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.
Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende
MehrEs ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.
Ziele sind das Arbeiten mit Funktionen und dem Aufzählungstyp (enum), sowie - einfache Verzweigung (if else) - Alternativen switch case - einfache Schleifen (while oder do while) Aufgabe 3: Diese Aufgabe
MehrÜbungspaket 4 Klassifikation von Dreiecken
Übungspaket 4 Klassifikation von Dreiecken Übungsziele: Skript: 1. Selbstständiges Entwickeln eines ersten Programms 2. Anwenden der Methoden des Software Life Cycles 3. Programmentwurf durch Anwendung
MehrInformatik Repetitorium SS 2009. Volker Jaedicke Volker.Jaedicke@web.de 0179 1322692
Informatik Repetitorium SS 2009 Volker Jaedicke Volker.Jaedicke@web.de 0179 1322692 Operatoren und Datentypen Beispiel: Anweisungen Variable int a float b int c a= a % (int) (++b-1/4) Vorher 36 3.5 c=b
MehrProgrammiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny 11. Dynamische Datenstrukturen 11.1 Lineare Liste Eine lineare Liste (auch einfach verkettete Liste ) ist eine Art Array mit flexibler Länge.
MehrAlgorithmen und Datenstrukturen (für ET/IT)
Algorithmen und Datenstrukturen (für ET/IT) Wintersemester 2012/13 Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Feedback Vielen Dank für das Feedback auf Moodle! Bitte
MehrC/C++-Programmierung
1 C/C++-Programmierung Speicherverwaltung, 0, const Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010 2 Speicherverwaltung
MehrEinführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.
Einführung Elementare Datenstrukturen (Folie 38, Seite 23 im Skript) Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst. Einführung Elementare Datenstrukturen
Mehr7. Verkettete Strukturen: Listen
7. Verkettete Strukturen: Listen Java-Beispiele: IntList.java List.java Stack1.java Version: 4. Jan. 2016 Vergleich: Schwerpunkte Arrays verkettete Listen Listenarten Implementation: - Pascal (C, C++):
MehrSchwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen
Schwerpunkte 7. Verkettete Strukturen: Listen Java-Beispiele: IntList.java List.java Stack1.java Vergleich: Arrays verkettete Listen Listenarten Implementation: - Pascal (C, C++): über Datenstrukturen
MehrÜbungspaket 19 Programmieren eigener Funktionen
Übungspaket 19 Programmieren eigener Funktionen Übungsziele: Skript: 1. Implementierung und Kodierung eigener Funktionen 2. Rekapitulation des Stack-Frames 3. Parameterübergabe mittels Stack und Stack-Frame
MehrInformatik I (D-MAVT)
Informatik I (D-MAVT) Übungsstunde 8, 22.4.2009 simonmayer@student.ethz.ch ETH Zürich Aufgabe 1: Pointer & Structs Schauen wir s uns an! Aufgabe 2: Grossteils gut gemacht! Dynamische Arrays! Sortieren:
MehrFallstudie: Online-Statistik
Fallstudie: Online-Statistik Ziel: Klasse / Objekt, welches Daten konsumiert und zu jeder Zeit Statistiken, z.b. Mittelwert, Varianz, Median (etc.) ausgeben kann Statistics s = new Statistics(maxSize);...
MehrInformatik 1 ( ) D-MAVT F2010. Klassen. Yves Brise Übungsstunde 9
Informatik 1 (251-0832-00) D-MAVT F2010 Klassen Aufgabennachschub Informatik für Mathematiker und Physiker (251-0847-00) von Bernd Gärtner gehalten im Wintersemester. http://www.ti.inf.ethz.ch/ew/courses/info1_09/
MehrÜbungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 E-Uebung3.fm
E 3. Übung E 3. Übung Besprechung 1. Aufgabe Aufgabe 3: malloc Debugger gdb E.1 1. Include, Deklarationen #include #include void append_element(int value); int remove_element(void);
MehrTeil 5: Felder, Zeiger, Zeigerarithmetik Gliederung
Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung Felder (Arrays) Mehrdimensionale Felder Zeiger und Adressen Zeigerarithmetik Felder Mehrdimensionale Felder Zeiger und Adressen Zeigerarithmetik Felder
MehrÜbungspaket 21 Funktionen mit Zeigern und Arrays als Parameter
Übungspaket 21 Funktionen mit Zeigern und Arrays als Parameter Übungsziele: Skript: 1. Funktionen mit Zeigern als Parameter 2. Emulation von Variablenparametern 3. Funktionen mit Arrays als Parameter 4.
MehrAlgorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Wintersemester 2013/14 1. Vorlesung Kapitel 1: Sortieren Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I Das Problem Eingabe Gegeben: eine Folge A = a 1, a 2,..., a
MehrÜbungspaket 7 Angemessenes Formatieren von C-Programmen
Übungspaket 7 Angemessenes Formatieren von C-Programmen Übungsziele: Skript: 1. Gute Layout-Struktur durch Einrücken. Richtiges Verwenden von Kommentaren Kapitel: 19 Semester: Wintersemester 018/19 Betreuer:
MehrGI Vektoren
Vektoren Problem: Beispiel: viele Variablen vom gleichen Typ abspeichern Text ( = viele char-variablen), Ergebnisse einer Meßreihe ( = viele int-variablen) hierfür: Vektoren ( = Arrays = Feld ) = Ansammlung
MehrÜbungspaket 24 Zeichenketten
Übungspaket 24 Zeichenketten Übungsziele: Skript: 1. Verständnis über die interne Repräsentation von Zeichenketten 2. Arbeiten mit Zeichenketten 3. Definition konstanter Zeichenketten 4. Verwendung diverser
MehrNachname:... Vorname:... MatrNr.:... Klausur PR2. int main() { char Text[] = "Sehr geehrte Damen und Herren!"; char *tmp=text;
Nachname:... Vorname:... MatrNr.:... Klausur PR2 HAW-Hamburg, Fakultät Technik und Informatik, Department Informations- und Elektrotechnik Dr. Robert Heß, 26.1.2009 Bearbeitungsdauer: 90 min Hilfsmittel:
MehrÜbungspaket 3 Mein erstes Programm: Fläche eines Rechtecks
Übungspaket 3 Mein erstes Programm: Fläche eines Rechtecks Übungsziele: Skript: 1. Der Software Life Cycle im Überblick. Umgang mit Editor und Compiler 3. Editieren und Starten eines eigenen Programms
MehrKlausur C-Programmierung / 15.02.2014 / Klingebiel / 60 Minuten / 60 Punkte
Klausur C-Programmierung / 15.02.2014 / Klingebiel / 60 Minuten / 60 Punkte Musterlösung 1. Aufgabe (5 Punkte) Im folgenden Programmcode sind einige Fehler enthalten. Finden und markieren Sie mindestens
MehrProgrammierkurs C/C++
Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Donnerstag Sandro Andreotti andreott@inf.fu-berlin.de WS 2008/09 1 Structs Blockkurs: "Einführung in C/C++" 2 Structs sind Bündel von Variablen (unter
MehrDr. Monika Meiler. Inhalt
Inhalt 12 Strukturierte Datentpen - Strukturen... 12-2 12.1 Definition und Deklaration von Strukturtpen und Strukturen... 12-2 12.2 Strukturen als Funktionsparameter und Funktionswert... 12-4 12.3 Felder
MehrAlgorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Wintersemester 2012/13 1. Vorlesung Kapitel 1: Sortieren Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I Das Problem Eingabe Gegeben: eine Folge A = a 1, a 2,..., a
MehrC:\!hinher\AdressVw.cpp Top. <überschrift>
C:\!hinher\AdressVw.cpp Top 10.12.2006 18:45:47 Seite 1 // // Die zu vervollstõndigen Teile finden Sie am Programmende // / AdressVw.c InformatikII: Dynamische Adressverwaltung 29.05.2001
MehrFH Ravensburg-Weingarten Schriftlich Prüfung Programmieren
FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren Prof. Dr. H. Voos, Prof. Dr. M. Zeller Datum, Zeit Aufgabenblätter zugelassene Hilfsmittel, 08:00 10:00 Uhr (120 min) 15 Seiten (einschl. Deckblatt)
MehrBinärbäume: Beispiel
Binärbäume Als Beispiel für eine interessantere dynamische Datenstruktur sehen wir uns jetzt Binärbäume an Ein Binärbaum wird rekursiv definiert: Er ist leer oder besteht aus einem Knoten (die Wurzel des
MehrInformatik II Übung, Woche 14
Giuseppe Accaputo 7. April, 2016 Plan für heute 1. Java Klassen Beispiel: Implementation eines Vorlesungsverzeichnis (VVZ) 2. Informatik II (D-BAUG) Giuseppe Accaputo 2 Java Klassen Beispiel: Implementation
MehrDr. Monika Meiler. Inhalt
Inhalt 13 Listen und Bäume...13-2 13.1 Einfach verkettete lineare Listen...13-2 13.1.1 Vorbetrachtungen zum Programm... 13-2 13.1.2 Programm zum Sortierroblem... 13-4 13.2 Standardoerationen für einfach
Mehr3. Übungsblatt zu Algorithmen I im SoSe 2017
Karlsruher Institut für Technologie Prof. Dr. Jörn Müller-Quade Institut für Theoretische Informatik Björn Kaidel, Sebastian Schlag, Sascha Witt 3. Übungsblatt zu Algorithmen I im SoSe 2017 http://crypto.iti.kit.edu/index.php?id=799
MehrFH Ravensburg-Weingarten Schriftlich Prüfung Programmieren
FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren Prof. Dr. M. Zeller Datum, Zeit Aufgabenblätter erreichbare Punktzahl zugelassene Hilfsmittel, 0800 1000 Uhr (120 min) 16 Seiten (einschl. Deckblatt)
MehrC++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22
C++ Teil 2 Sven Groß IGPM, RWTH Aachen 16. Apr 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 2 16. Apr 2015 1 / 22 Themen der letzten Vorlesung Hallo Welt Elementare Datentypen Ein-/Ausgabe Operatoren Sven
MehrKapitel 7: Rekursion. Inhalt. Rekursion: Technik Rekursion vs. Iteration
Wintersemester 2007/08 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Inhalt Rekursion: Technik Prof. Dr. Günter Rudolph Fakultät
MehrÜbungspaket 17 Der gcc Compiler
Übungspaket 17 Der gcc Compiler Übungsziele: Skript: 1. Sicherer Umgang mit gemischten Ausdrücken 2. Herleiten der unterschiedlichen Datentypen in gemischten Ausdrücken 3. Kenntnis über die implizite Durchführung
MehrÜbungspaket 13 Der Datentyp double
Übungspaket 13 Der Datentyp double Übungsziele: Skript: 1. Umgang mit dem Datentyp double, 2. Deklarationen von double-variablen, 3. double-konstanten 4. und double-rechenoperationen. Kapitel: 32 Semester:
MehrEinführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper
Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen Sebastian Küpper Unzulänglichkeit von Feldern Wenn ein Unternehmen alle Rechnungen eines Jahres verwalten möchte,
MehrKlausur: Grundlagen der Informatik I, am 05. Februar 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:
Seite 1 von 8 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 15 Pkt.) Für eine
MehrGrundgebiete der Informatik 2 Lösungsvorschlag zur Probeklausur
Lehrstuhl für Informatik 3 Prof. Dr.-Ing. M. Nagl RWTH Aachen Grundgebiete der Informatik 2 Lösungsvorschlag zur Probeklausur Prof. Dr.-Ing. M. Nagl Simon Becker Ulrike Ranger René Wörzberger Aufgabe 1
MehrKlausur: Informatik I am 06. Februar 2009 Gruppe: D Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:
Seite 1 von 10 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 12 Pkt.) Was liefert
MehrInformatik 1 ( ) D-MAVT F2011. Pointer, Structs. Yves Brise Übungsstunde 6
Informatik 1 (251-0832-00) D-MAVT F2011 Pointer, Structs Organisatorisches Übungsstunde 20110413 Da ich abwesend bin, bitte Gruppe von David Tschirky besuchen. Mittwoch, 20110413, 13:15-15:00 Uhr, VAW
MehrEinführung in die Programmierung
: Inhalt Einführung in die Programmierung Wintersemester 2009/0 : Technik vs. Iteration Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund 2 Definition (einfache,
MehrEinführung in die Programmierung Wintersemester 2010/11
Einführung in die Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund : Rekursion Inhalt Rekursion: Technik Rekursion
MehrTeil 5: Zeiger, Felder, Zeichenketten Gliederung
Teil 5: Zeiger, Felder, Zeichenketten Gliederung Zeiger und Adressen Felder (Arrays) Zeichenketten (Strings) Zeigerarithmetik Mehrdimensionale Felder Zeiger und Adressen Felder Zeichenketten Zeigerarithmetik
MehrÜbungspaket 19 Programmieren eigener Funktionen
Übungspaket 19 Programmieren eigener Funktionen Übungsziele: Skript: 1. Implementierung und Kodierung eigener Funktionen 2. Rekapitulation des Stack-Frames 3. Parameterübergabe mittels Stack und Stack-Frame
MehrKlassen mit Instanzmethoden
Klassen mit Instanzmethoden Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 3.12.07 G. Bohlender (IANM UNI Karlsruhe) OOP und Klassen 3.12.07
Mehr15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen
453 15. Rekursion Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen Mathematische Rekursion 454 Viele mathematische Funktionen sind sehr natürlich rekursiv
MehrFelder, Zeiger und Adreßrechnung
Felder, Zeiger und Adreßrechnung Felder bestehen aus Variablen eines einzigen Datentyps. Bisher kennen wir eindimensionale Felder. In C sind Felder mit beliebigen Dimensionen möglich. Unsere räumliche
Mehr