Übung 7 Aufgabe 2

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 7 Aufgabe 2

Beitrag 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
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

Johnny
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 24. Nov 2011 19:28

Re: Übung 7 Aufgabe 2

Beitrag 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?
It is only when we lose everything that we are free to do anything

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 7 Aufgabe 2

Beitrag 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
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

Johnny
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 24. Nov 2011 19:28

Re: Übung 7 Aufgabe 2

Beitrag von Johnny »

ich verstehe nicht was du meinst
It is only when we lose everything that we are free to do anything

Benutzeravatar
mmec
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 203
Registriert: 7. Sep 2011 17:59
Wohnort: Darmstadt

Re: Übung 7 Aufgabe 2

Beitrag 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
FC SEEMOO No.1

Johnny
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 24. Nov 2011 19:28

Re: Übung 7 Aufgabe 2

Beitrag 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?
It is only when we lose everything that we are free to do anything

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 7 Aufgabe 2

Beitrag 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")
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

Johnny
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 24. Nov 2011 19:28

Re: Übung 7 Aufgabe 2

Beitrag 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?
It is only when we lose everything that we are free to do anything

snejjj
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 26. Okt 2011 11:21

Re: Übung 7 Aufgabe 2

Beitrag 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?
Zuletzt geändert von snejjj am 4. Jun 2012 13:34, insgesamt 1-mal geändert.

Melkom
Mausschubser
Mausschubser
Beiträge: 89
Registriert: 21. Okt 2005 13:58
Wohnort: Frankfurt am Main

Re: Übung 7 Aufgabe 2

Beitrag 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.

Antworten

Zurück zu „Archiv“