Rechnen mit Brüchen, ist meine Lösung soweit richtig?

Cookiieee

Mitglied
Die Rechnung mit endlichen (Gleit-)Kommazahlen kann zu Ungenauigkeiten führen, es kann daher wünschenswert sein, ganzzahlige Brüche zu verwenden.
In dieser Aufgabe soll eine Objektklasse zur Repräsentation von und Rechnung mit Brüchen erzeugt werden.
Die Köpfe der geforderten Methoden sind bereits vorgegeben und dürfen nicht verändert werden. Die Methoden sollen entsprechend der Kommentare vervollständigt werden.
Achten sie darauf diese Methoden, wann immer möglich, zu verwenden und so Duplikationen zu vermeiden.
Alle Methoden deren Rückgabetyp Fraction ist, sollen ein neues Objekt erzeugen und zurückgeben und die zur Berechnung verwendeten Objekte unverändert lassen!

Die Java-Standardbibliotheken Math und Integer dürfen (müssen aber nicht) verwendet werden. Um eine Gleitkommazahl bei der Rechnung mit Ganzzahlen zu erhalten muss ggf. Typecasting verwendet werden!
Es stehen außerdem die folgenden zwei Methoden schon zur Verfügung:
public static int GCD(int x, int y): Gibt den größten gemeinsamen Teiler der beiden Argumente (Greatest Common Divider) zurück.

public static int LCM(int x, int y): Gibt das kleinste gemeinsame Vielfache der beiden Argumente (Lowest Common Multiple) zurück.


Java:
public class Fraction {

    private int numerator, denominator;
    
    /**
     * Gibt den größten gemeinsamen Teiler der beiden Argumente (Greatest Common Divider) zurück.
     */
    public static int GCD(int x, int y) {
        if (y == 0) return x;
        return GCD(y, x % y);
    }

    /**
     * Gibt das kleinste gemeinsame Vielfache der beiden Argumente (Lowest Common Multiple) zurück.
     */
    public static int LCM(int x, int y) {
        return (x * y) / GCD(x, y);
    }
 //Beginn der Aufgabe 
   /**
     * Vollstaendig parametrisierter Konstruktor der Zaehler und Nenner
     * uebergeben bekommt und die entsprechenden Attribute setzt.
     * Negative Vorzeichen (Zahlen kleiner als Null) duerfen nur im Zaehler
     * auftreten (nicht im "denominator"-Attribut).
     * Die Uebergabe eines negativen Nenners ("denominator"-Argument) an den Konstruktor ist jedoch zulaessig.
     * Der Konstruktor muss also den uebergebenen Nenner pruefen und sein Vorzeichen so behandeln,
     * dass der resultierende Bruch (die Attribute) die genannte Restriktion erfüllt
     * und der Wert des Bruchs (die Argumente) unverändert bleibt
     * (ein negatives Vorzeichen im Nenner muss also methematisch korrekt beseitigt werden).
     * Wird eine Null als Nenner uebergeben, so wird das entsprechende Attribut
     * auf Eins gesetzt.
     * Jeder erzeugte Bruch wird gekuerzt (dazu soll die entsprechende Mehode s.u. verwendet werden).
     */
    public Fraction(int numerator, int denominator) {
        if(pDenominator<0){
            numerator = -pNumerator;
            denominator = -pDenominator;
        }
        if(pDenominator == 0){
            denominator = 1;
        }
        
    }

    /**
     * Gibt den Nenner zurueck.
     */
    public int getDenominator() {
    return denominator;
    
    }

    /**
     * Gibt den Zaehler zurueck.
     */
    public int getNumerator() {
        return numerator;
    }

    /**
     * Gibt den Bruch als Gleitkommazahl zurueck.
     */
    public double toDouble() {
        double fraction = numerator / denominator;
        return fraction;
    }

    /**
     * Gibt einen String im Format
     * "Zaehler/Nenner" zurueck.
     */
    public String toString() {
        double fraction = toDouble();
        return numerator + "/" + denominator + " = " + fraction;
        
    }

    /**
     * Kuerzt (vereinfacht) den Bruch.
     */
    public void shorten() {
        int factorC = GCD(numerator, denominator);
        numerator = numerator/factorC;
        denominator = denominator/factorC;
        
    }

    /**
     * Erweitert (macht gleichnamig), addiert dann den uebergebenen Bruch.
     */
    public Fraction add(Fraction f) {
        numerator = numerator * f.denominator + f.numerator * denominator;
        denominator = denominator * f.denominator;
        cancel();
      
    }

