Darstellung von Brüchen

Informatikanfänger12

Aktives Mitglied
Hallo,
ich soll ein Programm schreiben, welches nichtnegative rationalen Zahlen als Brüche darstellt und diese addiert, multipliziert bzw. auch kürzt.
Dabei geht es mir um die Frage, wie ich es mache, wenn negative Zahlen eingeben werden:
Mein Programm bisher:


Java:
public class Bruch {
   
   
    int zaehler;
    int  nenner;
   
   
    public Bruch(){
        zaehler=0;          //parameterloser Konstruktor
        nenner=1;
    }
   
    public Bruch(int zaehler, int nenner){
       
        if(zaehler<0 || nenner<0) {
            System.out.println("Positive Werte eingeben");
            return;
        }
        if(nenner==0) {
            this.nenner=1;
        }
         this.zaehler=zaehler;
         this.nenner=nenner;
         kuerze();
         }
   
     public int getZaehler(){
        return zaehler;
    }                                       //getter-Methoden
     public int getNenner(){
            return nenner;
        }

    public void kuerze() {

        int limit = Math.min(zaehler,nenner);
        for(int i=2; i<=limit; i++) {
            if(zaehler%i==0 && nenner%i==0 ) {
                zaehler /=i;
                nenner/=i;
            }
        }
       
     
    }
   
    public String toString()
      {
         return "" + zaehler + " / " + nenner;
      }

Dabei gehts mir um die Zeile im 2. Konstruktor, mit Nenner und Zaehler <0.
Kann man das irgendwie besser machen ? 🙂
 
Code:
    ..
        if (zaehler < 0 || nenner < 0)
            throw new IllegalArgumentException("Negative argumentes are not allowed!");
        ..
 
Danke 🙂
Ich habe noch eine Frage zu meiner Methode kuerze() . Wenn ich z.b 2 Brüche addiere, soll ich kuerze dann in der Methode addiere gleich anwenden?
In der Aufgabe steht, dass kuerze nich unnötig oft verwendet werden soll.
Wie würdet ihr es machen:

Hier meine Addition-Methode:

Java:
public Bruch addiere( Bruch a){
        
        int z1 = zaehler  * a.getNenner();
        int z2 = nenner * a.getZaehler();
        int n= nenner*a.getNenner();
        return new Bruch(z1+z2, n);
      }
 
Vllt kann mir jmd bitte sagen, wie ich folgende Methode noch programmieren kann:
Soll einen Bruch im Format „123/456“ in ein Objekt des Typs Bruch überführen und zurück geben. Ich habe doch schon die toString-Methode oder was sehe ich falsch?
 
Zu deiner 1. Frage: Ich würde nach dem addieren den Bruch noch mal kürzen lassen. Kommt aber auch auf die genaue Aufgabenstellung an.
Zu deiner 2. Frage: Das hat nichts mit toString() zu tun. Deine neue Methode soll einen String entgegen nehmen in der Form 123/456 und daraus dann ein Bruch-Objekt erstellen.
Diese soll zurückgegeben werden. Du müsstest also die Zahl vor dem Bruchstrich extrahieren und zum Zähler machen und die andere Zahl zum Nenner.
 
Danke🙂

Also zu 1.)

Java:
public Bruch addiere( Bruch a){
        
        int z1 = zaehler  * a.getNenner();
        int z2 = nenner * a.getZaehler();
        int n= nenner*a.getNenner();
       
        Bruch b=new Bruch(z1+z2,n);
        b.kuerze();
        return b;
      }

Ok so🙂


Bei 2. weis ich nicht wie das genau gehen soll:

Wie kann ich da etwas extrahieren. Kannst du nochmal bitte weiterhelfen?
 
Habs nur überflogen aber sieht gut aus.
2. Du musst nicht wissen wann das "/" kommt. Du kannst einen String an einem Zeichen splitten (in deinem Fall dem Bruchstrich). Dann bekommst du ein String-Array zurück was in einem Fall beide Zahlen enthalten würde. die kannst du dann umwandeln in Zahlen 🙂
 
Hier mal ein Beispiel
Java:
String input = "12;4;3";
String[] inputArr = input.split(";");
for(int i = 0; i < inputArr.length; i++) {
    System.out.println(Integer.toString(inputArr[i]);
}
Das musst du jetzt nur noch auf dein Beispiel anpassen 🙂
 
Was macht genau das
Integer.toString(inputArr



Habe es bis jetzt so:

Java:
public static  Bruch liesBruch(String input) {
       
        String[] inputArr = input.split("/");
       
        for(int i = 0; i < inputArr.length; i++) {
            System.out.println(Integer.toString(inputArr[i]);
        }
       
    }
 
Sorry .. da war ich beim schreiben wohl woanders. 😀
Das soll natürlich die Integer.parseInt(String s) Methode sein.
Diese nimmt einen String und wandelt ihn in ein int um.
 
Schau mal, vllt so:

Java:
public static  Bruch liesBruch(String input) {
       
        String[] inputArr = input.split("/");
       
       
            int neuerZaehler=(Integer.parseInt(inputArr[0]));
            int neuerNenner=(Integer.parseInt(inputArr[1]));
           return new Bruch(neuerZaehler, neuerNenner);
           
        }

Da brauch ich keine for Schleife egtl?
 
Danke🙂
Vllt nochmal zur Methode kuerze:
Man soll eine Klasse programmieren, welche eine nicht negative rationale Zahl mittels Bruchschreibweise korrekt darstellt.
Also soll ich kuerze in addiere und multipliziere reinnehmen oder nicht?
Man soll kuerze laut Aufgabe nicht unnötig oft verwenden?
 
Zu deiner 1. Frage: Ich würde nach dem addieren den Bruch noch mal kürzen lassen. Kommt aber auch auf die genaue Aufgabenstellung an.
public Bruch addiere( Bruch a){

int z1 = zaehler * a.getNenner();
int z2 = nenner * a.getZaehler();
int n= nenner*a.getNenner();
return new Bruch(z1+z2, n);
}
Macht die Methode addiere bereits da sie den Konstruktor Bruch( int, int ) mittels new aufruft. Dieser beinhaltet bereits das Kürzen.

public Bruch(int zaehler, int nenner){

if(zaehler<0 || nenner<0) {
System.out.println("Positive Werte eingeben");
return;
}
if(nenner==0) {
this.nenner=1;
}
this.zaehler=zaehler;
this.nenner=nenner;
kuerze();
}
 
Hallo! wie Prüfe ich diese Methode mit Junit in eclipse ?
Java:
public Bruch addiere( Bruch a){
       
        int z1 = zaehler  * a.getNenner();
        int z2 = nenner * a.getZaehler();
        int n= nenner*a.getNenner();
      
        Bruch b=new Bruch(z1+z2,n);
        b.kuerze();
        return b;
      }
Wie übergebe diese Bruch hier also
Java:
    @Test
    public void testAddiere() {
        // Erzeuge einen Bruch zum Testen.
        Bruch einBruch = new Bruch();

        // Teste den Zaehler des Bruchs.
        assertThat("getNenner arbeitet nicht korrekt.",
               einBruch.addiere(new Bruch(1/2)), // so was funktioniert nicht
                is(equalTo(1)));
  
    }
 
Zuletzt bearbeitet von einem Moderator:
Du musst schon einen existierenden Konstruktor aufrufen.
Einen, der *einen int* (der in deinem Test auch 0 wäre) entgegen nimmt, wird es nicht geben.
 

Zurück
Oben