Klammerung testen

chrisööö

Mitglied
Hallo Leute,
ich habe zwei Klassen geschrieben. Die Text Klasse enthält eine Methode die die richtige Klammerung prüfen soll und eine Methode die eine Zeichenkette innerhalb einer anderen Zeichenkette auf die Anzahl des Vorkommens prüft. Die zweite Methode funktioniert, jedoch die erste nicht. Ich erhalte immer ein "true" Ergebnis. Ich hab da jetzt schon so oft drüber geschaut, jedoch fällt mir der Fehler einfach nicht auf. Vielleicht kann mir Jemand helfen.

Die zweite Klasse ist eine Testklasse für die Klasse Text.

Klasse Text:
Java:
/**
 *
 * @author Christian
 * Diese Klasse prüft eine eingegebene Zeichenfolge auf korrekte klammerung
 * und auf das vorkommen einer Zeichenfolge innerhalb dieser Zeichenfolge.
 */
public class Text {
    final char klammerAuf = '(';
    final char klammerZu = ')';
    private String zeichenkette;

    //Konstruktor der die Zeichenfolge representiert
    public Text (String zeichenkette) {
            this.zeichenkette = zeichenkette;
    }
    /**
     * Instanzmethode die auf richtige Klammerung innerhalb der eingegebenen
     * Zeichenfolge mittels einer Schleife prüft. Geprüft wird mittels eines
     * Counter der hoch bzw. heruntergezählt wird und genau 0 bei korrektheit
     * liefert.
     */
    public boolean istKorrektGeklammert() {

        int zeichenlaenge = zeichenkette.length() - 1;
        int zeichenposition = 0;
        int klammeranzahl = 0;
        boolean wert ;


        while (zeichenposition <= zeichenlaenge) {
                if (klammeranzahl < 0) {
                    wert = false;
                    zeichenposition = zeichenlaenge;
                }
                else{
                    if (zeichenkette.charAt(zeichenposition) == klammerAuf) {
                        klammeranzahl++;
                    }
                    else if(zeichenkette.charAt(zeichenposition) == klammerZu) {
                        klammeranzahl--;
                    }
                }
                zeichenposition++;
        }
        
        if(klammeranzahl == 0) {
                wert = true;
        }
        else{
                wert = false;
        }
         
        return wert;
    }
    /**
     * Liefert die Anzahl einer bestimmten Zeichenfolge die innerhalb einer
     * Zeichenfolge auftritt.
     */
    public int gibAnzahl(String zeichenfolge) {
        
        int zeichenposition = 0;
        int anzahlZeichen = 0;
        int zeichenlaenge = zeichenkette.length();

        while (zeichenposition < zeichenlaenge - (zeichenfolge.length() - 1)) {

             if (zeichenkette.substring(zeichenposition, zeichenposition +
                     zeichenfolge.length()).equals(zeichenfolge)){
                     anzahlZeichen++;
             }
             zeichenposition++;
             
        }
        return anzahlZeichen;
    }
    
}

Test Klasse:
Java:
/**
 *
 * @author Christian
 */
public class TextTest {

    public static void testeKlammerung() {
        Text t1;
        Text t2;
        Text t3;
        Text t4;
        Text t5;
        Text t6;
        Text t7;
        Text t8;
        Text t9;
        Text t10;

        t1 = new Text("(2*(a+3)+b)*(a-b)+c");
        System.out.println("Ist (2*(a+3)+b)*(a-b)+c korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t2 = new Text("c+(2*(a+3)+b)*(a-b)");
        System.out.println("Ist c+(2*(a+3)+b)*(a-b) korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t3 = new Text("(())()");
        System.out.println("Ist (())() korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t4 = new Text("a)b(a+3)/b(");
        System.out.println("Ist a)b(a+3)/b( korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t5 = new Text("(a)b)a+3(/b()");
        System.out.println("Ist (a)b)a+3(/b() korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t6 = new Text("(1+a)b)+2*(a+3)/b(a");
        System.out.println("Ist (1+a)b)+2*(a+3)/b(a korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t7 = new Text("f[g(x))");
        System.out.println("Ist f[g(x)) korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t8 = new Text("");
        System.out.println("Ist \"\"  korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t9 = new Text(" ");
        System.out.println("Ist \" \" korrekt geklammert? " +
                t1.istKorrektGeklammert());
        t10 = new Text("ANANAS");
        System.out.println("Ist ANANAS korrekt geklammert? " +
                t1.istKorrektGeklammert());
         
    }

    public static void testeZeichenfolge() {
        System.out.println("Wie oft ist An in Anna aß die Ananas, da war die "
                + "ganze Anna nass vorhanden?");
        System.out.println(new Text("Anna aß die Ananas, da war die ganze "
                + "Anna nass").gibAnzahl("An"));

        System.out.println("Wie oft ist an in Anna aß die Ananas, da war die "
                + "ganze Anna nass vorhanden?");
        System.out.println(new Text("Anna aß die Ananas, da war die ganze "
                + "Anna nass").gibAnzahl("an"));

        System.out.println("Wie oft ist na in Anna aß die Ananas, da war die "
                + "ganze Anna nass vorhanden?");
        System.out.println(new Text("Anna aß die Ananas, da war die ganze "
                + "Anna nass").gibAnzahl("na"));

        System.out.println("Wie oft ist e A in Anna aß die Ananas, da war die "
                + "ganze Anna nass vorhanden?");
        System.out.println(new Text("Anna aß die Ananas, da war die ganze "
                + "Anna nass").gibAnzahl("e A"));

        System.out.println("ANA in ANANAS vorhanden");
        System.out.println(new Text("ANANAS").gibAnzahl("ANA"));

        System.out.println("Wie oft ist aaa in aaaaa vorhanden?");
        System.out.println(new Text("aaaaa").gibAnzahl("aaa"));

    }



    public static void main(String[] args) {

       testeKlammerung();
       testeZeichenfolge();
       
 }
}
 
du musst mit [c]break;[/c] die while schleife verlassen sollte anzahlklammern jemals <0 werden. es wird bei )( sonst wieder true, da er das letzte zeichen noch einliest

bekomme mit deinem code für t5 ein false
 
Zuletzt bearbeitet von einem Moderator:
Java:
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());
t1.istKorrektGeklammert());

ist dein zweites problem

kein break;?
edit: ah kleinigkeit übersehn, brauchst kein break, passt schon
 
Zuletzt bearbeitet von einem Moderator:
so findet man den fehler ganz einfach:
Java:
                    if (zeichenkette.charAt(zeichenposition) == klammerAuf) {
                        klammeranzahl++;
                        System.out.print("+");
                    }
                    else if(zeichenkette.charAt(zeichenposition) == klammerZu) {
                        klammeranzahl--;
                        System.out.print("-");
                    }

System.out.print ist sehr hilfreich beim finden bekloppter fehler 😉
 
Oh ja nee hatte ich übersehen 😳 Ist doch OK - wie sollte man es sonst machen? So ist's ja sowieso ein bißchen langweilig. Wenn's <{[()]}> verschiedene Klammern wären könnte man einen Stack nehmen, aber bei EINER Klammerart würde der Stack ja nur "den int emulieren" 😀
 
@michael: ich hatte auch schon nach Stack schreien wollen, aber so ist es ja wirklich einfach.

Etwas habe ich noch gefunden, was man abkürzen kann:

Java:
 if(klammeranzahl == 0) {
                wert = true;
        }
        else{
                wert = false;
        }
         
        return wert;

wird zu

Java:
return klammeranzahl == 0;
 

Zurück
Oben