Programmieren in Java 8. Übung Lösungen 1. Aufgabe a) public class Complex extends Object { private double u; private double v; Complex() { u = 0; v = 0; } Complex(double x, double y) { u = x; v = y; } // Realteil public double real() { return u; } // Imagiaerteil public double imaginaer() { return v; } // Betrag public double betrag() { return Math.sqrt(u * u + v * v); } // Addition zweier komplexer Zahlen public Complex plus(Complex z) { return new Complex(u + z.u,v + z.v); } // Subtraktion zweier komplexer Zahlen public Complex minus(Complex z) { return new Complex(u - z.u,v - z.v); } // Multiplikation zweier komplexer Zahlen public Complex mal(Complex z) { return new Complex(u * z.u - v * z.v, u * z.v + v * z.u); } // Multiplikation einer komplexen Zahl mit einer " double"-Zahl public Complex mal(double x) { return new Complex(u * x, v * x); } public Complex teilenDurch(Complex z) { double rz = z.betrag(); return new Complex((u * z.u + v * z.v) / (rz * rz), (v * z.u - u * z.v) / (rz * rz)); 1 Programmieren in Java } public String toString() { if (v >= 0) return (String.valueOf(u) + " + " + String.valueOf(v) + "i"); else return (String.valueOf(u) + " - " + String.valueOf(-v) + "i"); } } b) public class ComplexTest extends Object { public static void main(String args[]) { Complex u, v, w, z; u = new Complex(1,2); System.out.println("u: " + u); v = new Complex(3,-4.5); /* System.out.println("v: " + v.real() + " + " + v.imaginaer() + "i"); */ System.out.println("v: " + v); // Addiere u und v z = v.plus(u); System.out.println("v + u: " + z); // Subtraktion u - v z = u.minus(v); System.out.println("u - v: " + z); // Multiplikation u * v z = u.mal(v); System.out.println("u * v: " + z); // Multiplikation v * u z = v.mal(u); System.out.println("v * u: " + z); // Multiplikation mit einer Gleitpunktzahl double x = 5.1; z = v.mal(x); System.out.println("v * x: " + z); // Teilen u durch v z = u.teilenDurch(v); System.out.println("u / v: " + z); // Teilen v durch u z = v.teilenDurch(u); System.out.println("v / u: " + z); } } 2. Aufgabe a) class Rational { // Instanzvariable long num = 0L; // Numerator long den = 1L; // Denominator // Private Methoden private long ggT(long m, long n) { long rest = m % n; 2 Programmieren in Java while (rest > 0) { m = n; n = rest; rest = m % n; } return n; } // Konstruktoren public Rational(double x) { double wert1; double wert2; // Verschieben des Dezimalpunkts um 8 Stellen nach rechts wert1 = 100000000L * x; // Verschieben des Dezimalpunkts um 7 Stellen nach rechts wert2 = 10000000L * x; // wert1 - wert2 = 90000000 * x // Abschneiden zu einer " long"-Zahl, Entfernen des gebrochenen Teils // Approximation von x durch Numerator/90000000 num = (long) (wert1 - wert2); den = 90000000L; // Reduzieren reduzieren(); } public Rational(long num, long den) { super(); this.num = num; this.den = den; if (den == 0) { System.out.println("Ein Null-Denominator ist falsch"); System.out.println("Denominator wird auf 1 gesetzt"); this.den = 1; } } // Instanzmethoden // Addition public Rational plus(Rational r) { Rational temp = new Rational(num * r.den + den * r.num, den * r.den); return temp; } // Subtraktion public Rational minus(Rational r) { Rational temp = new Rational(num * r.den - den * r.num, den * r.den); return temp; } // Multiplikation public Rational mal(Rational r) { Rational temp = new Rational(num * r.num, den * r.den); return temp; } // Division public Rational teilenDurch(Rational r) { Rational temp = new Rational(num * r.den, den * r.num); return temp; } public void reduzieren() 3 Programmieren in Java { long teiler; long absnum; // absoluter Wert des Numerators absnum = (num <0) ? -num : num; if (num == 0) den = 1; else { // Finde den groessten gemeinsamen Teiler von absnum und dem Denominator teiler = ggT(absnum,den); // Fall „teiler == 1“, ist die rationale Zahl reduziert,anderenfalls // teile Numerator und Denominator durch ihren groessten gemeinsamen // Teiler if (teiler > 1) { num /= teiler; den /= teiler; } } } // Konvertieren rationale Zahl in " double"-Zahl public double rationalIndouble() { return (double) num / den; } // Ausgabe public String toString() { return String.valueOf(num) + '/' + String.valueOf(den); } } b) class RationalTest { public static void main(String args[]) { System.out.println("Approximation Double-Zahl in rationale Zahl"); double d = 0.75; Rational v = new Rational(d); System.out.println("v: " + v); System.out.println("Erzeugen einer rationalen Zahl"); Rational u = new Rational(2,3); System.out.println("u: " + u); System.out.println("Die zugehoerige double-Zahl ist: " + u.rationalIndouble()); System.out.println("Rechnen mit rationalen Zahlen"); Rational z; z = u.plus(v); System.out.println("u + v: " + z); z = u.minus(v); System.out.println("u - v: " + z); z = v.minus(u); System.out.println("v - u: " + z); z = u.mal(v); System.out.println("u * v: " + z); z = u.teilenDurch(v); System.out.println("u / v: " + z); z = v.teilenDurch(u); System.out.println("v / u: " + z); } } 4 Programmieren in Java 3. Aufgabe public class Turtle { // Instanzvariable private double turtleR, turtleX, turtleY, turtleTheta; // Konstruktor public Turtle() { this(0.0,0.0,100,0); } public Turtle(double turtleX, double turtleY, double turtleR, double turtleTheta) { this.setzeTurtleX(turtleX); this.setzeTurtleY(turtleY); this.setzeTurtleR(turtleR); this.setzeTurtleTheta( turtleTheta); } // Instanzmethoden public double holeTurtleX() { return turtleX; } public void setzeTurtleX(double turtleX) { this.turtleX = turtleX; } public double holeTurtleY() { return turtleY; } public void setzeTurtleY(double turtleY) { this.turtleY = turtleY; } public double holeTurtleR() { return turtleR; } public void setzeTurtleR(double turtleR) { this.turtleR = turtleR; } public double holeTurtleTheta() { return turtleTheta; } public void setzeTurtleTheta(double turtleTheta) { this.turtleTheta = turtleTheta; } public void schritt() { turtleX += turtleR * Math.cos(turtleTheta*Math.PI/180); turtleY += turtleR * Math.sin(turtleTheta*Math.PI/180); } public void wende(double winkel) { turtleTheta += winkel; 5 Programmieren in Java } } a) import java.awt.*; import java.applet.*; public class Vieleck extends Applet { // Turtle-Objekt Turtle turtle; // Abmessung des Fensters Dimension d; // Anzahl der Ecken /* int eckenZahl = 12; */ int eckenZahl = 3; public void init() { d = getSize(); // turtle = new Turtle(d.width/2-25,3*d.height/4,100,0); turtle = new Turtle(d.width/4,3*d.height/4,200,0); } public void paint(Graphics g) { double xAlt; double yAlt; g.setColor(Color.yellow); g.fillRect(0,0,d.width-1,d.height-1); g.setColor(Color.black); for (int i = 0; i < eckenZahl; i++) { xAlt = turtle.holeTurtleX(); yAlt = turtle.holeTurtleY(); turtle.schritt(); g.drawLine((int) xAlt, (int) yAlt,(int) turtle.holeTurtleX(), (int) turtle.holeTurtleY()); turtle.wende(-360/eckenZahl); } } } b) import java.awt.*; import java.applet.*; public class Vieleck extends Applet { // Turtle-Objekt Turtle turtle; // Abmessung des Fensters Dimension d; // Anzahl der Ecken /* int eckenZahl = 12; */ int eckenZahl = 3; public void init() { d = getSize(); // turtle = new Turtle(d.width/2-25,3*d.height/4,100,0); turtle = new Turtle(d.width/4,3*d.height/4,200,0); } public void paint(Graphics g) { double xAlt; double yAlt; 6 Programmieren in Java g.setColor(Color.yellow); g.fillRect(0,0,d.width-1,d.height-1); g.setColor(Color.black); for (int i = 0; i < eckenZahl; i++) { xAlt = turtle.holeTurtleX(); yAlt = turtle.holeTurtleY(); turtle.schritt(); g.drawLine((int) xAlt, (int) yAlt,(int) turtle.holeTurtleX(), (int) turtle.holeTurtleY()); turtle.wende(-360/eckenZahl); } } } <HTML> <HEAD> <TITLE>1. Turtle-Anwendung</TITLE> </HEAD> <BODY> <APPLET CODE="Vieleck.class" WIDTH=320 HEIGHT=320> </APPLET> </BODY> </HTML> b) import java.awt.*; import java.applet.*; public class Quadratrosette extends Applet { // Turtle-Objekt Turtle turtle; // Abmessung des Fensters Dimension d; public void init() { d = getSize(); turtle = new Turtle(d.width/2,d.height/2,100,0); } public void paint(Graphics g) { g.setColor(Color.yellow); g.fillRect(0,0,d.width-1,d.height-1); for (int i = 0; i < 36; i++) { zeichneQuadrat(g); turtle.wende(10); } } public void zeichneQuadrat(Graphics g) { g.setColor(Color.black); for (int i = 0; i < 4; i++) { double xAlt = turtle.holeTurtleX(); double yAlt = turtle.holeTurtleY(); turtle.schritt(); g.drawLine((int) xAlt, (int) yAlt,(int) turtle.holeTurtleX(), (int) turtle.holeTurtleY()); turtle.wende(90); } 7 Programmieren in Java } } <HTML> <HEAD> <TITLE>2. Turtle-Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Quadratrosette.class" WIDTH=300 HEIGHT=300> </APPLET> </BODY> </HTML> c) import java.awt.*; import java.applet.*; public class Aufg3c extends Applet { // Turtle-Objekt Turtle turtle; // Abmessung des Fensters Dimension d; // Seitenlaenge int seitenlaenge = 20; public void init() { d = getSize(); turtle = new Turtle(d.width/2,d.height/2,seitenlaenge,0); } public void paint(Graphics g) { double xAlt; double yAlt; g.setColor(Color.yellow); g.fillRect(0,0,d.width-1,d.height-1); g.setColor(Color.black); for (int i = 0; i < 29; i++) { xAlt = turtle.holeTurtleX(); yAlt = turtle.holeTurtleY(); turtle.schritt(); g.drawLine((int) xAlt, (int) yAlt,(int) turtle.holeTurtleX(), (int) turtle.holeTurtleY()); seitenlaenge +=10; turtle.setzeTurtleR(seitenlaenge); turtle.wende(90); } } } <HTML> <HEAD> <TITLE>3. Turtle-Anwendung</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg3c.class" WIDTH=320 HEIGHT=320> </APPLET> </BODY> </HTML> 8