C++ for-Schleife - Bedingung wird nicht übernommen



  • Ganz simple Lösung ohne Strings zusammenzukleben:

    void outputX (char *s)
    {
        int f;
        for (f=0;*s;s++)
        {
            if (*s == ' ') f = 1;
            putchar (f-- < 0 ? 'X' : *s);
        }
    }
    


  • Danke für die neuen Ansätze!

    Mir würde es aber allein für das Verständnis von Schleifen sehr helfen, den Fehler in meinem ursprünglichen Code zu finden.

    Wäre darüber sehr dankbar!



  • Stephan239 schrieb:

    Mir würde es aber allein für das Verständnis von Schleifen sehr helfen, den Fehler in meinem ursprünglichen Code zu finden.

    Das hat dir SeppJ doch schon in der ersten Antwort erklärt: deine Indizes liegen z.B. völlig daneben. Die dürfen sich normalerweise nur im Bereich 0 <= n < array.length bewegen.



  • Stephan239 schrieb:

    Danke für die neuen Ansätze!

    Mir würde es aber allein für das Verständnis von Schleifen sehr helfen, den Fehler in meinem ursprünglichen Code zu finden.

    Wäre darüber sehr dankbar!

    Den Fehler in der ersten Schleife hast du korrigiert. Die Antwort für die zweite Schleife hat dir out bereits gegeben.

    Wofür brauchst du überhaupt eine zweite Schleife?

    In der (korrigierten) ersten Schleife läufst du doch bereits über alle Buchstaben im String. Dein Algorithmus sollte doch ungefähr so funktionieren:

    Schau dir jeden Buchstaben beginnend beim ersten an. Falls der Buchstabe ein Leerzeichen war, dann ersetze jeden weiteren Buchstaben durch ein "X".



  • temi schrieb:

    Schau dir jeden Buchstaben beginnend beim ersten an. Falls der Buchstabe ein Leerzeichen war, dann ersetze jeden weiteren Buchstaben durch ein "X".

    Naja, das ist nicht ganz richtig.
    Dann wird "Das ist ein Text" zu "Das XXXXXXXXXXXX" 😞



  • Andromeda schrieb:

    temi schrieb:

    Schau dir jeden Buchstaben beginnend beim ersten an. Falls der Buchstabe ein Leerzeichen war, dann ersetze jeden weiteren Buchstaben durch ein "X".

    Naja, das ist nicht ganz richtig.
    Dann wird "Das ist ein Text" zu "Das XXXXXXXXXXXX" 😞

    Du hast vollkommen recht!

    Hier ist eine kleine Ergänzung erforderlich und es stellt sich außerdem die Frage was passieren soll, wenn zwei Leerzeichen aufeinander folgen.

    Eine Möglichkeit wäre es, sich zu merken, dass ein Leerzeichen aufgetreten ist und in diesem Fall zu prüfen, ob das folgende Zeichen ein Buchstabe ist. Alle weiteren Zeichen werden durch "X" ersetzt.



  • temi schrieb:

    Hier ist eine kleine Ergänzung erforderlich und es stellt sich außerdem die Frage was passieren soll, wenn zwei Leerzeichen aufeinander folgen.

    Das ist eine interessante Frage. Witzigerweise kommt meine Triviallösung damit klar (siehe vorherige Seite).

    Aus:

    "Das      ist eine     Beispieleingabe und mehr nicht!"
    

    wird:

    "Dxx      ixx exxx     Bxxxxxxxxxxxxxx uxx mxxx nxxxxx"
    

    🙂



  • Danke nochmal für die zahlreichen Antworten.

    Nach langem Herumprobieren bin ich nun auf folgende funktionierende Lösung gekommen:

    char A[81];
        int wortlaenge = -1;
        int wortanfang_i = 0;
    
        cout << "Geben Sie den Text ein: ";
        cin.getline(A, sizeof(A));
    
        for( int i = 0; i <= strlen(A); i++ ) {
            wortlaenge = wortlaenge + 1;
    
            if( A[i] == ' ' || A[i] == '\0' ) {
                wortanfang_i = i-wortlaenge;
    
                for( int j = wortanfang_i+1; j < i; j++ ) {
                    A[j] = 'X';  
                } 
            wortlaenge = -1;
            wortanfang_i = 0;
            } 
        }
    

    Statt dem ersetzen von 'X' könnte man das Programm jetzt Grossbuchstaben nach dem 1. Buchstaben in Kleinbuchstaben umwandeln (HALLO -> Hallo). (Damit das Programm auch mal Sinn ergeben würde :D)

    Danke an das Forum! 👍



  • Ich würde dem ganzen noch ein bisschen C++-Anstrich geben, d.h. std::string statt char-Array und iteratoren statt Zeiger.



  • Techel schrieb:

    Ich würde dem ganzen noch ein bisschen C++-Anstrich geben, d.h. std::string statt char-Array und iteratoren statt Zeiger.

    Man ist ja nerdish by nature. 😉



  • Bitte Bitte 🙂

    Mal ne andere Frage: Womit lernst du C++? Tutorial? Skript aus der Schule? Buch?
    Und welche Entwicklungsumgebung nutzt du?

    Ich habe genauso wie du angefangen, in meiner Ausbildung. Am Ende der Ausbildung musste ich feststellen, dass das alles Schrott war und hab dann mit C++ von vorne angefangen. Das passiert vielen Leuten - denn selbst die Profs haben oft keinen Plan - und bei dir scheint das auch der Fall zu sein. Machs lieber gleich richtig und verschwende keine Jahre ;). Außerdem macht korrektes C++ mehr Spaß und ist zudem noch einfacher.



  • out schrieb:

    Bitte Bitte 🙂

    Mal ne andere Frage: Womit lernst du C++? Tutorial? Skript aus der Schule? Buch?
    Und welche Entwicklungsumgebung nutzt du?

    Ich habe genauso wie du angefangen, in meiner Ausbildung. Am Ende der Ausbildung musste ich feststellen, dass das alles Schrott war und hab dann mit C++ von vorne angefangen. Das passiert vielen Leuten - denn selbst die Profs haben oft keinen Plan - und bei dir scheint das auch der Fall zu sein. Machs lieber gleich richtig und verschwende keine Jahre ;). Außerdem macht korrektes C++ mehr Spaß und ist zudem noch einfacher.

    Ich lerne C++ auf der Uni. Ist bei uns eher ein Nebenfach. Entwicklungsumgebung: wxDev-C++? Hab da keine Ahnung 😃

    Ich denke die von mir gepostet Lösung entspricht den Anforderungen des Professors, da wir ausschliesslich diese Codebausteine gelernt haben und im Skript stehen.

    Bei mir gehts auch eher nur drum den Prüfungsgegenstand zu schaffen, ich habe nich vor mich in Zukunft gezielt mit C++ zu beschäftigen.



  • Stephan239 schrieb:

    Bei mir gehts auch eher nur drum den Prüfungsgegenstand zu schaffen, ich habe nich vor mich in Zukunft gezielt mit C++ zu beschäftigen.

    Ok. Schreibste das das nächste Mal am besten dazu. Dann wissen wir, dass du Lösungen suchst, die dein Prof haben will bzw. in der Klausur sehen will. Unter Windows ist die Haupt-IDE Visual Studio, für den Selbstzweck ist es die Community Edition. VS ist aber ein Schwergewicht. Ansonsten ist CodeBlocks zu empfehlen. Bei beiden funktioniert das Debuggen gut. Debuggen spart dir ne Menge Zeit.



  • Stephan239 schrieb:

    Ich denke die von mir gepostet Lösung entspricht den Anforderungen des Professors[..]

    Sie entspricht jedenfalls mal nicht Deinem ersten Beispiel.



  • Wenn du schon nicht die anderen Hinweise umsetzt, dann ersetze wenigstens das <= bei

    i <= strlen(A);
    

    zu <

    Dann kann A[i] nicht '\0' werden.



  • Stephan239 schrieb:

    Bei beiden funktioniert das Debuggen gut. Debuggen spart dir ne Menge Zeit.

    Hä? "spart Zeit" im Vergleich zu was - im Vergleich zum buggy Releasen und warten auf den Bug report der User? Bezweifle ich mal.

    Fehlerfreies Entwickeln spart zeit.



  • Oops, Zitat war im obigen Post falsch zugeordnet. Richtige Zuordnung:

    out schrieb:

    Bei beiden funktioniert das Debuggen gut. Debuggen spart dir ne Menge Zeit.



  • zufallswert schrieb:

    Stephan239 schrieb:

    Bei beiden funktioniert das Debuggen gut. Debuggen spart dir ne Menge Zeit.

    Hä? "spart Zeit" im Vergleich zu was - im Vergleich zum buggy Releasen und warten auf den Bug report der User? Bezweifle ich mal.

    Fehlerfreies Entwickeln spart zeit.

    Manche verstehen ihren eigenen Code wohl erst, wenn sie ihn im Single-Step durchgehen und zugucken können, wie sich Variablen ändern und so ... 😃


Anmelden zum Antworten