Bitte Helft einem Anfänger auf die Sprünge



  • Hallo

    Ich lerne C-Programmierung und ich soll in einer meiner Übungsaufgaben eine rekursive ( 😡 ) C-Funktion schreiben, welche ein Char-Array der Länge l darauf prüft, ob sie ein Palindrom ist. Wenn ja, soll sie 1 ausgeben, sonst 0.
    Gesagt getan. Ich habe die Abbruchbedingungen für Felder der Länge 1 und 2 festgelegt und der Funktion beigebracht, das char-Array in ein kürzeres Array zu verwandeln. Leider funktioniert das Ganze nicht und mir ist absolut nicht klar, woran das liegt. Kann mir bitte jemand helfen?
    Die Main-Funktion testet das Ganze.

    #include <stdio.h>
    #include <stdlib.h>
    
    int palindrom2(char feld[],int l) {
        if(l==1) return 1;
        if(l==2 && feld[0]==feld[1]) return 1;
        if(l==2 && feld[0]!=feld[1]) return 0;
        int j=l-2;
        char feld2[j];
        int k=1;
        else {
    
             while(k<=l-2) {
                           feld2[k-1]=feld[k];
                           k++;
                           }
             return palindrom2(feld2,l-2);
    }
    
    int main() {
        char a[] = {'A','B','C','B','A'};
        char b[] = {'A','B','C','C','B','A'};
        char c[] = {'A','B','C','D','A'};
        int d,e,f;
        d=palindrom2(a,5);
        e=palindrom2(b,6);
        f=palindrom2(c,5);
        printf("%d",d);
        printf("%d",e);
        printf("%d",f);  
      system("PAUSE");	
      return 0;
    }
    


  • Wozu gehört denn das else?
    Und wazu gehört das Zeug vor dem else?

    Überprüfe mal die Klemmerung {} und lies noch mal Arrays und Pointer (Vektoren und Zeiger).



  • int palindrom2(char feld[],int w) {
      if( feld[0]!=feld[w-1] ) return 0;
      return w<3||palindrom2(feld+1,w-2);
    }
    


  • Und fürs nächste mal: Bitte nicht schreiben "geht net".
    Welches Verhalten erwartest du wo? Welches Verhalten tritt stattdessen ein?

    Und die Funktion rekursiv zu schreiben ist ja mal völlig sinnlos.. (siehe http://www.c-plusplus.net/forum/278200 )



  • Finde ich gar nicht so sinnlos. Sieht doch recht hübsch aus. 😃

    int palindrom2(char * feld, int l)
    {
        return l ? ((feld[0] == feld[l-1]) && (l > 2 ? palindrom2(feld+1, l-2) : 1)) : 0;
    }
    


  • DirkB schrieb:

    Überprüfe mal die Klemmerung {} und lies noch mal Arrays und Pointer (Vektoren und Zeiger).

    Stimmt, da fehlt eine Klammer. Funktioniert aber trotzdem noch nicht. Ich muss wohl wirklich nochmal was zu Vektoren und Zeigern nachlesen 😞



  • Paul Müller schrieb:

    Finde ich gar nicht so sinnlos. Sieht doch recht hübsch aus. 😃

    Ja, total 😃



  • Gigaz schrieb:

    rekursive ( 😡 )

    Dz, Dz. 🙄

    Gigaz schrieb:

    Stimmt, da fehlt eine Klammer. Funktioniert aber trotzdem noch nicht. Ich muss wohl wirklich nochmal was zu Vektoren und Zeigern nachlesen 😞

    In feld2 steht ja gar nichts drin 😮 . Du solltest einen Pointer nehmen und ihn auf den zweiten Eintrag deines Arrays zeigen lassen



  • cooky451 schrieb:

    Paul Müller schrieb:

    Finde ich gar nicht so sinnlos. Sieht doch recht hübsch aus. 😃

    Ja, total 😃

    Beim näheren hinsehen merke ich auch, dass ein kleines L als Bezeichner eine ungünstige Wahl ist. 😉
    Ich denke ich habe jetzt alle Fälle abgedeckt, in denen man die Funktion falsch benutzen kann. Ob man es jetzt als günstig erachtet eine fehlerhafte Eingabe als kein Palindrom anzusehen sei jedem selber überlassen. Abhilfe könnte ein Tristate schaffen. ⚠ -1 ist auch ungleich 0 und wird demzufolge auch als true gewertet, eine Auswertung ist damit nur über den Wertvergleich möglich. Das Problem lässt sich aber durch eine geschickte Wahl des Ergebnissen lösen. Beispielsweise könnte man einfach sagen, wenn es ein Palindrom ist, dann ist das Resultat false, also 0. Damit ließen sich die Fehlerfälle auf 1 und -1 legen, welche beide true ergeben und damit einfach verworfen werden können. Die einzige Fehlerquelle, welche sich in C aber nur schwer vermeiden lässt, ist ein ungültiges Feld als Eingabe.

    int palindrom2(char * feld, int len)
    {
        return len > 0 ? !((feld[0] == feld[len-1]) && (len > 2 ? !palindrom2(&feld[1], len-2) : 1)) : -1;
    }
    


  • Vielen Danke für den Hinweis mit den Zeigern. 👍 Ich habe es hinbekommen und wieder was gelernt.

    #include <stdio.h>
    #include <stdlib.h>
    
    void arrayverschieber(char *a, int k) {
         int j;
         for(j=0;j<=k-1;j++) *(a+j)=*(a+j+1);
    }
    int palindrom2(char *a, int k) {
        if(k==1) return 1;
        if(k==2) return *a==*(a+1);
        if(*a!=*(a+k-1)) return 0;
        arrayverschieber(a,k);
        return palindrom2(a,k-2);
    }
    int main(){
        char a[] = "EinnegermitgazellezagtimregenniE";
        printf("%d",palindrom2(a,32));
        system("PAUSE");
        return 0;
    }
    


  • Ich rate dir, deinen Code so zu schreiben, dass du ihn später ohne große Mühe schnell verstehen kannst.


Anmelden zum Antworten