# Palindrom



## Bastie (10. Feb 2011)

Moin Leute,
Ich soll ein Programm schreiben, dass überprüft, ob eine Wort ein Palindrom, also was rückwärts gelesen das gleiche Wort ergibt, ist oder nicht. Das Programm sollen wir mir Hilfe des JavaEditors erstellen. 
Nun ist mein Problem, dass das Programm immer Nein ankreuzt, egal was ich eingebe.

Mein Code 

```
public void jButton1_ActionPerformed(ActionEvent evt) {
    String eingabe="";
    String ausgabe="";
    char ch;
    eingabe=input.getText();
    int lang=eingabe.length();
    for (int i=lang; i<0; i--) {
      ch=eingabe.charAt(i);
      ausgabe=ausgabe+ch;
    }
    if (ausgabe.contentEquals(eingabe)) {
      jCheckBox1.setSelected(true);
    }
    else {
      jCheckBox2.setSelected(true);
    }

}
```

Compilieren lässt es sich ohne Probleme, gibt keine Fehlermeldung aus.
Hoffe mal, ihr könnt mir helfen...


----------



## SlaterB (10. Feb 2011)

die Welt der Buttons und Selectboxen ist vielleicht schön, viel wichtiger ist aber ein simples System.out.println(),
ganz vergessen oder noch nie kennengelernt?

gib mal Eingabe und Ausgabe aus, vielleicht siehst du dann wo du weiterarbeiten musst,
mit System.out.println() kannst jeden einzelnen Schritt loggen, etwa was in jedem einzelnen Schleifendurchlauf passiert
(oder eben auch mangels Ausgaben feststellen wenn eine Schleife gar nicht durchlaufen wird..)


----------



## Bastie (10. Feb 2011)

Hatten den Befehl noch nicht, machen alles nur mit dem JavaEditor.

Wenn ich Lagerregal eingebe, dann auf den Button klicke und mir die Strings zum Schluss ausgeben lasse,
kommt für den String Eingabe "Lagerregal", für die Ausgabe aber nichts...
hab jetzt testweise mal das mit der Checkbox auskommentiert,
ändert sich aber nichts...


----------



## XHelp (10. Feb 2011)

Bastie hat gesagt.:


> Wenn ich Lagerregal eingebe, dann auf den Button klicke und mir die Strings zum Schluss ausgeben lasse, kommt für den String Eingabe "Lagerregal", für die Ausgabe aber nichts...



Dann wird wohl die Schleife nicht betreten. Die Schleife läuft *solange* i<0 ist. Da ist vermutlich ein kleiner Denkfehler drin.


----------



## SlaterB (10. Feb 2011)

Ausgaben sind die absolute Grundfunktion eines jeden Programmes, zunächst mal ja/nein ob das Programm läuft, 
dann aber eben alles was das Programm macht, ob es 4 ausrechnet, ob eine Datei gefunden wurde, 
ob eine Spielfigur sich bewegt oder eine Verschlüsselung geknackt wurde,

ein Programm ohne Rückmeldung ist nichts wert, man weiß gar nicht ob es überhaupt was macht,
Checkboxen sind eine Möglichkeit (hab nicht gesagt dass du die auskommentieren sollst), aber begrenzt,

System.out.println() schreibt beliebige Infos, wenn man denn eine Konsole hat auf der man nachlesen kann,
von einem Hello World-Programm mal gehört?
alternativ kannst du auch Text in ein Textfeld schreiben so wie du input eingibst,

mit Text kann man 1000fach mehr Infos direkt zurückgeben als mit nur mit SelectBox,
stell dir vor ich könnte hier keinen Text schreiben sondern nur ja/ nein antworten

ok, wenn auch das meiste blah blah ist, du hörst wahrscheinlich gar nicht zu  
mein grundlegender Rat ist jedenfalls der beste den du bekommen kannst: schau dir an WAS DAS PROGRAMM MACHT, 
ob jeder einzelne Schritt so ausgeführt wird wie du es willst, nur am Endergebnis kann man nicht immer viel erkennen

-----

ausgabe ist leer, wie ich schon angedeutet habe liegt es an der Schleife, schau dir die genau an,
beschreibe notfalls in Worten was sie machen soll, welche Indexe sollen in welcher Reihenfolge durchlaufen werden,
was genau ist der Start, was ist das Ende usw.

edit: oder es wird mal wieder alles verraten ohne nachzudenken


----------



## XHelp (10. Feb 2011)

SlaterB hat gesagt.:


> edit: oder es wird mal wieder alles verraten ohne nachzudenken



Also als "alles" würde ich das nicht bezeichnen


----------



## Bastie (10. Feb 2011)

Schon mal gehört, kann ich ohne Google aber grad nicht mehr wirklich zuordnen  

