Advertisement
Guest User

Bruch

a guest
Jun 1st, 2021
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.50 KB | None | 0 0
  1. import java.math.BigInteger;
  2.  
  3. public class Bruch implements Comparable<Bruch> {
  4.     // Mit dem Interface Comparable<Bruch> gibt man an,
  5.     // dass der Bruch mit anderen Brüchen verglichen werden kann.
  6.     // Z.B. für Sortieralgorithmen.
  7.    
  8.     private final int zaehler;  // Die Attribute kennzeichne ich sicherheitshalber mit "final" damit ich sie nicht versehentlich verändere.
  9.     private final int nenner;   // Bei jeder Rechnung wird also ein neuer Bruch zurückgegeben
  10.    
  11.     public Bruch(int zaehler, int nenner) {
  12.         // Konstruktor für einen echten Bruch (z.B. 7/6)
  13.         this.zaehler = zaehler;
  14.         this.nenner = nenner;
  15.     }
  16.    
  17.     public Bruch(int ganze, int zaehler, int nenner) {
  18.         // Konstruktor für einen gemischten Bruch (z.B. 1 1/6)
  19.         this((ganze*nenner)+zaehler, nenner);
  20.     }
  21.    
  22.     public Bruch(int ganze) {
  23.         // Konstruktor für Ganzzahlen (z.B. 5/1)
  24.         this(ganze, 1);
  25.     }
  26.  
  27.     public Bruch erweitere(int faktor) {
  28.         // sollte klar sein
  29.         return new Bruch(this.zaehler*faktor, this.nenner*faktor);
  30.     }
  31.    
  32.     public Bruch kuerze() { // hier mache ich es mir einfach, weil es in der Klasse BigInteger schon eine Funktion für den größten gemeinsamen Teiler gibt.
  33.         int ggT = BigInteger.valueOf(this.zaehler).gcd(BigInteger.valueOf(this.nenner)).intValue(); // ggT berechnen
  34.         return new Bruch(this.zaehler/ggT, this.nenner/ggT); // Zähler und Nenner durch ggT teilen
  35.     }
  36.    
  37.     // Getter (da die Attribute final sind, gibt es keine Setter)
  38.    
  39.     public int getZaehler() {
  40.         return zaehler;
  41.     }
  42.  
  43.     public int getNenner() {
  44.         return nenner;
  45.     }
  46.  
  47.    
  48.     // Grundrechenarten
  49.    
  50.     public Bruch addiere(Bruch summand) {
  51.         // Zum addieren werden einfach beide Zähler mit dem Nenner des jeweils anderen Summanden erweitert und dann zusammenaddiert.
  52.         // Die Nenner der beiden Summanden werden addiert und ergeben zusammen den Nenner des Ergebnisses. Am Ende wird die Zahl gekürzt.
  53.         // (1/2) + (2/3) = (3/6) + (4/6) = (7/6)
  54.         return new Bruch((this.zaehler*summand.nenner) + (summand.zaehler*this.nenner), this.nenner * summand.nenner).kuerze();
  55.     }
  56.    
  57.     public Bruch addiere(int summand) {
  58.         // Nicht zwingend nötig, aber bestimmt hilfreich, wenn man einen Bruch auch einfach mit einem int addieren kann
  59.         return this.addiere(new Bruch(summand));
  60.     }
  61.    
  62.     public Bruch subtrahiere(Bruch subtrahend) {
  63.         // Das Gleiche wie bei der Addition, nur dass die erweiterten Zähler voneinander subtrahiert werden
  64.         return new Bruch((this.zaehler*subtrahend.nenner) - (subtrahend.zaehler*this.nenner), this.nenner * subtrahend.nenner).kuerze();
  65.     }
  66.    
  67.     public Bruch subtrahiere(int subtrahend) {
  68.         // Hier auch nochmal als Subtraktion mit einem int.
  69.         return this.subtrahiere(new Bruch(subtrahend));
  70.     }
  71.    
  72.     public Bruch multipliziere(Bruch faktor) {
  73.         // Die Multiplikation ist einfacher als die Addition. Einfach beide Zähler und beide Nenner multiplizieren und am Ende kürzen
  74.         return new Bruch(this.zaehler * faktor.zaehler, this.nenner * faktor.nenner).kuerze();
  75.     }
  76.    
  77.     public Bruch multipliziere(int faktor) {
  78.         return this.multipliziere(new Bruch(faktor));
  79.     }
  80.    
  81.     public Bruch dividiere(Bruch divisor) {
  82.         // Das Gleiche wie bei der Multiplikation, nur dass Zähler und Nenner vom Divisor vertauscht werden.
  83.         return new Bruch(this.zaehler * divisor.nenner, this.nenner * divisor.zaehler);
  84.     }
  85.    
  86.     public Bruch dividiere(int divisor) {
  87.         return this.dividiere(new Bruch(divisor));
  88.     }
  89.    
  90.     // Ende Grundrechenarten
  91.  
  92.     @Override
  93.     public int compareTo(Bruch other) {
  94.         // Da wir das Interface Comparable<Bruch> implementiert haben, müssen wir natürlich auch noch angeben, wie der Computer zwei Brüche vergleichen soll
  95.         // Der Einfachheit halber werden die Brücke einfach in Kommazahlen umgerechnet und mit der integrierten Methode verglichen
  96.         return Double.compare(this.toDouble(), other.toDouble());
  97.     }
  98.    
  99.     @Override
  100.     public boolean equals(Object obj) {
  101.         // Equals sollte man bei jeder Klasse überschreiben, um prüfen zu können, ob zwei Objekte gleich sind
  102.         if (obj instanceof Bruch) {
  103.             // Wenn das andere Objekt ein Bruch ist, kürze beide und vergleiche Zähler und Nenner
  104.             Bruch z1 = this.kuerze();
  105.             Bruch z2 = ((Bruch) obj).kuerze();
  106.             if (z1.zaehler == z2.zaehler && z1.nenner == z2.nenner) {
  107.                 return true;
  108.             } else {
  109.                 return false;
  110.             }
  111.         } else if (obj instanceof Integer) {
  112.             // Wenn das andere Objekt ein Integer ist, mache aus dem Integer einen Bruch und vergleiche
  113.             return this.equals(new Bruch(((Integer) obj).intValue()));
  114.         } else if (obj instanceof Double) {
  115.             // Wenn es ein Double ist, rechne den Bruch in ein double um und vergleiche
  116.             return this.toDouble() == ((Double) obj);
  117.         } else {
  118.             // Ansonsten wird immer falsch ausgegeben. (Eigentlich müsste man noch vergleiche mit allen anderen Zahlenarten einbauen)
  119.             return false;
  120.         }
  121.     }
  122.    
  123.     public double toDouble() {
  124.         // Bruch in Kommazahl umrechnen
  125.         return (double) this.zaehler / this.nenner;
  126.     }
  127.    
  128.     @Override
  129.     public String toString() {
  130.         // Die Methode toString sollte in allen Klassen überschrieben werden. Hier wird einfach eine String-Repräsentation des Bruches ausgegeben.
  131.         // Dadurch kannst du einfach einen Bruch in einen String reinschreiben, ohne Zähler und Nenner aus dem Bruch zu holen.
  132.         return this.zaehler + "/" + this.nenner;
  133.     }
  134.    
  135.     public String toMixedString() {
  136.         // Falls man den Bruch als gemischten Bruch haben will, ist hier noch die toMixedString Methode.
  137.         if (zaehler / nenner == 0) {
  138.             return this.toString();
  139.         } else {
  140.             return (zaehler / nenner) + " " + Math.abs(zaehler % nenner) + "/" + nenner;
  141.         }
  142.     }
  143. }
  144.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement