[C++] Zapełnianie vectora
Ostatnio zmodyfikowano 2020-02-29 19:51
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ę: 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 ); 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; } }
|
|
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. |
|
Biedrzyk Temat założony przez niniejszego użytkownika |
» 2020-02-29 13:00:06 Chodzi o coś takiego? if(( dlugosc == 2 ) ||( dlugosc == 1 ) ) { liczby.push_back( liczba ); for( int i = liczby.size() - 1; i >= 0; i-- ) { cout << "vector krotkie " << liczby[ i ] << endl; } }
|
|
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: 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ąć? |
|
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. |
|
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 ;) |
|
« 1 » |