8. Übung - oth-regensburg.de

Werbung
Programmieren in Java
8. Übung
Lösungen
1. Aufgabe
a)
/**
* @author Christine Niebler
*/
public class Complex {
private double real;
private double imaginaer;
// Konstruktoren
public Complex() {
real=0.0;
imaginaer=0.0;
}
public Complex(double real, double imaginaer) {
this.real = real;
this.imaginaer = imaginaer;
}
// Zugriff Realteil
public double real() {
return real;
}
// Zugriff Imaginaerteil
public double imaginaer() {
return imaginaer;
}
// Betrag der komplexen Zahl, die diese Methode aufruft
public double betrag() {
return Math.sqrt(real * real + imaginaer * imaginaer);
}
// Addition 2er komplexer Zahlen (aufrufende Instanz
// und uebergebene komplexe Zahl)
public Complex plus(Complex z) {
return new Complex(real+z.real, imaginaer+z.imaginaer);
}
// Subtraktion 2er komplexer Zahlen
// (aufrufende Instanz minus uebergebene
// komplexe Zahl)
public Complex minus(Complex z) {
return new Complex(real-z.real, imaginaer-z.imaginaer);
}
-1-
Programmieren in Java
// Multiplikation 2er komplexer Zahlen (aufrufende Instanz
// multipliziert mit uebergebener komplexer Zahl)
public Complex mal(Complex z) {
return new Complex(real * z.real - imaginaer * z.imaginaer,
real * z.imaginaer + imaginaer * z.real);
}
// Multiplikation der aufrufenden Instanz
// (komplexe Zahl mit uebergebener "double"-Zahl)
public Complex mal(double x) {
return new Complex(real * x, imaginaer * x);
}
// Division 2er komplexer Zahlen (aufrufende Instanz
// geteilt durch uebergebene komplexe Zahl)
public Complex teilenDurch(Complex z) {
double rz = z.betrag();
return
new Complex((real * z.real + imaginaer * z.imaginaer) / (rz * rz),
(imaginaer * z.real - real * z.imaginaer) / (rz * rz));
}
}
// Ausgabe komplexe Zahl
public String toString() {
if (imaginaer >= 0)
return (String.valueOf(real) + " + "
+ String.valueOf(imaginaer) + "i");
else
return (String.valueOf(real) + " - "
+ String.valueOf(-imaginaer) + "i");
}
-2-
Programmieren in Java
b)
/**
* @author Christine Niebler
*/
public class ComplexTest {
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);
//Realteil von u
System.out.println("Realteil von u: " + u.real());
//Imaginaerteil von u
System.out.println("Imaginaerteil von u: " + u.imaginaer());
//Betrag von u
System.out.println("|u|: " + u.betrag());
// 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);
-3-
Programmieren in Java
2. Aufgabe
a)
/**
* @author Christine Niebler
*/
public class Rational {
private long num;
private long den;
// Numerator (Zaehler)
// Denominator (Nenner)
// Default-Konstruktor
public Rational() {
num = 1;
den = 1;
}
// Konstruktor zur Ueberfuehrung einer
// double-Zahl in einen Bruch
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();
// Konstruktor zur Initialisierung einer gebrochenen Zahl
// aus dem uebergebenen Zaehler bzw. Nenner
public Rational(long num, long den) {
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;
}
}
private long ggT(long m, long n) {
long rest = m % n;
while (rest > 0) {
m = n;
n = rest;
rest = m % n;
}
return n;
}
// Addition 2er rationaler Zahlen (aufrufende Instanz
// und uebergebene rationale Zahl)
public Rational plus(Rational r) {
return new Rational(num * r.den + den * r.num, den * r.den);
}
-4-
Programmieren in Java
// Subtraktion 2er rationaler Zahlen (aufrufende Instanz
// minus uebergebene rationale Zahl)
public Rational minus(Rational r) {
return new Rational(num * r.den - den * r.num, den * r.den);
}
// Multiplikation 2er rationaler Zahlen (aufrufende Instanz
// multipliziert mit uebergebener rationaler Zahl)
public Rational mal(Rational r) {
return new Rational(num * r.num, den * r.den);
}
// Division 2er rationaler Zahlen (aufrufende Instanz
// geteilt durch uebergebene rationale Zahl)
public Rational teilenDurch(Rational r) {
Rational temp = new Rational(num * r.den, den * r.num);
return temp;
}
// die vorliegende Instanz soll weitgehend
// auf kleinstmoegliche Groessen reduziert
// werden, z.B. Teilen durch gemeinsame
// Vielfache von Zaehler und Nenner
public void reduzieren() {
long teiler;
long absnum; // Betrag des Zaehlers
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);
//
//
//
if
}
}
}
}
Falls „teiler == 1“, ist die rationale Zahl
reduziert,anderenfalls teile Numerator und
Denominator durch ihren groessten gemeinsamen Teiler
(teiler > 1)
{
num /= teiler;
den /= teiler;
// Ausgabe rationale Zahl
public String toString() {
return String.valueOf(num) + "/" + String.valueOf(den);
}
-5-
Programmieren in Java
b)
/**
* @author Christine Niebler
*/
public 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);
Rational 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);
3. Aufgabe
/**
* @author Christine Niebler
*/
public class Turtle {
// Instanzvariable
private double turtleR, turtleX, turtleY, turtleTheta;
// Konstruktoren
public Turtle() {
this(0.0,0.0,100,0);
}
public Turtle(double turtleX, double turtleY,
double turtleR, double turtleTheta) {
this.turtleX=turtleX;
this.turtleY=turtleY;
this.turtleR=turtleR;
this.turtleTheta=turtleTheta;
}
-6-
Programmieren in Java
// Instanzmethoden
public double getTurtleX() {
return turtleX;
}
public void setTurtleX(double turtleX) {
this.turtleX = turtleX;
}
public double getTurtleY() {
return turtleY;
}
public void setTurtleY(double turtleY) {
this.turtleY = turtleY;
}
public double getTurtleR() {
return turtleR;
}
public void setTurtleR(double turtleR) {
this.turtleR = turtleR;
}
public double getTurtleTheta() {
return turtleTheta;
}
public void setTurtleTheta(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;
}
-7-
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.getTurtleX();
yAlt = turtle.getTurtleY();
turtle.schritt();
g.drawLine((int) xAlt,
(int) yAlt,
(int) turtle.getTurtleX(),
(int) turtle.getTurtleY());
turtle.wende(-360/eckenZahl);
}
}
<HTML>
<HEAD>
<TITLE>1. Turtle-Anwendung</TITLE>
</HEAD>
<BODY>
<APPLET CODE="Vieleck.class" WIDTH=320 HEIGHT=320></APPLET>
</BODY>
</HTML>
-8-
Programmieren in Java
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.getTurtleX();
double yAlt = turtle.getTurtleY();
turtle.schritt();
g.drawLine((int) xAlt,
(int) yAlt,
(int) turtle.getTurtleX(),
(int) turtle.getTurtleY()); turtle.wende(90);
}
}
<HTML>
<HEAD>
<TITLE>2. Turtle-Aufgabe</TITLE>
</HEAD>
<BODY>
<APPLET CODE="Quadratrosette.class" WIDTH=300 HEIGHT=300></APPLET>
</BODY>
</HTML>
-9-
Herunterladen