001 package de.hska.java.aufgaben.objekte;
002
003 /**
004 * Eine rationale Zahl gegeben durch den Zähler und Nenner.
005 *
006 * <p>
007 * <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/objekt_orientierung.html#rationale_zahlen">Zurück zum Aufgabentext</a>
008 * </p>
009 *
010 *
011 * @author Christian Pape
012 */
013 public class RationaleZahl {
014
015 /**
016 * Der Zähler als ganze Zahl. Bei einer negativen RationalenZahl
017 * ist der zaehler immer negativ. Bei der Zahl 0 ist er immer 0.
018 */
019 private int zaehler;
020
021 /**
022 * Der Nenner als natürliche Zahl. Bei einer negativen RationalenZahl
023 * ist der nenner immer positiv. Bei der Zahl 0 ist er immer 0.
024 */
025 private int nenner;
026
027 /**
028 * Erzeugt eine neue Rationale Zahl mit gegebenen zaehler und nenner.
029 * Der nenner darf nicht 0 sein.
030 */
031 public RationaleZahl(int zaehler, int nenner) {
032 this.zaehler = zaehler;
033 if (zaehler == 0) {
034 nenner = 0;
035 }
036 if (nenner < 0) {
037 zaehler *= -1;
038 this.nenner = -nenner;
039 } else {
040 this.nenner = nenner;
041 }
042 kuerzen();
043 }
044
045 /**
046 * Gibt den größten gemeinsamen Teiler (ggT) von a und b zurück.
047 */
048 private int getGgt(int a, int b) {
049 while ( a > 0 && b > 0) {
050 if ( a > b ) {
051 a = a % b;
052 } else {
053 b = b % a;
054 }
055 }
056
057 return Math.max(a, b);
058 }
059
060 /**
061 * Kürzt zaehler und nenner um ihren grössten gemeinsamen Teiler.
062 */
063 private void kuerzen() {
064 int ggt = getGgt(Math.abs(zaehler), nenner);
065
066 if (ggt > 0) {
067 zaehler = zaehler / ggt;
068 nenner = nenner / ggt;
069 }
070 }
071
072 /**
073 * Addiert die gegeben rationaleZahl zu dieser RationalenZahl und gibt
074 * die Summe zurück.
075 */
076 public RationaleZahl addieren(RationaleZahl rationaleZahl) {
077 return new RationaleZahl(this.zaehler * rationaleZahl.nenner + this.nenner * rationaleZahl.zaehler,
078 this.nenner * rationaleZahl.nenner);
079 }
080
081 /**
082 * Multipliziert die gegeben rationaleZahl mit dieser RationalenZahl und
083 * gibt das Produkt zurück.
084 */
085 public RationaleZahl multiplizieren(RationaleZahl rationaleZahl) {
086 return new RationaleZahl(this.zaehler * rationaleZahl.zaehler, this.nenner * rationaleZahl.nenner);
087 }
088
089 /**
090 * Gibt den Nenner dieser RationalenZahl zurück.
091 */
092 public int getNenner() {
093 return nenner;
094 }
095
096 /**
097 * Gibt den Zähler dieser RationalenZahl zurück.
098 */
099 public int getZaehler() {
100 return zaehler;
101 }
102
103 /**
104 * Gibt den Wert dieser RationalenZahl als double-Wert zurück.
105 */
106 public double getDoubleWert() {
107 return (double) zaehler / (double) nenner;
108 }
109 }