Klassen Aufgabe: Binärbaum überprüfen

similuke

Mitglied
Hallo zusammen,
habe eine Java-Programmieraufgabe bekommen, in der man drei Funktionen in einer Klasse erstellen soll (KD.java), die als Argument einen String aufnimmt und ihn auf einen gültigen Binärbaum überprüft.
Mittels JUnit und (Tests.java) sollen die verschiedenen Fälle getestet werden. Dabei wird bei den ungültigen Fällen eine "ParseException" geworfen.
Ich habe es geschafft einige wenige Fälle erfolgreich abzuarbeiten, doch wie ihr auf dem Bild sehen könnt funktioniert der Fall (balancedTree) mit dem String "A(B,C)" schon nicht.
Für dieses Bsp. bin ich den Code schon mehrere Male durchgegangen, aber ich finde den Fehler nicht.
Wenn ich den finden würde, könnte ich mich auch den anderen nicht-erfolgreich bestandenen Fälle annehmen.

Ich habe noch eine main-Funktion
Code:
public static void main(String Args[]) throws ParseException
geschrieben um KD.java selbst zu kompilieren.

Dabei scheint der Fall "A(B,C)" zu funktionieren.

Any idea?

d2c5d830cfe8.JPG


Die drei .java-Dateien mit dem Quellcode:

KD.java
Java:
package u3a3;

public class KD {
	 static int pos = 0;
	 
	 public static void main(String Args[]) throws ParseException {
		 String kd="A(B,C)";
		 parse(kd);
		 System.out.println("fertig");
	 }
	 
	 private static void Baum(String kd) throws ParseException
	 {
		 if(kd.charAt(pos)=='-')
		 {
			 return;
		 }
		 
		 else
		 {
		 	Knoten(kd);
		 	if(pos>=kd.length())
		 	{
		 		return;
		 	}
		 	else if(kd.charAt(pos)=='(')
		 	{
		 		pos++;
		 		Nachfolger(kd);
		 		if(kd.charAt(pos)==')'||pos>=kd.length())
		 		{
		 			return;
		 		}
		 		else
		 		{
		 			throw new ParseException("Schliessende Klammer fehlt",pos);
		 		}
		 	}
		 			
		 	else
		 	{
		 		return;
		 	}
		 			
		 			
		 }
		 
	 }
	 
	 private static void Knoten(String kd) throws ParseException
	 {
		 if(Character.isUpperCase(kd.charAt(pos)))
		 {
			 pos++;
			 return;
		 }
		 
		 else
		 {
			 throw new ParseException("Kein Grossbuchstabe",pos);
		 }
	 }

	 private static void Nachfolger(String kd) throws ParseException
	 {
		 Baum(kd);
		 if(kd.charAt(pos)==',')
			 {
			 			pos++;
			 			Baum(kd);
			 			return;
			 }
		 else
		 {
			 return;
		 }
	 }
	 
	 
	 
	/**
	 * Parse a "Klammerdarstellung" (KD) of tree.
	 * 
	 * <ul>
	 * <li>An empty tree is encoded as '-'.</li>
	 * <li>A node is encoded as an upper case letter, i.e. everything accepted by {@link Character#isUpperCase(char)}.</li>
	 * <li>Children are appended to the father as a ','-separated list of nodes enclosed in round brackets.</li>
	 * </ul> 
	 * 
	 * @param kd Tree encoded in KD
	 * @throws ParseException if the given String is not a valid KD of a tree.
	 */
	public static void parse(String kd) throws ParseException
	{
		
		if(kd.length() == 0)
		 {
			 throw new ParseException("Leerer String",pos);
		 }
		Baum(kd);
		
	}
}

ParseException.java
Java:
package u3a3;

public class ParseException extends Exception {
	private static final long serialVersionUID = 1L;

	/**
	 * Create a parse exception
	 * @param what description of the reason
	 * @param offset offset of the input string where the problem occured
	 */
	public ParseException(String what, int offset) {
		super(String.format("Parsing failed at offset %d: %s", offset, what));
	}
}

Tests.java
Java:
package u3a3;

import org.junit.Test;

public class Tests {
	void testCase(String lkd) throws ParseException {
		KD.parse(lkd);
	}
	
	@Test public void empyTree() throws ParseException { testCase("-"); }
	@Test public void onlyRoot() throws ParseException { testCase("A"); }
	@Test public void balancedTree() throws ParseException { testCase("A(B,C)"); }
	@Test public void listLeft() throws ParseException { testCase("A(B(C,-),-)"); }
	@Test public void listLeftImplicit() throws ParseException { testCase("A(B(C))"); }
	@Test public void listRight() throws ParseException { testCase("A(-,B(-,C))"); }
	@Test public void missingSibling() throws ParseException { testCase("A(B,-,C)");}
	@Test public void noChildren() throws ParseException { testCase("A(-,-)");}
	@Test public void genericTree() throws ParseException { testCase("A(-,B(C),-,D(E(-,F(G,H)),I))"); }
	
