Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Lekcja 28.] Zadanie domowe.- problem z warunkami w pętli

Ostatnio zmodyfikowano 2012-03-11 16:34
Autor Wiadomość
seth
Temat założony przez niniejszego użytkownika
[Lekcja 28.] Zadanie domowe.- problem z warunkami w pętli
» 2012-03-03 22:39:36
Być może to jakiś głupi błąd początkującego, ala sam nie jestem w stanie dojść do tego co jest nie tak...

Mając kod:
C/C++
std::string konwertuj( std::string & sTekst ) {
    std::string sWynik;
    size_t znalezionaPozycja1 = sTekst.find( "  " );
    size_t znalezionaPozycja2 = sTekst.find( "<b>" );
    size_t znalezionaPozycja3 = sTekst.find( "</b>" );
   
    do {
        if( znalezionaPozycja1 != std::string::npos ) {
            sWynik = sTekst.erase( znalezionaPozycja1, 1 );
            znalezionaPozycja1 = sWynik.find( "  ", znalezionaPozycja1 );
        }
       
        if( znalezionaPozycja2 != std::string::npos ) {
            sWynik = sWynik.erase( znalezionaPozycja2, 3 );
            sWynik = sWynik.insert( znalezionaPozycja2, "[b]" );
            znalezionaPozycja2 = sWynik.find( "<b>", znalezionaPozycja2 + 3 );
        }
       
        if( znalezionaPozycja3 != std::string::npos ) {
            sWynik = sWynik.erase( znalezionaPozycja3, 4 );
            sWynik = sWynik.insert( znalezionaPozycja3, "[/b]" );
            znalezionaPozycja3 = sWynik.find( "</b>", znalezionaPozycja3 + 4 );
        }
       
    } while(( znalezionaPozycja1 != std::string::npos ) &&( znalezionaPozycja2 != std::string::npos ) &&( znalezionaPozycja3 != std::string::npos ) );
   
    return sWynik;
}

Program powycina nadmiarowe spacje, jednak nie zastąpi znaczników.

Z kolei wprowadzając:
C/C++
while(( znalezionaPozycja1 != std::string::npos ) ||( znalezionaPozycja2 != std::string::npos ) ||( znalezionaPozycja3 != std::string::npos ) );


Zostaje wycięta tylko jedna nadmiarowa spacja, oraz podmieniane znacznimi.

Oczywiście wyniesienie poszczególnych if'ów do osobnych pętli daje pożadane efekty, jednak ciekawi mnie dlaczego ww. kod nie działa. Jeśli ktoś podpowie co zrobiłem nie tak, będę wdzięczny.
P-51893
GoldWolf
» 2012-03-07 13:27:48
Wrzuć cały program, bo tak to możemy z fusów wróżyć co się stało.
P-52165
GoldWolf
» 2012-03-07 13:27:48
Wrzuć cały program, bo tak to możemy z fusów wróżyć co się stało.
P-52166
GoldWolf
» 2012-03-07 13:27:52
Wrzuć cały program, bo tak to możemy z fusów wróżyć co się stało.

PS adekwatnie się to jakoś trubluje u Was ;-)
P-52167
seth
Temat założony przez niniejszego użytkownika
» 2012-03-08 21:52:58
Całość to tak na prawdę nie wiele więcej, a wygląda to tak:

C/C++
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst ) {
    std::string sWynik;
    size_t znalezionaPozycja1 = sTekst.find( "  " );
    size_t znalezionaPozycja2 = sTekst.find( "<b>" );
    size_t znalezionaPozycja3 = sTekst.find( "</b>" );
   
    do {
        if( znalezionaPozycja1 != std::string::npos ) {
            sWynik = sTekst.erase( znalezionaPozycja1, 1 );
            znalezionaPozycja1 = sWynik.find( "  ", znalezionaPozycja1 );
        }
       
        if( znalezionaPozycja2 != std::string::npos ) {
            sWynik = sWynik.erase( znalezionaPozycja2, 3 );
            sWynik = sWynik.insert( znalezionaPozycja2, "[b]" );
            znalezionaPozycja2 = sWynik.find( "<b>", znalezionaPozycja2 + 3 );
        }
       
        if( znalezionaPozycja3 != std::string::npos ) {
            sWynik = sWynik.erase( znalezionaPozycja3, 4 );
            sWynik = sWynik.insert( znalezionaPozycja3, "[/b]" );
            znalezionaPozycja3 = sWynik.find( "</b>", znalezionaPozycja3 + 4 );
        }
       
    } while(( znalezionaPozycja1 != std::string::npos ) &&( znalezionaPozycja2 != std::string::npos ) &&( znalezionaPozycja3 != std::string::npos ) );
   
    return sWynik;
}

