Advertisement
Guest User

Bruch

a guest
Jun 2nd, 2021
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.81 KB | None | 0 0
  1. // Die imports werden nur für die main-Methode gebraucht, in der einige Tests gemacht werden.
  2. // Die eigentliche Klasse Bruch sollte keine main-Methode haben und braucht daher auch nicht diese imports
  3. import java.util.Arrays;
  4. import java.util.Random;
  5.  
  6. public class Bruch extends Number implements Comparable<Number> {
  7.     // Mit dem Interface Comparable<Bruch> gibt man an,
  8.     // dass der Bruch mit anderen Brüchen verglichen werden kann.
  9.     // Z.B. für Sortieralgorithmen.
  10.    
  11.     private final int zaehler;  // Die Attribute kennzeichne ich sicherheitshalber mit "final" damit ich sie nicht versehentlich verändere.
  12.     private final int nenner;   // Bei jeder Rechnung wird also ein neuer Bruch zurückgegeben
  13.    
  14.     public static void main(String[] args) {
  15.         Bruch z1 = new Bruch(1, 2);
  16.         Bruch z2 = new Bruch(2, 3);
  17.         System.out.println(z1 + " + " + z2 + " = " + z1.addiere(z2)); // 1/2 + 2/3 = 7/6
  18.         System.out.println(z1 + " + " + z2 + " = " + z1.addiere(z2).toMixedString()); // 1/2 + 2/3 = 1 1/6
  19.         System.out.println(z1 + " - " + z2 + " = " + z1.subtrahiere(z2)); // 1/2 - 2/3 = -1/6
  20.         System.out.println(z1 + " * " + z2 + " = " + z1.multipliziere(z2)); // 1/2 * 2/3 = 1/3
  21.         System.out.println(z1 + " / " + z2 + " = " + z1.dividiere(z2)); // 1/2 / 2/3 = 3/4
  22.        
  23.         // vergleich mit Bruch
  24.         System.out.println(new Bruch(1,2).equals(new Bruch(2,4))); // true
  25.         System.out.println(new Bruch(1,2).equals(new Bruch(1,4))); // false
  26.        
  27.         // vergleich mit int
  28.         System.out.println(new Bruch(1,2).equals(1)); // false
  29.         System.out.println(new Bruch(1).equals(1)); // true
  30.        
  31.         // vergleich mit double
  32.         System.out.println(new Bruch(1,2).equals(0.5)); // true
  33.         System.out.println(new Bruch(1,2).equals(0.6)); // false
  34.        
  35.         // Sortiertest (compareTo)
  36.         Bruch[] brueche = new Bruch[10];
  37.         Random random = new Random();
  38.         for (int i = 0; i<10; i++) {
  39.             brueche[i] = new Bruch(random.nextInt(10), random.nextInt(9)+1);
  40.         }
  41.         System.out.println("Gemischte Brüche: " + Arrays.toString(brueche));
  42.         Arrays.sort(brueche);
  43.         System.out.println("Sortierte Brüche: " + Arrays.toString(brueche));
  44.     }
  45.    
  46.     public Bruch(int zaehler, int nenner) {
  47.         // Konstruktor für einen echten Bruch (z.B. 7/6)
  48.         if (nenner == 0) throw new IllegalArgumentException("Der Nenner darf nicht 0 sein.");
  49.         this.zaehler = zaehler;
  50.         this.nenner = nenner;
  51.     }
  52.    
  53.     public Bruch(int ganze, int zaehler, int nenner) {
  54.         // Konstruktor für einen gemischten Bruch (z.B. 1 1/6)
  55.         this(new Bruch(zaehler, nenner).addiere(ganze));
  56.     }
  57.    
  58.     public Bruch(int ganze) {
  59.         // Konstruktor für Ganzzahlen (z.B. 5/1)
  60.         this(ganze, 1);
  61.     }
  62.    
  63.     public Bruch(Bruch original) {
  64.         // Konstruktor für Kopien von anderen Brüchen
  65.         this(original.zaehler, original.nenner);
  66.     }
  67.  
  68.     public Bruch erweitere(int faktor) {
  69.         // sollte klar sein
  70.         return new Bruch(this.zaehler*faktor, this.nenner*faktor);
  71.     }
  72.    
  73.     private static int ggT(int a, int b) {
  74.         // Größten gemeinsamen Teiler mit der euklidischen Methode berechnen. Wird gebraucht zum kürzen.
  75.         return b==0?a:ggT(b,a%b);
  76.     }
  77.    
  78.     public Bruch kuerze() {
  79.         int ggT = ggT(this.zaehler, this.nenner); // ggT berechnen
  80.         Bruch ergebnis = new Bruch(this.zaehler/ggT, this.nenner/ggT); // Zähler und Nenner durch ggT teilen
  81.         if (ergebnis.nenner < 0) {
  82.             // falls der Nenner negativ ist, beide Vorzeichen umkehren.
  83.             ergebnis = new Bruch(-ergebnis.zaehler, -ergebnis.nenner);
  84.         }
  85.         return ergebnis;
  86.     }
  87.    
  88.     // Getter (da die Attribute final sind, gibt es keine Setter)
  89.    
  90.     public int getZaehler() {
  91.         return this.zaehler;
  92.     }
  93.  
  94.     public int getNenner() {
  95.         return this.nenner;
  96.     }
  97.  
  98.    
  99.     // Grundrechenarten
  100.    
  101.     public Bruch addiere(Bruch summand) {
  102.         // Zum addieren werden einfach beide Zähler mit dem Nenner des jeweils anderen Summanden erweitert und dann zusammenaddiert.
  103.         // Die Nenner der beiden Summanden werden multipliziert und ergeben zusammen den Nenner des Ergebnisses. Am Ende wird die Zahl gekürzt.
  104.         // (1/2) + (2/3) = (3/6) + (4/6) = (7/6)
  105.         return new Bruch((this.zaehler*summand.nenner) + (summand.zaehler*this.nenner), this.nenner * summand.nenner).kuerze();
  106.     }
  107.    
  108.     public Bruch addiere(int summand) {
  109.         // Nicht zwingend nötig, aber bestimmt hilfreich, wenn man einen Bruch auch einfach mit einem int addieren kann
  110.         return this.addiere(new Bruch(summand));
  111.     }
  112.    
  113.     public Bruch subtrahiere(Bruch subtrahend) {
  114.         // Hier wird einfach das Vorzeichen des subtrahenten umgedreht und dann addiert.
  115.         return this.addiere(subtrahend.multipliziere(-1));
  116.     }
  117.    
  118.     public Bruch subtrahiere(int subtrahend) {
  119.         // Hier auch nochmal als Subtraktion mit einem int.
  120.         return this.subtrahiere(new Bruch(subtrahend));
  121.     }
  122.    
  123.     public Bruch multipliziere(Bruch faktor) {
  124.         // Die Multiplikation ist einfacher als die Addition. Einfach beide Zähler und beide Nenner multiplizieren und am Ende kürzen
  125.         return new Bruch(this.zaehler * faktor.zaehler, this.nenner * faktor.nenner).kuerze();
  126.     }
  127.    
  128.     public Bruch multipliziere(int faktor) {
  129.         return this.multipliziere(new Bruch(faktor));
  130.     }
  131.    
  132.     public Bruch dividiere(Bruch divisor) {
  133.         // Das Gleiche wie bei der Multiplikation, nur dass Zähler und Nenner vom Divisor vertauscht werden.
  134.         return this.multipliziere(new Bruch(divisor.nenner, divisor.zaehler));
  135.     }
  136.    
  137.     public Bruch dividiere(int divisor) {
  138.         return this.dividiere(new Bruch(divisor));
  139.     }
  140.    
  141.     // Ende Grundrechenarten
  142.  
  143.     @Override
  144.     public int compareTo(Number other) {
  145.         // Da wir das Interface Comparable<Number> implementiert haben, müssen wir natürlich auch noch angeben, wie der Computer den Bruch mit anderen Zahlen vergleichen soll
  146.         // Der Einfachheit halber werden die Brücke einfach in Kommazahlen umgerechnet und mit der integrierten Methode verglichen
  147.         return Double.compare(this.doubleValue(), other.doubleValue());
  148.     }
  149.    
  150.     @Override
  151.     public boolean equals(Object obj) {
  152.         // Equals sollte man bei jeder Klasse überschreiben, um prüfen zu können, ob zwei Objekte gleich sind
  153.         if (obj instanceof Bruch) {
  154.             // Wenn das andere Objekt ein Bruch ist, kürze beide und vergleiche Zähler und Nenner
  155.             Bruch z1 = this.kuerze();
  156.             Bruch z2 = ((Bruch) obj).kuerze();
  157.             if (z1.zaehler == z2.zaehler && z1.nenner == z2.nenner) {
  158.                 return true;
  159.             } else {
  160.                 return false;
  161.             }
  162.         } else if (obj instanceof Number) {
  163.             // Wenn das andere Objekt ein sonstiger Zahlentyp ist, rechne den Bruch in ein double um und vergleiche
  164.             return this.doubleValue() == ((Number) obj).doubleValue();
  165.         } else {
  166.             // Ansonsten wird immer falsch ausgegeben. (Eigentlich müsste man noch vergleiche mit allen anderen Zahlenarten einbauen)
  167.             return false;
  168.         }
  169.     }
  170.    
  171.     @Override
  172.     public String toString() {
  173.         // Die Methode toString sollte in allen Klassen überschrieben werden. Hier wird einfach eine String-Repräsentation des Bruches ausgegeben.
  174.         // Dadurch kannst du einfach einen Bruch in einen String reinschreiben, ohne Zähler und Nenner aus dem Bruch zu holen.
  175.         return this.zaehler + "/" + this.nenner;
  176.     }
  177.    
  178.     public String toMixedString() {
  179.         // Falls man den Bruch als gemischten Bruch haben will, ist hier noch die toMixedString Methode.
  180.         if (zaehler / nenner == 0) {
  181.             return this.toString();
  182.         } else {
  183.             return (zaehler / nenner) + " " + Math.abs(zaehler % nenner) + "/" + nenner;
  184.         }
  185.     }
  186.  
  187.     // Methoden der übergeordneten Klasse Number (müssen implementiert werden, da sie in Number nur abstrakt sind)
  188.  
  189.     @Override
  190.     public double doubleValue() {
  191.         // Bruch in Kommazahl umrechnen
  192.         return (double) this.zaehler / this.nenner;
  193.     }
  194.  
  195.     @Override
  196.     public float floatValue() {
  197.         // Bruch in Kommazahl umrechnen
  198.         return (float) this.doubleValue();
  199.     }
  200.  
  201.     @Override
  202.     public int intValue() {
  203.         // Bruch in Ganzzahl umrechnen (Achtung, beim Ergebnis werden mögliche Kommazahlen abgeschnitten)
  204.         return (int) this.doubleValue();
  205.     }
  206.  
  207.     @Override
  208.     public long longValue() {
  209.         return (long) this.doubleValue();
  210.     }
  211. }
  212.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement