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.