Repititorium PI - WiSe11/12 Hannes Schnaitter, Patrick Weggler | Februrary 2012 | Institut für Angewandte Intelligenz Proudly presented by Fachschaft Informatik in conjunction with SK Informatik Seite 2 Willkommen | Repititorium PI | Inhalt Day 1 Basics Formale Sprachen Java Februrary 2012 Seite 3 Basics - Algorithmen | Repititorium PI | Februrary 2012 Definition Ein Algorithmus ist eine präzise, endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer, elementarer Verarbeitungsschritte mit einer endlichen Gesamtausführungsdauer. Seite 4 Basics - Algorithmen | Repititorium PI | Eigenschaften I Korrektheit I Robustheit I Termination I Determinismus I Determiniertheit I Termination Februrary 2012 Seite 5 Basics - Algorithmen | Repititorium PI | Februrary 2012 6 Schritte zum Glück 1. Problem formulieren 2. Problemanalyse, -spezifikation, -anstraktion 3. Algorithmenentwurf 4. Korrektheitsnachweis, Verifikation 5. Aufwandsanalyse 6. Programmkonstruktion 7. . . . 8. P ROFIT ! Seite 6 Basics - Diagramme | Repititorium PI | Februrary 2012 Flowcharts Start Lies x ein! Stop Anfang und Ende eines Programms ja a=0? z=0 Ein- / Ausgabe nein a<b Vergleic he a und b a=b Verzweigung aufgrund einer Bedingung Wende Formel (3) an Elementare Anweisungen UP Unterprogramm Teil - / Subalgorithmus (UP: Name) a>b C C Konnektor zur Verbindung von Diagrammen Seite 7 Basics - Diagramme | Repititorium PI | Nassi-Schneidermann Februrary 2012 Seite 8 Formale Sprachen - Grammatiken | Repititorium PI | Februrary 2012 Definition Grammatik Eine Grammatik ist gegeben durch ein 4-Tupel G = (T , N, P, S) mit: 1. T ist eine Menge von Terminalsymbolen 2. N ist eine Menge von nicht-terminalen Symbolen, wobei gelten muss: T ∩ N = ∅ 3. P ist eine endliche Menge von Produktionen der Form L → R mit L ∈ (T ∪ N)+ \ T und R ∈ (T ∪ N)∗ Alternative Notation: L ::= R oder L = R 4. S ∈ N ist ein ausgezeichnetes Startsymbol oder Axiom Seite 9 Formale Sprachen - Grammatiken | Repititorium PI | Februrary 2012 Definition Sprache Die durch eine Grammatik G = (T , N, P, S) definierte Sprache L(G) ist durch L(G) := {σ ∈ T ∗ |S ⇒∗ σ} gegeben. Seite 10 Formale Sprachen - Chomsky | Repititorium PI | Februrary 2012 Definition Chomsky-Hierarchie Menge aller Sprachen Typ 0 – Sprachen Kontextsensitive oder Typ 1 – Sprachen kontextfreie oder Typ 2 – Sprachen reguläre oder Typ 3 – Sprachen Seite 11 Formale Sprachen - Chomsky | Repititorium PI | Februrary 2012 Beispiel Aufgabe Schreibe eine Grammatik, welche die Sprache aller Palindrome kleiner Buchstaben erzeugt und bestimme, von welchem Typ sie ist. Seite 12 Formale Sprachen - Chomsky | Repititorium PI | Februrary 2012 Beispiel Aufgabe Schreibe eine Grammatik, welche die Sprache aller Palindrome kleiner Buchstaben erzeugt und bestimme, von welchem Typ sie ist. Lösung G = (T,N,P,S) T = { a, . . . , z} N = { S} P={ S → a | . . . | z | ε, S → aSa | . . . | zSz } Seite 13 Formale Sprachen - Chomsky | Repititorium PI | Februrary 2012 Beispiel Aufgabe Schreibe eine Grammatik, welche die Sprache aller Palindrome kleiner Buchstaben erzeugt und bestimme, von welchem Typ sie ist. Lösung G = (T,N,P,S) T = { a, . . . , z} N = { S} P={ S → a | . . . | z | ε, S → aSa | . . . | zSz } Typ 2 Seite 14 Formale Sprachen - Chomsky | Repititorium PI | Februrary 2012 Beispiel 2 Aufgabe Welche Sprache wird durch folgende Grammatik beschrieben und welchen Typ hat sie? G = (T,N,P,S), T = { a, b}, N = { S} P={ S → aS | bA A → b | bA } Seite 15 Formale Sprachen - Chomsky | Repititorium PI | Februrary 2012 Beispiel 2 Aufgabe Welche Sprache wird durch folgende Grammatik beschrieben und welchen Typ hat sie? G = (T,N,P,S), T = { a, b}, N = { S} P={ S → aS | bA A → b | bA } Lösung L(G) = {an bm } n, m ∈ N, m ≥ 2 Seite 16 Formale Sprachen - Chomsky | Repititorium PI | Februrary 2012 Beispiel 2 Aufgabe Welche Sprache wird durch folgende Grammatik beschrieben und welchen Typ hat sie? G = (T,N,P,S), T = { a, b}, N = { S} P={ S → aS | bA A → b | bA } Lösung L(G) = {an bm } n, m ∈ N, m ≥ 2 Typ 3 Seite 17 Formale Sprachen - Syntax | Repititorium PI | Definition Syntaxdiagramme siehe Tafel Februrary 2012 Seite 18 Formale Sprachen - Syntax | Repititorium PI | Beispiel Aufgabe G = (T,N,P,S) T = { a, . . . , z} N = { S} P={ S → a | . . . | z | ε, S → aSa | . . . | zSz } Februrary 2012 Seite 19 Formale Sprachen - Syntax | Repititorium PI | Beispiel Aufgabe G = (T,N,P,S) T = { a, . . . , z} N = { S} P={ S → a | . . . | z | ε, S → aSa | . . . | zSz } Lösung siehe Tafel Februrary 2012 Seite 20 Formale Sprachen - Syntax | Repititorium PI | Februrary 2012 Beispiel 2 Aufgabe Schreibe ein Syntaxdiagramm für den Methodenkopf in Java. Seite 21 Formale Sprachen - Syntax | Repititorium PI | Februrary 2012 Beispiel 2 Aufgabe Schreibe ein Syntaxdiagramm für den Methodenkopf in Java. Lösung siehe Tafel Seite 22 Formale Sprachen - [E]BNF | Repititorium PI | Februrary 2012 Definition Bachus-Naur-Form BNF ::= Ableitungssymbol (Produktion, →) . Markierung des Endes einer Produktionsregel < ... > Regelbezeichner (linke Seite von Produktionsregeln; entspricht den Nicht-Terminalsymbolen, die in den Produktionsregeln verwendet werden) | Alternative (Oder-Symbol) (. . .) Präzedenzregelnde Strukturklammern Seite 23 Formale Sprachen - [E]BNF | Repititorium PI | Februrary 2012 Erweiterungen bei EBNF [. . .] optionale Ausdrücke: 0- oder 1-mal auftretend {. . .} optionale Ausdrücke: beliebig oft auftretend Seite 24 Formale Sprachen - [E]BNF | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreibe die EBNF für den Methodenkopf in Java. Seite 25 Formale Sprachen - [E]BNF | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreibe die EBNF für den Methodenkopf in Java. Lösung <method-head> ::= <access-specifier> [’static’] <type> <identifier>’(’[<param-list>]’)’. <access-specifier> ::= ’public’ | ’private’ | ’protected’ | <empty>. <type> ::= ’byte’ | ’short’ | . . . . <identifier> ::= <char> {<char++>}. <param-list> ::= <param> | (<param> ’,’ <param-list>). <empty> ::= ’ ’. Seite 26 Formale Sprachen - Automaten | Repititorium PI | Februrary 2012 Deterministischer endlicher Automat (DEA) ohne Ausgabe Der Automat ist gegeben durch ein 5-Tupel M = (Z , Σ, δ, z0 , T ) mit: 1. Z ist eine Menge möglicher Zustände des Automaten, |Z | < ∞ 2. Σ ist ein Eingabealphabet, |Σ| = m < ∞ 3. δ : Z × Σ → Z ist eine Zustandsübergangsfunktion 4. z0 ∈ Z ist der Startzustand 5. T ⊆ Z ist eine Menge der Endzustände (Terminalzustände) Seite 27 Formale Sprachen - Automaten | Repititorium PI | Februrary 2012 Beispiel Aufgabe Baue einen Automaten, der Wörter der Sprache L(G) erkennt. G = (T,N,P,S), T = { a, b}, N = { S} P={ S → aS | bA A → b | bA } Seite 28 Formale Sprachen - Automaten | Repititorium PI | Februrary 2012 Beispiel Aufgabe Baue einen Automaten, der Wörter der Sprache L(G) erkennt. G = (T,N,P,S), T = { a, b}, N = { S} P={ S → aS | bA A → b | bA } Lösung siehe Tafel Seite 29 Formale Sprachen - Automaten | Repititorium PI | Februrary 2012 Beispiel 2 Aufgabe Baue einen Automaten der Zahlen in der Mantissenschreibweise erkennt. Beispielsweise sollen erkannt werden: I 3 I −7 I .2e − 7 I 1.3E + 5 Seite 30 Formale Sprachen - Automaten | Repititorium PI | Februrary 2012 Beispiel 2 Lösung 0-9 0-9 S1 +- Start S2 0-9 S3 . Ee . . 0-9 S4 S0 Ee S6 S7 0-9 +0-9 S5 0-9 Seite 31 Formale Sprachen - Regex | Repititorium PI | Februrary 2012 Definition RegEx I <Regex> ::= ε | <S>. I <Regex> ::= <Regex><Regex> | ’(’<Regex> ’|’ <Regex> ’)’ | ’(’<Regex>’)’ ’∗ ’. I <S> ::= Terminalsymbole. Seite 32 Formale Sprachen - Regex | Repititorium PI | Februrary 2012 Beispiel Aufgabe Baue einen Regex, der auf die Wörter der Sprache L(G) matcht. G = (T,N,P,S), T = { a, b}, N = { S} P={ S → aS | bA A → b | bA } Seite 33 Formale Sprachen - Regex | Repititorium PI | Februrary 2012 Beispiel Aufgabe Baue einen Regex, der auf die Wörter der Sprache L(G) matcht. G = (T,N,P,S), T = { a, b}, N = { S} P={ S → aS | bA A → b | bA } Lösung (a)∗ b(b)∗ b Seite 34 Java - Datentypen | Repititorium PI | Februrary 2012 Datentypen Typ boolean VZ N Belegung true/false char byte short int long float N Y Y Y Y Y double Y n=16 n=8 n=16 n=32 n=64 1, 40239846 × 10−45 3, 40282347 × 10+38 4, 94065645841246544 × 10−324 1, 79769131486231570 × 10+308 Seite 35 Java - Datentypen | Repititorium PI | Februrary 2012 Berechnung Wertebereich Der Wertebereich sieht bei gegebenem n aus: W = −2n−1 . . . 2n−1 − 1 Seite 36 Java - Datentypen | IEEE 754 Repititorium PI | Februrary 2012 Seite 37 Java - Datentypen | Repititorium PI | Februrary 2012 IEEE 754 Exponent E Mantisse M Bedeutung E =0 M=0 −1S × 0 < E < 2r − 1 M≥0 −1S × 1 + E = 2r − 1 E = 2r − 1 M=0 M>0 ±∞ NaN M 2p × 21−B M 2p × 2E−B Seite 38 Java - Datentypen | Repititorium PI | Februrary 2012 Beispiele Aufgabe1 In eine Variable welchen Datentyps kann die Zahl 1,099,511,627,776 gespeichert werden? Aufgabe2 Ist die Zahl 0.1 exakt speicherbar? Begründung! Seite 39 Java - Datentypen | Repititorium PI | Februrary 2012 Beispiele Aufgabe1 In eine Variable welchen Datentyps kann die Zahl 1,099,511,627,776 gespeichert werden? Lösung long da 1, 099, 511, 627, 776 = 240 Aufgabe2 Ist die Zahl 0.1 exakt speicherbar? Begründung! Lösung nein - Erklärung siehe Tafel Seite 40 Java - Datentypen | Repititorium PI | Februrary 2012 Typkonvertierung implizit Kleinere Datentypen werden implizit d.h. automatisch in den größeren Bereich umgerechnet. char → short → int → long → float → double → String boolean → String Seite 41 Java - Datentypen | Repititorium PI | Februrary 2012 Typkonvertierung explizit 1 2 long longVar=42; int intVar=0; 3 4 intVar = (int)longVar; Seite 42 Java - if-else | Repititorium PI | Februrary 2012 if-else 1 2 if(boolean) Anweisung; else Anweisung2; Seite 43 Java - if-else | Repititorium PI | Februrary 2012 Beispiele Aufgabe Betrachten Sie alle Variablen als gegeben. Wenn x kleiner y und b wahr oder ob text gleich ’Freund’ ist geben Sie Brunhilde aus, andernfalls überprüfen Sie ob selbiger text gleich ’Freundin’ ist, dann geben Sie Martin aus. Andernfalls soll der Rückgabewert von x < y ausgegeben werden. Tip: Eine Ausgabe erfolgt mit System.out.println(String) Seite 44 Java - if-else | Repititorium PI | Februrary 2012 Beispiele Aufgabe Betrachten Sie alle Variablen als gegeben. Wenn x kleiner y und b wahr oder ob text gleich ’Freund’ ist geben Sie Brunhilde aus, andernfalls überprüfen Sie ob selbiger text gleich ’Freundin’ ist, dann geben Sie Martin aus. Andernfalls soll der Rückgabewert von x < y ausgegeben werden. Tip: Eine Ausgabe erfolgt mit System.out.println(String) Lösung Siehe Tafel Seite 45 Java - if-else | Repititorium PI | Februrary 2012 switch case 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 char op = ’+’; switch ( op ) { case ’+’: System.out.println( x + y ); break; case ’-’: System.out.println( x - y ); break; case ’@’: case ’#’: System.Exit(0); break; default: System.Exit(-1); } Seite 46 Java - while | Repititorium PI | Februrary 2012 While-Schleife 1 while(boolean)Anweisung; 2 3 4 5 6 while(boolean){ Anweisung1; Anweisung2; } Seite 47 Java - while | Repititorium PI | Februrary 2012 Do-While 1 do 2 Anweisung; while(boolean); 3 4 5 6 do { 7 Anweisung1; Anweisung2; }while(boolean) 8 9 Seite 48 Java - while | Repititorium PI | Februrary 2012 For-Schleife 1 for(int i=0;boolean;i++)Anweisung; 2 3 4 5 6 for(int i=0;boolean;i++){ Anweisung1; Anweisung2; } Seite 49 Java - while | Repititorium PI | Februrary 2012 Beispiele Schreiben Sie ein kurzes Programm, welches die Zahlen von 1 bis 100 in einer Zeile getrennt mit ’-’ ausgibt. Tun Sie dies mit allen drei Schleifen. Ein Ausgabe endet immer mit einem Zeilenumbruch! Tip: Eine Ausgabe ohne Zeilenumbruch erfolgt mit System.out.print(String) Seite 50 Java - while | Repititorium PI | Februrary 2012 Beispiele Schreiben Sie ein kurzes Programm, welches die Zahlen von 1 bis 100 in einer Zeile getrennt mit ’-’ ausgibt. Tun Sie dies mit allen drei Schleifen. Ein Ausgabe endet immer mit einem Zeilenumbruch! Tip: Eine Ausgabe ohne Zeilenumbruch erfolgt mit System.out.print(String) Lösung Siehe Tafel Seite 51 Java - while | Repititorium PI | Februrary 2012 Beispiele Schreiben Sie ein kurzes Programm, welches einen Baum malt. Als Blätter dient ’X’ als Stamm ’H’ 1 2 3 4 5 X XXX XXXXX XXXXXXX H Seite 52 Java - while | Repititorium PI | Februrary 2012 Beispiele Schreiben Sie ein kurzes Programm, welches einen Baum malt. Als Blätter dient ’X’ als Stamm ’H’ 1 2 3 4 5 X XXX XXXXX XXXXXXX H Lösung Siehe Tafel Seite 53 Java - while | Repititorium PI | Februrary 2012 Geplanter Ausbruch 1 2 3 4 5 while(true){ if(boolean)break; if(boolean)continue; System.out.println("Noch immer"); } Seite 54 Java - while | Repititorium PI | Februrary 2012 Foreach-Schleife 1 2 3 4 String[] str = {"1", "2", "3"}; for (String s : str) { System.out.println(s); } Achtung: die Variable über welche iteriert wird muss vom Interface Iterable sein. Seite 55 Java - Datentypen++ | Repititorium PI | Februrary 2012 Strings http://openbook.galileocomputing.de/javainsel9/bilder/stringuml.gif Die Klasse String implementiert folgende Interfaces: I Java.lang.CharSequence I Java.lang.Comparable I Java.io.Serializable Seite 56 Java - Datentypen++ | Repititorium PI | Februrary 2012 Strings http://openbook.galileocomputing.de/javainsel9/bilder/stringuml.gif Die Klasse String implementiert folgende Interfaces: I Java.lang.CharSequence I Java.lang.Comparable I Java.io.Serializable Seite 57 Java - Datentypen++ | Repititorium PI | Februrary 2012 Strings http://openbook.galileocomputing.de/javainsel9/bilder/stringuml.gif Die Klasse String implementiert folgende Interfaces: I Java.lang.CharSequence I Java.lang.Comparable I Java.io.Serializable Seite 58 Java - Datentypen++ | Repititorium PI | Februrary 2012 Strings http://openbook.galileocomputing.de/javainsel9/bilder/stringuml.gif Die Klasse String implementiert folgende Interfaces: I Java.lang.CharSequence I Java.lang.Comparable I Java.io.Serializable Seite 59 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 60 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 61 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 62 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 63 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 64 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 65 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 66 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 67 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 68 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 69 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 70 Java - Datentypen++ | Repititorium PI | Februrary 2012 Die wichtigsten String Methoden I char charAt(int index) I int compareTo{IgnoreCase}(String str) I String concat(String str) I boolean contains(CharSequence c) I boolean endsWith(String suffix) I boolean equals{IgnoreCase}(Object obj) I int length() I String[] split(String regEx) I char[] toCharArray() I String to{Lower/Upper}Case(Locale locale) I String trim() Seite 71 Java - Datentypen++ | Repititorium PI | Februrary 2012 Arrays 1 2 int[] numbers; String[] woerter; 3 4 5 int[] primes={2,3,5,7,7+4}; String[] namen = {"Hugo","Erwin", "Siglinde"}; 6 7 numbers = new int[10]; 8 9 10 System.out.println(namen[2]); System.out.println(primes.length); Seite 72 Java - Datentypen++ | Repititorium PI | Februrary 2012 Beispiele Aufgabe Programmieren Sie das Sieb des Eratosthenes. I Erzeugen Sie ein Array mit den Zahlen vom 2 bis Short.MAX_VALUE I streichen Sie solange alle vielfachen von 2 bis Sie am Ende sind I nehmen Sie nun die nächste noch vorhande Zahl. . . I wiederhohlen Sie. . . Seite 73 Java - Datentypen++ | Repititorium PI | Februrary 2012 Beispiele Aufgabe Programmieren Sie das Sieb des Eratosthenes. I Erzeugen Sie ein Array mit den Zahlen vom 2 bis Short.MAX_VALUE I streichen Sie solange alle vielfachen von 2 bis Sie am Ende sind I nehmen Sie nun die nächste noch vorhande Zahl. . . I wiederhohlen Sie. . . Seite 74 Java - Datentypen++ | Repititorium PI | Februrary 2012 Beispiele Aufgabe Programmieren Sie das Sieb des Eratosthenes. I Erzeugen Sie ein Array mit den Zahlen vom 2 bis Short.MAX_VALUE I streichen Sie solange alle vielfachen von 2 bis Sie am Ende sind I nehmen Sie nun die nächste noch vorhande Zahl. . . I wiederhohlen Sie. . . Seite 75 Java - Datentypen++ | Repititorium PI | Februrary 2012 Beispiele Aufgabe Programmieren Sie das Sieb des Eratosthenes. I Erzeugen Sie ein Array mit den Zahlen vom 2 bis Short.MAX_VALUE I streichen Sie solange alle vielfachen von 2 bis Sie am Ende sind I nehmen Sie nun die nächste noch vorhande Zahl. . . I wiederhohlen Sie. . . Seite 76 Java - Datentypen++ | Repititorium PI | Februrary 2012 Beispiele Aufgabe Programmieren Sie das Sieb des Eratosthenes. I Erzeugen Sie ein Array mit den Zahlen vom 2 bis Short.MAX_VALUE I streichen Sie solange alle vielfachen von 2 bis Sie am Ende sind I nehmen Sie nun die nächste noch vorhande Zahl. . . I wiederhohlen Sie. . . Java - Datentypen++ | Seite 77 Repititorium PI | Februrary 2012 Lösung 1 2 3 4 public class Sieb { public static void main(String[] args) { int[] ar = new int[Short.MAX_VALUE]; for (int i = 0; i < ar.length; i++) ar[i] = i; 5 for (int i = 2; i < ar.length; i++) { if (ar[i] != -1) { for (int j =ar[i]*ar[i]; j<ar.length; j = j+i){ ar[j] = -1; } } } for (int i = 0; i < ar.length; i++) { if (ar[i] != -1) System.out.println(ar[i]); } 6 7 8 9 10 11 12 13 14 15 } 16 17 } Seite 78 Java - Datentypen++ | Repititorium PI | Februrary 2012 Arrays Advanced 1 Object[] obj = new Object[10]; 2 3 4 int[][] zweiD = new int[10][10]; int[][][] dreiD = new int[10][10][10] 5 6 7 8 int[][] gemein = {{1,2,3,4}, {1,2,3,4,5}, {1}}; Achtung: Arrays können auch über unterschiedlich lange Arrays gehen! Seite 79 Java - Datentypen++ | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreiben Sie eine kurze Methode, welche zwei Matritzen des Rn×n miteinander addiert. Seite 80 Java - Datentypen++ | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreiben Sie eine kurze Methode, welche zwei Matritzen des Rn×n miteinander addiert. Lösung Siehe Tafel Seite 81 Java - Datentypen++ | Repititorium PI | Februrary 2012 GOOD FIGHT GOOD NIGHT Danke für eure Aufmerksamkeit. Beginn Morgen um 10ct am selben Ort Seite 82 Wilkommen | Repititorium PI | Februrary 2012 Inhalt Day 2 Komplexität Unterprogramme Rekursion Object Oriented Programming Dynamische Datenstrukturen Seite 83 Komplexität - Zählen für Informatiker | Repititorium PI | Februrary 2012 Beispiel Aufgabe Wie viele Additionen, Multiplikationen und Vergleiche werden jeweils getätigt. 1 2 3 4 5 6 7 8 9 int[] arr = {2,3,5,7,8,9} int evensum = 0; int triprod = 1; for (int i = 0; i < arr.length(); i++) { if (arr[i] % 2 == 0) evensum += arr[i]; if (arr[i] % 3 == 0) triprod *= arr[i]; } Seite 84 Komplexität - Zählen für Informatiker | Repititorium PI | Februrary 2012 Beispiel Lösung Die Problemgröße n ist die Länge des Arrays. BC WC Additionen 0 n Multiplikationen 0 n Vergleiche 2n 2n mit for-Schleife 3n + 1 3n + 1 Der WC allgemein wäre, wenn die Zahlen im Array allesamt sowohl durch 2 als auch durch 3 teilbar sind. Seite 85 Komplexität - O-Notation | Repititorium PI | Februrary 2012 Definition mathematisch f (n) ⊆ O (g(n)) ⇔ ∃c > 0 ∃n0 ≥ 0 ∀n ≥ n0 : f (n) ≤ c · g(n) Seite 86 Komplexität - O-Notation | Repititorium PI | Februrary 2012 Definition mathematisch f (n) ⊆ O (g(n)) ⇔ ∃c > 0 ∃n0 ≥ 0 ∀n ≥ n0 : f (n) ≤ c · g(n) oft auch so geschrieben: f (n) = O (g(n)) Seite 87 Komplexität - O-Notation | Repititorium PI | Februrary 2012 Beispiele Aufgabe Ordne folgende Komplexitäten aufsteigend und bestimme, ob die angegebene Komplexitätsklasse wahr sind. 1. 1, 7n = O(2n ) 2. n2 = O(n4 ) 3. 322378128 = O(1) 4. nn = O(n!) 5. n3 = O(n2 ) 6. n17 = O(n!) p 7. (n) = O(log n) Seite 88 Komplexität - O-Notation | Repititorium PI | Beispiele Lösung 1. 322378128 = O(1) p 2. (n) 6= O(log n) 3. n2 = O(n4 ) 4. n3 6= O(n2 ) 5. n17 = O(n!) 6. 1, 7n = O(2n ) 7. nn 6= O(n!) Februrary 2012 Seite 89 Unterprogramme | Repititorium PI | Februrary 2012 Motivation Wiederverwendung von Programmteilen. Kapselung von Funktionsinterna und z.B. statt eine komplexe Gleichung im Quellcode stehen zu haben hat man ein einfaches Mnemonik. . . Seite 90 Unterprogramme | Repititorium PI | Februrary 2012 Definition 1 2 3 4 5 6 7 8 int name(int eins,Object object){ //Das ist eine Funktion Anweisungen; return 1; } void name2 (){ //Das ist eine Prozedur } Allgemein: Modifiers Rückgabewert Funktionsname(Variablentyp Variablenname,. . . ) Seite 91 Unterprogramme | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreiben sie eine Methode, welche zwei ganzzahlige Werte mitteinander vergleicht und den kleineren der beiden zurück liefert. Seite 92 Unterprogramme | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreiben sie eine Methode, welche zwei ganzzahlige Werte mitteinander vergleicht und den kleineren der beiden zurück liefert. Lösung 1 2 3 long kleiner(long a,long b){ return a<b?a:b; } Seite 93 Rekursion - Java | Repititorium PI | Februrary 2012 Definition 1 2 3 4 5 static void runter( int n ){ if ( n == 0 ) return; // Rekursionsende System.out.print( n + ", " ); return runter( n - 1 ); } Seite 94 Rekursion - Java | Repititorium PI | Februrary 2012 Definition 1 2 3 4 5 static void runter( int n ){ if ( n == 0 ) return; // Rekursionsende System.out.print( n + ", " ); return runter( n - 1 ); } Als Rekursion (lat. recurrere zurücklaufen“) bezeichnet man ” eine Technik, die eine Funktion durch sich selbst definiert (rekursive Definition). Wenn man mehrere Funktionen durch wechselseitige Verwendung voneinander definiert, spricht man von wechselseitiger Rekursion. Seite 95 Rekursion - Java | Repititorium PI | Februrary 2012 Definition 1 2 3 4 5 static void runter( int n ){ if ( n == 0 ) return; // Rekursionsende System.out.print( n + ", " ); return runter( n - 1 ); } Als Rekursion (lat. recurrere zurücklaufen“) bezeichnet man ” eine Technik, die eine Funktion durch sich selbst definiert (rekursive Definition). Wenn man mehrere Funktionen durch wechselseitige Verwendung voneinander definiert, spricht man von wechselseitiger Rekursion. Seite 96 Rekursion - Java | Repititorium PI | Februrary 2012 wechselseitige Rekursion 1 2 3 4 5 6 7 8 static void eins(int a){ if(a<=1)return; else return zwei(a-1); } static void zwei(int a){ if(a==2) return; else return eins(a-1); } Seite 97 Rekursion - Java | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreiben sie eine rekursive Methode, welche den größten gemeinsamen Teiler liefert. Seite 98 Rekursion - Java | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreiben sie eine rekursive Methode, welche den größten gemeinsamen Teiler liefert. Lösung 1 2 3 4 static int ggT(int a, int b){ if(a==b||b==0) return a; else return ggT(b,a%b); } Seite 99 Rekursion - Java | Repititorium PI | Februrary 2012 Iterativ vs. Rekursiv Aufgabe Schreibe zwei Methoden, welche die n! zurück liefern, tue dies sowohl rekursiv als auch iterativ. Seite 100 Rekursion - Java | Repititorium PI | Februrary 2012 Iterativ vs. Rekursiv Aufgabe Schreibe zwei Methoden, welche die n! zurück liefern, tue dies sowohl rekursiv als auch iterativ. Lösung 1 2 3 4 5 6 7 8 9 long fakRek(long n){ if (n<=1)return 1; else return n*fakRek(n-1); } long fakIt(long n){ long tmp=1; for(long i=1;i<=n;i++) tmp *=i; return tmp; } Seite 101 OOP - Motivation | Repititorium PI | Februrary 2012 Motivation Kapselung von Daten in Verbindung mit Funktionen als Objekte. Seite 102 OOP - Motivation | Repititorium PI | Februrary 2012 UML - Unified Modeling Language Seite 103 OOP - Java | Repititorium PI | Februrary 2012 Ein einfaches Object 1 2 3 4 5 6 7 8 9 public class Simple { public int klassenvariable=0; void methode (){ return; } public static void main(String[] args) { Simple test = new Simple(); } } Seite 104 OOP - Java | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreibe eine einfache class Auto, welche in der Main instanziert und mittels der toString-Methode ausgegeben wird sowie die Lackfarbe als öffentliches Klassenatribut, sowie die Motorleistung als Privates Atribut über getter zu Verfügung stellt. Seite 105 OOP - Java | Repititorium PI | Februrary 2012 Beispiele Aufgabe Schreibe eine einfache class Auto, welche in der Main instanziert und mittels der toString-Methode ausgegeben wird sowie die Lackfarbe als öffentliches Klassenatribut, sowie die Motorleistung als Privates Atribut über getter zu Verfügung stellt. Lösung Siehe Tafel Seite 106 OOP - Exceptions | Repititorium PI | Februrary 2012 Exceptions Bei Java ist es möglich Fehlerzustände über einen gesonderten Kanal zu signalisieren, wodurch diese nicht mit den regulären Rückgabewerten kollidieren. Seite 107 OOP - Exceptions | Repititorium PI | Februrary 2012 Exceptions 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Fehler { void methode () throws Exception{ if(true) throw new IllegalStateException("foo"); return; } public static void main(String[] args) { Simple test = new Simple(); try { test.methode(); } catch (Exception e){ //Pokemon Exception-Handling //- Gonna catch ’em all } } } Seite 108 DDS - Arrays | Repititorium PI | Februrary 2012 Beispiele Eine dynamisches Array ist ein Array, welches bei Bedarf umkopiert wird. Üblicherweise wird ein Array wenn es überläuft auf die doppelte Größe erweitert. Aufgabe Schreibe ein Programm das Objects aufnimmt und diese in einem dyn. Array speichert. Lösung Siehe Tafel Seite 109 DDS - Lists | Repititorium PI | Februrary 2012 Definition Eine Liste ist entweder leer oder sie beinhaltet Daten und einen Verweis auf eine Restliste. Seite 110 DDS - Lists | Repititorium PI | Februrary 2012 Listen in Java 1 2 3 4 class List{ Object daten; List next; } Seite 111 DDS - Lists | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implementieren sie eine Liste wobei folgendes umzusetzen ist: I Die Elemente sind als inline-Klasse umzusetzen I Die Liste soll sowohl das Element Head als auch Last enthalten. I Erstelle einen Konstruktor um aus einem Object Array eine Liste zu erstellen I Erstelle eine Methode um am Ende der Liste ein Element anzufügen I Estellen sie geeignete Methoden um das n-te Objekt der Liste zu erhalten Seite 112 DDS - Lists | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implementieren sie eine Liste wobei folgendes umzusetzen ist: I Die Elemente sind als inline-Klasse umzusetzen I Die Liste soll sowohl das Element Head als auch Last enthalten. I Erstelle einen Konstruktor um aus einem Object Array eine Liste zu erstellen I Erstelle eine Methode um am Ende der Liste ein Element anzufügen I Estellen sie geeignete Methoden um das n-te Objekt der Liste zu erhalten Lösung siehe vim Seite 113 DDS - Wald | Repititorium PI | Februrary 2012 Definition Ein Baum ist entweder leer oder ein Knoten mit n-Nachfolgern, wobei keine Zyklen auftreten dürfen (gerichteter azyklischer Graph). Ein Baum mit maximal 2 Nachfolgern nenn man Binärbaum. Seite 114 DDS - Wald | Repititorium PI | Februrary 2012 Traversierung Unter traversierung versteht man das durchlaufen eines Baumes. Man unterscheidet zwischen Preorder,Inorder und Postorder. 1 2 3 4 //inorder left(); root(); right(); Seite 115 DDS - Wald | Repititorium PI | Februrary 2012 Beispiele Aufgabe Programmiere einen einfachen Baum, welcher als Daten einen String enthält. Die Daten sind sortiert einzufügen. Fügen sie die Buchstaben a-z zum Test ein. Anschließend sind alle Elemente in Pre- Post- und Inorder auszugeben. Lösung Siehe vim Seite 116 DDS - Wald | Repititorium PI | Februrary 2012 GOOD FIGHT GOOD NIGHT Danke für eure Aufmerksamkeit. Beginn Morgen um 10ct am selben Ort Seite 117 Wilkommen | Repititorium PI | Inhalt Day 3 Stacks Queues Graphen Suchen & Sortieren Februrary 2012 Seite 118 DDS - S&Q | Repititorium PI | Februrary 2012 Definition Stacks Auch Kellerspeicher gennant. Er ist eine Datenspeicherstruktur nach dem First In Last Out [FILO]. Der Zugrif erfolgt immer nur auf dem obersten Element. Üblicherweise sind folgende Operationen zu finden: I push(daten) legt daten auf den Stapel I pop() hohl das oberste Element I top() liefert das oberste Element, ohne es vom Stapel zu nehemen I empty() true falls leer Üblicherweise wird der Stack mithilfe eines Arrays und eines Stackpointer umgesetzt. Seite 119 DDS - S&Q | Repititorium PI | Februrary 2012 Definition Queues Eine Queue ist eine Datenspeicherstruktur nach dem First in First out [FIFO] Prinzip. Eine gute Analogie ist ein Rohr in das Daten auf der einen Seite reingeschoben werden und auf der wieder raus kommen. Umgesetzt wird sie normalerweise als einfach verkette Liste. Seite 120 DDS - S&Q | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implemetiere einen einfachen Stack mittels einer Liste, achte dabei aber auf Effizienz. Seite 121 DDS - S&Q | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implemetiere einen einfachen Stack mittels einer Liste, achte dabei aber auf Effizienz. Lösung Siehe vim Seite 122 DDS - S&Q | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implemetiere einen einfachen Stack mittels einer Liste, achte dabei aber auf Effizienz. Lösung Siehe vim Aufgabe2 Implementiere eine einfache Queue auf die selbe Weise. Seite 123 DDS - S&Q | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implemetiere einen einfachen Stack mittels einer Liste, achte dabei aber auf Effizienz. Lösung Siehe vim Aufgabe2 Implementiere eine einfache Queue auf die selbe Weise. Lösung Siehe vim Seite 124 DDS - C60 | Repititorium PI | Februrary 2012 Definition ungerichtete Graphen Ein Graph G ist ein Tupel G = G(V , E), mit einer Knoten-Menge V = {vi | i ∈ IN} (vertices, auch V (G) ), mit 0 ≤ card(V ) < ∞ und einer Kanten-Menge E ⊆ V × V (edge set, E(G)). Die Kanten-Menge E ist defineiert über eine irreflexive, symmetrische Relation R auf der Knoten-Menge V , mit R = {(vi , vj ), (vj , vi )|vi , vj ∈ V , i 6= j}, so dass E = {((vi , vj ), (vj , vi )) = eij |(vi , vj ), (vj , vi ) ∈ V × V } (kompaktere Notation: ((vi , vj ), (vj , vi )) = vi vj ). Seite 125 DDS - C60 | Repititorium PI | Februrary 2012 Adjazenzmatrix Graph: 1 4 2 Adjazenz-Matrix: 1 0 1 0 0 1 0 3 i 5 j 1 2 3 4 5 6 2 0 0 1 0 0 0 3 1 0 0 0 1 1 4 1 0 0 0 1 0 6 5 0 0 0 0 1 1 6 0 0 0 0 0 0 Seite 126 DDS - C60 | Repititorium PI | Februrary 2012 Adjazenzliste Gerichteter Graph G : 3 2 Adjazenz-Liste: 8 1 9 2 3 4 5 6 7 6 4 6 5 1 7 6 5 3 5 4 7 1 Ungerichteter Graph G: 3 2 2 1 6 5 4 9 8 Adjazenz-Liste: 8 7 8 9 1 2 3 4 5 6 2 1 1 5 4 6 6 7 3 6 7 7 8 5 5 9 1 1 4 9 9 7 8 Seite 127 DDS - C60 | Repititorium PI | Februrary 2012 Beispiele Gib Adjazenzliste und -matrix für folgenden Graph an. Seite 128 S&S - Suchen | Repititorium PI | Februrary 2012 Binäre Suche Ist ein sortiertes Array gegeben, so können wir darin schnell suchen. Dazu betrachten wir immer die Mitte des aktuellen Teilarrays. Ist sie gleich dem gesuchten Element, so sind wir fertig und geben das Element zurück. Ist das gesuchte Element kleiner als die Mitte, so suchen wir rekursiv in der linken Hälfte, sonst rekursiv in der rechten Hälfte. Ist das Teilarray leer, so konnte das Element nicht gefunden werden und wir sind fertig. Seite 129 S&S - Suchen | Repititorium PI | Februrary 2012 Beispiel Aufgabe Gib an, wie du die Zahl 3 im Array {1,2,3,4,5,8,9,12,31,34,65} findest. Begründe die Laufzeitkomplexität der Binären Suche. Seite 130 S&S - Suchen | Repititorium PI | Februrary 2012 Beispiel Aufgabe Gib an, wie du die Zahl 3 im Array {1,2,3,4,5,8,9,12,31,34,65} findest. Begründe die Laufzeitkomplexität der Binären Suche. Lösung siehe Tafel Seite 131 S&S - Sortieren | Repititorium PI | Februrary 2012 naive Sortieralgorithmen Definition Naive oder sukzessive Sortieralgorithmen gehen die Zahlen linear durch und vergleichen Stelle für Stelle. Seite 132 S&S - Sortieren | Repititorium PI | Februrary 2012 Bubble Beim Bubblesort steigen die großen Zahlen wie Luftblasen nach oben. 1 2 3 4 5 6 7 8 9 10 11 12 int[] arr = {3,2,6,3,4,6,8,1,2,9}; boolean changed = false; for (int i = arr.length - 1; i >= 0; i++) { for (int j = 0; j < i; j++) { if (arr[j]>arr[j+1]) { int tmp = arr[j]; arr[j] = arr[j changed = true; } } if (! changed) break; else changed = false; } Seite 133 S&S - Sortieren | Repititorium PI | Februrary 2012 Insertion Beim Insertionsort nehmen wir das aktuelle Element und fügen es an der richtigen Stelle im schon sortierten Arraybereich ein. Seite 134 S&S - Sortieren | Repititorium PI | Februrary 2012 Selection Beim Selectionsort nehmen wir immer das kleinste Element aus den noch unsortierten Array und hängen es am Ende des schon sortierten Bereichs an. Seite 135 S&S - Sortieren | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implementiere je einen Selection- und einen Insertionsort. Seite 136 S&S - Sortieren | Repititorium PI | Februrary 2012 Beispiele Aufgabe Implementiere je einen Selection- und einen Insertionsort. Lösung siehe Tafel Seite 137 S&S - C&C | Repititorium PI | Februrary 2012 komplexere Sortieralgorithmen Die Divide&Conquer-Algorithmen sind (im allgemeinen) effizienter als die sukzessiven Algorithmen. Es gibt zwei verschiedene Möglichkeiten, eine Menge von Zahlen per D&C zu sortieren: I Easy Split – Hard Join (ESHJ) I Hard Split – Easy Join (HSEJ) Seite 138 S&S - C&C | Repititorium PI | Februrary 2012 Merge Mergesort ist die ESHJ Variante. Wir halbieren unsere Menge immer bis wir einelementige Mengen haben und fügen diese wieder sortiert zusammen (merge). S&S - C&C | Seite 139 Repititorium PI | Februrary 2012 Quick Der Quicksort ist die HSEJ Variante. Wir wählen ein Pivot-Element und fügen die restlichen Elemente in zwei Teilmengen ein - abhängig davon, ob sie kleiner oder größer als das Pivot-Element sind. Dies machen wir rekursiv auf den Teilmengen und fügen sie dann, wenn sie leer sind wieder passend zusammen. Seite 140 S&S - C&C | Repititorium PI | Februrary 2012 Beispiele Aufgabe Visualisiere, wie du mit Merge- bzw. Quicksort folgendes Array sortierst. {3,5,4,2,7,8,9,2,1,6} Seite 141 S&S - C&C | Repititorium PI | Februrary 2012 Beispiele Aufgabe Visualisiere, wie du mit Merge- bzw. Quicksort folgendes Array sortierst. {3,5,4,2,7,8,9,2,1,6} Lösung siehe Tafel Seite 142 S&S - Heap | Repititorium PI | Februrary 2012 die Müllhalde Ein Heap ist ein spezieller Baum, bei dem in der Wurzel das kleinste (oder größte) Element gespeichert ist. In den davon ausgehenden Bäumen sind die Heapeigenschaften rekursiv gegeben. Der Heapsort funktioniert nun so, dass wir das Wurzelelement aus dem Heap entfernen und danach die Heapeigenschaften wiederherstellen. Dadurch bekommen wir die sortierte Zahlenfolge. Seite 143 S&S - Heap | Repititorium PI | Februrary 2012 Beispiel Abbildung: CC-BY-NC xkcd.com/835 Randall Munroe Seite 144 S&S - C | Repititorium PI | Februrary 2012 Vergleich der Komplexität Verfahren selection insertion bubble merge quick heap WC n2 n2 n2 n · log n n2 n · log n AC n2 n2 n2 n · log n n · log n n · log n Speicher 1 1 1 n log n 1 Q&A | Seite 145 Repititorium PI | Februrary 2012 Q&A Fragen? Klausuraufgaben? Spaß? Seite 146 Q&A | Repititorium PI | Februrary 2012 GOOD FIGHT GOOD NIGHT Viel Erfolg bei der Klausur!