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

3.28 Usuwanie spacji

Ostatnio zmodyfikowano 2019-01-01 23:00
Autor Wiadomość
rottingham
Temat założony przez niniejszego użytkownika
» 2018-12-10 03:13:09
@YooSy Super! Dzięki za pomoc :)

Kod zdaje się działać i tym razem chyba nawet spełnia swoją funkcję :D

Co można ewentualnie zrobić lepiej czy widzicie jakieś niedociągnięcia?

C/C++
void modyfikujemy( string & tekst )
{
    string a = " ";
    size_t czySpacja = tekst.find( " " );
    if(( tekst[ czySpacja ] == a[ 0 ] ) &&( tekst[ czySpacja + 1 ] == a[ 0 ] ) )
    do
    {
        tekst.erase( czySpacja, 1 );
        tekst.find( " ", czySpacja + 1 );
    } while( tekst[ czySpacja + 1 ] == a[ 0 ] );
   
    do
    {
        if(( tekst[ czySpacja ] == a[ 0 ] ) &&( tekst[ czySpacja + 1 ] == a[ 0 ] ) )
        do
        {
            tekst.erase( czySpacja, 1 );
            tekst.find( " ", czySpacja + 1 );
        } while( tekst[ czySpacja + 1 ] == a[ 0 ] );
       
        cout << czySpacja << endl;
        czySpacja = tekst.find( " ", czySpacja + 1 );
       
    } while( czySpacja != string::npos );
   
}
P-173181
pekfos
» 2018-12-10 10:40:18
Masz niepotrzebnie powielony kod.
Zamiast szukać jednej spacji i sprawdzać, czy po niej występuje druga, możesz po prostu szukać dwóch spacji. Albo: pójdź krok dalej i usuwaj więcej niż jeden znak naraz. Taki algorytm oparty o erase jest bardzo nieefektywny, możesz go trochę przyspieszyć jeśli nie będziesz usuwać po jednym znaku. To nie jest duża modyfikacja względem kodu, który masz teraz.
P-173182
rottingham
Temat założony przez niniejszego użytkownika
» 2018-12-10 22:55:54
Hmm... Wyszedł mi taki kod (mam nadzieję, że dobrze załapałem Twoje wskazówki). Czy chodziło o taką optymalizację kodu?

C/C++
void modyfikujemy( string & tekst )
{
    string a = " ";
    size_t czySpacja = tekst.find( "  " );
    size_t czySpacja2 = tekst.rfind( "  " );
   
    do
    {
        if( tekst[ czySpacja ] )
        do
        {
            tekst.erase( czySpacja, 1 );
            tekst.find( "  ", czySpacja + 1 );
        } while( tekst[ czySpacja + 1 ] == a[ 0 ] );
       
        if( tekst[ czySpacja2 ] )
        do
        {
            tekst.erase( czySpacja2, 1 );
            tekst.rfind( "  ", czySpacja2 - 1 );
        } while( tekst[ czySpacja2 ] == a[ 0 ] );
       
        czySpacja = tekst.find( "  ", czySpacja + 1 );
        czySpacja2 = tekst.rfind( "  ", czySpacja2 - 1 );
    } while(( czySpacja != string::npos ) &&( czySpacja2 != string::npos ) );
   
}
P-173189
pekfos
» 2018-12-10 23:06:40
Nie o to chodziło.
P-173190
rottingham
Temat założony przez niniejszego użytkownika
» 2018-12-11 14:07:35
Hm... Czy do usuwania więcej niż jednego znaku na raz potrzebna mi jest metoda size?


EDIT.
Czy w poprzednim kodzie popełniłem błąd bo mimo, że szukałem dwóch spacji (łańcucha znaków) to użyłem tej metody w sposób, który służy do wyszukiwania pojedynczego znaku?
P-173193
pekfos
» 2018-12-11 17:12:18
Czy w poprzednim kodzie popełniłem błąd bo mimo, że szukałem dwóch spacji (łańcucha znaków) to użyłem tej metody w sposób, który służy do wyszukiwania pojedynczego znaku?
Masz na myśli drugi argument find()? Nie wiem czy dokładnie o to pytasz, ale tak, jest tam błąd. Jak szukasz tekstu "  " i usuniesz tam jeden znak, to nie możesz zrobić czySpacja + 1 w find(), bo pomijasz wtedy ten drugi znak spacji ze znalezionych dwóch. Jeśli będziesz mieć 3 spacje, to zostawisz wtedy dwie obok siebie. Generalnie kod jest bez sensu. Bez sensu używasz dwóch rodzajów wyszukiwania i bez sensu są te 2 pętle w środku trzeciej. Jeśli masz więcej niż jedną pętlę, robisz zadanie źle. Chyba, że próbujesz robić coś innego niż find-erase.

Hm... Czy do usuwania więcej niż jednego znaku na raz potrzebna mi jest metoda size?
Da się bez niej. Najlepiej zdecyduj się, co chcesz zrobić: czy po prostu zrobić zadanie (do tego wystarczy poprawnie użyć find() i erase()), czy robić lepszą wersję którą zasugerowałem. Bo wiesz.. jak chcesz robić dobrze, to najlepsze rozwiązanie nie używa erase() w ogóle ;)
P-173194
rottingham
Temat założony przez niniejszego użytkownika
» 2018-12-12 01:17:04
Posłuchałem Twojej rady i zrobiłem kod wyszukujący dwie spacje:

C/C++
void modyfikujemy( string & tekst )
{
    string szukanyZnak = "  ";
   
   
    size_t czySpacja = tekst.find( szukanyZnak );
    do
    {
        if( tekst[ czySpacja ] )
        do
        {
            tekst.erase( czySpacja, 1 );
        } while( tekst[ czySpacja ] == tekst[ czySpacja + 1 ] );
       
        cout << czySpacja << endl;
        czySpacja = tekst.find( szukanyZnak, czySpacja + szukanyZnak.size() );
       
    } while( czySpacja != string::npos );
   
}

I właśnie jeszcze próbuję napisać ten efektywniejszy kod (usuwający więcej niż jeden znak jednocześnie), o którym wspominałeś. Nie mam pojęcia w jaki sposób on ma usuwać więcej niż jeden znak jednocześnie. Więc pomyślałem, że trzeba skorzystać z dwóch rodzajów metody find... A jeżeli nie... Czy mógłbyś dać ewentualnie jakąś wskazówkę? Kombinowałem do tej pory ze stworzeniem nowej zmiennej i tablicą oraz z użyciem metody size. Na razie to nic mi nie dało...

Tak z ciekawości: czy kod, który w ogóle nie używa erase powinienem umieć napisać będąc na 28 rozdziale? A jeżeli tak, to czy chodzi o wykorzystanie metody insert?

P-173219
jankowalski25
» 2018-12-12 05:08:31
"[początek][usuń mnie][zostaw][skasuj][koniec]"
           ^          ^
"[początek][zostaw]ie][zostaw][skasuj][koniec]"
                   ^          ^
"[początek][zostaw]ie][zostaw][skasuj][koniec]"
                   ^                  ^
"[początek][zostaw][koniec]aw][skasuj][koniec]"
                           ^                  ^
"[początek][zostaw][koniec]"
Daszki oznaczają indeksy: jeden informuje o tym, skąd odczytać dane (wystarczy pomijać to, co ma być skasowane), a drugi wskazuje, gdzie je zapisać.
P-173220
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona