Zdziszek Temat założony przez niniejszego użytkownika |
vectory, listy, wyswietlanie » 2015-12-12 21:35:23 Witam, mam problem z pewnym zadaniem. #include<iostream> #include<stdio.h> #include<math.h> #include<conio.h> #include<string> #include<vector> #include<algorithm> #include<map> #include<list> using namespace std;
struct ocena { string przedmiot; double wartosc; };
struct indeks { string imie; string nazwisko; vector < ocena > oceny; int id; };
void pobierz( indeks & o ) { cout << "Podaj imie i nazwisko studenta: "; cin >> o.imie >> o.nazwisko; cin.ignore(); ocena oc; do { cout << "Podaj przedmiot: "; getline( cin, oc.przedmiot ); if( oc.przedmiot ==( string ) "" ) break; cout << "Podaj ocene: "; cin >> oc.wartosc; o.oceny.push_back( oc ); cin.ignore(); } while( 1 ); }
void wyswietl1( const indeks & o ) { cout << o.imie << " " << o.nazwisko << endl; }
bool po_ocenie( const ocena & e1, const ocena & e2 ) { return e1.wartosc < e2.wartosc; }
void wyswietl_oceny( const vector < ocena >& o ) { for( auto v = o.begin(); v != o.end(); ++v ) { cout <<( * v ).przedmiot << " " <<( * v ).wartosc << endl << endl; } }
void wyswietl_po_ocenie( const list < indeks >& l ) { for( auto v = l.begin(); v != l.end(); ++v ) { wyswietl1( * v ); } }
int main() { list < indeks > indeksy; list < ocena > indek; indeks i; int N = 0; indeks ind[ 30 ]; int wybor; while( 1 ) { cout << "1. Wczytaj dane studenta." << endl; cout << "2. Wyswietl studentow." << endl; cout << "3. Sortuj po nazwisku." << endl; cout << "4. Sortuj po ocenie." << endl; cout << "5. " << endl; cin >> wybor; switch( wybor ) { case 1: pobierz( i ); indeksy.push_back( i ); break; case 4: indek.sort( po_ocenie ); wyswietl_po_ocenie( indeksy ); break; } } system( "pause" ); return 0; }
Problem polega na tym, że program najpierw pobiera dane studenta(imię, nazwisko, przedmioty, oceny), a potem ma wyświetlić dane studentów ale po posortowanych ocenach(case 4) i nie wiem w jaki sposób to zrobić, bo albo wyskakują błędy, że program nie może skonwertować z 'ocena' na 'indeks', albo są problemy z funkcją bool(też z argumentami) albo program się kompiluje, ale nie wyświetla tych ocen. Próbowałem na mnóstwo sposobów, ale nie mam pojęcia jak to zrobić, nie wiem jak połączyć wyświetlanie imienia, nazwiska oraz przedmiotów i ocen, bo są to inne typy, ktoś mógłby mi pomóc?Z góry dziękuję. |
|
carlosmay |
» 2015-12-12 22:21:25 Może tutaj znajdziesz pomysł i rozwiązanie problemu. Podobny tematPomijam fakt, że kod jest pomieszany to: list < indeks > indeksy; list < ocena > indek; indeks i; int N = 0; indeks ind[ 30 ]; int wybor;
Moja rada: poznać dokładniej struktury (konstruktory i funkcje składowe (metody)). |
|
Zdziszek Temat założony przez niniejszego użytkownika |
» 2015-12-12 22:55:32 W mainie są tam nieużywane zmienne i tablice, bo kombinowałem na wiele sposobów, gdy wyskakiwały mi błędy, tylko ich nie usunąłem,a na temat struktur i metod trochę czytałem, ale i tak nie wiem jak poradzić sobie z problemem. Mógłbyś mnie nakierować w jaki sposób za pomocą jednej funkcji wyświetlić imię, nazwisko oraz przedmiot, wartość?Bo z tym mam największy problem, a są one zadeklarowane za pomocą 'ocena' i 'indeks' i wyskakują błędy, że nie można skonwertować z jednego na drugie. Chciałbym to zrobić za pomocą iteratorów, żeby móc potem bez problemu zmieniać np z vectora na listę itp. |
|
carlosmay |
» 2015-12-12 23:05:13 Mógłbyś mnie nakierować w jaki sposób za pomocą jednej funkcji wyświetlić imię, nazwisko oraz przedmiot, wartość? |
Napisz funkcje składową w strukturze indeks . Bo z tym mam największy problem, a są one zadeklarowane za pomocą 'ocena' i 'indeks' i wyskakują błędy, że nie można skonwertować z jednego na drugie. |
Bo w miejscu gdzie kompilator spodziewa się obiektów typu indeks dostaje obiekty typu ocena . Toteż zgłasza bunt. Przeczytaj uważnie temat z linka, który wrzuciłem. Jest tam sporo info. W międzyczasie naskrobię przykład metody wyświetlającej dane ze struktur. |
|
carlosmay |
» 2015-12-12 23:17:49 To tak z grubsza. struct ocena { string przedmiot; double wartosc; void show_ocena() { cout << przedmiot << "- " << wartosc << endl; } };
struct indeks { string imie; string nazwisko; vector < ocena > oceny; int id; void show() { cout << "id studenta: " << id << " "; cout << imie << " " << nazwisko << ". "; for( auto it = oceny.begin(); it != oceny.end(); it++ ) it->show_ocena(); cout << endl; } };
int main() { vector < indeks > vindeks; for( vector < indeks >::iterator it = vindeks.begin(); it != vindeks.end(); it++ ) it->show(); }
|
|
Zdziszek Temat założony przez niniejszego użytkownika |
» 2015-12-13 00:03:19 Dzięki, zrobiłem coś takiego: struct ocena { string przedmiot; double wartosc; ocena( const string & przedmiot, double wartosc ) : przedmiot( przedmiot ) , wartosc( wartosc ) { } void show_ocena() { cout << przedmiot << "- " << wartosc << endl; } };
struct indeks { string imie; string nazwisko; vector < ocena > oceny; int id; indeks( const string & imie, const string & nazwisko, int & id, vector < ocena > & oceny ) : imie( imie ) , nazwisko( nazwisko ) , id( id ) , oceny( oceny ) { } void show() { cout << "id studenta: " << id << " "; cout << imie << " " << nazwisko << endl; for( auto it = oceny.begin(); it != oceny.end(); ++it ) it->show_ocena(); cout << endl; } };
void pobierz( indeks & o ) { cout << "Podaj imie i nazwisko studenta: "; cin >> o.imie >> o.nazwisko; cin.ignore(); ocena oc; do { cout << "Podaj przedmiot: "; getline( cin, oc.przedmiot ); if( oc.przedmiot ==( string ) "" ) break; cout << "Podaj ocene: "; cin >> oc.wartosc; o.oceny.push_back( oc ); cin.ignore(); } while( 1 ); }
int main() { list < indeks > indeksy; vector < indeks > vindeks; indeks i; int N = 0; int wybor; while( 1 ) { cout << "1. Wczytaj dane studenta." << endl; cout << "2. Wyswietl studentow." << endl; cout << "3. Sortuj po nazwisku." << endl; cout << "4. Sortuj po ocenie." << endl; cout << "5. " << endl; cin >> wybor; switch( wybor ) { case 1: pobierz( i ); indeksy.push_back( i ); break; case 4: for( vector < indeks >::iterator it = vindeks.begin(); it != vindeks.end(); it++ ) it->show(); break; } } system( "pause" ); return 0; }
Tylko teraz pojawił się inny problem: Error C2512 'ocena': no appropriate default constructor available Error C2512 'indeks': no appropriate default constructor available i podkreśla mi zmienną "indeks i;" w funkcji main oraz "ocena oc;" w funkcji pobierz, w czym jest problem, nie współgra to jakoś z konstruktorami, czy źle je napisałem? No i właśnie mam pytanie, bo w strukturze indeks mam vector typu 'ocena' i nie da się jakoś w ten sposób zgrać tych danych, żeby je razem wyświetlić, zamiast używać konstruktorów? |
|
carlosmay |
» 2015-12-13 00:49:25 Wykomentowałem miejsca gdzie należy napisać konstruktory (z argumentami i domyślne) dla tych obiektów. Bez nich nie ruszysz. Zwróć uwagę na "default". |
|
Zdziszek Temat założony przez niniejszego użytkownika |
» 2015-12-13 14:06:23 Ok,dzięki=] Popróbuję i dam znać |
|
« 1 » |