Brüche kürzen

Diskutiere Brüche kürzen im Java Basics - Anfänger-Themen Bereich.
Kirby_Sike

Kirby_Sike

Ich bin gerade etwas verwirrt xD In der Aufgabenstellung steht dass die "kuerze()" Methode eine private void Methode sein muss, jedoch verstehe ich nicht wie ich dass kürzen soll, ich könnte natürlich dass kürzen sowohl aus der Additions Methode und den Konstruktiven ziehen und in die Methode schieben, aber ist das eine gute Idee?

Jedoch das eigentlich Problem in meinen Augen ist, dass ich der Methode keine Parameter übergeben darf :(

Hier einfach mal die komplette Aufgabenstellung:

12857

Java:
public class Bruch {

    private int zaehler;
    private int nenner;
 
    public Bruch(int _zaehler, int _nenner){
        int temp = kuerze(_zaehler, _nenner);
        this.zaehler = (_zaehler/temp);
        this.nenner = (_nenner/temp);
        toString();
    }
 
    public Bruch(String fraction){
         String [] parts = fraction.split("/");
        int _zaehler = Integer.parseInt(parts[0]);
        int _nenner = Integer.parseInt(parts[1]);
        int temp = kuerze(_zaehler, _nenner);
        this.zaehler = (_zaehler/temp);
        this.nenner = (_nenner/temp);
        toString();
    }
 
    @Override
    public String toString(){
        return this.zaehler + "/" + this.nenner;
    }
 
    public Bruch addiere(Bruch a) {
        Bruch c = new Bruch(1, 1);
        c.zaehler = ((this.zaehler*a.nenner) + (a.zaehler*this.nenner));
        c.nenner = (this.nenner*a.nenner);
        int temp = kuerze(c.zaehler, c.nenner);
        c.zaehler = (c.zaehler/temp);
        c.nenner = (c.nenner/temp);
        return c;
    }
 
    private int kuerze(int a, int b) {
        if(a < b) {
            return kuerze(b, a);
        }
        if(0 == b) {
            return a;
        }
        return kuerze(a % b, b);
    }
}
 
Zuletzt bearbeitet:
H

httpdigest

Die kuerze() Methode soll eine Hilfsmethode sein, die den aktuellen Bruch `this` (über Zugriff auf die Instanzvariablen) kürzt.
Es wird wohl reichen, diese Methode einmal im Konstruktor aufzurufen, sodass der erzeugte Bruch immer gekürzt ist.
 
Kirby_Sike

Kirby_Sike

Wenn ich es richtig verstehe bedeutet dies hier:
java.lang.ArithmeticException: / by zero
das bei irgendeiner Iteration durch 0 geteilt wird, was nicht definiert ist, jedoch blicke ich den Fehler in meinem Code nicht

Java:
public class Bruch {
 
    private int zaehler;
    private int nenner;
   
    public Bruch(int _zaehler, int _nenner){
        this.zaehler = _zaehler;
        this.nenner = _nenner;
        System.out.println("Zaehler: " + this.zaehler);
        System.out.println("Nenner: " + this.nenner);
        kuerze();
        System.out.println("Zaehler gekürzt: " + this.zaehler);
        System.out.println("Nenner gekürzt: " + this.nenner);
        /*int temp = kuerze(_zaehler, _nenner);
        this.zaehler = (_zaehler/temp);
        this.nenner = (_nenner/temp);*/
        toString();
    }
   
    public Bruch(String fraction){
        String [] parts = fraction.split("/");
        this.zaehler = Integer.parseInt(parts[0]);
        this.nenner = Integer.parseInt(parts[1]);
        kuerze();
        toString();
    }
   
    @Override
    public String toString(){
        return this.zaehler + "/" + this.nenner;
    }
   
    public Bruch addiere(Bruch a) {
        Bruch c = new Bruch(1, 1);
        this.zaehler = ((this.zaehler*a.nenner) + (a.zaehler*this.nenner));
        this.nenner = (this.nenner*a.nenner);
        kuerze();
        c.zaehler = this.zaehler;
        c.nenner = this.nenner;
        return c;
    }
   
    private void kuerze() {
        int result = 0;
        int a = this.zaehler, b = this.nenner;
        int h = (a > b) ? b : a;
        // Der GGT wird hier berechnet.
        for (int i = h; i > 1; i--) {
            if ((a % i) == 0 && (b % i) == 0) {
                System.out.println(result = i);
                break;
            }
        }
        this.zaehler = (this.zaehler/result);
        this.nenner = (this.nenner/result);
    }
}

Java:
public static void main(String[] args) {
        //Bruch s = new Bruch("34/561");
        //Bruch s1 = new Bruch("65/273");
        Bruch a = new Bruch(4, 2);
        Bruch a1 = new Bruch(21, 14);
        Bruch k = a.addiere(a1);
        System.out.println(k.toString());
        //Bruch k = s.addiere(s1);
        //System.out.println(k.toString());
    }
 
H

httpdigest

In solchen Fällen immer einfach einen Debugger verwenden. Jede IDE hat einen integriert.
Und bei dir ist der Fehler, dass wenn der GGT = 1 ist, schlägt dein Code fehl, da result in kuerze() niemals auf 1 gesetzt wird, sondern immer 0 bleibt, da deine Schleife nur bis i > 1 geht.
Der konkrete Fall tritt bei addiere() auf, da du dort (warum auch immer) den Bruch (1, 1) erzeugst.
 
Kirby_Sike

Kirby_Sike

In solchen Fällen immer einfach einen Debugger verwenden. Jede IDE hat einen integriert.
Und bei dir ist der Fehler, dass wenn der GGT = 1 ist, schlägt dein Code fehl, da result in kuerze() niemals auf 1 gesetzt wird, sondern immer 0 bleibt, da deine Schleife nur bis i > 1 geht.
Der konkrete Fall tritt bei addiere() auf, da du dort (warum auch immer) den Bruch (1, 1) erzeugst.
Ich erzeuge den Bruch(1,1) weil ich keinen Schimmer habe wie ich sonst einen return vom Typ Bruch machen soll xD
 
H

httpdigest

Java:
public Bruch addiere(Bruch a) {
  return new Bruch(
    (zaehler * a.nenner) + (a.zaehler * nenner),
     nenner * a.nenner);
}
 
Kirby_Sike

Kirby_Sike

@httpdigest Ich hatte mal noch eine Frage zum einlesen von einem Textdokument :) Ich habe folgenden Code zum einlesen der Datei:

Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFileExample {

public static void main(String[] args) {
  BufferedReader objReader = null;
  try {
   String strCurrentLine;

   objReader = new BufferedReader(new FileReader("blablabla"));

   while ((strCurrentLine = objReader.readLine()) != null) {

    System.out.println(strCurrentLine);
   }

  } catch (IOException e) {

   e.printStackTrace();

  } finally {

   try {
    if (objReader != null)
     objReader.close();
   } catch (IOException ex) {
    ex.printStackTrace();
   }
  }
}
}
Jedoch wird nicht nur der Inhalt der Datei eingelesen, sondern auch irgendwelche Parameter, wie kann ich dies unterbinden?

So sieht es nach dem einlesen aus:

Java:
Konsolen Output:

{\rtf1\ansi\ansicpg1252\cocoartf2511
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0

\f0\fs24 \cf0 O#O\
OO#\
#OO\
#O#}
Was ich ausgegeben haben möchte:

Java:
O#O
OO#
#OO
#O#
 
H

httpdigest

Deine Datei "blablabla" ist ganz offensichtlich ein RichTextFile Dokument und nicht einfach nur Text. Du brauchst einen Parser für rtf Dateien.
Du kannst ja auch keine Word .doc Datei mit einem BufferedReader einlesen und dann erwarten, nur den Text angezeigt zu bekommen.
 
Kirby_Sike

Kirby_Sike

Jap ist eine RTF xD Ich glaube ich versuche einfach eine txt Datei zu machen oder werde ich dort das selbe ausgegeben bekommen?
 
Thema: 

Brüche kürzen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben