Seite 2 von 2

Re: Übung 7 Aufgabe 2

Verfasst: 2. Jun 2012 22:54
von Owyn
Statt

palindrom(t2.substring(1, t2.length()-2));
return palindrom;

sollten Sie schreiben:

return palindrom(t2.substring(1, t2.length()-2));

Dann ist zumindest der Fehler mit dem fehlenden return draußen - und mit der Rückgabe des rekursiven Aufrufs passiert auch was.
Es kann natürlich sein, dass noch mehr kleine Fehler im Code sind.

Gruß,
Christian Heinig

Re: Übung 7 Aufgabe 2

Verfasst: 2. Jun 2012 23:05
von Johnny
ich wiederhole: ich habe es schon versucht, und ich bekomme: missing return statement. ich habe es genau nach else if(t2.charAt(0)==t2.charAt(t2.length()-1)) angehängt, und ich bekomme diese Fehlermeldung. Was für Fehler können noch erscheinen?

Re: Übung 7 Aufgabe 2

Verfasst: 2. Jun 2012 23:30
von Owyn
Ah, ok - das letzte if hat kein else. Wenn die Ausführung bis zu diesem if kommt, dort die Bedingung aber nicht zutrifft, gibt es kein return.

Gruß,
Christian Heinig

Re: Übung 7 Aufgabe 2

Verfasst: 2. Jun 2012 23:35
von Johnny
ich verstehe nicht was du meinst

Re: Übung 7 Aufgabe 2

Verfasst: 3. Jun 2012 03:06
von mmec
Hallo Johnny,

Aktueller Stand, nehme ich mal an:

Code: Alles auswählen

 public static boolean palindrom(String txt) { 
       String t1=txt.trim();
       String t2=t1.toUpperCase();
       if (t2.length()==1) return true; // 1.
       else if(t2.charAt(0)==t2.charAt(t2.length()-1)) { // 2.
           return palindrom(t2.substring(1, t2.length()-2));
       }
       else if(t2.charAt(0)!=t2.charAt(t2.length()-1)) return false; // 3.
}
Falls die erste, zweite und dritte Bedinungen in dieser Verzweigung (Zeilen sind im Code markiert) nicht zutreffen, würde kein Wert zurück gegeben werden. Deswegen kommt die Fehlermeldung "missing return statement".
Natürlich kann dieser Fall bei diesem Code nicht eintreten, da immer entweder die 2. oder 3. Bedingung erfüllt ist. Das scheint der Compiler aber nicht zu wissen. Wenn du bei der letzten if-else Verzweigung einfach das if und die Bedinung weg machst, damit dann da nur noch

Code: Alles auswählen

else return false;
steht, sollte das funktionieren. Da darfst du sogar dann das else weg lassen, weil in allen anderen Fällen die Methode schon beendet wurde.

Wobei du anscheinend noch zwei Bugs im Code hast. Die Fehlermeldungen werden vom Typ out of Bound sein. Ich hab dir die Lösung für deine voraussichtlichen Probleme in einem schlecht lesbarem Türkis geschrieben. Versuch sie aber mal selbst zu finden.

Bei der Methode substring(int a, int b) gibt a den ersten Index des Substrings an und b den nach dem letzten. Das heißt beim String "abc" bekommst du wenn du die Methode "abc".substring(0,2) eine Rückgabe von "ab". Wenn du jetzt den String "ab" hast und darauf "ab".substring(1, "ab".length()-2) anwendest, bekommst du dann natürlich eine Fehlermeldung. Die Sachen kann man auch in der Java API ganz oben bei den Beispielen nachlesen. Link.

Das zweite ist dass du bei Strings mit gerader Anzahl von Buchstaben irgendwann deiner Methode einen leeren String übergeben wirst (vorausgesetzt der vorherige Bug ist repariert) dies wird wieder zu einer out of Bounds Runtime Exception führen, da du mit t2.length()-1 versuchst den Index -1 anzusprechen, der natürlich nicht existiert. Ein String von der Länge 0 sollte also auch als Palindrom erkannt werden.