	@Test(expected = ParseException.class)
	public void empyString() throws ParseException { testCase(""); }

	@Test(expected = ParseException.class)
	public void noChild()throws ParseException { testCase("A()"); }

	@Test(expected = ParseException.class)
	public void noSibling()throws ParseException { testCase("A(B,)"); }

	@Test(expected = ParseException.class)
	public void missingOpenBrace()throws ParseException { testCase("AB)"); }

	@Test(expected = ParseException.class)
	public void missingCloseBrace()throws ParseException { testCase("A(B"); }

	@Test(expected = ParseException.class)
	public void missingComma()throws ParseException { testCase("A(BC)"); }
	
	@Test(expected = ParseException.class)
	public void garbage()throws ParseException { testCase("A(B)C"); }

	@Test(expected = ParseException.class)
	public void garbage2()throws ParseException { testCase("A(B)(C)"); }
	
	@Test(expected = ParseException.class)
	public void noRoot()throws ParseException { testCase("-(A)"); }

	@Test(expected = ParseException.class)
	public void invalidNode()throws ParseException { testCase("A(1)"); }

	
}
 

hdi

Top Contributor
Steht doch da, was den Fehler verursacht hat: Parsing failed at offset 1: Kein Großbuchstabe. Dein String enthält Klammern, und "(" ist kein Großbuchstabe, daher der Fehler. Konkret: Kuck mal in Zeile 21:
Java:
  Knoten(kd);
Dieser Aufruf steht unmittelbar im else-Zweig auf die "-"-Prüfung. Erst danach prüfst du auf Klammern. Du rufst die Methode Knoten() also auf mit der Klammer, und dann kracht's.

PS: Du solltest dich an die Konventionen halten: Methodennamen beginnen nie mit einem Großbuchstaben! Also nenn die Methode nicht "Knoten", vorallen Dingen ist das ein nichtssagender Name. Schau dir mal die Methode an. Sie inkrementiert eine Variable. Wie kommst du dann auf den Namen "Knoten" ;) Nenn sie erhoehePos() oder sowas..
 

similuke

Mitglied
die Methode heisst deshalb Knoten, weil sie überprüft ob es auch wirklich ein Knoten ist(also ob es auch wirklich ein Grossbuchstabe ist).
aber wenn ich das erste Mal Knoten() aufrufe ist der Zähler pos=0, also A, Knoten() überprüft dann diese Stelle ob es sich um einen UpperCaseLetter handelt, in diesem Fall ja
dann wird pos inkrementiert und returned
jetzt ist pos=1 und er kommt in das if-Statement: an pos 1 ist eine Klammer, und er geht weiter...

er kommt ja nicht vom Knoten() mit pos=1, returned, und ruft noch einmal Knoten() auf...
 

hdi

Top Contributor
Hm, okay jetzt hab ich mir das etwas genauer angesehen. Also was du da hast nennt man Spagetthi-Code ;) Die Logik springt hin und her, und ständig passieren Seiten-Effekte. Die Methoden haben sinnlose Namen und man weiß nie genau wo was passiert. Wo und wann genau der Fehler auftritt lässt sich hier wohl am besten durch Debugging herausfinden. Mach mal einen Doppelklick in Eclipse an den linken Rand im Text-Editor (grauer Streifen). Dann sollte da so ein Knubbelchen erscheinen. Mach das mal an den Anfang der Baum()-Methode. Und dann Rechtsklick auf deine Datei -> Debug As -> Java Applikation. Dann bleibt er da beim Knoten hängen, und du siehst eine Liste mit Variablen, unter anderem pos mit dem Wert. Dann hast du oben Knöpfe, zB step over, usw. So kannst du jetzt schrittweise durch dein Programm wandern und beobachten wie sich die Werte verändenr um den Fehler herauszufinden.

Auf jeden Fall hast du dieses Problem eben wegen dem Spagehtti-Code. Da blickt kein Mensch durch...
 

hdi

Top Contributor
Welche - offset? Das sind String-interne Werte, die brauchen dich nicht interessieren. Du musst nach "pos" Ausschau halten, das muss dort auch in der Liste vorhanden sein.
 

similuke

Mitglied
tja, das ist das problem: pos wird gar nirgends angezeigt, egal wo ich mich gerade im Programm befinde
nur immer der String kd wird angezeigt
 

hdi

Top Contributor
Achso jetzt seh ich's erst: Das ist eine Klassen-Variable (static). Klick in diesem Variablen-Fenster mal rechts oben auf diesen weißen Pfeil nach unten. Dort auf java -> show static variables
 

similuke

Mitglied
also, es sieht wie folgt aus:
pos wird bis auf 5 erhöht, dann ist er im letzten if-statement wo er die "schliessende Klammer" überprüft und returned, er läuft also ganz durch in diesem Fall
deshalb verstehe ich nicht, dass JUnit schon ein Problem hat, wenn pos=1 ist
 
Zuletzt bearbeitet:

similuke

Mitglied
dann hab ich noch das ausprobiert:
anstatt:
Java:
private static void Baum(String kd) throws ParseException
     {
         if(kd.charAt(pos)=='-')
         {
             return;
         }

(Test & Debugging mit main funktioniert, sowie JUnit meldet ein erfolgreicher Test)

habe ich pos inkrementiert:
Java:
private static void Baum(String kd) throws ParseException
     {
         if(kd.charAt(pos)=='-')
         {
             pos++;
             return;
         }

(auch hier funktioniert der Test mit main, doch dieses Mal meldet JUnit einen nicht-erfolgreichen Test)
 

hdi

Top Contributor
Dann liegt der Fehler vllt in deinen Testcases. Kann es sein dass die nicht unabhängig voneinander sind? Das vllt ein voriger Testcase den nächsten beeinflusst? Lass mal nur den Testcase für balancedTree durchlaufen.
 

similuke

Mitglied
hey, ich habe soeben den Test nur mit balancedTree durchgeführt:
dieses Mal hat es geklappt!:applaus:
aber mir ist im Moment nicht klar wieso das so ist...
 
F

Firephoenix

Gast
Hi,
die Tests werden nacheinander ausgeführt, benutzten dafür aber die gleichen Daten.
Ich vermute mal es liegt an der Klassenvariable pos in KD, die evtl nach irgend einem Test nicht mehr auf 0 steht und damit folgetests fehlschlagen.
(Eine gute Regel in der Informatik: Zustandserhaltung).
Was du machen kannst ist, pos public zu machen oder getter/setter dafür einzurichten und dann bei den Testcases folgenden aufruf (ausgehend mal von public)

Java:
@Before
public void vorJedemTestAusfuehren(){
KD.pos = 0;
}

die Methode wird von JUnit erkannt (@Before annotation) und vor jedem einzelnem Test ausgeführt.
Gruß
 

similuke

Mitglied
danke für den Tipp
doch wenn pos nich mehr static ist, dann muss ich die Funktionen auch non-static machen
dies hat zur Folge, dass er dann in Tests.java meckert und sagt, dass er keine statische Referenz auf eine nicht-statische Methode machen kann...
 

similuke

Mitglied
ja stimmt, hat geklappt
die Tests werden jetzt unabhängig voneinander ausgeführ :toll:
probiere jetzt noch die anderen Fälle

welche andere Möglichkeit gibt es denn, das Ganze zu implementieren
eine Variante ohne globale Variable vielleicht?
irgendwie muss es doch gehen, ohne die Tests.java zu verändern...

auf jeden Fall danke ich Dir für Deine Zeit... gute Nacht!
 
F

Firephoenix

Gast
Hi,
wenn du die Testklasse nicht verändern willst musst du die KD entsprechend ändern, so dass pos nach jedem Durchlauf wieder sauber auf 0 steht.
Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jere58 Aufgabe zu Mustern Java Basics - Anfänger-Themen 1
M Interfaces Aufgabe Java Basics - Anfänger-Themen 2
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
Justin4687 Benötige Hilfe bei folgender Aufgabe Java Basics - Anfänger-Themen 2
A Erste Schritte Aufgabe mit while Schleife Java Basics - Anfänger-Themen 11
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
M Java Programmierung Aufgabe Anfänger Java Basics - Anfänger-Themen 1
R Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
Mikejr Java Berg aufgabe Java Basics - Anfänger-Themen 6
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
berserkerdq2 Habe ich die Aufgabe richtig gelöst? Java Basics - Anfänger-Themen 3
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
Neuling47 Ich zerbreche mit den kopf an einer Aufgabe Java Basics - Anfänger-Themen 61
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
T Informatik Studium Aufgabe Java Basics - Anfänger-Themen 4
T Aufgabe Informatik Studium Java Basics - Anfänger-Themen 10
I matrix aufgabe Java Basics - Anfänger-Themen 22
J Brauche Hilfe bei for-each Aufgabe Java Basics - Anfänger-Themen 1
9 Aufgabe Bruttorechner Java Basics - Anfänger-Themen 14
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
J Brauche Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
J boolean aufgabe Java Basics - Anfänger-Themen 9
D Snake-Spiel ähnliche Aufgabe Hilfe Java Basics - Anfänger-Themen 3
M Hilfe - Array Aufgabe Java Basics - Anfänger-Themen 8
StevenGG Aufgabe im Studium Java Basics - Anfänger-Themen 36
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
S Schulaufgabe - verstehe leider die Aufgabe nicht Java Basics - Anfänger-Themen 4
Leo0909 Ich brauche Hilfe bei dieser Aufgabe Java Basics - Anfänger-Themen 2
R Eclipse Aufgabe Java Basics - Anfänger-Themen 4
J OOP-Aufgabe Java Basics - Anfänger-Themen 15
Helix19 Informatik Grundkurs (Haus-)Aufgabe Java Basics - Anfänger-Themen 5
P eine kleine Aufgabe mit Audio Java Basics - Anfänger-Themen 1
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
TimoN11 Java spezielle Suchprobleme - Aufgabe Java Basics - Anfänger-Themen 5
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 2
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 9
dieter000 Aufgabe Hilfe Java Basics - Anfänger-Themen 18
jonathanpizza Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
Q Hilfe auf Aufgabe(Matrixmultiplikation) Java Basics - Anfänger-Themen 1
jonathanpizza Hilfe bei der Aufgabe Java Basics - Anfänger-Themen 19
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Rechnungen-Aufgabe Java Basics - Anfänger-Themen 18
C Biene-Aufgabe Java Basics - Anfänger-Themen 2
K Algorithmen und Datenstrukturen Programmier Aufgabe Java Basics - Anfänger-Themen 10
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Aufgabe Flussdiagramm, kann jemand checken? Java Basics - Anfänger-Themen 8
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Lösung Aufgabe - Java Programmiren lernen für Dummies Java Basics - Anfänger-Themen 11
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
J Exception-Aufgabe Java Basics - Anfänger-Themen 8
I Methoden char Array Aufgabe (bitte hierbei um Hilfe) Java Basics - Anfänger-Themen 3
F Aufgabe: Abstand von einem Punkt zu einem anderen Punkt Java Basics - Anfänger-Themen 10
T Aufgabe zum Verschlüsselungsalgorithmus Java Basics - Anfänger-Themen 11
J Erste Schritte Aufgabe Java Basics - Anfänger-Themen 24
T Methoden BinaryTree transformieren Aufgabe Java Basics - Anfänger-Themen 36
J Brauche Hilfe bei einer aufgabe Java Basics - Anfänger-Themen 1
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
S Sortieralgorithmus - Aufgabe mit Lösungsidee Java Basics - Anfänger-Themen 20
A Aufgabe: Gleitkommazahlen Java Basics - Anfänger-Themen 3
A Java-Programmierungs Aufgabe Java Basics - Anfänger-Themen 2
U Aufgabe zu Kontrollstrukturen Java Basics - Anfänger-Themen 8
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
J Aufgabe als Feuertaufe Java Basics - Anfänger-Themen 8
S Unbedingte hilfe bei Java Aufgabe [Schleife / Zinsrechnung] Java Basics - Anfänger-Themen 14
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
S Hilfe bei Java Aufgabe (Schleifen) Java Basics - Anfänger-Themen 25
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
B BITTE!! Ich brauche dringende Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 17
H aufgabe 4 Java Basics - Anfänger-Themen 297
M Hilfe bei Projektorientierungs-Aufgabe !! Java Basics - Anfänger-Themen 3
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
H java aufgabe Java Basics - Anfänger-Themen 7
E Mathematische Aufgabe: Antwort entspricht nicht der Lösung Java Basics - Anfänger-Themen 5
H was verlangt die aufgabe ? Java Basics - Anfänger-Themen 10
H java aufgabe Java Basics - Anfänger-Themen 68
H java aufgabe Java Basics - Anfänger-Themen 25
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
R Java Aufgabe (Teilbarkeit) Java Basics - Anfänger-Themen 7
H java aufgabe Java Basics - Anfänger-Themen 44
H java aufgabe Java Basics - Anfänger-Themen 7
H java string aufgabe Java Basics - Anfänger-Themen 10
H array aufgabe Java Basics - Anfänger-Themen 13
D Erste Schritte Lösen dieser Aufgabe, Hilfe! Java Basics - Anfänger-Themen 12
H aufgabe Java Basics - Anfänger-Themen 9
H lösung aufgabe Java Basics - Anfänger-Themen 12
S Hilfe für Aufgabe Java Basics - Anfänger-Themen 4
H java online aufgabe Java Basics - Anfänger-Themen 4
H Array aufgabe Java Basics - Anfänger-Themen 7
H oop aufgabe probe kalusur Java Basics - Anfänger-Themen 11
H oop aufgabe Java Basics - Anfänger-Themen 19
H JAVA AUFGABE Java Basics - Anfänger-Themen 7
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
J Problem bei Aufgabe "Geldstückelung" Java Basics - Anfänger-Themen 5
P Problem bei Java-Aufgabe Java Basics - Anfänger-Themen 12
B Verständnis Frage zu der Aufgabe Java Basics - Anfänger-Themen 30

Ähnliche Java Themen

Neue Themen


Oben