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
geschrieben um KD.java selbst zu kompilieren.
Dabei scheint der Fall "A(B,C)" zu funktionieren.
Any idea?
Die drei .java-Dateien mit dem Quellcode:
KD.java
ParseException.java
Tests.java
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
Dabei scheint der Fall "A(B,C)" zu funktionieren.
Any idea?
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)"); }
}