Das folgende Listing zeigt die wesentlichen Teile der Lösung für das Bruchrechenprogramm (Kapitel 19 Aufgabe 6): // Klasse Bruch Aufgabe 6 Kapitel 19 public class Bruch //eine Klasse für Bruch { private long zaehler = 1 ; private long nenner = 1 ; // Das sind die Attribute // das Schlüsselwort private verhindert, das von außen auf die Attribute // zugegriffen werden kann. Stichwort: Datenkapselung private long ggT (long a, long b) // eine Hilfsmethode, die nicht außer- { // halb verfügbar ist. long z ; while (b != 0) { z = a % b ; a = b ; b = z ; } return a ; } Bruch (long za, long ne) // der Konstruktor { zaehler = za ; nenner = ne ; } public String ausgabe () // gibt einen Bruchstring zurück { String s = String.valueOf(zaehler) + "/" + String.valueOf(nenner) ; return s ; } public void einlesen (String eingabe) // liest einen String als Bruch in // die Attribute ein { int mitte = eingabe.indexOf("/") ; String zaehlerString = eingabe.substring(0,mitte) ; String nennerString = eingabe.substring(mitte+1,eingabe.length()) ; zaehler = Long.parseLong(zaehlerString) ; nenner = Long.parseLong(nennerString) ; } public long gibZaehler () { return zaehler ; } public long gibNenner () { return nenner ; } public void erweitere (long k) { zaehler *= k ; nenner *= k ; } public void kuerze () { long teiler = ggT(zaehler,nenner) ; zaehler /= teiler ; nenner /= teiler ; if (nenner < 0) { this.erweitere(-1) ; } } void mult(Bruch b) { zaehler *= b.gibZaehler() ; nenner *= b.gibNenner() ; this.kuerze() ; } void divi(Bruch b) { zaehler *= b.gibNenner() ; nenner *= b.gibZaehler() ; this.kuerze() ; } void addi (Bruch b) { long kgv = nenner*b.gibNenner()/ggT(nenner,b.gibNenner()) ; zaehler = zaehler*kgv/nenner + b.gibZaehler()*kgv/b.gibNenner() ; nenner = kgv ; this.kuerze() ; } void subt (Bruch b) { long kgv = nenner*b.gibNenner()/ggT(nenner,b.gibNenner()) ; zaehler = zaehler*kgv/nenner - b.gibZaehler()*kgv/b.gibNenner() ; nenner = kgv ; this.kuerze() ; } } // Anfang Methodenaus bruchrechner public void jButton1_ActionPerformed(ActionEvent evt) { Bruch bruch1 = new Bruch(1,1) ; Bruch bruch2 = new Bruch(1,1) ; bruch1.einlesen(jTextField1.getText()) ; bruch2.einlesen(jTextField2.getText()) ; bruch1.addi(bruch2) ; jTextField3.setText(bruch1.ausgabe()) ; } Uns interessiert hier vor allem das Umwandeln des Bruchstrings in der Form "3/5" in die zwei long-Zahlen für Zähler und Nenner, da hier einige wichtige Methoden zur Stringbearbeitung verwendet werden. Hier eine Übersicht: String string1 ; String string2 ; //erzeugt zwei instanzen vom Typ string ''string1.String()'' erzeugt einen Leerstring als string 1 ''string1.String(string2)'' Als string1 wird eine Kopie von string2 angelegt ''string1.String(zeichenfeld)'' Der String1 wird aus einem Zeichenfeld erzeugt, also einer Variablem vom Typ char[] ''string2 = string1.substring(beginn, ende)'' Dabei wird aus dem string1 ein Teilstring herausgelesen und in string 2 gespeichert. Die beiden int-Variablen begin und end geben Anfangs- und Endposition des Teilstrings im eigentlichen String an. Dabei werden die Zeichen von 0 ab gezählt. End ist die Position des ersten Zeichens hinter dem Teilstring. string2 = string1.substring(0, 3) ergibt den Teilstring der Zeichen 0 bis 2, also der ersten 3 Zeichen. ''int laenge =string1.length()'' gibt die Länge eines Strings zurück. Wie bei Feldern haben bei einem String der Länge 5 die Zeichen die Indizes (Hausnummern) 0 bis 4. ''int pos = string1.indexOf(“ab“) ;'' sucht nach dem ersten Vorkommen des Teilstrings “ab“ in string1 und gibt dessen Position zurück. Der Parameter kann natürlich auch eine Stringvariable sein. ''string1.toLowerCase() ; string1.toUpperCase'' wandelt alle Zeichen eines Strings in Klein- bzw. Großbuchstaben um. Nicht wandelbare Zeichen wie Ziffern oder Satzzeichen bleiben erhalten. ''string1.replace(‘a‘,‘z‘)'' ersetzt alle a’s im String durch z’s. Als Parameter sind natürlich auch char-Variablen erlaubt. ''boolean test = string1.equals(string2)'' überprüft zwei Strings auf Gleichheit. Es gibt noch die Methode equalsIgnoreCase, die zusätzlich Unterschiede in Groß- und Kleinschreibung ignoriert.