4/22/2009 Ablauf Nachbesprechung Übung 6 Informatik I (D(D-MAVT) Besprechung/Vertiefung der Vorlesung [9.4.2009] Übungsstunde 8, 22.4.2009 [email protected] ETH Zürich Vorbesprechung Übung 8 Aufgabe 3: Aufgabe 1: Pointer & Structs ◦ Schauen wir‘s uns an! ◦ Dynamische Arrays! ◦ Sortieren: Selectionsort ◦ Pro Schleifendurchlauf das maximale Element des nicht-sortierten Bereichs finden und mit dem letzten element des nicht-sortierten Bereichs vertauschen... Aufgabe 2: ◦ Grossteils gut gemacht! [5,1,3,4,7,8,9] (sortiert ab "7") ---> finde 5 ---> vertausche mit "4" ---> [4,1,3,5,7,8,9] Aufgabe 3: ◦ "den unsortieren Bereich absuchen" macht: for(int i = n-1; i > 0; i--) { for(int j = 0; j <= i; j++) { ... } } Aufgabe 3: for(int i = n-1; i > 0; i--) { maxIdx = i; // Suchen des grössten Elements im Teilbereich [0...i] for(int j = 0; j <= i; j++) { if(array[maxIdx] < array[j]) { maxIdx = j; } } // Vertauschen mit dem letzten Element int tmp = array[i]; array[i] = array[maxIdx]; array[maxIdx] = tmp; } 1 4/22/2009 Ablauf Nachbesprechung Übung 6 Besprechung/Vertiefung der Vorlesung [9.4.2009] Vorbesprechung Übung 8 Funktionen Advanced Rekursion Aber: Keine Zeit für alles! Übersicht O(log n), falls sortiert O(n log n) O(n) ◦ http://en.wikipedia.org/wiki/Linked_list O(1) O(n) O(n^2) ◦ http://en.wikipedia.org/wiki/Stack_(data_structure) ◦ http://en.wikipedia.org/wiki/Binary_search_tree Listen ◦ Gut zum Einfügen/Löschen: ◦ Suchen: ◦ Schlecht für Sortieren: Dynamische Datenstrukturen Arrays ◦ Gut zum Suchen: ◦ Sortieren: ◦ Schlecht für Einfügen/Löschen: Stacks, Listen, Bäume, UPN ◦ Overloading ◦ Inlining Dynamische Datenstrukturen Bäume ◦ Höhe eines Baumes (beim zufälligen Einfügen) ca. log n ◦ Baum kann jedoch zu einer Liste (mit „Höhe“ n) degenerieren ◦ Suchen, Einfügen, Löschen: O(log n) 10 9 Datenstruktur: Stack Stacks: Reverse Polish Notation LIFO – Datenstruktur Übung 8... Anwendung von Stacks Operationen: Wir kennen infix-Schreibweise: 9–2*4 Neu (RPN): Postfix-Schreibweise: 92–4* push(...) pop() init() size() clear() Realisiert als... ◦ Dynamisches Array ◦ Liste 11 ◦ (9 – 2) * 4 --> ◦ 9 – (2 * 4) --> Beispiel 12 2 4/22/2009 Funktionen Strukturierung des Programmes -> Übersichtlichkeit Modularisierung des Programmes -> Wiederverwendbarkeit -> Zusammenfassen von häufig benötigten Codestücken Ähnlichkeiten zu mathematischen Funktionen -> Eingabe/Ausgabeparameter 14 Funktionen Funktionen Funktionsdeklaration Funktionsprototypen return_type Funktionsname (FormalParameters) { Codeblock } ◦ Funktion muss vor ihrem Aufruf definiert werden ◦ Dies ist aber nicht immer möglich int main (int argc, char **argv) {… } ◦ Daher: Funktionsprototyp am Anfang (= Funktionsdeklaration) f (x,y) {… } return_type ◦ Rückgabetyp der Funktion ◦ void, void wenn kein Rückgabewert Parameter Funktionsaufruf mittels „Ich kenne diese Funktion“ return_type Funktionsname (FormalParameters); ◦ Oft: In header-files (z.B. sqrt(double)) ◦ Lokale Variablen der Funktion Funktionsname (ActualParameters) ◦ Funktion gibt Wert des Typs return_type zurück 15 Funktionen 16 Funktionen Call-By-Value Overloading.. Overloading allows the creation of several functions with the same name which differ from each other in terms of the type of the input and the type of the output of the function. return_type Funktionsname (int/bool/double…Params) { Codeblock } int sum (int a, int b) { return (a + b); } ◦ Die Funktion kann ihre Parameter (in main) nicht verändern! ◦ Sie kann sie nur benutzen, benutzen um mit ihnen zu rechnen Call-By-Reference return_type Funktionsname (Pointer to Params) { Codeblock } void increment (int * x) { (*x)++; return; } ◦ Die Funktion kann ihre Parameter (in main) verändern 17 18 3 4/22/2009 Funktionen Rekursion Inlining... Compiler integriert die Anweisungen der Funktion physisch ins Hauptprogramm ◦ Spart „jmp“ zur Funktion -> Funktionen, die sich selbst aufrufen, sind rekursiv int my_func_rec(int a) { if(a > 0) { return a + my_func_rec(a-1); } else { return 0; } } Zeitersparnis Nützlich bei kurzen/einfachen Funktionen: ◦ Zeit für Funktionsaufruf wird gespart 2 Bedingungen: ◦ Parameter muss sich ändern! ◦ Es muss ein branch (z.B. ‚if‘) vorhanden sein, sodass die Rekursion verlassen wird! 19 Rekursion - Hanoi 20 Ablauf void hanoi(nDiscs, from, to, helper); Prototyp: Was muss getan werden, um N discs von 1 nach 3 zu bewegen? Nachbesprechung Übung 6 Besprechung/Vertiefung der Vorlesung [9.4.2009] Vorbesprechung Übung 8 1. Ich muss (N-1) discs von 1 nach 2 bewegen - Jetzt liegt nur noch eine disc auf 1 hanoi(N-1, 1, 2, 3) 2. Ich muss 1 disc von 1 nach 3 bewegen - Dies ist sicher möglich, da auf 3 nur grössere discs liegen! move(1,3) 3. Ich muss (N-1) discs von 2 nach 3 bewegen - Jetzt liegen alle discs auf 3 hanoi(N-1, 2, 3, 1) 21 Vorbesprechung / Übung 8 Aufgabe 1: FIFO-Liste („Warteschlange“, Theorie) ◦ Pointer auf erstes und letztes Element der Liste (head, last) ◦ void enter(int k) fügt ein Element „k“ am Ende der Liste ein ◦ int leave() liefert Element am Kopf der Liste Vorbesprechung / Übung 8 Aufgabe 2: Stack (Programmierung) ◦ Implementieren eines double-Stacks mittels eines dynamischen Arrays ◦ Stack soll nicht global sein (wie geht das?) ◦ a) Funktion init(), die den Stack initialisiert ◦ b) Funktion pop(), die das oberste Element entfernt und zurückgibt ◦ c) Funktion push(), die ein Element zuoberst hinzufügt Wenn nötig: Vergrössern des Arrays (wie ging das nochmal?) ◦ d) Funktion size(), die die aktuelle Grösse des Stacks zurückgibt ◦ e) Funktion clear(), die den Stack aufräumt (-> Löschen des Arrays) 4 4/22/2009 Vorbesprechung / Übung 8 Vorbesprechung / Übung 8 Aufgabe 2: Stack (Programmierung) ◦ Hilfestellung: Funktionssignaturen ◦ Stack: struct tStack { ... } Aufgabe 3: UPN-Taschenrechner (Programmierung) ◦ Benutzen des Stacks aus Aufgabe 2 ◦ Schema: ◦ a) Funktion ◦ b) Funktion init( ) pop( ) ◦ c) Funktion push( ) ◦ d) Funktion size( ) ◦ e) Funktion clear( ) Folien online unter Einlesen des nächsten Befehls +, -, /, * vorhergehende Zahlen pop-en, rechnen, push-en Zahl Zahl push-en ; Programm beenden ◦ Also: Per Fallunterscheidung mittels while(cin >> nextCommand) über den input iterieren if (strcmp(nextCommand, „+“) == 0) { ... } www.n.ethz.ch/student/mayersi Informatik I (D(D-MAVT) Übungsstunde 8, 22.4.2009 [email protected] ETH Zürich 5