int main() {
    std::string tekst = "<b>to jest </b> testowy        napis     :)";
    std::cout << tekst << std::endl;
    std::cout << konwertuj( tekst ) << std::endl;
   
    return 0;
}
P-52228
pekfos
» 2012-03-09 15:14:23
10 znaków w nazwie zmiennej to już chyba granica między opisowością nazwy a nieczytelnością kodu..
int LiczbaMajacaZaZadanieZliczanieIlosciWystapienZnacznikaBWeWczytanymSkrypcie = 0;
P-52277
seth
Temat założony przez niniejszego użytkownika
» 2012-03-11 16:34:38
Właściwie nazwy zmiennych były nazwami z poprzednich lekcji kursu :), ale fakt można były to nazwać trochę "przystępniej".

Jeśli chodzi o program już wiem co było nie tak - pomimo że, w programie występuje "0", oznacza ono pozycję wystąpienia szukanej frazy, a nie liczbę zliczającą ilość wystąpień. Tak więc w przypadku:
znalezionaPozycja2 = 0;

warunek
znalezionaPozycja2 != std::string::npos

Był spełniony.

Błąd był w pierwszym if'ie, gdzie operowałem na 2 zmiennych:
sWynik = sTekst.erase( znalezionaPozycja1, 1 );

Właściwie nie wiedzieć po co - zmienna "sWynik" tak na prawdę w ogóle nie jest potrzebna.

Dzięki za pomoc, zainteresowanie tematem, poprawiony kod w którym ładnie widać po kolei co się dzieje załączam poniżej, może komuś się przyda...
C/C++
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst ) {
   
    std::string fraza1 = "  ";
    std::string fraza2 = "<b>";
    std::string fraza3 = "</b>";
    size_t znalezionaPozycja1 = sTekst.find( fraza1 );
    size_t znalezionaPozycja2 = sTekst.find( fraza2 );
    size_t znalezionaPozycja3 = sTekst.find( fraza3 );
    int licznik = 1;
    std::cout << "Pozycja1 (przed petla): " << znalezionaPozycja1 << std::endl;
    std::cout << "Pozycja2 (przed petla): " << znalezionaPozycja2 << std::endl;
    std::cout << "Pozycja3 (przed petla): " << znalezionaPozycja3 << std::endl;
   
    do {
       
        std::cout << "\nPrzejscie petli: " << licznik << std::endl;
       
        if( znalezionaPozycja1 != std::string::npos ) {
            sTekst = sTekst.erase( znalezionaPozycja1, 1 );
            znalezionaPozycja1 = sTekst.find( fraza1, znalezionaPozycja1 );
            std::cout << "Pozycja1: " << znalezionaPozycja1 << std::endl;
        }
       
        if( znalezionaPozycja2 != std::string::npos ) {
            sTekst = sTekst.erase( znalezionaPozycja2, 3 );
            sTekst = sTekst.insert( znalezionaPozycja2, "[b]" );
            znalezionaPozycja2 = sTekst.find( fraza2, znalezionaPozycja2 + fraza2.size() );
            std::cout << "Pozycja2: " << znalezionaPozycja2 << std::endl;
        }
       
        if( znalezionaPozycja3 != std::string::npos ) {
            sTekst = sTekst.erase( znalezionaPozycja3, 4 );
            sTekst = sTekst.insert( znalezionaPozycja3, "[/b]" );
            znalezionaPozycja3 = sTekst.find( fraza3, znalezionaPozycja3 + fraza3.size() );
            std::cout << "Pozycja3: " << znalezionaPozycja3 << std::endl;
        }
       
        licznik++;
        std::cout << sTekst;
        std::cout << std::endl;
       
    } while(( znalezionaPozycja1 != std::string::npos ) ||( znalezionaPozycja2 != std::string::npos ) ||( znalezionaPozycja3 != std::string::npos ) );
   
    return sTekst;
}

int main() {
    std::string tekst = "<b>to jest </b> testowy        napis     :)";
    std::cout << tekst << std::endl;
    std::cout << konwertuj( tekst ) << std::endl;
   
    return 0;
}
P-52432
« 1 »
  Strona 1 z 1