Handouts/Slides

Werbung
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
Herunterladen