Funkcja sort
Ostatnio zmodyfikowano 2016-01-02 13:21
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! 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; } }
struct ocena { string przedmiot; int wartosc; };
struct indeks { string imie; string nazwisko; vector < ocena > oceny; }; |
|
carlosmay |
» 2015-12-31 00:18:15 Chciałbym się trzymać tego sposobu. Pomocy! |
Niestety ten sposób nie zadziała. 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 ); } }
|
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. 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. void wyswietl( const vector < indeks > & ind, int n )
|
|
|
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 :) 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; } } |
|
carlosmay |
» 2016-01-02 01:19:25 void sortowanie_ocena( vector < indeks > & ind, vector < ocena > & o )
|
Wyrzuć stąd argument ( vector < ocena > & o ) i sprawdź czy sortowanie działa prawidłowo. |
|
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 :) |
|
« 1 » |