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

Poziom 3 Rozdział 28

Ostatnio zmodyfikowano 2015-08-06 11:45
Autor Wiadomość
Braile
Temat założony przez niniejszego użytkownika
Poziom 3 Rozdział 28
» 2015-08-03 19:50:37
Mam kolejny problem. Nie jestem w stanie wymyślić innego algorytmu niż ten, który zapisałem jednak nie działa on poprawnie tj. nie wykonuje zadania: "Napisz program, który z podanego łańcucha znaków usunie powtarzające się spacje występujące obok siebie i zastąpi znaczniki <b> oraz </b> znacznikami oraz . Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran. Przykładowy fragment aplikacji, który możesz wykorzystać:"
C/C++
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst )
{
    std::string sWynik;
    //TODO: tu należy napisać kod realizujący zadanie
    return sWynik;
}
int main()
{
    std::string tekst = "<b>to jest </b> testowy        napis     :)";
    std::cout << konwertuj( tekst ) << std::endl;
    return 0;
}

Moja funkcja wygląda następująco:
C/C++
string konwertuj( string & tekst )
{
    string sWynik;
    size_t znalezionepogrubienie = tekst.find( '<' );
    size_t znalezionepogrubienie2 = tekst.find( '>' );
    size_t znalezionaspacja = tekst.find( "  " );
   
    if( znalezionepogrubienie != string::npos )
    {
        sWynik = tekst.erase( znalezionepogrubienie, 1 );
        sWynik = tekst.insert( znalezionepogrubienie, "[" );
    }
    if( znalezionepogrubienie2 != string::npos )
    {
        sWynik = tekst.insert( znalezionepogrubienie2, "]" );
        sWynik = tekst.erase( znalezionepogrubienie2, 1 );
    }
    if( znalezionaspacja != string::npos )
    {
        sWynik = tekst.erase( znalezionaspacja, 1 );
    }
   
    return sWynik;
}

Jeszcze mam takie pytanie niezwiązane z zadaniem. Czy jest jakiś sposób aby nauczyć się rozwiązywać/wymyślać poprawne algorytmy ? Mój problem często polega na tym, że nie potrafię wymyślić kroków, które powinienem zrobić aby dany program działał. Składnie, definicje itp. mam opanowane jednak, gdy dojdzie do wymyślenia poprawnego algorytmu to staje w miejscu, drapie się po głowie i nie jestem w stanie przelać tego na "papier".
P-135654
JMII89
» 2015-08-03 20:08:36
Zrobiłeś to tylko dla pierwszego <b> a drugie ? Pozatym ta funkcja jest zła.
P-135655
pekfos
» 2015-08-03 20:51:33
Czy jest jakiś sposób aby nauczyć się rozwiązywać/wymyślać poprawne algorytmy ?
Myśleć. Jeśli uważasz, że stosowałeś się do tego, to popatrz na swój program.
i zastąpi znaczniki <b> oraz </b> znacznikami [b] oraz [/b].
C/C++
size_t znalezionepogrubienie = tekst.find( '<' );
size_t znalezionepogrubienie2 = tekst.find( '>' );
Szukasz nawiasów samych w sobie, a nie znaczników. Te mogą występować w dowolnym sensie, a nie jako <b>.
znaczniki
To jest liczba mnoga..? Więc jakaś pętla powinna być, no nie? Dopóki znajdujesz znacznik - zamieniaj. Na taki algorytm chyba łatwo wpaść.

gdy dojdzie do wymyślenia poprawnego algorytmu to staje w miejscu, drapie się po głowie
A wystarczy myśleć, a nie drapać się po głowie.
P-135659
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-03 21:53:27
Już po prostu nie wiem. Być może nie jest dzisiaj mój dzień i nie myślę tak jak powinienem. Do tej pory wszystkie zadania domowe wyłączając losowanie bez powtórzeń, w którym potrzebowałem naprowadzenia na fakt, że losujemy indeksy tablicy (mniejsza z tym), wykonywałem z palcem w nosie, a tutaj jak się zatrzymałem tak stoję i mój postęp nie idzie dalej.
Zmodyfikowałem funkcję, która w ogóle nie działa (coś złego dzieje się z pętlą), a wygląda ona tak:
C/C++
string konwertuj( string & tekst )
{
    string sWynik;
    size_t znalezionyznacznik = tekst.find( "<b>" );
    size_t znalezionyznacznik2 = tekst.find( "<\b>" );
    // size_t znalezionaspacja = tekst.find("  ");
   
    do
    {
        sWynik = tekst.erase( znalezionyznacznik, 3 );
        sWynik = tekst.insert( znalezionyznacznik, "[b]" );
    }
    while( znalezionyznacznik != string::npos );
   
    do
    {
        sWynik = tekst.erase( znalezionyznacznik2, 4 );
        sWynik = tekst.insert( znalezionyznacznik2, "[\b]" );
    }
    while( znalezionyznacznik2 != string::npos );
   
    return sWynik;
}
P-135660
pekfos
» 2015-08-03 22:17:42
C/C++
do
{
    sWynik = tekst.erase( znalezionyznacznik, 3 );
    sWynik = tekst.insert( znalezionyznacznik, "[b]" );
}
while( znalezionyznacznik != string::npos );

Jakie ta pętla ma szanse na zmodyfikowanie znalezionyznacznik..? Jeśli zacznie się kręcić, to w nieskończoność.
P-135661
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-03 22:21:37
Chyba odpocznę i wrócę ponownie jutro do "walki".
P-135662
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-04 15:18:18
Czy chodziło o coś takiego ?
C/C++
string konwertuj( string & tekst )
{
    string sWynik;
    size_t znalezionyznacznik = tekst.find( "<b>" );
    size_t znalezionyznacznik2 = tekst.find( "<\b>" );
    size_t znalezionaspacja = tekst.find( "  " );
    bool sprawdz1 = tekst.find( "<b>" );
    bool sprawdz2 = tekst.find( "<\b>" );
    bool sprawdz3 = tekst.find( "  " );
   
    do
    {
        sWynik = tekst.erase( znalezionyznacznik - 1, 1 );
        sWynik = tekst.insert( znalezionyznacznik, "[b]" );
    }
    while( sprawdz1 != 0 );
   
    do
    {
        sWynik = tekst.erase( znalezionyznacznik2 - 1, 1 );
        sWynik = tekst.insert( znalezionyznacznik2, "[\b]" );
    }
    while( sprawdz2 != 0 );
   
    do
    {
        sWynik = tekst.erase( znalezionaspacja - 1, 1 );
    }
    while( sprawdz3 != 0 );
   
    return sWynik;
}
P-135687
Braile
Temat założony przez niniejszego użytkownika
Poziom 3 Rozdział 30
» 2015-08-04 18:34:40
<< removed - nie na temat i niezgodnie z zasadami >>
P-135701
« 1 » 2 3
  Strona 1 z 3 Następna strona