Okay, das i>=0 sein muss, hab ich jetzt schon mal verstanden, 
irgendwie kommt dann aber ne elendlange Fehlermeldung, wenn ich dann auf den Button klicke.
Das grundsätzliche compilieren funktioniert dann aber.

Naja, ich erzähl jetzt mal so, wie ich mein Programm verstehe =D 


Speichert das Wortes im String eingabe
Bestimmt der Länge des Wortes und speicher in lang
setzt  i mit lang gleich,
nimmt sich den letzten Buchstaben von eingabe,
fügt ihn dem String ausgabe hinzu,
zieht von i -1 ab,
guckt ob i noch größer/gleich 0 ist,
wenn ja, dann überprüft er den Buchstaben davor und immer so weiter
bis i<0 ist.
Wenn das der Fall ist, verlässt er die for-Schleife,
guckt ob ausgabe == eingabe ist,
wenn ja, dann kreuzt er die Ja-Checkbox an,
wenn nicht, dann die Nein-Checkbox.

Gebe ich also Lagerregal ein,
stellt er fest, dass das Wort 10 Buchstaben hat,
nimmt den letzten Buchstaben und fügt ihm ausgabe hinzu.
Dann verringert er i auf 9, nimmt den 9. Buchstaben und schreibt ihn ausgabe dazu,
bis i<0 ist, er also dann alle Buchstaben genommen hat.

Ich find da jetzt aber einfach nicht meinen Fehler drin.
Außerdem hab ich das mit der Checkbox einfach nur gemacht,
da ich sowieso nur eine Ja/Nein Ausgabe haben will.


----------



## SlaterB (10. Feb 2011)

das mit den Text was jetzt nur für das >= 0, ist ja geschafft

was immer du an sonstigen Fehlern erhälst, solltest du auch posten,
kann alles mögliche sein, bestimmt irgendwelche Objekte nicht richtig initialisiert, == null, also relativ unabhängig von deiner Programmlogik reine Technikfrage,
System.out.println() kann da auch helfen, aber wollen wir mal nicht tot reden,

Fehlermeldung ist dringend nötig und wahrscheinlich mehr Code


----------



## Andi_CH (10. Feb 2011)

Hm, Hokus Pokus - was war die Antwort auf das Ein und Alles und überhaupt (oder so ähnlich  ) ?
42 - also teilen wir mal 42 / 6 = 7 ich würde den Fehler mal auf Zeile 7 suchen :lol:

[SARKASMUS]Nein stimmt nicht - du solltest den Fehler auf Zeile 7 suchen - ich such den Fehler wieder mal da[/SARKASMUS]

Zeile 7 genau anschauen. Das ist ernst gemeint - und hier ist die Anleitung dazu)


----------



## XHelp (10. Feb 2011)

Warum willst du nicht es so machen, wie dir SlaterB vorgeschlagen hat?

```
String eingabe="";
String ausgabe="";
char ch;
eingabe=input.getText();
System.out.println("Eingabe ermittelt: "+eingabe);
int lang=eingabe.length();
System.out.println("Länge der Eingabe: "+lang);
for (int i=lang; i>=0; i--) {
  System.out.println("Untersuche index: "+i);
  ch=eingabe.charAt(i);
  System.out.println("Buchstabe: "+ch);
  usw....
```



SlaterB hat gesagt.:


> Fehlermeldung ist dringend nötig und wahrscheinlich mehr Code


Och... vermutlich reicht schon ein Hinweis, dass der Index bei 0 anfängt


----------



## Bastie (10. Feb 2011)

Meine Fehlermeldungen sind dann:


Exception in thread "AWT-EventQueue-1" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
	at java.lang.String.charAt(String.java:686)
	at Paretwas.jButton1_ActionPerformed(Paretwas.java:66)
	at Paretwas$1.actionPerformed(Paretwas.java:38)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6267)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6032)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


----------



## SlaterB (10. Feb 2011)

ok, dann wäre es doch wieder ein aktuelles Problem mit der String-Verarbeitung wie XHelp schon erkannt hat, siehe dessen Posting 14:13

die Fehlemeldung besagt übrigens, dass du mit Index 5 auf einen String der Länge 5 zugreifst, 
wo es wie bei Arrays nur Indexe 0, 1, 2, 3 und 4 gibt, 5 verschiedene, 5 ist nicht dabei
(jetzt verrate ich auch viel  )


----------



## Andi_CH (10. Feb 2011)

Bastie hat gesagt.:


> Exception in thread "AWT-EventQueue-1" java.lang.StringIndexOutOfBoundsException: String index out of range: 5



So lang ist die doch gar nicht. Der Index mit dem du auf einen Array zugreifen willst ist ausserhalb des gültigen Bereiches .... Tja

[ZAUNPFAHL] Java beginnt bei 0 mit Zählen (wurde schon nebenbei erwähnt) also wenn ein Wort - z.B. "Zaunpfahl" eingegeben wird ist "Z" an der Position 0 und das "l" an der Position 8 obwohl das Wort 9 Buchstaben hat, als die lenght den Wert 9 liefert.[/ZAUNPFAHL]


