Problem mit Präfix/Postfix In/Dekrementierungen



  • Hab ein Programm geschrieben, das erkennt, ob ein Palindrom eingegeben wurde.
    Ich poste hier mal den gesamten Quellcode, beziehe mich aber nur auf ein paar Zeilen. 🙂

    (Und erstmal danke an dieser Stelle für die Hilfe bei den ganzen anderen Problemen, die ich schon hatte! War mir echt eine Hilfe! 😋 )

    Hier der Code:

    #include <iostream>
    #include <string.h>                                                             // strcmp
    
    using namespace std;
    
    int main()
    {
    
      int i, k;
      char c, op = 0;  
    
      while (op != 'n')
      {
        char wort[30] = {0};
        char umkehr[30] = {0};
    
        cout << "Bitte geben Sie ein Wort ein:  ";
    
        /* Eingabe des Wortes in wort-Array */
        i = 0;
    
        while ((wort[i] = cin.get()) != '\n')                                       // Wort in Array eingeben
          i++;
    
        wort[i] = '\0';                                                             // String-Ende markieren
    
        /* Ersetzen aller Großbuchstaben durch Kleinbuchstaben */ 
    
        for(i = 0; wort[i] != '\0'; ++i)
           if ((int(wort[i]) > 64) && (int(wort[i]) < 91))                          // Buchstabe groß?
           wort[i] = char (wort[i] + 'a' -'A');                                     // --> Ersetzen durch kleinen Buchstaben
    
        /* Kopie des Wortes in umgekehrter Reihenfolge */
    
        for (i = 0; wort[i] != '\0'; ++i);                                          // Abtastung des Arrays bis Wortende inkl '/0'
        --i;                                                                        // '/0' ausschließen
    
        for (k = 0; i >= 0; ++k, --i )                                              // Kopie des Wortes in umgekehrter Reihenfolge
           umkehr[k] = wort [i];
    
        umkehr[k] = '\0';                                                           // Setzen von '/0' als Ende des Strings
    
        /* Vergleich der Strings */
        if(strcmp(wort, umkehr) == 0)
                        cout << "\nEs handelt sich um ein Palindrom.\n\n\n";
        else 
                        cout << "\nDas eingegebene Wort ist kein Palindrom\n\n\n";
    
        cout << "Erneute Eingabe? (j/n)  ";
        cin  >> op;
        cout << "\n\n";
    
        while(cin.get() != '\n');                                                   // Puffer leeren
      }
    
      cout << "Vielen Dank!\n\n";
      system("pause");
      return 0;
    
    }
    

    Zu meinem Problem:

    1. In den ganzen for-Schleifen in den Zeilen 32, 38 und 41 hatte ich mich vorher jeweils ohne bestimmten Grund für Postfix In- und Dekrement entschieden,
    da ich dachte, dass die Stellung nur bei mehreren Anweisungen bzw. Operationen nötig ist. Das Programm lief demnach fehlerhaft. Wird die Postfix-In/Dekrementierung am Ende der for-Schleife denn dann garnicht ausgeführt?
    Mit Präfix lief's dann natürlich...

    2. Wenn ich den Befehl zum Leeren des Puffers aus Zeile 56 in Zeile 27 verfrachte, wird ein zusätzliches Enter erwartet, um fortzufahren. Ich dachte, dass damit das Enter nach dem Ende der Eingabe nach Verarbeitung gelöscht würde?
    Wenn ich den Befehl ganz weglasse, funktioniert es natürlich garnicht mehr...

    Vielen Dank im Voraus für eure Hilfe! 🙂



  • Normalerweise spielt es in der for Schleife keine Rolle.
    Aber mach dir mal noch ein wenig Gedanken über den Algo.

    http://www.spieleprogrammierer.de/contest/02/

    Hier eine kleine Motivation dein Code zu kürzen. 😉



  • Danke für den Link!
    Die meisten Codes verstehe ich leider nicht :((
    Brauche ich dazu denn schon Kenntnisse über Funktionen und Klassen?
    Das ist nämlich erst das nächste Kapitel von meinem Buch ^^
    bin erst bei Arrays.

    Also mit dem Präfix-Operatoren hatte ich wie gesagt Fehler... seltsam.
    Und weißt du was zu dem Pufferproblem? 🙂

    lG
    Tonikum



  • achja was mir auch noch aufgefallen ist,das hier:

    #include <string.h>
    

    ist veraltet und es sollte so heißen

    #include <string>
    

    und wenn du schonmal dabei bist string zu includieren, dann nutze auch gleich die std::strings, die sind nämlich wesentlich leichter zu handhaben 😉



  • Firefighter schrieb:

    achja was mir auch noch aufgefallen ist,das hier:

    #include <string.h>
    

    ist veraltet und es sollte so heißen

    #include <string>
    

    Die Header string.h und string sind doch zwei völlig unterschiedliche paar Schuhe. Wenn schon, sollte es heutzutage <cstring> heissen. Denn <string> nutzt ihm nichts, wenn er strcmp und Konsorten benutzt 😉



  • ohh mein Fehler, zu schnell gelesen, danke LordJaxom



  • Danke für die ganzen Anregungen! 🙂

    std::strings oder sowas kenne ich noch nicht...
    stecke doch noch in den Kinderschuhen meiner steilen Programmierkarriere 😃



  • http://www.cplusplus.com/reference/string/string/string.html

    guck mal hier nach, strings sind wesentlich dynamischer als char arrays.
    oder google doch einfach mal nach "C++ Strings"



  • Also ich verstehe deine Probleme nicht ganz. Probier die bitte doch mal ein wenig konkreter zu definieren. Und vor allem einzugrenzen. Hast du den Debugger schon benutzt? - Das ist des Programmiers liebster Freund und er sollte auch deiner werden. 😉



  • Okay 🙂

    Was ist ein Debugger? ^^
    Ich benutze Dev-C++, das zeigt mir immer an, wenn an der Syntax was nich stimmt o.ä. Meinst du das? *schäm*

    Zu meinen Sorgenkindern:
    1. Gibt es in der Endanweisung einer for-Schleife, die nur aus einer In/Dekrementierung besteht, einen logischen Unterschied zwischen Post und Präfix In/Dekrementierung? Und wenn ja, welchen?
    Mein Programm lief wie gesagt erst nachdem ich mich für die Präfix-VAriante entschieden hab, fehlerfrei.

    2. Warum wird, wenn ich die Anweisung zur Leerung des Puffers, an Zeile 27 setze, ein zusätzliches Enter erwartet und in Zeile 56 nicht?

    Dankeschön! 🙂



  • Nein, das ist Syntax Higlighting. 😉

    Hier gibt es eine Einführung.
    http://www.nds.rub.de/lehre/vorlesungen/programmiersprachen/EinfuehrungDevC.html
    Afaik ist der Dev C++ veraltet und du solltest besser auf einen aktuellen Compiler umsteigen. (VC++ z.B)

    1). So, wie du die benutz nein. Aber Man kann natürlich spezielle Gerüste bauen, die dann ev. doch Probleme geben können.

    for ( int i = 0; i != 5; )
    	{
    		std::cout  << wort[i++];
    	}
    

    bedeutet was anderes, als

    for ( int i = 0; i != 5; )
    	{
    		std::cout  << wort[++i];
    	}
    
    1. Zeig mal, WO du den genau einfügst.

Anmelden zum Antworten