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
3.28 Usuwanie spacji
» 2018-12-06 16:21:06
No dzień dobry!

Ogółem to męczę się z napisaniem funkcji, która usuwałaby powielające się spacje. Napisałem do tej pory dziwny twór i w związku z tym, że jeszcze nie działa on do końca poprawnie (ale już coś tam działa) kłaniam się z prośbą, a w zasadzie to dwiema

1. Czy idę dobrym tokiem?
2. Jeżeli nie to proszę o drogowskaz na dobrą ścieżkę.

Howgh!

C/C++
void modyfikujemy( string & tekst )
{
    int t[ 6 ];
    size_t czySpacja;
    t[ 0 ] = czySpacja = tekst.find( " " );
   
    int i = 1;
    do
    {
        cout << czySpacja << endl;
        t[ i ] = czySpacja = tekst.find( " ", czySpacja + 1 );
        i++;
    } while( czySpacja != string::npos );
   
   
    for( int i = 0; i < 6; i++ )
    {
        cout << t[ i ] << endl;
        if(( t[ i ] + 1 ) == t[ i + 1 ] )
             tekst.erase( t[ i ], 1 );
       
    }
}
P-173121
rafallauterbach
» 2018-12-06 17:03:01
C/C++
void jedna_spacja( string & tekst ) {
    for( int i = 0; i < tekst.length() - 1; i++ )
    {
        if( tekst[ i ] == ' ' )
        while( tekst[ i + 1 ] == ' ' )
             tekst.erease( i + 1 );
       
    }
}

Piszę z telefonu i tu może coś nie działać, ale wydaje mi się że Twój przykład zbyt skomplikowałeś.


Poczytaj o string.erease() i string.length() i jeśli coś nie działa to napraw w ramach zadania. Dobrym sposobem na wiedzę jest szukanie sobie dokumentacji, np dokumentacja string i masz tam wszystko co można z nim zrobić.  Myślałem żeby specjalnie coś zepsuć ale nie wiedziałem co ;p Możesz np znaleźć sposób żeby usunąć wszystkie znaki z rzędu naraz po przeczytaniu referencji string zamiast usuwania po jednym (jak u mnie)
P-173123
pekfos
» 2018-12-06 19:22:16
rafallauterbach: Cieszę się, że jesteś w stanie z głowy napisać jedno z naiwnych rozwiązań tego zadania, ale dawanie gotowego kodu to najmniej efektywny sposób niesienia pomocy na początku nauki programowania.

Czy idę dobrym tokiem?
Po co ci ta tablica t? Nie wiesz, ile jest spacji w tekście i dość prawdopodobne że będzie to więcej niż 6.
P-173131
rafallauterbach
» 2018-12-06 23:38:21
Samo rozwiązanie mogło być krótsze i efektywniejsze, ale takie było łatwo zrozumiałe.
No a z tym najgorszym sposobem... Pewnie zależy.
P-173146
rottingham
Temat założony przez niniejszego użytkownika
» 2018-12-06 23:51:33
@rafallauterbach dzięki za pomoc! Co prawda nie patrzyłem jeszcze na gotowca, którego mi dałeś, ale rada odnośnie dokumentacji była pomocna, bo naprowadziło mnie to na rozwiązanie

@pekfos - ok. Zakładając, że zrobię tablicę o ilości elementów więcej niż 6. Np. 10 000. Czy sam kierunek był dobry?

Obecnie zmieniłem tok myślenia i napisałem takie rozwiązanie:

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

Rozwiązanie zdaje się działać. Czy ono jest waszym zdaniem poprawne, czy ma jakieś luki?
P-173147
pekfos
» 2018-12-07 00:05:51
Rozwiązanie zdaje się działać.
Nie działa dla parzystej ilości spacji pod rząd.

Zakładając, że zrobię tablicę o ilości elementów więcej niż 6. Np. 10 000. Czy sam kierunek był dobry?
Nie. Zwiększenie rozmiaru tablicy nie naprawia problemu jej przepełnienia.
P-173148
rottingham
Temat założony przez niniejszego użytkownika
» 2018-12-07 00:22:46
No dobra...

Więc wracam na inną drogę.

Próbuję zrobić warunek korzystając z porównania i operacji logicznych, więc wklepuję:

if(( czySpacja == " " ) &&( czySpacja + 1 == " " ) )


Otrzymuję wówczas od kompilatora komunikat:
|13|warning: comparison with string literal results in unspecified behaviour [-Waddress]|
|13|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]|
|13|warning: comparison with string literal results in unspecified behaviour [-Waddress]|
|13|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]|

No i teraz pytanie czy mogę mimo wszystko w jakiś sposób przeprowadzić te porównania?

Jeżeli to jest możliwe, to w którym kierunku iść aby to zrobić?
P-173149
YooSy
» 2018-12-07 00:43:14
czySpacja to liczba, a " " łańcuch znaków, więc nie da się ich porównać.
Gdy znajdziesz pozycję spacji użyj tej wartości jako indeks tablicy (Stringa).
P-173150
« 1 » 2 3 4
  Strona 1 z 4 Następna strona