Übungsstunde 10

Ü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