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

Funkcja sort

Ostatnio zmodyfikowano 2016-01-02 13:21
Autor Wiadomość
Garniturek
Temat założony przez niniejszego użytkownika
Funkcja sort
» 2015-12-30 23:07:46
Witam, chciałbym posortować oceny każdej osoby ze struktury i nie mogę znaleźć błędu, gdyż kompilator się kompiluje, ale nie wykonuje się sortowanie. Chciałbym się trzymać tego sposobu. Pomocy!

C/C++
bool porownaj_ocena( const ocena & l1, const ocena & l2 )
{
    if( l1.wartosc < l2.wartosc )
         return true;
    else return false;
   
}
void sortowanie_ocena( vector < indeks > & ind, vector < ocena > & o )
{
   
    for( auto v = ind.begin(); v != ind.end(); ++v )
    {
        indeks x;
       
        sort( x.oceny.begin(), x.oceny.end(), porownaj_ocena );
    }
}
void pobierz( vector < indeks > & ind, int n )
{
    indeks x;
    ocena o;
    cin >> x.imie >> x.nazwisko;
   
    for( int i = 0; i < n; i++ )
    {
        cout << "Podaj przedmiot: ";
        cin >> o.przedmiot;
        cout << "Podaj ocene: ";
        cin >> o.wartosc;
        x.oceny.push_back( o );
    }
    ind.push_back( x );
}

void wyswietl( const vector < indeks > & ind, int n )
{
    for( auto v = ind.begin(); v != ind.end(); ++v )
    {
        cout <<( * v ).imie << " " <<( * v ).nazwisko << endl;
        for( auto w = v->oceny.begin(); w != v->oceny.end(); ++w )
             cout <<( * w ).przedmiot << ": " <<( * w ).wartosc << endl;
       
    }
   
}

C/C++
struct ocena
{
    string przedmiot;
    int wartosc;
};

struct indeks
{
    string imie;
    string nazwisko;
    vector < ocena > oceny;
};
P-142610
carlosmay
» 2015-12-31 00:18:15
  Chciałbym się trzymać tego sposobu. Pomocy! 
 Niestety ten sposób nie zadziała.

C/C++
void sortowanie_ocena( vector < indeks > & ind, vector < ocena > & o ) // przekazanie ocen nie ma sensu
{
   
    for( auto v = ind.begin(); v != ind.end(); ++v )
    {
        indeks x; // przekazany jest vector<indeks> ind, a tutaj tworzysz domyślny obiekt 'indeks' i go chcesz sortowac
        // nie ma on nic wspolnego z indeksami i ma pusty vector w składowych       
        sort( x.oceny.begin(), x.oceny.end(), porownaj_ocena ); // sortowanie pustego vectora
    }
}
 
 Ciągle nie rozumiesz co piszesz.

vector<ocena> o; nie jest osobnym bytem, tylko składową struktury indeks .
W każdym wpisie w indeks jest odrębny vector ocen i trzeba się do niego odwoływać za pośrednictwem obiektów ze struktury indeks ,
a nie z zewnątrz.

Funkcja wyświetlająca dane jest napisana prawidłowo (na pierwszy rzut oka),
a sortowanie to jakaś "abstrakcja". Odwołanie do vektora ocen zrób takie samo jak dla wyświetlania.

C/C++
for( auto w = v->oceny.begin(); w != v->oceny.end(); ++w )
     cout <<( * w ).przedmiot << ": " <<( * w ).wartosc << endl;

 
 Jeszcze zostaje kwestia sposobu odwołania do obiektów.
Stosuj jeden rodzaj zapisu (pośredni dostęp do składowych ind-> bądź wskaźnikowy (*ind) i trzymaj się jednego),
bo to też jest powodem pomyłek.
(*ind).begin() albo ind->begin(); ,
( * w ).przedmiot ==> w->przedmiot .
Jest czytelniejszy i od razu widać, gdzie jest odwołanie wskaźnikiem, a gdzie bezpośrednio.

C/C++
void wyswietl( const vector < indeks > & ind, int n ) // po co tu to 'n'? [/cpp] [/cytat]
P-142612
Garniturek
Temat założony przez niniejszego użytkownika
» 2016-01-01 21:06:32
Ale się wygłupiłem z tą zmienną indeks. Poprawiłem, kod działa. Dzięki za pomoc. Jeśli jakaś możliwość poprawienia kodu, proszę pisac :)
C/C++
bool porownaj_ocena( const ocena & l1, const ocena & l2 )
{
    if( l1.wartosc < l2.wartosc )
         return true;
    else return false;
   
}
void sortowanie_ocena( vector < indeks > & ind, vector < ocena > & o )
{
   
    for( auto v = ind.begin(); v != ind.end(); ++v )
    {
        sort( v->oceny.begin(), v->oceny.end(), porownaj_ocena );
    }
}
void pobierz( vector < indeks > & ind, int n )
{
    indeks x;
    ocena o;
    cin >> x.imie >> x.nazwisko;
   
    for( int i = 0; i < n; i++ )
    {
        cout << "Podaj przedmiot: ";
        cin >> o.przedmiot;
        cout << "Podaj ocene: ";
        cin >> o.wartosc;
        x.oceny.push_back( o );
    }
    ind.push_back( x );
}

void wyswietl( const vector < indeks > & ind )
{
    for( auto v = ind.begin(); v != ind.end(); ++v )
    {
        cout << v->imie << " " << v->nazwisko << endl;
        for( auto w = v->oceny.begin(); w != v->oceny.end(); ++w )
             cout << w->przedmiot << ": " << w->wartosc << endl;
       
    }
   
}
P-142668
carlosmay
» 2016-01-02 01:19:25
C/C++
void sortowanie_ocena( vector < indeks > & ind, vector < ocena > & o )
 
 Wyrzuć stąd argument ( vector < ocena > & o ) i sprawdź czy sortowanie działa prawidłowo.
P-142675
Garniturek
Temat założony przez niniejszego użytkownika
» 2016-01-02 13:21:11
No w sumie masz rację, że nie potrzebnie przekazywałem tą zmienną. Działa :)
P-142692
« 1 »
  Strona 1 z 1