    /**
     * Multipliziert mit dem uebergebenen Bruch.
     */
    public Fraction multiply(Fraction f) {
        numerator = numerator * f.numerator;
        denominator = denominator * f.denominator;
        cancel();
    }

    /**
     * Bildet den Kehrwert, wenn der Zaehler ungleich Null ist.
     * Sonst wird der Bruch unveraendert zurueckgegeben.
     */
    public Fraction reciprocal() {
      
    }
    
    /**
     * Dividiert durch den uebergebenen Bruch
     * (unter Verwendung von Kehrwert und Multiplikation).
     */
    public Fraction divide(Fraction f) {
        numerator = numerator * f.denominator;
        denominator = denominator * f.numerator;
        cancel();
    }
}
 

LimDul

Top Contributor
Neben der Tatsache, dass es nicht kompiliert - was passiert im Konstruktor, wenn ein Nenner > 0 übergeben wird?
Kommentar im Konstruktor:
* Jeder erzeugte Bruch wird gekuerzt (dazu soll die entsprechende Mehode s.u. verwendet werden).
Wo passiert das?

reciprocal - kein Code, kompiliert nicht.
divide - zwar mathematisch richtig, aber nicht gemäß Aufgabe, es sollen die Methoden für den Kehrwert und Multiplikation genutzt werden.

Alle Methoden verlezten folgende Aufgabestellung:

Alle Methoden deren Rückgabetyp Fraction ist, sollen ein neues Objekt erzeugen und zurückgeben und die zur Berechnung verwendeten Objekte unverändert lassen!

toDouble wird auch nicht funktionieren, da es eine Integer Division.

Als konstruktiver Vorschlag: Ersetz alle Methoden, die was zurückgeben mit folgendem Inhalt:
return null;

Dann fang an eine Methode nach der anderen zu implementieren und bau dir ein kleines Programm, was die Methoden testet. Und wenn eine Methode funktioniert (am besten mit dem Konstruktor anfangen), dann die nächste.
 

Cookiieee

Mitglied
Java:
public class Fraction {

    private int numerator, denominator;

    public static int GCD(int x, int y) {
        if (y == 0) return x;
        return GCD(y, x % y);
    }

    public static int LCM(int x, int y) {
        return (x * y) / GCD(x, y);
    }

    public Fraction(int numerator, int denominator) {
        if (denominator == 0)
            throw new IllegalArgumentException("Division by zero");
        int factor = GCD(Math.abs(numerator), Math.abs(denominator));
        this.numerator = numerator / factor;
        this.denominator = denominator / factor;
        if (this.denominator < 0) {
            this.numerator = -this.numerator;
            this.denominator = -this.denominator;
        }
    }

    public int getDenominator() {
        return denominator;
    }

    public int getNumerator() {
        return numerator;
    }

    public double toDouble() {
        return (double) numerator / denominator;
    }

    public String toString() {
        return numerator + "/" + denominator;
    }

    public void shorten() {
        int factor = GCD(Math.abs(numerator), Math.abs(denominator));
        this.numerator = numerator / factor;
        this.denominator = denominator / factor;
        if (this.denominator < 0) {
            this.numerator = -this.numerator;
            this.denominator = -this.denominator;
        }
    }

    public Fraction add(Fraction f) {
        int commonDenominator = LCM(this.denominator, f.denominator);
        return new Fraction(this.numerator * (commonDenominator / this.denominator)
                + f.numerator * (commonDenominator / f.denominator), commonDenominator);
    }

    public Fraction multiply(Fraction f) {
        return new Fraction(this.numerator * f.numerator, this.denominator * f.denominator);
    }

    public Fraction reciprocal() {
        return numerator == 0 ? this : new Fraction(denominator, numerator);
    }

    public Fraction divide(Fraction f) {
        return this.multiply(f.reciprocal());
    }

    public static void main(String[] args) {
        // Getter Test
        Fraction twothird = new Fraction(2, 3);
        System.out.println("Fraction twothird: " + twothird.getNumerator() + "/" + twothird.getDenominator());
        // Erwartet: 2/3

        try {
            Fraction f = new Fraction(2, 0);
            System.out.println("Fraction f: " + f.getNumerator() + "/" + f.getDenominator());
        } catch (IllegalArgumentException e) {
            System.out.println("Exception caught: " + e.getMessage());
            // Erwartet: Exception mit "Division by zero"
        }
    }
}


