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

Lekcja 28 Zadanie domowe.

Ostatnio zmodyfikowano 2014-07-04 17:09
Autor Wiadomość
Haryen
Temat założony przez niniejszego użytkownika
Lekcja 28 Zadanie domowe.
» 2014-07-03 22:06:24
Cześć! Wykonałem zadanie domowe z lekcji 28.
C/C++
//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 [b] oraz [/b].
//Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran.
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst )
{
    std::string sWynik;
    sTekst.erase( 23, 7 );
    sTekst.erase( 29, 4 );
    sTekst.erase( 0, 3 );
    sTekst.insert( 0, "[b]" );
    sTekst.erase( 11, 4 );
    sTekst.insert( 11, "[/b]" );
    sWynik = sTekst;
    return sWynik;
}
int main()
{
    std::string tekst = "<b>to jest </b> testowy        napis     :)";
    std::cout << konwertuj( tekst ) << std::endl;
    return 0;
}

Ma ono tak wyglądać? To była krótka linijka, ale jakbym miał zrobić to samo na jakimś długim tekście to byłoby to bez sensu. Trzeba to zrobić inaczej?
P-113237
pekfos
» 2014-07-03 22:07:15
Trzeba inaczej.
P-113240
Haryen
Temat założony przez niniejszego użytkownika
» 2014-07-03 22:10:00
To znaczy jak? Mam wyszukać pozycję, gdzie znajdują się znaki do usunięcia i wtedy je usuwać?
P-113241
pekfos
» 2014-07-03 22:13:58
Znajdować frazy przez np find() i je usuwać/zastępować. "Napisz program, który z podanego łańcucha znaków usunie [..]". Nie masz prawa zakładać, że podany łańcuch jest dokładnie taki jak w zadaniu. Masz napisać funkcję, która wykona zadanie dla dowolnego podanego łańcucha.
P-113243
Haryen
Temat założony przez niniejszego użytkownika
» 2014-07-03 22:21:05
W większych projektach może nie, ale tu w zadaniu jest jasne powiedziane co mam zastąpić/usunąć. :P No ale ok, wykonam tak jak trzeba.

Zrobiłem tak:
C/C++
#include <iostream>
#include <string>


void B1( std::string & sTekst, std::string fraza )
{
    size_t pozycjaB1 = sTekst.find( fraza );
    std::string noweB1 = "[b]";
    sTekst.erase( pozycjaB1, fraza.size() );
    sTekst.insert( pozycjaB1, noweB1 );
}

void B2( std::string & sTekst, std::string fraza )
{
    size_t pozycjaB2 = sTekst.find( fraza );
    std::string noweB2 = "[/b]";
    sTekst.erase( pozycjaB2, fraza.size() );
    sTekst.insert( pozycjaB2, noweB2 );
}

void spacje( std::string & sTekst, std::string fraza )
{
    size_t pozycjaSpacji;
    do
    {
        pozycjaSpacji = sTekst.find( fraza ); //Szuka pozycji spacji
        if( pozycjaSpacji + 1 == std::string::npos ) //Jeśli na kolejnej pozycji od wynalezionej spacji NIE znajduje się spacja to szukamy kolejnej pozycji
             continue;
        else
             sTekst.erase( pozycjaSpacji, 1 ); //Jeśli się znajduje to usuwamy ją
       
    } while( pozycjaSpacji != std::string::npos );
   
}

std::string konwertuj( std::string & sTekst )
{
    std::string sWynik;
    B1( sTekst, "<b>" );
    B2( sTekst, "</b>" );
    spacje( sTekst, " " );
    sWynik = sTekst;
    return sWynik;
}

int main()
{
    std::string tekst = "<b>to jest </b> testowy        napis     :)";
    std::cout << konwertuj( tekst ) << std::endl;
    return 0;
}


Ale program crashuje się, a winowajcą jest funkcja spacje. Nie wiem co jest nie tak.
P-113245
pekfos
» 2014-07-04 16:56:53
C/C++
if( pozycjaSpacji + 1 == std::string::npos ) //Jeśli na kolejnej pozycji od wynalezionej spacji NIE znajduje się spacja to szukamy kolejnej pozycji
To tak nie działa. Nie sprawdzasz też, czy do erase() nie podajesz npos.
P-113281
Haryen
Temat założony przez niniejszego użytkownika
» 2014-07-04 17:09:12
Ok, już działa. Nie wiedziałem jak wyszukiwać kilka spacji obok siebie, ale sprawdziłem w czyimś rozwiązaniu.

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


void B1( std::string & sTekst, std::string fraza )
{
    size_t pozycjaB1 = sTekst.find( fraza );
    std::string noweB1 = "[b]";
    sTekst.erase( pozycjaB1, fraza.size() );
    sTekst.insert( pozycjaB1, noweB1 );
}

void B2( std::string & sTekst, std::string fraza )
{
    size_t pozycjaB2 = sTekst.find( fraza );
    std::string noweB2 = "[/b]";
    sTekst.erase( pozycjaB2, fraza.size() );
    sTekst.insert( pozycjaB2, noweB2 );
}

void spacje( std::string & sTekst, std::string fraza )
{
    size_t pozycjaSpacji;
    do
    {
        pozycjaSpacji = sTekst.find( fraza );
        if( pozycjaSpacji != std::string::npos )
        {
            sTekst.erase( pozycjaSpacji, 1 );
        }
       
    } while( pozycjaSpacji != std::string::npos );
   
}

std::string konwertuj( std::string & sTekst )
{
    std::string sWynik;
    B1( sTekst, "<b>" );
    B2( sTekst, "</b>" );
    spacje( sTekst, "  " );
    sWynik = sTekst;
    return sWynik;
}

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