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    }