Ich habe jetzt das, allerdings kommt, dass da noch etwas falsch ist, kann mir da jemand weiter helfen?
Siehe Bilder

Oder muss ich bei Zeile 77
Fraction f = new Fraction(2, 0);

Statt (2,0) einfach (2,1) hinschreiben?
 

Anhänge

  • Screenshot (111).png
    Screenshot (111).png
    12 KB · Aufrufe: 0
  • Screenshot (110).png
    Screenshot (110).png
    16,4 KB · Aufrufe: 0
Zuletzt bearbeitet:

Hough

Mitglied
In Zeile 77 übergibst Du einen Nenner = 0. Genau dieser Fall wird in Zeile 15 abgeprüft und in Zeile 16 wird eine Exception geworfen, denn Brüche mit einer 0 im Nenner (entspricht Division durch 0) sind mathematisch nicht definiert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Rechnen mit Brüchen - objektorientierte Programmierung Java Basics - Anfänger-Themen 18
D Erste Schritte Rechnen mit Brüchen Java Basics - Anfänger-Themen 13
C Kann mir jemand sagen warum ich nicht mal rechnen kann ? Java Basics - Anfänger-Themen 32
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
Zeppi Geteilt rechnen Java Basics - Anfänger-Themen 2
D Mit Objekten rechnen, Textfield, JavaFX, Noob Java Basics - Anfänger-Themen 8
L Mit Zahlen im String rechnen Java Basics - Anfänger-Themen 19
L Datentypen Rechnen und abrunden mit double Java Basics - Anfänger-Themen 7
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
D Operatoren Mit Objekten rechnen Java Basics - Anfänger-Themen 7
S Rechnen mit MaxValue Java Basics - Anfänger-Themen 7
L Rechnen mit Objekten Java Basics - Anfänger-Themen 3
W Erste Schritte Rechnen mit Schleifen? Denkanstoß gesucht Java Basics - Anfänger-Themen 15
W Seltames Problem bei Rechnen mit BigIntegers Java Basics - Anfänger-Themen 2
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
S Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ? Java Basics - Anfänger-Themen 20
S Dezimalzahlen rechnen Java Basics - Anfänger-Themen 3
kilopack15 Rechnen mit großen Zahlen Java Basics - Anfänger-Themen 6
D Rechnen mit numerischen Datentyp Frage Java Basics - Anfänger-Themen 16
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
1 Mit Java Rechnen Java Basics - Anfänger-Themen 10
T Einstieg in "grafische Progammierung" + Rechnen in Flussdiagramm Java Basics - Anfänger-Themen 2
W Variablen float rundet beim Bruch rechnen Java Basics - Anfänger-Themen 3
N Oracle SQL mit Zwischenergebnis rechnen Java Basics - Anfänger-Themen 2
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
S Double mithilfe eines Scanners so einlesen, dass ich damit rechnen kann Java Basics - Anfänger-Themen 4
J Char-Rechnen Java Basics - Anfänger-Themen 8
A Rechnen mit Set/Get? Java Basics - Anfänger-Themen 2
Z Erste Schritte Instanzmethoden Rechnen (Bruch) Java Basics - Anfänger-Themen 18
M Mit Werten aus Arrays in anderen Methoden rechnen? Java Basics - Anfänger-Themen 3
J Mit Datum rechnen Java Basics - Anfänger-Themen 11
F Erste Schritte [GUI] Dual in Dezimal rechnen Java Basics - Anfänger-Themen 5
D rechnen mit Stunden und Minuten Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
G Rechnen mit Long Variablen Java Basics - Anfänger-Themen 4
N Probleme beim Rechnen mit Integer und double Java Basics - Anfänger-Themen 4
W Variablen Rechnen mit "char" Java Basics - Anfänger-Themen 2
Joew0815 Compiler-Fehler Unexpected Type - Problem mit Variablen rechnen Java Basics - Anfänger-Themen 7
F Werte aus Tabelle vergleichen/rechnen Java Basics - Anfänger-Themen 5
C Mit Potenzen rechnen "Problem" Java Basics - Anfänger-Themen 3
M Mit Array rechnen Java Basics - Anfänger-Themen 9
T Rechnen in Arrays Java Basics - Anfänger-Themen 11
B von Ergebniss weiter rechnen Java Basics - Anfänger-Themen 3
S Rechnen mit Datum bzw. Uhrzeit Java Basics - Anfänger-Themen 3
S Datentypen Operatoren und Ausdrücke (formel richtig rechnen) Java Basics - Anfänger-Themen 8
N Mit long rechnen Java Basics - Anfänger-Themen 2
K Übungsblatt 13 Aufgabe 6 (Rechnen) Java Basics - Anfänger-Themen 12
C Mit Gleitkommazahlen rechnen Java Basics - Anfänger-Themen 20
T Rechnen mit Operatoren Java Basics - Anfänger-Themen 2
W Mit (char) rechnen Java Basics - Anfänger-Themen 3
F Mit Arrays rechnen Java Basics - Anfänger-Themen 12
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
B mit benutzereingaben rechnen Java Basics - Anfänger-Themen 4
L Bruch rechnen Java Basics - Anfänger-Themen 29
B mit Datum rechnen Java Basics - Anfänger-Themen 10
D Rechnen mit int Array Java Basics - Anfänger-Themen 9
M mit Uhrzeit rechnen Java Basics - Anfänger-Themen 11
T mit Winkel & Sinus rechnen / sin(30°)=2,5 Java Basics - Anfänger-Themen 7
A Rechnen mit big integer Java Basics - Anfänger-Themen 29
L Mit matrizen rechnen Java Basics - Anfänger-Themen 19
W Probleme mit double rechnen Java Basics - Anfänger-Themen 4
J Datentypen Rechnen mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 3
K mit einer int rechnen Java Basics - Anfänger-Themen 10
M Warum -48 rechnen? Java Basics - Anfänger-Themen 3
K Java Code rechnen Java Basics - Anfänger-Themen 7
F Rechnen mit komplexen Zahlen Java Basics - Anfänger-Themen 23
C Datentypen Unklarheiten beim Rechnen Java Basics - Anfänger-Themen 5
W Modulo rechnen Java Basics - Anfänger-Themen 3
H Datentypen Rechnen und Runden Java Basics - Anfänger-Themen 2
S Rechnen mit Zeitangaben Java Basics - Anfänger-Themen 5
Binary.Coder Doppeltes Hashing verläuft in "Endlosscheife" beim rechnen per Hand Java Basics - Anfänger-Themen 8
F Mit Anzahl Startparametern rechnen Java Basics - Anfänger-Themen 17
T mit List<Integer> rechnen Java Basics - Anfänger-Themen 9
O einfaches rechnen mit zahlen Java Basics - Anfänger-Themen 4
K Stunden zusammen Rechnen Java Basics - Anfänger-Themen 4
T mit Typen Date rechnen Java Basics - Anfänger-Themen 6
S mit Werten aus 2D-Array rechnen Java Basics - Anfänger-Themen 32
J Anfänger-Problem: Rechnen mit Java Java Basics - Anfänger-Themen 3
J Mit Java exp Rechnen ? Java Basics - Anfänger-Themen 4
P Mit double und BigDecimal rechnen Java Basics - Anfänger-Themen 6
K Wie zerlege Ich einen String zum Rechnen? Java Basics - Anfänger-Themen 3
D Rechnen mit zwei Klassen Java Basics - Anfänger-Themen 19
J Mit Zeitzonen rechnen! Java Basics - Anfänger-Themen 3
G Float schneidet nach dem Rechnen auf eine Stelle ab Java Basics - Anfänger-Themen 9
L Eingeben Rechnen Ausgeben - Leider nicht so einfach Java Basics - Anfänger-Themen 31
G Mit tastatureingaben rechnen Java Basics - Anfänger-Themen 10
B Großer Java bug beim rechnen? Java Basics - Anfänger-Themen 66
S mit Strings rechnen Java Basics - Anfänger-Themen 16
D mit request.getParameter("x") rechnen Java Basics - Anfänger-Themen 3
T mit byte rechnen. ? Java Basics - Anfänger-Themen 8
MrTical Zahlen einlesen um damit zu rechnen Java Basics - Anfänger-Themen 5
Safado modulo rechnen Java Basics - Anfänger-Themen 5
F mit Dualzahlen rechnen Java Basics - Anfänger-Themen 5
J Rechnen mit Dualzahlen Java Basics - Anfänger-Themen 5
C Bedingtes Rechnen Java Basics - Anfänger-Themen 64
G mit Strings rechnen (Unicode) Java Basics - Anfänger-Themen 15
H Modulo rechnen Java Basics - Anfänger-Themen 17
T Rechnen Java Basics - Anfänger-Themen 3
G Taschenrechner.aber Rechnen bring ich nicht zam! Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben