Praktische Informatik mit Java - Lösungen 1.1 1 Ziffernsysteme Das Binärsystem Seite 8 Aufgabe 1: Schreiben Sie die Zahl 130 im Binärsystem und im Hexadezimalsystem. 130(10) = 10000010(2) = 82(16) Aufgabe 2: Im Anhang ist eine Tabelle mit den Hexadezimalzahlen der Zeichen nach dem Unicode abgedruckt. Lesen Sie ab, welcher Hexadezimalzahl 'ß' entspricht und rechnen Sie sie um ins Dezimalsystem. 'ß' = DF(16) = 223(10) 6.1. Einführung in Java Die ersten Java-Applets Seite 54 Aufgabe 18: Drucken Sie den Java-Quelltext aus. Unterstreichen Sie mit einer Farbe die Vokabeln, die zur Sprache Java gehören, und mit einer anderen die, die Sie selbst gewählt haben. import java.applet.*; import java.awt.*; class Versuch1 extends Applet { Versuch1() { Button knopfl = new Button("linker Knopf"); Button knopfr = new Button("rechter Knopf"); add(knopfl); add(knopfr); } } Aufgabe 19: Fügen Sie zu obiger Klasse noch weitere Buttons hinzu. import java.applet.*; import java.awt.*; class Versuch2 extends Applet { Versuch2() { Button knopfeins = new Button("Knopf eins"); Button knopfzwei = new Button("Knopf zwei"); Button knopfdrei = new Button("Knopf drei"); add(knopfeins); add(knopfzwei); add(knopfdrei); } } Aufgabe 20: Fügen Sie im Text der HTML-Seite Ihren Namen und das Datum hinzu. <HTML> <HEAD> <TITLE> Java - Programm 3 </TITLE> </HEAD> <BODY> <P> Reinhold Ley, 30. 1. 2002 </P> <APPLET code="Programm3.class" width = 300 height =100> </APPLET> 2 Praktische Informatik mit Java - Lösungen </BODY> </HTML> Aufgabe 21: Kopieren Sie den Programmtext, benennen Sie ihn um in Programm3 und verändern Sie ihn: fügen Sie Labels und Buttons in unterschiedlichen Farben hinzu. import java.applet.*; import java.awt.*; public class Programm3 extends Applet { public Programm3() { setBackground(Color.yellow); Button knopfl = new Button("linker Knopf"); knopfl.setBackground(Color.red); knopfl.setForeground(Color.green); Button knopfr = new Button("rechter Knopf"); knopfr.setBackground(Color.magenta); knopfr.setForeground(Color.orange); Label schriftz = new Label("Hello World"); schriftz.setBackground(Color.pink); schriftz.setForeground(Color.blue); add(knopfl); add(knopfr); add(schriftz); } } Aufgabe 22: Ergänzen Sie die Klasse Quadrat so, dass die Diagonalen des Quadrats in roter Farbe gezeichnet werden. import java.applet.*; import java.awt.*; public class Quadrat2 extends Applet { public Quadrat2() { Label ueberschr = new Label("Quadrat mit Diagonalen"); add(ueberschr); } public void paint(Graphics stift) { stift.setColor(Color.blue); stift.drawLine(10, 50, 10, 150); stift.drawLine(10, 150, 110, 150); stift.drawLine(110, 150, 110, 50); stift.drawLine(110, 50, 10, 50); stift.setColor(Color.red); stift.drawLine(10, 50, 110, 150); stift.drawLine(10, 150, 110, 50); } } Aufgabe 23: Beschreiben Sie zuerst, was das folgende Applet darstellen wird und prüfen Sie anschließend nach: import java.applet.*; import java.awt.*; public class demo1 extends Applet { public demo1() { setBackground(Color.green); } public void paint(Graphics stift) { stift.setColor(Color.yellow); stift.fillRect(10, 50, 100, 100); stift.setColor(Color.blue); Praktische Informatik mit Java - Lösungen 3 stift.fillOval(10, 50, 100, 100); stift.setColor(Color.red); stift.drawString("Dies ist ein Quadrat mit Kreis darin!", 10, 60); } } Aufgabe 24: Zeichnen Sie eine Treppe aus gefüllten Rechtecken. Skizzieren Sie sie zuerst auf einem Blatt Papier und überlegen Sie sich die Koordinaten. import java.applet.*; import java.awt.*; public class Treppe extends Applet { public Treppe() { setBackground(Color.yellow); } public void paint(Graphics stift) { stift.setColor(Color.blue); stift.fillRect(20, 120, 120, 20); stift.fillRect(20, 100, 100, 20); stift.fillRect(20, 80, 80, 20); stift.fillRect(20, 60, 60, 20); stift.fillRect(20, 40, 40, 20); stift.fillRect(20, 20, 20, 20); } } Aufgabe 25: Berechnen Sie die Werte von x*10, 100-y, 10, und y für die ersten drei Durchläufe und schreiben Sie sie in einer Tabelle auf. x 1 2 3 4 5 6 7 8 9 10 x*10 10 20 30 40 50 60 70 80 90 100 100-y 99 96 91 84 75 64 51 36 19 0 10 10 10 10 10 10 10 10 10 10 10 y 1 4 9 16 25 36 49 64 81 100 Aufgabe 26: Die Variable h gebe die Höhe einer Treppenstufe an. Zeichnen Sie mit Hilfe einer ForSchleife eine Treppe aus gefüllten Rechtecken. import java.applet.*; import java.awt.*; 4 Praktische Informatik mit Java - Lösungen public class Treppe2 extends Applet { int h=20; int x=50; int b=0;; public void paint(Graphics g) { for (int y=50; y<200; y=y+h) { b=b+40; g.fillRect(x, y, b, h); } } } Aufgabe 27: Zeichnen Sie mit Hilfe einer While-Schleife konzentrische Kreise. import java.applet.*; import java.awt.*; public class Kreise extends Applet { int x=150; int r=0; public void paint(Graphics g) { while (r<100) { r=r+10; g.drawOval(x-r, x-r, 2*r, 2*r); } } } Aufgabe 28: Schreiben Sie eine Klasse für die Folge der ungeraden Zahlen. import java.applet.*; import java.awt.*; public class UZahlen extends Applet { public UZahlen() { Label Ueberschrift=new Label("Ungerade Zahlen:"); add(Ueberschrift); for (int n=1; n<30; n=n+2) { Label L=new Label(" " + n); add(L); } } } Praktische Informatik mit Java - Lösungen 5 Aufgabe 29: Die Zahlenfolge (an) soll die Summe der ersten n ungeraden Zahlen darstellen. Schreiben Sie eine Klasse. import java.applet.*; import java.awt.*; public class Summe extends Applet { public Summe() { Label Ueberschrift=new Label("Summe der ungeraden Z."); add(Ueberschrift); int s=0; for (int n=1; n<30; n=n+2) { s=s+n; Label L=new Label(" " + s); add(L); } } } Aufgabe 30: Berechnen Sie die Fakultäten bis 10! und speichern Sie sie in einem Array. (5!=1*2*3*4*5. Definition: 0!=1) import java.applet.*; import java.awt.*; public class Faku extends Applet { public Faku() { Label Ueberschrift=new Label("Fakultäten:"); add(Ueberschrift); int f[]=new int[10]; f[0]=1; for (int n=1; n<10; n=n+1) { f[n]=f[n-1]*n; Label L=new Label(" " + f[n]); add(L); } } } Aufgabe 31: Ein beliebiges Dreieck soll gezeichnet und an einer vertikalen Achse gespiegelt werden. import java.applet.*;import java.awt.*; class Spiegelung extends Applet { int x0, y0, m, xSchirm, ySchirm; Graphics Stift; public void init() { m=20; x0=200; y0=200; setBackground(Color.white); } void zeichneAchsen() { Stift.drawLine(0,y0,2*x0,y0); Stift.drawLine(x0,0,x0,2*y0); } void zeichneEinheiten() { Stift.drawOval(x0-5,y0-5,10,10); for (int i=-10; i<=10; i=i+1) Stift.drawLine(xSchirm(i),y0-3,xSchirm(i),y0+3); for (int i=-10; i<=10; i=i+1) Stift.drawLine(x0-3,ySchirm(i),x0+3,ySchirm(i)); } void zeichneDreieck(double xa, double ya, double xb, double yb, double xc, double yc) { 6 Praktische Informatik mit Java - Lösungen Stift.drawLine(xSchirm(xa),ySchirm(ya), xSchirm(xb),ySchirm(yb)); Stift.drawLine(xSchirm(xb),ySchirm(yb), xSchirm(xc),ySchirm(yc)); Stift.drawLine(xSchirm(xc),ySchirm(yc), xSchirm(xa),ySchirm(ya)); } int xSchirm(double x){ return xSchirm=(int)(x0+m*x); } int ySchirm(double y){ return ySchirm=(int)(y0-m*y); } public void paint (Graphics g) { Stift=g; zeichneAchsen(); zeichneEinheiten(); Stift.setColor(Color.red); zeichneDreieck(1,1,5,2,3,8); zeichneDreieck(-1,1,-5,2,-3,8); } } Aufgabe 32: Erzeugen Sie Zufallszahlen von 1 bis 6 (Würfelzahlen). Würfeln Sie unter Verwendung einer For-Schleife 10 mal. Berechnen Sie die Summe der 10 Würfelzahlen und geben Sie zum Schluss den Durchschnitt aus. import java.applet.*; import java.awt.*; public class Wuerfel extends Applet { int f[]=new int[10]; int su=0; double du; public Wuerfel() { Label Ueberschrift=new Label("Wuerfel:"); add(Ueberschrift); for (int n=0; n<10; n=n+1) { f[n]=(int)(Math.random()*6)+1; Label L=new Label(" " + f[n]); add(L); su=su+f[n]; } du=(double)su/10; Label durch=new Label("Durchschnitt: "+du); add(durch); } } Aufgabe 33: Erzeugen Sie Zufallszahlen von 1 bis 6 (Würfelzahlen) und stellen Sie eine Häufigkeitsverteilung auf. import java.applet.*; import java.awt.*; public class Wuerfel2 extends Applet { int z; int s[]=new int[7]; public Wuerfel2() { Label Ueberschrift=new Label("Häufigkeit:"); add(Ueberschrift); for (int n=0; n<10; n=n+1) { z=(int)(Math.random()*6)+1; s[z]=s[z]+1; } for (int n=1; n<7; n=n+1) { Label L=new Label(" "+n+" : "+s[n]); add(L); } Praktische Informatik mit Java - Lösungen } } Aufgabe 35: Ergänzen Sie in obiger Klasse Rechteck3 eine Methode berechneUmfang(). import java.applet.*; import java.awt.*; public class Rechteck4 extends Applet { int a, b; String s; public void init() { a = 80; b = 50; setBackground(Color.green); } public int berechneFlaeche(int L, int B) { int F = L * B; return F; } public int berechneUmfang(int L, int B) { int U = 2*L + 2*B; return U; } public void paint (Graphics stift) { int A=berechneFlaeche(a,b); int Um=berechneUmfang(a,b); s="Laenge: "+a+" Breite: "+b+" Flaeche:"+A+" Umfang:"+Um; stift.drawString(s , 20, 40); stift.fillRect( 20 , 80 , a , b ); } } 6. 11 Datenströme, Schreiben in Dateien Seite 94 Aufgabe 69: Schreiben Sie eine Applikation, die eine Zahl aus einer Datei von der Festplatte liest, sie um 1 erhöht und wieder auf Platte schreibt. import java.io.*; public class LiesZahl { public static void main(String[]args) throws IOException { String x; int z; File datei = new File("Zahl.txt"); FileReader dateiLeser=new FileReader(datei); BufferedReader einLeser=new BufferedReader(dateiLeser); x=einLeser.readLine(); PrintWriter ausgabe = new PrintWriter(System.out); ausgabe.println("gelesen: "+x); z=Integer.parseInt(x); z=z+1; FileWriter dateiSchreiber=new FileWriter(datei); PrintWriter aufPlatte = new PrintWriter(dateiSchreiber); aufPlatte.println(z); aufPlatte.close(); ausgabe.println("geschrieben: "+z); ausgabe.close(); } 7 8 Praktische Informatik mit Java - Lösungen } Aufgabe 70: Ergänzen Sie die GUI-Applikation vom vorigen Abschnitt so, dass der eingegebene Text in einer Datei auf der Festplatte gespeichert wird, beziehungsweise von der Festplatte gelesen und in der zweiten TextArea angezeigt wird. Da hier ein Input-Output-Fehler auftreten kann, muss dieser „abgefangen“ werden. Die kritischen Zeilen, in denen ein Fehler auftreten kann, werden zwischen try und catch eingerahmt. Man könnte zum Beispiel versuchen, eine Datei von der Festplatte zu lesen, die es noch gar nicht gibt. import java.awt.*; import java.awt.event.*; import java.io.*; public class FenApp4 extends Frame implements ActionListener{ String z; String eingabeText; Button A = new Button("speichern"); Button B = new Button("gespeicherten Text holen"); TextArea TextEin = new TextArea("Eingabe hier", 3, 40); TextArea TextAus = new TextArea("Ausgabe: "); public FenApp4() { super("Speichern auf Festplatte"); setLayout(new FlowLayout()); add(TextEin); add(A); add(B); A.addActionListener(this); B.addActionListener(this); add(TextAus); TextAus.setEditable(false); setSize(600, 500); setVisible(true); addWindowListener(new FensterLauscher()); } public String lesen() { try { File Datei = new File("Test2.txt"); FileReader DateiLeser=new FileReader(Datei); BufferedReader Leser=new BufferedReader(DateiLeser); z=Leser.readLine(); DateiLeser.close(); Leser.close(); } catch (IOException e) { TextAus.append("Datei nicht gefunden!"); } return z; } public void schreiben(String t) { try { File Datei = new File("Test2.txt"); FileWriter DateiSchreiber = new FileWriter(Datei); PrintWriter Ausgabe = new PrintWriter(DateiSchreiber); Ausgabe.println(t); DateiSchreiber.close(); Ausgabe.close(); } catch (IOException e) {} } public void actionPerformed(ActionEvent e) { String s=e.getActionCommand(); Praktische Informatik mit Java - Lösungen if (s.equals("speichern")) { eingabeText = TextEin.getText(); schreiben(eingabeText); } if (s.equals("gespeicherten Text holen")) { z=lesen(); TextAus.append(z); } } public static void main(String[]args) { new FenApp4(); } class FensterLauscher extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } } Hier bietet es sich an, mit Seite 150 weiter zu machen. Anstatt auf Festplatte werden dort Daten mit dem PrintWriter über einen Port ins Netz oder Internet gesendet. 9 10 10 Praktische Informatik mit Java - Lösungen Client - Server- Programmierung Seite 154 Aufgabe 107: Ergänzen Sie die HTML-Seite durch Radio-Buttons und Auswahlmenüs und untersuchen Sie, in welcher Form die Daten dann an den Server übermittelt werden. Siehe Seite 155! Seite 157 Aufgabe 108: Erstellen Sie eine HTML-Seite mit einer Umfrage über ein interessantes Thema. Speichern Sie die übermittelten Daten auf der Server-Festplatte. Schreiben Sie ein Programm, das eine Auswertung dieser Daten in einer Häufigkeitstabelle darstellt. public void alleLesen(BufferedReader r, PrintWriter a) { try { String zeile[]=new String[4]; int alt[]=new int[22]; a.println("HTTP/1.0 200 OK\nContent-type: text/html\n\n"); a.println("<H3>Haeufigkeiten:</H3> "); int i=0; zeile[i]=r.readLine(); while (zeile[i] != null) { while ((zeile[i] != null) && (i<3)){ i=i+1; zeile[i]=r.readLine(); } int alter=Integer.parseInt(zeile[1]); alt[alter]=alt[alter]+1; i=0; zeile[i]=r.readLine(); } for (int k=10; k<22; k=k+1) a.println("Alter: "+k+"Häufigkeit: "+alt[k]+"<BR>"); } catch (Exception e) { e.printStackTrace(); } } } Aufgabe 109: Schreiben Sie ein Server-Programm, das eine HTML-Seite von der Festplatte liest und prüft, ob ein bestimmtes Wort vorkommt (Suchmaschine). Seite 159 Aufgabe 110: Erstellen Sie eine Datenbank mit einer Tabelle der Adressen der Schülerinnen und Schüler deiner Klasse. Auf einer grafischen Oberfläche soll ein Name eingegeben und nach Telefonnummern und E-Mail-Adressen gesucht werden. Wir öffnen eine neue Datenbank in Access (siehe Lehrbuch Seite 28 ff.) und nennen sie Adressen. Darin erstellen wir eine Tabelle und nennen sie Klassenliste. Wir nennen die Spalten Vorname, Nachname, Telefon und E-Mail. Will man auf Daten in einer Access-Datenbank zugreifen, so registriert man zuerst die Datenquelle, indem man auf Start - Einstellungen - (in NT: Verwaltung) - Datenquellen (ODBC) klickt. Man benutzt den Treiber sun.jdbc.odbc.JdbcOdbcDriver. um eine Verbindung zwischen der Java- und der Microsoft-Welt herzustellen: Praktische Informatik mit Java - Lösungen import java.awt.*; import java.awt.event.*; import java.sql.*; public class Adressen extends Frame implements ActionListener{ String treiber="sun.jdbc.odbc.JdbcOdbcDriver"; String url="jdbc:odbc:Adressen"; String user=""; String psst=""; Label l = new Label("Suchen in DB Adressen"); TextField textEin = new TextField(20); TextArea textAus = new TextArea("",10,60); Button b = new Button("Los!"); public Adressen() { setLayout(new FlowLayout()); add(l); add(b); b.addActionListener(this); add(textEin); add(textAus); setSize(500,300); setVisible(true); addWindowListener(new FensterLauscher()); } public void actionPerformed(ActionEvent e) { String str = textEin.getText(); String frage="SELECT * FROM Klassenliste WHERE Nachname LIKE '"+str+"%'"; Connection con = null; try { Class.forName(treiber); con=java.sql.DriverManager.getConnection(url,user,psst); Statement st= con.createStatement(); ResultSet res= st.executeQuery(frage); while (res.next()) { String Vorname=res.getString("Vorname"); textAus.append(Vorname+"\t"); String Nachname=res.getString("Nachname"); textAus.append(Nachname+"\t"); String Telefon=res.getString("Telefon"); textAus.append(Telefon+"\t"); String EMail=res.getString("E-Mail"); textAus.append(EMail+"\n"); } res.close(); st.close(); con.close(); } catch (Exception ex) { textAus.append(""+ex.getMessage());} } class FensterLauscher extends WindowAdapter { public void windowClosing(WindowEvent e) {System.exit(0);} } public static void main(String[] args) { new Adressen(); } } 11 12 10.1 Praktische Informatik mit Java - Lösungen Servlets Als Laufumgebung für Servlets (und für Java Server Pages) eignet sich Tomcat. Der Standalone- Server Tomcat kann auch unter MSWindows benutzt werden, da er in Java geschrieben ist. Nach der Installation von Tomcat muss man angeben, wo Java-Compiler, Java-Interpreter und die ClassDateien zu finden sind, die bedarfsweise importiert werden. Das kann man in der Datei Autoexec.bat machen, wie im Lehrbuch Seite 232 beschrieben. Unter Windows 200 / NT geschieht dies durch setzen der Umgebungsvariablen. Dazu klickt man mit der rechten Maustaste auf Arbeitsplatz und wählt Eigenschaften - Erweitert - Umgebungsvariablen - Systemvariablen - Neu. Als neue Systemvariable trägt man ein: CLASSPATH und als ihr Wert zum Beispiel C:\jdk1.3\lib;C:\Jsdk20\lib; Der Variablen JAVA_HOME geben wir beispielsweise den Wert C:\jdk1.3 und der Variablen TOMCAT_HOME den Wert E:\Tomcat, wenn wir dort Tomcat installiert haben. Im Verzeichnis Tomcat\Jakarta\bin befindet sich die Datei startup.bat, mit der man Tomcat startet. Im Verzeichnis Tomcat\jakarta\webapps\examples\servlets befinden sich Html-Dateien, die Beispiel-Servlets aufrufen können. Im Verzeichnis Tomcat\jakarta\webapps\examples\WEB-INF\classes befinden sich die Class-Dateien dieser Servlets. Seite 168 Aufgabe 111: Schreiben Sie ein Servlet Forum, das Textbeiträge zu einem Thema speichert und ausgibt. Wir öffnen eine neue Datenbank in Access (siehe Lehrbuch Seite 28 ff.) und nennen sie ForumDB. Darin erstellen wir eine Tabelle und nennen sie ForumTabelle. Wir nennen Feld1 Name und Feld2 Textbeitrag. Wir registrieren die Datenbank für den Zugriff wie oben beschrieben. Praktische Informatik mit Java - Lösungen import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; public class ForumDrei extends HttpServlet { String treiber="sun.jdbc.odbc.JdbcOdbcDriver"; String url="jdbc:odbc:ForumDB"; // Datenbankname String user=""; String psst=""; Connection con = null; Statement s; String Name=" "; String Textbeitrag=" "; String frage="select * from ForumTabelle"; // Tabellenname String ergebnis="OK"; ResultSet resultat; public void doPost(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException, IOException{ Name = anfrage.getParameter("Name"); Textbeitrag = anfrage.getParameter("Textbeitrag"); antwort.setContentType("text/html"); PrintWriter ausgabe = antwort.getWriter(); ausgabe.println("<HTML><BODY><FONT SIZE=6>Forum:</FONT><BR>"); String eintrag="insert into ForumTabelle (Name,Textbeitrag) values('"+Name+"','"+Textbeitrag+"')"; try { Class.forName(treiber); con=DriverManager.getConnection(url,user,psst); s=con.createStatement(); if (Textbeitrag.equals(" ")) s.execute(eintrag); s.execute(frage); resultat = s.getResultSet(); while (resultat.next()) { String Name = resultat.getString("Name"); String Textbeitrag = resultat.getString("Textbeitrag"); ausgabe.println(Name + ":\t" + Textbeitrag + "<BR>"); } } catch (Exception e) {ergebnis = e.getMessage();} ausgabe.println(ergebnis+"</BODY> </HTML>"); } } 13