----------



## Bastie (10. Feb 2011)

Also muss ich dann in der for-Schleife lang-1 nehmen, wenn ich das richtig verstehe? =D 

Wenn ich das jetzt compiliere, funktioniert das erstmal,
allerdings klick ich auf den Button, tut sich nichts weiter...
ist der Quelltext allerdings dann grundsätzlich erstmal richtig?


----------



## SlaterB (10. Feb 2011)

ich behaupte, dass niemand mehr einen direkten Fehler wird nennen können,
ob alles wie gewünscht funktioniert läßt sich nur im Gesamtkonzext sagen,

wenn z.B. jCheckBox1/2 durch falsche Konfiguration nicht in der GUI enthalten sind, dann bringen dort Änderungen wenig,
wie schon mal gesagt sind Unmengen allgemeiner technischer Fehler immer denkbar


----------



## Bastie (10. Feb 2011)

Okay, dann danke ich euch vielmals für eure Geduld und alles =)


----------



## Landei (10. Feb 2011)

Forensuche hätte dir z.B. das geliefert:


```
String s = "otto";
boolean palindrom = new StringBuilder(s).reverse().toString().equals(s);
```
http://www.java-forum.org/711771-post6.html


----------



## Sonecc (14. Feb 2011)

Super Landei. Pädagogisch richtig wertvoll. Da hat er dann richtig was gelernt, wenn er das so macht...


----------



## Landei (14. Feb 2011)

Genau, dann hätte er gelernt:
- Forensuche zu verwenden
- die vorhandenen APIs auszunutzen
- "out of the box" zu denken

Natürlich hätte er beim Suchen auch pädagogisch _noch_ wertvollere Versionen finden können. Ganz prinzipiell habe ich etwas gegen Sinnlos-Aufgaben, die nicht mal entfernt etwas mit der Praxis zu tun haben, und sich zudem besser über solche "Tricks" wie oben lösen lassen. 

Dass die Lösung so gekünstelt aussieht, liegt übrigens bloß daran, dass die Java-API hier ziemlich umständlich ist. Haskell:


```
isPalindrome xs = xs == reverse xs

isPalindrome "otto"
-- True

isPalindrome "ottokar"
-- False

isPalindrome [1,2,1]
-- True
```


----------



## Sonecc (14. Feb 2011)

Was er dadurch lernen soll ist eine Problemstellung anzugehen und diese programmatisch lösen zu können.
Prinzipiell also die Entwicklung eines Algorithmus.

Zu beweisen dass man die Klassenbibliothek in und auswendig kennt hilft niemandem. Wenn er dann mal in C programmieren muss, sitzt er dann wieder da und weiß nicht was nun.

Deine Lösung mag vielleicht trickreich sein und die Bibliothek ausnutzen, gelernt hat er dadurch aber schlichtweg rein gar nichts. Die Umsetzung des Algorithmus "per Hand" bringt ihm wenigstens bei wie man Probleme in der Programmierung lösen kann. (Und zwar in der allgemeinen, nicht in der Java-spezifischen!)


----------



## Landei (14. Feb 2011)

Ich kenne genug Beispiele, wo die Leute immer alles "zu Fuß" machen wollen, weil sie nie gelernt haben, wie wichtig es ist, die API zu kennen. Und natürlich ist es eine kreative Leistung zu erkennen, dass einem ein "reverse" (in welcher Form auch immer) weiterhelfen kann. 

Vor ein paar Jahren hätte ich deiner Argumentation vielleicht noch zugestimmt, aber inzwischen habe ich gelernt, dass Schleifen überbewertet, und Abstraktionsvermögen unterbewertet wird. Sicher sollte man wissen, wie eine Schleife funktioniert, aber ich finde, dafür gibt es bessere und weniger an den Haaren herbeigezogene Beispiele (etwa Bubblesort, und später andere Sortieralgorithmen). Trotzdem suche ich selbst immer Lösungen, wo ich das Hantieren mit Schleifenindizes möglichst vermeiden kann, denn das ist eine der fehleranfälligsten Programmiertechniken überhaupt.

Versteht man z.B. Quicksort besser, wenn man sich stundenlang mit Schleifenindizes quält, oder wenn das Problem auf elegange Weise rekursiv löst? Ich denke letzteres, auch wenn man für eine effiziente Programmierung in Java dann leider doch wieder mit Schleifen hantieren muss - aber zumindest hat man dann die Arbeitsweise korrekt verstanden und kann sich auf die Implementierung konzentrieren.


----------



## Sonecc (14. Feb 2011)

Das driftet nun ab in grundlegendere Dinge als die Tatsache, dass deine Lösung eine unzureichende wäre.
Was das betrifft, gibts in der Laberecke ein passenderes Thema


----------