Grüße, Johannes

Re: Übung 7 Aufgabe 2

Verfasst: 3. Jun 2012 18:11
von Johnny
nach der emfehlung in türkis habe ich die Klasse Words folgendermaßen geändert:

Code: Alles auswählen

 public static boolean palindrom(String txt) { 
       String t1=txt.trim();
       String t2=t1.toUpperCase(); 
       if (t2.length()==1) return true;
       else if(t2.charAt(0)==t2.charAt(t2.length()-1) & t2.length()>2) return palindrom(t2.substring(1, t2.length()-2));
       else return false;
} 

 public static boolean anagramm(String t1, String t2) {
        String t3=t1.trim();
        String t4=t2.trim();
        String t5=t1.toUpperCase();
        String t6=t2.toUpperCase();
        if(t5.length()==0) return false;
        else if (t5.length()>0) {
            if(t5.length()==t6.length()) {
                char c1=t5.charAt(0);
                int c2=t6.indexOf(c1);
                if(c2==-1) return false;
                else return anagramm(t5.substring(1), t6.substring(0, c2-1)+t6.substring(c2+1, t6.length()));
            }
            else return false; 
            }
}
der ganzen Klasse fehlt ein return statement, warum?

Re: Übung 7 Aufgabe 2

Verfasst: 3. Jun 2012 18:37
von Owyn
Es fehlt nicht der ganzen Klasse ein return-Statement, sondern der Methode anagramm, was auch daran erkennbar ist, dass BlueJ die geschweiften Klammern der Methode markiert.

Für den Compiler ist nicht erkennbar, dass die Bedingung beim "if (t5.length()>0)" immer zutrifft. Und da kein return ausgeführt werden würde, wenn sie nicht zutreffen würde, kommt die Fehlermeldung.

Viel einfacher und für Sie gewinnbringender ließen sich Ihre Fragen übrigens klären, wenn Sie sie in einer Poolbetreuung stellen würden!

Gruß,
Christian Heinig
(selbsternannter Ehrenvorsitzender des "1. Herr Heinig Fanklub Darmstadt")

Re: Übung 7 Aufgabe 2

Verfasst: 3. Jun 2012 22:38
von Johnny
ich habe schon eine Bedingung geschrieben falls t5.length()==0, muss ich eine Bedingung auch für t5.length kleiner als 0 schreiben? Welchen Fall habe ich nicht berücksichtigt? Weswegen geht es schief?

Re: Übung 7 Aufgabe 2

Verfasst: 3. Jun 2012 23:16
von snejjj
Nur mal so:
deine Palindrom-Methode hat einen Fehler. Teste sie mal mit "aa" (ist ein Palindrom), dann bekommst du false.

Und in deiner Anagramm-Methode:
warum ist es automatisch kein anagramm wenn der erste String leer ist? Solange der zweite auch leer ist, ist doch alles gut ;-)
und warum muss die Länge gleich sein? (trim() löscht ja nur Whitespace am Anfang und Ende des Strings, nicht zwischendrin)

edit: und noch was: du verwendest die Variablen t3 und t4 nie. Wozu belegst du sie dann?

Re: Übung 7 Aufgabe 2

Verfasst: 4. Jun 2012 00:58
von Melkom
Johnny hat geschrieben:ich habe schon eine Bedingung geschrieben falls t5.length()==0, muss ich eine Bedingung auch für t5.length kleiner als 0 schreiben? Welchen Fall habe ich nicht berücksichtigt? Weswegen geht es schief?
Theoretisch schon. Der Compiler weiß nicht, dass es keine Worte gibt, deren Länge < 0 sind. Für ihn sind Längen nur Ganzzahlen, die positiv und negativ sein können. Schreiben Sie einfach statt "else if..." nur "else", dann decken Sie diesen Fall gleich mit ab, auch wenn er nie eintreten wird.