TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen Praktikum Grundlagen der Programmierung F. Forster, T. Gawlitza, A. Flexeder Übungen zu WS 2007/2008 Lösungsvorschläge zu Blatt 12 18. Januar 2008 Praktikum Grundlagen der Programmierung Aufgabe 54 Appletspielereien (Lösungsvorschlag) a) HTML-Code: simpleapplet.html <html> <head> <title>Applet - Spielereien </title> </head> <body> <h1>Applet - Spielereien </h1> <applet codebase="." code=" SimpleApplet. class " width=600 height=400 alt=" Your browser has to be Java - enabled to see the applet !" > </applet> </body> </html> b) Applet-Code: SimpleApplet.java import import import import import java. applet . Applet ; java. awt . Color ; java. awt . Font ; java. awt . Graphics ; java. awt . Polygon ; public class SimpleApplet extends Applet { public void paint ( Graphics page ) { setBackground( Color . gray ); Font big = new Font (" SansSerif " , Font. BOLD ,30); Font normal = new Font (" SansSerif " ,Font . BOLD ,10); page. setFont ( big ); page. setColor ( Color . black ); page. drawString (" Applet - Spielereien ", 50 , 50); page. setFont ( normal ); page. setColor ( Color . white ); page. drawString (" im Praktikum Grundlagen der Programmierung" , 50 , 70); page. drawRoundRect(30 ,20 , 340 , 60 ,10 ,10); page. setColor ( Color . blue ); page. drawOval (200 , 200 , 100 , 100); page. drawOval (400 , 200 , 100 , 100); page. setColor ( Color . black ); page. fillRect (235 , 235 , 30 , 30); page. fillRect (435 , 235 , 30 , 30); Polygon p = new p. addPoint (350 , p. addPoint (330 , p. addPoint (370 , Polygon (); 240); 280); 280); page. fillPolygon (p ); page. setColor ( Color . red ); Lösung 12/ Seite 2 page. drawLine (250 , 350 , 450 , 350); page. drawLine (250 , 350 , 220 , 320); page. drawLine (450 , 350 , 480 , 320); } } Test durch Aufrufen der HTML-Datei im WWW-Browser oder mit appletviewer. Aufgabe 55 (Ü) Pater-Noster Eine mögliche Modellierung sieht folgendermassen aus: Thread run():void Fahrgast in:int out:int name:String Fahrgast(in:int,out:int,name:String) run():void Paternoster mitfahren(in:int,out:int):void public class Fahrgast extends Thread { private String name ; private int in , out ; private Paternoster aufzug ; public Fahrgast ( String name , Paternoster aufzug , int in , int out ) { this. name = name ; this. aufzug = aufzug ; this. in = in ; this. out = out ; } public void run () { System . out . println ( name + " wartet im " + in + ". Stock " ); aufzug . mitfahren (in , out ); } public String toString () { return name; } } public abstract class Paternoster extends Thread { public abstract void mitfahren (int in , int out ); } public class SimplePaternoster extends Paternoster { private int stockwerke , frei , stockwerk = 0, delta = 1; private Object monitor = new Object (); public SimplePaternoster(int stockwerke , int frei) { this. stockwerke = stockwerke ; this. frei = frei ; } public void run () { while (true) { // Aufzug verweilt im Stockwerk try { sleep (1000); } catch ( InterruptedException e) { } synchronized( monitor ) { System . out . println (" Aufzug faehrt los ." ); try { sleep (1000); } catch ( InterruptedException e) { } Lösung 12/ Seite 3 stockwerk += delta ; if (( stockwerk ==0)||( stockwerk == stockwerke -1)) delta = -delta ; System . out . println (" Aufzug haelt an ." ); System . out . println (" Stockwerk "+ stockwerk +"; lasse Leute ein - und aussteigen " ); monitor . notifyAll (); } } } public void mitfahren (int in , int out ){ synchronized ( monitor ) { while ( stockwerk != in || frei == 0) try { monitor . wait ();} catch ( InterruptedException ie ) {} System . out . println ( Thread . currentThread() + " steigt ein " ); frei - -; while ( stockwerk != out ) try { monitor . wait ();} catch ( InterruptedException ie ) {} frei ++; System . out . println ( Thread . currentThread() + " steigt aus " ); } } } public class ExtendedPaternoster extends Paternoster { private int stockwerke , frei , stockwerk = 0, delta = 1; // Monitore zum Ein- und Aussteigen private Object [] einsteigen , aussteigen ; public ExtendedPaternoster(int stockwerke , int frei ) { this. stockwerke = stockwerke ; this. frei = frei ; einsteigen = new Object [ stockwerke ]; aussteigen = new Object [ stockwerke ]; for (int i = 0; i< stockwerke ;i ++) { einsteigen [i] = new Object (); aussteigen [i] = new Object (); } } public void run () { while (true) { synchronized( einsteigen [ stockwerk + delta ]) { synchronized( aussteigen [ stockwerk + delta ]) { synchronized( einsteigen [ stockwerk ]) { synchronized( aussteigen [ stockwerk ]) { // Aufzug faehrt try { sleep (1000); } catch ( InterruptedException e) { } stockwerk += delta ; if (( stockwerk ==0)||( stockwerk == stockwerke -1)) delta = - delta ; } } System . out . println (" Stockwerk "+ stockwerk +"; lasse Leute aussteigen " ); aussteigen [ stockwerk ]. notifyAll (); } // Abstand zwischen aus- und einsteigen try { sleep (500); } catch ( InterruptedException e) { } System . out . println (" Stockwerk "+ stockwerk +"; lasse Leute einsteigen " ); einsteigen [ stockwerk ]. notifyAll (); } // Aufzug verweilt im Stockwerk try { sleep (1000); } catch ( InterruptedException e) { } } } public void mitfahren (int in , int out ){ synchronized ( einsteigen [ in ]) { while ( stockwerk != in || frei == 0) try { einsteigen [in ]. wait ();} catch ( InterruptedException ie ) {} frei - -; } System . out . println ( Thread . currentThread() + " ist eingestiegen" ); synchronized ( aussteigen [ out ]) { while ( stockwerk != out ) try { aussteigen [ out ]. wait ();} catch ( InterruptedException ie ) {} frei ++; } } } Lösung 12/ Seite 4 Aufgabe 56 (H) Aussichtsturm (10 Punkte) public class Tourist extends Thread { private String name ; private Aufzug aufzug ; public Tourist ( String name , Aufzug aufzug ){ this. name = name ; this. aufzug = aufzug ; } public void run () { System . out . println ( name + " moechte rauffahren ." ); aufzug . rauffahren (); System . out . println ( name + " befindet sich auf der Platform ." ); try { System . out . println ( name +" verweilt auf der platform " ); sleep ((new java . util . Random ()). nextInt (8000)+2000); } catch ( InterruptedException e) { } System . out . println ( name + " moechte runterfahren." ); aufzug . runterfahren(); } public String toString () { return name ; } } public class Aufzug extends Thread { private int stockwerk = 0, platform = 0; private boolean frei = true; private Object rauf = new Object (); private Object runter = new Object (); private Object passagier = new Object (); public Aufzug (){} public void run () { while (true) { if( stockwerk == 0){ synchronized ( rauf ){ rauf. notify ();} try { sleep (500); } catch ( InterruptedException e) { } stockwerk = 10; }else{ synchronized ( runter ){ runter . notify ();} try { sleep (500); } catch ( InterruptedException e) { } stockwerk = 0; } frei = true; System . out . println ("[ Aufzug ]: Aufzug haelt an." ); System . out . println ("[ Aufzug ]: Stockwerk "+ stockwerk +": ein - und aussteigen " ); synchronized( passagier ){ passagier . notify ();} System . out . println ("[ Aufzug ]: Aufzug faehrt los ." ); try { sleep (1000); } catch ( InterruptedException e) { } } } public void rauffahren (){ synchronized ( rauf ) { while (! frei || platform ==10 || stockwerk != 0){ System . out . println (" RAUF: Tourist muss warten . " ); try { rauf . wait ();} catch ( InterruptedException ie ) {} } frei = false; platform ++; } synchronized( passagier ){ try { passagier . wait (); }catch( InterruptedException ie ){} } } public void runterfahren(){ synchronized ( runter ) { while(! frei || stockwerk != 10){ System . out . println (" RUNTER : Tourist muss warten ." ); try { runter . wait ();} catch ( InterruptedException ie) {} } frei = false; Lösung 12/ Seite 5 platform - -; } synchronized( passagier ){ try { passagier . wait (); }catch( InterruptedException ie ){} } } } public class Main { public static void main ( String [] args ) { Aufzug p = new Aufzug (); Tourist f1 = new Tourist (" Thomas " , p ); Tourist f2 = new Tourist (" Alex " , p ); Tourist f3 = new Tourist (" Peter " , p ); Tourist f4 = new Tourist (" Sylvia " , p ); Tourist f5 = new Tourist (" Markus " , p ); Tourist f6 = new Tourist (" Michael ",p ); Tourist f7 = new Tourist (" Arnie " , p ); Tourist f8 = new Tourist (" Bert " , p ); Tourist f9 = new Tourist (" Flo " , p ); Tourist f10 = new Tourist (" Betty " , p ); Tourist f11 = new Tourist (" Biggy " , p ); f1. start (); f2. start (); f3. start (); f4. start (); f5. start (); f6. start (); f7. start (); f8. start (); f9. start (); f10 . start (); f11 . start (); p. start (); } } Aufgabe 57 (H) Applet-Kunst (5 Punkte) a) HTML-Code: modernart.html <html> <head> <title> Moderne Kunst </title> </head> <body> <h1> Moderene Kunst </h1> <applet codebase="." code=" ModernArt . class " width=600 height=700 alt=" Your browser has to be Java - enabled to see the applet !" > </applet> </body> </html> b) Applet-Code: ModernArt.java import import import import import java. applet . Applet ; java. awt . Color ; java. awt . Font ; java. awt . Graphics ; java. util . Random ; public class ModernArt extends Applet { public void paint ( Graphics page ) { // how many moves are final int MOVES = 40; // boundaries of the canvas: TOPLEFT_X, TOPLEFT_Y, BOTTOMRIGHT_X, BOTTOMRIGHT_Y final int[] CANVAS_BOUNDARIES = new int[] {20 ,20 ,400 ,600}; page. drawRect ( CANVAS_BOUNDARIES[0] -1 , CANVAS_BOUNDARIES[1] -1 , CANVAS_BOUNDARIES[2] - CANVAS_BOUNDARIES[0]+2 , CANVAS_BOUNDARIES[3] - CANVAS_BOUNDARIES[1]+2); Random random = new Random (); for (int i = 0; i < MOVES ; i ++) { setRandomColor( page ); Lösung 12/ Seite 6 int move = random . nextInt (5); if ( move == 0) drawText (" modern art ",page , CANVAS_BOUNDARIES); else if ( move == 1) drawRect ( page , CANVAS_BOUNDARIES); else if ( move == 2) drawOval ( page , CANVAS_BOUNDARIES); else drawLine ( page , CANVAS_BOUNDARIES); } setBackground( Color . white ); } private void setRandomColor( Graphics page) { Random random = new Random (); page. setColor (new Color ( random . nextInt (256) , random . nextInt (256) , random . nextInt (256))); } private void drawLine ( Graphics page , int[] boundaries ) { Random random = new Random (); int x1 = random . nextInt ( boundaries [2] - boundaries [0]) + boundaries [0]; int x2 = random . nextInt ( boundaries [2] - boundaries [0]) + boundaries [0]; int y1 = random . nextInt ( boundaries [3] - boundaries [1]) + boundaries [1]; int y2 = random . nextInt ( boundaries [3] - boundaries [1]) + boundaries [1]; page. drawLine (x1 ,y1 ,x2 ,y2 ); } private void drawRect ( Graphics page , int[] boundaries ) { Random random = new Random (); int x = random . nextInt ( boundaries [2] - boundaries [0]) + boundaries [0]; int y = random . nextInt ( boundaries [3] - boundaries [1]) + boundaries [1]; int width = random . nextInt ( boundaries [2] - x ); int height = random . nextInt ( boundaries [3] - y); if ( random . nextInt (2) == 1) page . drawRect (x , y , width , height ); else page . fillRect (x ,y , width , height ); } private void drawOval ( Graphics page , int[] boundaries ) { Random random = new Random (); int x = random . nextInt ( boundaries [2] - boundaries [0]) + boundaries [0]; int y = random . nextInt ( boundaries [3] - boundaries [1]) + boundaries [1]; int width = random . nextInt ( boundaries [2] - x ); int height = random . nextInt ( boundaries [3] - y); if ( random . nextInt (2) == 1) page . drawOval (x , y , width , height ); else page . fillOval (x ,y , width , height ); } private void drawText ( String string , Graphics page , int[] boundaries ) { int stringWidth = page . getFontMetrics(). stringWidth ( string ); int height = page. getFontMetrics(). getHeight (); Random random = new Random (); int x = random . nextInt ( boundaries [2] - boundaries [0] - stringWidth ) + boundaries [0]; int y = random . nextInt ( boundaries [3] - boundaries [1] - height ) + boundaries [1] + height ; page. drawString ( string ,x ,y ); } } Test durch Aufrufen der HTML-Datei im WWW-Browser oder mit appletviewer.