Übungsstunde 10 Einführung in die Programmierung I Probleme bei Übung 9 [TODO Assistent] Nachbesprechung Übung 10 <<I>> Comparable Aufgabe 1 boolean lessThan(Comparable other) Ziel: Schreiben von Methoden, die für alle Instanzen von Klassen funktionieren, die Comparable implementieren. public interface Comparable { boolean lessThan(Comparable other); } Canton City Lake Mountain lessThan() toString() lessThan() toString() lessThan() toString() lessThan() toString() public class Canton implements Comparable { … public boolean lessThan(Comparable other) { if(other instanceof Canton) return area < ((Canton) other).area; else throw new NotComparableException( "cannot compare " + this + " with " + other); } } lessThan muss per instanceof den dynamischen Typen abfragen und casten Hint: beim generischen Comparable<T> ist das nicht mehr nötig public static Comparable max(Comparable[] array) { Comparable max = array[0]; for(int i = 1; i < array.length; i++) if(max.lessThan(array[i])) max = array[i]; return max; } Comparable Objekte unterstützen lessThan() Mountain highest = ( Mountain) ArrayUtils.max(mountains); max() gibt ein Comparable zurück, was auch wieder ge-casted werden muss. Aufgabe 2 Ziel: Fehlerbehandlung mit Exceptions Ankündigen, weil checked Exception public Person(String dataRow) throws IllegalPersonFormatException { Scanner scanner = new Scanner(dataRow); try { age = scanner.nextInt(); if(age < 0) throw new IllegalPersonFormatException( "negative age" ); // ... isMale = gender.equals( "m"); } catch(InputMismatchException e) { throw new IllegalPersonFormatException( "non-int value" ); } catch(NoSuchElementException e) { throw new IllegalPersonFormatException( "not enough values" ); } } Sinnlose Daten Umwandeln von “internen” Exceptions Klient der Person-Klasse: static LinkedPersonList readPersons(Scanner scanner) { LinkedPersonList persons = new LinkedPersonList(); while(scanner.hasNextLine()) { try { persons.addLast( new Person(scanner.nextLine())); } catch(IllegalPersonFormatException e) { System.out.println( "Error: illegal person data: " e.getMessage()); } } return persons; } + Muss Exception handlen und überspringt dann fehlerhafte Zeilen. Vorbesprechung Übung 11 Aufgabe 1: Comparable Modern Art Ziel: Kunst und Comparable<T> benutzen public class ModernArtApp { public static void main(String[] args) throws InterruptedException { // create a frame (window) JFrame frame = new JFrame( "Modern Art" ); frame.setMinimumSize( new Dimension(400, 300)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // add a modern art panel to the frame frame.add( new ModernArtPanel()); // show the frame frame.setVisible( true); // repaint the frame (window) every 100 ms, so that there is some action! while(true) { frame.repaint(); Thread.sleep(100); } }} Comparable<T> <<I>> Comparable<T> int compareTo(T other); <<bind>> T → Shape public int compareTo( Shape other) { // this.area() und other.area() } <<I>> Shape void draw(Graphics g); double area(); <<implements>> Dank generischem Typ Comparable<T> hat other nun den Typ Shape, auf den wir area() aufrufen können (ohne Cast) Rectangle Oval draw() area() compareTo( Shape o) draw() area() compareTo( Shape o) Aufgabe 2 Ziel: Auswerten von einfachen Ausdrücken (Expressions) Enter a value for x: 2.0 >> 1+x 3.0 >> sin(x) 0.9092974268256817 >> a+x unknown variable 'a' >> (1 + sin(x)) * 5^x Syntax error: unexpected token '^', expected end of input >> (1 + sin(x)) * (5^x) 47.73243567064204 >> exit Legale Expressions? Aufgabe 2: Parsen 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. “ ” “a” “x % 5” “1b” “a + b” “a * 2” “-1” “(a + 2 )” “2x+y” “1++” “(1 + 2) * 3” “sin()” “1 + (2 + (3.1))” “x^0.5” “1 + 1 + 1” “sin(x) * cos(x^2)” “var1” Aufgabe 2: Parsen Folgt diese Zeichenkette der EBNF Beschreibung? Wie gehen Sie vor? “( 1 + 2 ) + 3” Wie schreibt man ein Programm, das dies überprüft? Aufgabe 2: Parsen ● ● ● Regeln werden zu Methoden Alternativen werden zu if-else-if-else Regeln auf der RHS werden zu Methodenaufrufen void term() { if(next token is open) { consume open token expr(); check and consume close token } else if(next token is func) { consume func token expr(); check and consume close token } else { atom(); } } Aufgabe 2: Parsen “( 1 + 2 ) + )” expr() Tokenizer term() term() expr() atom() term() term() atom() atom() Error: Expected ‘num’ or ‘var’! Aufgabe 2: Parsen Die roten Regeln sind Tokenizer-Regeln, die in der Projektvorlage in der Klasse Tokenizer vorgegeben sind. k chec consume Aufgabe 2: Evaluieren Während dem Parsen kann auch gleich evaluiert werden. double evalterm() { if(next token is open) { consume open token double val = eval expr(); check and consume close token return val; } else if(/* next token is func */) { consume func token double arg = eval expr(); double val = applyThatFunc(arg) check and consume close token return val; } else { return evalatom(); } } Aufgabe 2: Evaluieren 6.0 “( 1 + 2 ) + 3” expr() Tokenizer 3. 0 3. 0 term() term() 3.0 3.0 expr() 0 term() 2.0 1.0 atom() 2. 1.0 term() atom() atom() Aufgabe 3: Plotten GUI-y-Achse Für jeden Wert x auf der x-Achse einen Wert y auf der y-Achse berechnen. Beispiel: y-Achse GUI-x-Achse x-Achse Aufgabe 3: Plotten PlotterApp hat einen FunctionChangeListener, der bei Änderung im JTextField die setFunction-Methode auf das PlotterPanel aufruft. PlotterPanel JLabel JTextField Zusatzübungen
© Copyright 2024 ExpyDoc