Lösungen: 1. Aufgabe Clock.html <applet code="Clock.class" width=200 height=200></applet> /* Clock.java */ import java.util.*; import java.applet.*; import java.awt.*; import java.awt.image.*; /* * @author Benjamin Kormann */ public class Clock extends Applet implements Runnable { Thread runner; GregorianCalendar gc; Image dbImage; Graphics dbGraphics; int mitte; int xSt = 0, ySt = 0; int xMin = 0, yMin = 0; int xSek = 0, ySek = 0; int stunde, minute, sekunde; public void init() { setBackground(Color.white); Dimension d = getSize(); mitte = d.width / 2; } public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } } public void run() { while (true) { gc = new GregorianCalendar(); stunde = gc.get(Calendar.HOUR_OF_DAY); minute = gc.get(Calendar.MINUTE); sekunde = gc.get(Calendar.SECOND); // Reduzieren der Stunden if (stunde > 12) stunde -= 12; // Berechnung der Zeigerpositionen xSt = (int) (7*mitte*Math.sin((Math.toRadians(stunde*30))+(Math.toRadians(minute*0.5)))/12); ySt = (int) (-7*mitte*Math.cos((Math.toRadians(stunde*30))+(Math.toRadians(minute*0.5)))/12); xMin = (int) (5*mitte*Math.sin(Math.toRadians(minute*6))/6); yMin = (int) (-5*mitte*Math.cos(Math.toRadians(minute*6))/6); xSek = (int) (7*mitte*Math.sin(Math.toRadians(sekunde*6))/12); ySek = (int) (-7*mitte*Math.cos(Math.toRadians(sekunde*6))/12); repaint(); try { Thread.sleep(1000); } catch (InterruptedException ie) {} } } public void paint(Graphics g) { // Uhrrahmen zeichnen g.setColor(Color.black); g.drawOval(0,0,(2*mitte)-1,(2*mitte)-1); // Stundenzeiger zeichnen g.setColor(Color.black); g.drawLine(mitte, mitte, mitte+xSt, mitte+ySt); // Minutenzeiger zeichnen g.drawLine(mitte, mitte, mitte+xMin, mitte+yMin); // Zahlen zeichnen for (int i=1; i<13;i++) g.drawString(Integer.toString(i), -5 + mitte + 5*((int) (mitte*Math.sin(Math.toRadians(i*30))))/6, 5 + mitte + 5*((int) (-mitte*Math.cos(Math.toRadians(i*30))))/6); // Sekundenzeiger zeichnen g.setColor(Color.red); g.drawLine(mitte, mitte, mitte+xSek, mitte+ySek); } public void update(Graphics g) { // doublebuffering initialisieren if (dbImage == null) { dbImage = createImage(this.getSize().width, this.getSize().height); dbGraphics = dbImage.getGraphics(); } // background loeschen dbGraphics.setColor(getBackground()); dbGraphics.fillRect(0, 0, this.getSize().width, this.getSize().height); // foreground setzen dbGraphics.setColor(getForeground()); paint(dbGraphics); // offset zeichnen g.drawImage(dbImage, 0, 0, this); } } 2. Aufgabe /* PI.java */ import java.io.*; import java.util.*; /* * @author Benjamin Kormann */ public class PI { public static void main(String args[]) throws IOException { String pi = new BufferedReader(new FileReader("pi")).readLine(); pi = pi.substring(2, pi.length()); Hashtable hash = new Hashtable(); for(int i = 0; i < pi.length(); i++) { Integer tmp = Integer.valueOf(pi.substring(i,i+1)); if (hash.containsKey(tmp)) ((Counter) hash.get(tmp)).count++; else hash.put(tmp, new Counter()); } Enumeration e = hash.keys(); while(e.hasMoreElements()) { Integer c = (Integer)e.nextElement(); System.out.println(c.toString() + " = " + ((Counter)hash.get(c)).count); } } } class Counter { int count; public Counter() { count = 1; } public String toString() { return Integer.toString(count); } } 3. Aufgabe <html> <head> <title>Berechnung von PI</title> </head> <body> <applet code="ViertelKreis.class" width=200 height=300></applet> </body> </html> /* Viertelkreis.java */ import javax.swing.*; import java.awt.*; import java.awt.event.*; /* * @author Benjamin Kormann */ public class ViertelKreis extends JApplet implements AdjustmentListener { private JTextField pi, anzahl; private JScrollBar scroll; private Panel pBottom; private ZeichenFlaeche zf; private int dreiecke; private double kreisZahl; public void init() { dreiecke = 3; pi = new JTextField(20); anzahl = new JTextField(20); scroll = new JScrollBar(JScrollBar.HORIZONTAL, 3, 5, 3, 1005); pBottom = new Panel(); zf = new ZeichenFlaeche(this.dreiecke); pi.setEditable(false); anzahl.setEditable(false); berechnePI(); pi.setText(piToString()); anzahl.setText("3"); scroll.addAdjustmentListener(this); Container c = getContentPane(); c.setLayout(new BorderLayout()); pBottom.setLayout(new GridLayout(3,1)); pBottom.add(scroll); pBottom.add(anzahl); pBottom.add(pi); c.add("South", pBottom); c.add("Center", zf); zf.zeichne(dreiecke); } public void adjustmentValueChanged(AdjustmentEvent ae) { dreiecke = ae.getValue(); anzahl.setText(Integer.toString(dreiecke)); zf.zeichne(dreiecke); berechnePI(); } public void berechnePI() { kreisZahl = 2*dreiecke*Math.sin(Math.toRadians(90)/(double)dreiecke); pi.setText(piToString()); } public String piToString() { return Double.toString(kreisZahl); } } class ZeichenFlaeche extends Canvas { private int dreiecke; private Image dbImage; private Graphics dbGraphics; private double winkel; private int hoehe, breite; public ZeichenFlaeche(int dreiecke) { this.dreiecke = dreiecke; this.winkel = holeWinkel(this.dreiecke); } public void zeichne(int dreiecke) { this.dreiecke = dreiecke; this.winkel = holeWinkel(this.dreiecke); repaint(); } public double holeWinkel(int dreiecke) { return Math.toRadians(90.0/(double)dreiecke); } public void paint(Graphics g) { breite = this.getSize().width; hoehe = this.getSize().height; g.setColor(Color.red); // 3Eck zeichnen for (int i = 1; i < dreiecke; i++) { g.drawLine(0, hoehe, (int)(breite*Math.sin(i*winkel)), hoehe - (int)(hoehe*Math.cos(i*winkel))); } for (int i = 0; i < dreiecke; i++) { g.drawLine((int)(breite*Math.sin(i*winkel)), (int)(hoehe - (int)(hoehe*Math.cos(i*winkel))), (int)(breite*Math.sin((i+1)*winkel)), (int)(hoehe - (int)(hoehe*Math.cos((i+1)*winkel)))); } // 1/4-Kreis zeichnen g.setColor(Color.black); g.drawArc(-breite, 0, 2*breite, 2*hoehe, 0, 90); } public void update(Graphics g) { if (dbImage == null) { dbImage = createImage(breite, hoehe); dbGraphics = dbImage.getGraphics(); } dbGraphics.setColor(getBackground()); dbGraphics.fillRect(0, 0, breite, hoehe); dbGraphics.setColor(getForeground()); paint(dbGraphics); g.drawImage(dbImage, 0, 0, null); } }