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

[C++] Zapełnianie vectora

Ostatnio zmodyfikowano 2020-02-29 19:51
Autor Wiadomość
Biedrzyk
Temat założony przez niniejszego użytkownika
[C++] Zapełnianie vectora
» 2020-02-28 21:56:52
Witam, piszę pewien program w którym po podaniu liczby w postaci stringa, funkcja ma mi odcinać po kolei po trzy ostatnie liczby z owego stringa i wpisywać je do wektora. W przypadku liczb, których długość jest podzielna przez 3 nie ma problemu - jednak gdybym chciał np. wpisać liczbę 12345 345 zostanie wpisane natomiast 12 zostanie pominięte ze względu na przekroczenie liczby elementów w stringu, a kombinuję jak ma wyglądać warunek który umożliwiłby wpisanie właśnie tej 12-tki jako kolejny element wektora. W przypadku liczb jedno- i dwucyfrowych dam zwykłego ifa. Poniżej podaję moją funkcję:

C/C++
void zamienLiczbe( string liczba )
{
    vector < string > liczby;
    int dlugosc = liczba.length();
   
    if((( dlugosc ) % 3 ) == 0 )
    {
        do
        {
            string slowo = liczba.substr( dlugosc - 3, dlugosc );
            cout << "slowo " << slowo << endl;
            liczby.push_back( slowo );
            liczba.erase( dlugosc - 3, dlugosc );
            dlugosc -= 3;
        } while( dlugosc > 0 );
       
        for( int i = liczby.size() - 1; i >= 0; i-- )
        {
            cout << "vector 1 " << liczby[ i ] << endl;
        }
    }
   
    if(((( dlugosc ) % 3 ) == 1 ) ||(( dlugosc ) % 3 ) == 2 )
    {
        do
        {
            string slowo = liczba.substr( dlugosc - 3, dlugosc ); //zostawiam żeby mimo wszystko póki długość liczby jest podzielna przez 3 to żeby nadal odcinał
            cout << "slowoV " << slowo << endl;
            liczba.erase( dlugosc - 3 );
            dlugosc -= 3;
            liczby.push_back( slowo );
           
        } while( dlugosc > 0 );
       
        for( int i = liczby.size() - 1; i >= 0; i-- )
        {
            cout << "vector 2 " << liczby[ i ] << endl;
        }
    }
P-176300
pekfos
» 2020-02-28 22:15:27
Jeśli długość modulo 3 jest niezerowa, dodaj te pierwsze 1-2 cyfry na koniec wektora. Potem pozostała długość jest podzielna przez 3, więc bierz kolejne trójki i dorzucaj na koniec wektora.
P-176301
Biedrzyk
Temat założony przez niniejszego użytkownika
» 2020-02-29 13:00:06
Chodzi o coś takiego?
C/C++
if(( dlugosc == 2 ) ||( dlugosc == 1 ) )
{
    liczby.push_back( liczba );
    for( int i = liczby.size() - 1; i >= 0; i-- )
    {
        cout << "vector krotkie " << liczby[ i ] << endl;
    }
}
P-176302
Biedrzyk
Temat założony przez niniejszego użytkownika
» 2020-02-29 14:39:54
Podumałem nad tym i wyszło mi coś takiego:
C/C++
if((( dlugosc ) % 3 ) == 0 )
{
    do
    {
        string slowo = liczba.substr( dlugosc - 3, dlugosc );
        liczby.push_back( slowo );
        liczba.erase( dlugosc - 3, dlugosc );
        dlugosc -= 3;
    }
    while( dlugosc > 0 );
   
    for( int i = liczby.size() - 1; i >= 0; i-- )
    {
        cout << "vector 1 " << liczby[ i ] << endl;
    }
}

if(( dlugosc ) % 3 != 0 )
{
    do
    {
        if(( dlugosc == 2 ) ||( dlugosc == 1 ) )
        {
            liczby.push_back( liczba );
            for( int i = liczby.size() - 1; i >= 0; i-- )
            {
                cout << "vector krotkie " << liczby[ i ] << endl;
            }
        }
        string slowo = liczba.substr( dlugosc - 3, dlugosc );
        liczba.erase( dlugosc - 3, dlugosc );
        dlugosc -= 3;
        liczby.push_back( slowo );
    }
    while( dlugosc > 0 );
   
    for( int i = liczby.size() - 1; i >= 0; i-- )
    {
        cout << "vector 2 " << liczby[ i ] << endl;
    }
}
tylko jest jedno ale - dostaję błąd
terminate called after throwing an instance of 'std::out_of_range' what():  basic_string::substr: __pos (which is 4294967295) > this->size() (which is 2)
rozumiem, żechodzi tu o linijkę
string slowo = liczba.substr( dlugosc - 3, dlugosc );
 tylko jak to pominąć?
P-176303
pekfos
» 2020-02-29 17:04:10
Po co tak to komplikujesz? Niepotrzebnie 2 razy odwracasz kolejność elementów i niepotrzebnie masz 2 kopie tego samego algorytmu. Przeczytaj jeszcze raz to, co napisałem w poprzednim poście.
P-176304
Biedrzyk
Temat założony przez niniejszego użytkownika
» 2020-02-29 19:51:35
Faktycznie, bez sensu - dopiero jak przeczytałem po przerwie Twojego posta i na to spojrzałem to już to zobaczyłem - muszę strzelić porządnego facepalma ;)
P-176305
« 1 »
  Strona 1 z 1