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

sorotowanie

Ostatnio zmodyfikowano 2017-04-11 20:28
Autor Wiadomość
Chowan
Temat założony przez niniejszego użytkownika
sorotowanie
» 2017-04-11 14:20:51
Witam, mam pytanie. Dlaczego w kodzie do sortowanie musze użyć rozmiaru stringa -1 gdyż w przeciwnym razie gdy wyrzuca mi dane nie wyswietla ostatniego elementu.

C/C++
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;

void sort_babel( string & tab )
{
    for( int i = 0; i < tab.size(); i++ ) {
        for( int j = 0; j < tab.size(); j++ )
        { if( tab[ j ] > tab[ j + 1 ] )
                 swap( tab[ j ], tab[ j + 1 ] ); } }
   
}
int main()
{
    string n;
   
    cout << "podaj ciag znakow: ";
    cin >> n;
    sort_babel( n );
    cout << "posortowany zbior: " << n << endl;
   
    system( "pause" );
    return 0;
}

jak poprawie na tab.size()-1 to wyświetla mi cały string posortowany. pomimo ze sprawdzając rozmiar string przy wprowadzaniu i przed wypisaniem ma on taka sama długość w sensie sprawdzam po cin >> n dodaje cout << n.size() i dodaje to po tym jak funkcja kończy przetwarzać elementy i długość jest ta sama a wypisuje mi jeden element mniej.
P-160063
maly7
» 2017-04-11 14:47:43
C/C++
for( int j = 0; j < tab.size() - 1; j++ )
{
    if( tab[ j ] > tab[ j + 1 ] )
        ...

Musi być tab.size()-1 ponieważ poniżej odwołujesz się do tab[ j + 1 ], więc w innym wypadku wykroczyłbyś poza zakres tablicy.

Inaczej mógłbyś zrobić tak (zaczynając od 1)
C/C++
for( int j = 1; j < tab.size(); j++ )
{
    if( tab[ j - 1 ] > tab[ j ] )
        ...
P-160064
Chowan
Temat założony przez niniejszego użytkownika
» 2017-04-11 17:56:27
Okej super dzięki. A możesz mi powiedziec dlaczego zamienia istniejący element z tablicy na ten z poza tablicy? Czy nie wiem jak to jest że on się nie wyświetla pomimo że string ma rozmiar taki jak powinien mieć.
P-160071
maly7
» 2017-04-11 18:44:11
Jeśli string np. str ma rozmiar 5, więc nie możesz się odwołać do elementu str[5], ponieważ taki element nie istnieje, maksymalny (piąty) to str[4].
Spróbuj sobie zrobić:
C/C++
cin >> n;
swap( n[ n.size() - 1 ], n[ n.size() ] );
W najlepszym razie po wyświetleniu zniknie ostatni znak ze stringa (będzie tam prawdopodobnie 0).
P-160073
Chowan
Temat założony przez niniejszego użytkownika
» 2017-04-11 20:17:17
No i tak się właśnie dzieje ale nie rozumiałem dlaczego. Dzięki za info
P-160075
maly7
» 2017-04-11 20:28:07
Przede wszystkim nigdy nie wolno wykraczać poza zakres tabeli (bo i po co?). Ale to nie znaczy, że nic tam nie ma, w twoim wypadku znajduje się tam 0 więc twój znak, np. 'a' zamienia z 0 więc nic się nie wyświetla. Jeśli masz napis = "abcde"; i zamienisz napis[4] z napis[5], to na miejscu napis[4] pojawi się to co było na miejscu napis[5] i odwrotnie. Jeśli teraz napis[4] = np. 0 to coś tam jest (dlatego rozmiar napisu jest taki sam) ale się po prostu nie wyświetli.
P-160076
« 1 »
  Strona 1 z 1