Palindrom



  • #include <stdio.h>
    #include <string.h>
    int main()
    {
    int i;//zählt die Zeichen
    char wort[100];//Array mit max 99 Elementen + '\0',(Anzahl frei gewählt)
    char aus[5]={"ENDE"};//programm sollte  wenn eingabe "ENDE"
    
      for (i=0;; )//zählt die Zeichen aufwärts
      {
          scanf("%c",&wort[i]);//
          if (scanf("%s",aus))//das scheint nicht zu klappen
          {
             printf ("Schluss");
             break;//die Eingabemöglichkeit zu Ende
          }
          else //das Programm geht hier nicht hinein?
          {
             if (wort[i]=='\n')//Enter nicht mitgezählt
             continue;//Rest der for-Schleife ignoriert
             else
             {
             i++;
             printf("%d Zeichen\n",i );//Anzahl der Zeichen
             }
          }
      }
    return 0;
    }
    //  Das Programm soll ein Polyndrom erkennen (zeichenweise eingegeben in ein Array gespeichert,ungeachtet der Leerzeichen).Wird das Wort "ENDE" eingegeben sollte Die Eingabemöglichkeit beendet werden. Mein grober Plan war der folgende: zuerst mit der for-Schleife Zeichen zählen um den Endwert zu ermitteln,dann mit zwei verschachtelten Schleifen (eine von wort[0] die andere vom Endwert) jedes Paar auf Identität untersuchen. läuft dabei ein Index bis zum letzten(oder ersten?) Element durch ist es ein Polyndrom. 
       Aber ich schaffe es im Moment nicht diese Abbruchsbedingung zu realisieren. (!?). Mache ich es mit if (scanf("%s","ENDE") geht der anscheinend nicht mehr in den nächsten else Block hinein.
    
       Danke im Voraus!
    


  • Vorweg:
    1. Nutze Code-Tags, dann bleibt die Formatierung erhalten und du bekommst auch Zeilennummern.
    Code mit der MAus markieren und auf den C-Button unter dem 😡 klicken
    Wenn du registrierter Nutzer bist, kannst du das sogar nachträglich machen.

    2. Du meinst Palindrom: https://youtu.be/ZRh-dyCskxE?t=4m52s

    Strings initialisiert man anders. Und zwar ganz einfach, indem man den Text zwischen " setzt.
    Und da ist dann die '\0' automatisch dabei: "ENDE"

    Auch das Einlesen von Wörtern macht man nicht zeichenweise.
    scanf ist zum Einlesen da, nicht für den Stringvergleich.
    Dafür gibt es extra eine Standardfunktion. Für die Längenbestimmung eines Strings übrigens auch.

    Das Programm hat zuviele Fehler. Reicht dein Kenntnisstand in C dafür überhaupt aus?



  • Also anscheinend reicht mein Kenntnisstand in C nicht dafür aus, offenbar genau so wie mein Kenntnisstand der deutschen Rechtschreibung:)
    Danke für die Antwort, und die tipps!
    Das ist eine abschließende Fernlehraufgabe in diesem Semester. Ich muss die irgendwie schaffen.
    Ich komme tatsächlich mit den char arrays gar nicht klar. Dachte dass man so wie so die Schleife braucht weil hier zeichenweise eingelesen wird, deswegen keine strlen() benutzt.
    Mir ist schon klar dass (scanf("%s",aus)) ein totaler Mist ist. aber wie installiere ich diese Abbruchbedingung? Es muss ja gleichzeitig zeichenweise eingelesen werden und die Eingabe der Zeichenkette ("ENDE") abgefangen werden.

    L.G.



  • Bagration1 schrieb:

    Es muss ja gleichzeitig zeichenweise eingelesen werden

    Warum?

    Bagration1 schrieb:

    und die Eingabe der Zeichenkette ("ENDE") abgefangen werden.

    Auch das ist lösbar.

    Schreibe erstmal eine Funktion, die einfach nur überprüft, ob der übergebene String ein Palindrom ist.
    Mehr soll die Funktion nicht machen. Vor allem keine Ein-/Ausgaben mit dem Nutzer.

    Für den ersten Test kannst du die Strings auch fest vorgeben.

    Die Eingabe und der Endetest kommen danach.

    Ein Programm "Gib deinen Namen ein" solltest du mal gemacht haben und strcmp muss auch im Script vorkommen.

    Ist da "ENDE" teil der Aufgabe (oder deine Idee)?



  • Bagration1 schrieb:

    Das ist eine abschließende Fernlehraufgabe in diesem Semester. Ich muss die irgendwie schaffen.

    Das da ist Schulniveau!

    Bagration1 schrieb:

    Ich komme tatsächlich mit den char arrays gar nicht klar.

    Wieso nicht? Wie kann sowas überhaupt sein? Keine Lust gehabt zu lernen? Die andere Möglichkeit wäre, du verstehst es intellektuell nicht. Ich weiß nicht was schlimmer ist.

    Bagration1 schrieb:

    Dachte dass man so wie so die Schleife braucht weil hier zeichenweise eingelesen wird, deswegen keine strlen() benutzt.

    Was hat das eine denn mit dem anderen zu tun?

    Bagration1 schrieb:

    Mir ist schon klar dass (scanf("%s",aus)) ein totaler Mist ist.

    Nein das ist dir nicht klar!

    Bagration1 schrieb:

    Es muss ja gleichzeitig zeichenweise eingelesen werden

    NEIN!



  • Das zeichenweise Einlesen ist leider in der Aufgabenstellung vorgeschrieben. Genau so wie die Abbruchsbedingung "ENDE".Das heisst (so wie ich das verstehe) bei der Eingabe sollte es egal sein ob ich EIN Zeichen eingebe dass in ein Array gespeichert werden soll, oder den string "ENDE"(woraufhin das Programm abbricht). Und Beides (in einem) kriege ich nicht hin. Oder ich verstehe die Aufgabenstellung falsch.
    Aber dennoch Danke!



  • Wenn du zeichenweise einliest, dann musst du halt (nach jedem Zeichen) darauf achten, dass du einen gültigen C-String hast.
    Dann kannst du jede Stringfunktion aus dem Standard benutzen.

    Wen "ENDE" in wort steht ist die Bedingung erfüllt.



  • Bagration1 schrieb:

    Das zeichenweise Einlesen ist leider in der Aufgabenstellung vorgeschrieben.

    das ist ja auch in Ordnung. Was micht gestört hat war:

    Es muss ja gleichzeitig zeichenweise eingelesen werden

    Ich versteh nicht wo dein Problem liegt. Lies jedes Zeichen ein und häng es an das vorangegange dran. Danach überprüfen ob "ENDE" in deinem char-Array vorkommt. Das sind die einfachsten C-Funktionen kombiniert mit primitivster Logik. Wenn du das wirklich nicht hinbekommst fällst du definitiv zu recht durch...



  • http://www2.hs-fulda.de/~klingebiel/c-stdlib/

    da solltest du alles finden, was du brauchst. scanf wird jedenfalls verwendet, wenn du daten in einem bestimmten format einlesen willst, die uhrzeit also z.b. mit scanf("%d:%d:%d", &hour, &minute, &second)

    für dein palindrom wäre folgender programmablauf eine möglichkeit:

    benutzer begrüßen und dazu auffordern, ein wort einzugeben

    solange kein EOF:
    nächstes zeichen einlesen
    eingelesenes zeichen an momentaner stelle in array speichern
    momentane stelle in array um 1 erhöhen

    zeichenkette terminieren
    evtl. momentane stelle in array als länge der zeichenkette abspeichern

    wenn eingegebene zeichenkette gleich "ENDE"
    programm beenden

    wenn länge der eingegebenen zeichenkette kleiner 2
    fehlermeldung ausgeben
    programm beenden

    wenn länge der zeichenkette nicht durch 2 teilbar
    fehlermeldung ausgeben
    programm beenden

    solange position im array kleiner länge der zeichenkette
    wenn zeichen an position im array ungleich zeichen an position "länge der zeichenkette minus position im array"
    schleife abbrechen

    wenn position im array gleich länge der zeichenkette
    ausgabe: palindrom
    sonst
    ausgabe: kein palindrom

    programm beenden



  • Wade1234 schrieb:

    solange kein EOF:

    '\n' reicht hier erstmal aus.

    Wade1234 schrieb:

    wenn länge der eingegebenen zeichenkette kleiner 2
    fehlermeldung ausgeben

    Warum ist das ein Fehler?

    Wade1234 schrieb:

    wenn länge der zeichenkette nicht durch 2 teilbar
    fehlermeldung ausgeben

    Warum sollte das ein Fehler sein?
    Ist "ARA" oder "UHU" kein Palindrom?

    Funktionen wie is_palindrom oder ispalindrom kann man durchaus finden.
    Auch hier im Forum.
    Verstehen sollte man sie aber.



  • DirkB schrieb:

    ]Warum ist das ein Fehler?

    Ist "ARA" oder "UHU" kein Palindrom?

    ja gute frage. wenn man es streichen kann, ist das doch gut. 😕


Anmelden zum Antworten