Zdziszek Temat założony przez niniejszego użytkownika |
vectory,listy,struktury » 2015-12-20 21:31:26 Witam, mam problem z pewnym zadaniem. Napisałem program, który pobiera od użytkownika imię, nazwisko studenta oraz przedmioty, oceny z tych przedmiotów i wyświetla studenta z najwyższą oceną, jeśli są dwie takie same to obydwie itp. #include<iostream> #include<stdio.h> #include<math.h> #include<map> #include<conio.h> #include<stdlib.h> #include<string> #include<vector> #include<list> #include<algorithm> #include<fstream> using namespace std;
struct ocena { string przedmiot; double wartosc; };
struct indeks { string imie; string nazwisko; int N; vector < ocena > oceny; };
void pobierz( indeks & i ) { cout << "Podaj imie i nazwisko studenta: "; cin >> i.imie >> i.nazwisko; ocena oc; cin.ignore(); while( 1 ) { cout << "Podaj przedmiot: "; getline( cin, oc.przedmiot ); if( oc.przedmiot ==( string ) "" ) break; cout << "Podaj ocene: "; cin >> oc.wartosc; i.oceny.push_back( oc ); cin.ignore(); } }
vector < ocena > szukaj_najwyzszej_oceny( list < indeks >& l ) { vector < ocena > kopia; for( auto v = l.begin(); v != l.end(); ++v ) { for( int i = 0; i <( * v ).oceny.size(); i++ ) { if(( * v ).oceny[ i ].wartosc <( * v ).oceny[ i + 1 ].wartosc ) swap(( * v ).oceny[ i ].wartosc,( * v ).oceny[ i + 1 ].wartosc ); } kopia.push_back(( * v ).oceny[ 0 ] ); for( int i = 0; i <( * v ).oceny.size(); i++ ) { if(( * v ).oceny[ i ].wartosc ==( * v ).oceny[ 0 ].wartosc ) kopia.push_back(( * v ).oceny[ i ] ); } } return kopia; }
void wyswietl_najwyzsze_oceny( const list < indeks >& l, const vector < ocena >& a ) { for( auto v = l.begin(); v != l.end(); ++v ) { cout <<( * v ).imie << " " <<( * v ).nazwisko << endl; for( auto i = a.begin(); i != a.end(); ++i ) { cout <<( * i ).przedmiot << " " <<( * i ).wartosc << endl; } } }
int main() { list < indeks > indeksy; int wybor; while( 1 ) { cout << "1. Dodaj studenta." << endl; cout << "2. Wyswietl studentow i ich oceny." << endl; cout << "3. Wyswietl studentow i ich oceny alfabetycznie." << endl; cout << "4. Wyswietl najwyzsza ocene." << endl; cin >> wybor; switch( wybor ) { case 1: { indeks i; pobierz( i ); indeksy.push_back( i ); break; } case 4: { vector < ocena > ram = szukaj_najwyzszej_oceny( indeksy ); wyswietl_najwyzsze_oceny( indeksy, ram ); break; } } } cout << endl << endl << endl << endl; system( "pause" ); return 0; }
Program ma wyświetlić imię, nazwisko studenta oraz tylko tę ocenę lub oceny, które są najwyższe, tych niższych nie wyświetla. Problem polega na tym, że podczas pracy programu wyskakuje mi błąd: Expression:vector subscript out of range. Ktoś mógłby mi pomóc? Edit: Przepraszam za pomylenie działów. |
|
mateczek |
» 2015-12-20 21:46:16 |
|
carlosmay |
» 2015-12-20 22:25:59 if(( * v ).oceny[ i ].wartosc <( * v ).oceny[ i + 1 ].wartosc )
Do sortowanie użyj std::sort z <algorithm>. std::sort() |
|
Zdziszek Temat założony przez niniejszego użytkownika |
» 2015-12-20 23:00:30 Tylko właśnie ja zrobiłem klasyczne sortowanie, bo za pomocą funkcji sort wyskakiwały mi błędy, stworzyłem sobie taką funkcję do sortowania: bool po_ocenie( const ocena & o1, const ocena & o2 ) { if( o1.wartosc < o2.wartosc ) return true; return false; }
Tylko teraz w jaki sposób tego użyć?Próbowałem na wiele sposobów, np oceny.sort( po_ocenie ) nie działa oraz wiele podobnych, również. Podpowiedziałbyś jak to tutaj ulokować? Edit: W sumie znalazłem dwa rozwiązania, jedno to dałem w pętli oceny.size() - 1 , a drugie to w mainie zadeklarowałem list < ocena > a; i w case wpisalem a.sort( po_ocenie ) i w obydwu przypadkach efekt był taki sam: wprowadzone dane:Jan Kowalski wf 3 i Jan Nowak wf 5. Jan Kowalski wf 3 wf 3 wf 5 wf 5 Jan Nowak wf 3 wf 3 wf 5 wf 5
Dobrze to w takim razie zrobiłem tylko program źle działa, czy te moje dwa sposoby są złe? |
|
carlosmay |
» 2015-12-21 00:05:31 ( o1.wartosc < o2.wartosc ) operator '<' zamień na '>' i będzie sortowanie malejące. std::sort() : jeśli funkcja zwróci true to pierwszy przekazany argument ma poprzedzać drugi, natomiast jeśli zwróci false drugi ma poprzedzać pierwszy. Z tego wynika, że zmiana operatora porównania zmienia kolejność sortowania z rosnącej na malejącą. |
|
Zdziszek Temat założony przez niniejszego użytkownika |
» 2015-12-21 00:50:01 Tylko nie wiem w jaki sposób mam tej funkcji użyć, bo przy każdej kombinacji jaką stosuje wyskakuje błąd, mam na myśli jak to zapisać, bo te dwa sposoby co próbowałem to działają źle przez co sama zmiana znaku nic nie robi |
|
carlosmay |
» 2015-12-21 04:05:02 std::sort( *.begin(), *.end(), po_ocenie ); |
|
Zdziszek Temat założony przez niniejszego użytkownika |
» 2015-12-23 21:40:09 Dalej mi tu coś nie pasuje z tym sortowaniem, bo wyskakują błędy, ale myślę, że stworzenie nowej struktury w, której uwzględnię odpowiednie zmienne powinno rozwiązać te problemy i pozwolić to posortować, pokombinuję, dzięki za pomoc=] |
|
« 1 » 2 |