Könnt ihr mir bei folgender Aufgabe helfen??

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Könnt ihr mir bei folgender Aufgabe helfen??

    Hi Leute...
    Also wir haben heut folgende Aufgabe gestellt bekommen:

    Ein Palindrom ist ein Wort oder Satz, das bzw. der von vorn und von hinten gelesen den gleichen Wortlaut besitzt, z.B.:

    OTTO
    REITTIER
    LAGERREGAL
    RELIEFPFEILER
    EIN NEGER MIT GAZELLE ZAGT IM REGEN NIE
    NEUER DIENST MAG AMTSEID REUEN
    DIE LIEBE TOTE! BEILEID!

    Das Programm soll testen, ob eine eingegebene Zeichenkette ein Palindrom ist oder nicht!
    Beachten Sie, dass bei Sätzen keine Satzzeichen eingegeben werden dürfen und die Leerzeichen zwischen den Wörtern zu ignorieren sind!


    Hier ist der Code:

    #include <stdio.h>
    #include <conio.h>
    #include <iostream.h>
    #include <iomanip.h>
    #include <stdlib.h>
    #include <time.h>

    void main()
    {
    char text[201];
    unsigned int i, j;
    bool palindrom = true;

    cout << "Das Programm prüft, ob ein eingegebener Text ein Palindromist!"
    << endl;

    cout << "Bitte Text eingeben!" << endl;
    cin.getline(text, 200);
    for (i=0, j=strlen(text)-1;i<strlen(text);i++, j--)
    {
    while (text == ' ')
    i++;

    while (text[j] == ' ')
    j--;

    if (text[i] != text[j])
    {
    palindrom = false;
    break;
    }
    }

    if (palindrom == true)
    cout << " Text ist ein Palindrom!";
    else
    cout << " Text ist kein Palindrom!";

    getchar();
    }

    Meine Frage:
    Kann mir jemand genau erklären wie die FOR schleife arbeitet, also warum
    j=strlen(text)-1;i<strlen(text)
    und wie ist das zu verstehen??:
    while (text[i] == ' ')
    Außerdem bin ich der Meinung dass in diesem Lösungsbeispiel unötige Headerdatein eingebunden sind...
    Wäre über eure Hilfe sehr froh!
    Greetz fireyoutz
  • Hi fireyoutz,
    Ich habe dein Prog ein wenig überarbeitet und unnötige Sachen auskomentiert

    C-Quellcode

    1. //#include <stdio.h>
    2. //#include <conio.h>
    3. #include <iostream>
    4. //#include <iomanip.h>
    5. //#include <stdlib.h>
    6. //#include <time.h>
    7. using namespace std;
    8. int main()
    9. {
    10. char text[201];
    11. unsigned int i, j;
    12. bool palindrom = true;
    13. cout << "Das Programm prüft, ob ein eingegebener Text ein Palindromist!"
    14. << endl;
    15. cout << "Bitte Text eingeben!" << endl;
    16. cin.getline(text, 200);
    17. for (i=0, j=strlen(text)-1;i<(strlen(text)/2);i++, j--)
    18. {
    19. while (text[i] == ' ')
    20. i++;
    21. while (text[j] == ' ')
    22. j--;
    23. if (text[i] != text[j])
    24. {
    25. palindrom = false;
    26. break;
    27. }
    28. }
    29. if (palindrom == true)
    30. cout << "Text ist ein Palindrom!\n";
    31. else
    32. cout << "Text ist kein Palindrom!\n";
    33. //getchar();
    34. }
    Alles anzeigen


    Die MAIN Methode muss INT zurück liefern.
    Die WHILE Schleifen sind dazu da, um die eventuelen Leerstellen aus dem String rauszufiltern
    Außerdem habe ich die FOR schleife ein bischen veränert (i<(strlen(text)/2)),
    da es schon reichen würde wen die Zeichen kette nur bis zur Hälfte durchlaufen wird (verkürzt die Laufzeit ;) )
    P.S. uüber die Arbeitsweise einer FOR Schleife kannst du z.b hier nachlesen:
    ht*p://tutorial.schornboeck.net/schleifen.htm
  • Ok schonmal Vielen Dank! Sieht man mal des der ObercodingLehrer es schlechter drauf hat wie ihr... :D
    Die arbeitsweise einer FOR Schleife ist mir NATÜRLICH schon bekannt :)
    Aber mir ist hier net klar was des mit den Stringlängen auf sich hat.
    Kannst mir vielleicht die genaue abarbeitung noch beschreiben?? Also z.b. wenn ich OTTO eingebe...
    Nochmal BIG THX!!!
  • Nun, i und j als Zaehler fuer deine Schleifenfuehrung benoetigen einen Start- und natuerlich auch eine Abbruchbedingung. In deinem Beispiel wird i dem ersten Element (Zeichen) deines Strings zugeordnet (Element text[0]), und j auf das Ende des Strings gesetzt. Die Laenge, also das Ende des Strings, wird ermittelt durch die Funktion strlen(), welche die Laenge eines Strings als Integerwert liefert. Wir muessen noch 1 abziehen, damit j nicht hinter dem String ansetzt (denk dran, das erste Zeichen der Zeichenkette ist das Element text[0], wir fangen also bei 0 an zu zaehlen). Wuerden wir die 1 nicht abziehen, wuerde j den String-Terminator ansprechen und nicht das letzte Zeichen des Strings.
    Abbruchbedingung fuer die Schleifenfuehrung ist: i<(strlen(text)/2) --> (hier koennte noch kuerzer stehen: i<j), d.h. sobald i die Haelfte des Strings erreicht hat, bricht die Schleife ab.
    i und j werden nach jedem Schleifendurchlauf hoch-, bzw. runtergezaehlt (und treffen sich irgendwann in der Mitte des Strings!)

    Beispiel OTTO:
    text[0] = O
    text[1] = T
    text[2] = T
    text[3] = O
    text[4] = String Terminator (ASCII 0)

    i=0, also text = 'O'
    strlen(text) liefert 4 (text ist ja auch 4 Zeichen lang)
    es muss also 1 abgezogen werden, damit j auf Element [3] landet.
    text[j] = 'O'
    -------------------------------------
    while (text[i] == ' ')
    i++;

    while (text[j] == ' ')
    j--;

    damit werden Leerzeichen einfach uebersprungen, das heisst i oder j hoch- u. runtergezaehlt
    ----------------------------------------
    die iomanip.h und die time.h kannst du in deinem Code rausschmeissen, dafuer fehlt die allerdings die string.h (fuer die strlen()-Funktion)

    hoffe, ich konnte helfen
  • Zuers eine kleine korrektur, bei der FOR Schleife fehlt was
    so wäre es korrekt: for (i=0, j=strlen(text)-1;i<=(strlen(text)/2);i++, j--)
    war mein fehler ;)

    Also.....
    Zuerst wird i auf 0 gesetzt und j auf die Länge von "text" - 1(in unserem Fall liefert uns strlen() also 4 zurück und -1 = 3)
    Warum das so sein muß? Weil unsere Zeichenkete in einem feld von typ char gespeichert wird
    und die indexierung bei einem Feld beginnt Typischerweise bei 0, also haben wir ein Feld dessen
    einzelne Elemente wir mit text[0] bis text[3] ansprechen können, insgesamt 4 Elemente,
    darum strlen(text)-1. Weiter folgt ein Abbruch Kriterium für die Schleife, die wird durchlaufen
    solange bis wir die Hälfte des Arrays erreicht haben. In jedem Schrit wird die Variable i um 1 vergrössert und j um 1 verkleinert. Jetzt gehen wir rein in die Schleife. Zuerst wird in der ersten
    WHILE schleifen geprüft ob text auf eine Leerstelle zeigt, das ist aber nicht der Fall da
    text[i] == text[0] und an der stelle steht die Buchstabe 'o' also wird direkt zu der nächsten Schleife
    übergegangen. Da prüfen wir ob text[j] auf eine Leerstelle zeigt. Das ist auch nicht der Fall weil
    text[j]==text[3] und an der stelle steht die Buchstabe 'o'. Dan kommt die IF anweisung wo geprüfft
    wird ob text[i] und text[j] ungleich sind, was auch nicht der Fall ist da die beiden auf die
    Buchstabe 'o' zeigen. Danach geht die Schleife von vorne los blos mit anderen werten für j und i.
    text[j] zeigt jetzt also auf die 3. Stelle in unserem Feld (text[2]) und text[i] zegt auf die Stelle 2 (text[1]). Und so geht es weiter bis unsere Abbruchkriterium erreicht ist. :)
    Ich hofe dass das was ich da geschrieben habe einigermasen verständlich war :)
    Sorry für mein Deutsch, ist nicht meine Muttersprache.