Wyswietlanie struktury

0

Witam, nie rozumiem dlaczego nie wyświetla mi się pętla w cStudent::wyswietl(), a w cStudent::pobierz_oceny() wyświetla normalnie. Pomocy

 
struct sOcena {
    string przedmiot;
    float ocena;
    int ECTS;
};

class cStudent {
    string m_imieNazwisko;
    char m_plec;
    int m_nrIndeksu;
    int m_ECTS;
   
   
public:
    vector < sOcena > m_ocena;
    cStudent();
    cStudent( const cStudent & s );
    cStudent( string imieNazwisko, char plec, int nrIndeksu );
    void pobierz();
    void wyswietl();
    void pobierz_oceny();
    string imieNazwisko();
    vector < sOcena > oceny( string nazwa, int rosnaca );
    float srednia();
};
#include "Header.h"

cStudent::cStudent()
    : m_imieNazwisko( "Nieznany" )
     , m_plec( 'n' )
     , m_nrIndeksu( - 1 )
{
}
cStudent::cStudent( const cStudent & s )
    : m_imieNazwisko( s.m_imieNazwisko )
     , m_plec( s.m_plec )
     , m_nrIndeksu( s.m_nrIndeksu )
{
}
cStudent::cStudent( string imieNazwisko, char plec, int nrIndeksu )
    : m_imieNazwisko( imieNazwisko )
     , m_plec( plec )
     , m_nrIndeksu( nrIndeksu )
{
}
void cStudent::wyswietl()
{
    cout << m_imieNazwisko << " " << m_plec << " " << m_nrIndeksu << " " << endl;
    cout << m_ocena.size() << endl;
    for( auto w = m_ocena.begin(); w != m_ocena.end(); ++w )
         cout << w->przedmiot << "-" << w->ocena << " " << w->ECTS << endl; }
void cStudent::pobierz_oceny()
{
    sOcena zam;
    cout << "Podaj nazwe przedmiotu: ";
    cin >> zam.przedmiot;
    cout << "Podaj ocene: ";
    cin >> zam.ocena;
    cout << "Podaj liczbe ECTS: ";
    cin >> zam.ECTS;
    m_ocena.push_back( zam );
}
 
 
#include "Header.h"

int main() {
    vector < cStudent > studenci;
    cout << "Dodaj: 1" << endl;
    cout << "Wyswietl po kolei: 2" << endl;
    while( 1 ) {
       
        char a = getchar();
        switch( a ) {
           
        case '1': {
                cout << "Podaj imie i nazwisko: ";
                string a;
                cin.sync();
                getline( cin, a );
                cout << "Podaj plec: ";
                char b;
                cin >> b;
                cout << "Podaj nr indeksu: ";
                int c;
                cin >> c;
                cStudent tmp( a, b, c );
                tmp.pobierz_oceny();
                studenci.push_back( tmp );
            } break;
        case '2':
            {
                for( auto v = studenci.begin(); v != studenci.end(); ++v )
                {
                    v->wyswietl();
                }
            } break;
        }
    }
}
0

Widocznie m_ocena.begin() == m_ocena.end() innej opcji raczej nie ma.
Popatrz dokładnie czy kopiujesz/przenosisz/cokolwiek ten wektor.

0

Ponieważ pobierz_oceny() pobiera tylko jedną ocenę, więc skąd może się wziąć lista?

0

Do tego vectora dodaje w pobierz_oceny() trzy wartości, więc ta pętla powinna się wykonywać

 
void cStudent::wyswietl()
{
    cout<<m_imieNazwisko<<" "<<m_plec<<" "<<m_nrIndeksu<<" "<<endl;
    for (auto w=m_ocena.begin(); w!=m_ocena.end(); ++w)
        cout<<w->przedmiot<<"-"<<w->ocena<<" "<<w->ECTS<<endl;
}

Wydaje mi się, że wszystko jest ok, dlatego nie wiem o co chodzi.
@_13th_Dragon nie dodałem pliku *.h, przez to się chyba nie zrozumieliśmy. Mój błąd, przepraszam. Kod dokleiłem u góry

0

Meh, brzydki kod, nie chce mi się w niego nawet wczytywać : )
Anyway, sprawdź przed pętlą która rzekomo Ci nie działa wielkość wektora, m_ocena.size().

0
  1. tmp.pobierz_oceny(); - wywołujesz jednokrotnie.
  2. W void cStudent::pobierz_oceny() jest wywołana jednokrotnie m_ocena.push_back(zam);
    Wiec skąd ci się widza te trzy oceny?
0

Wielkość vectora jest równa 0, a przecież dodaje do vectora wartości

1

Masz trzy możliwości:

  1. Forum wróżbitów, tam ci pomogą bez podania kodów.
  2. Odpalasz debuger i znajdujesz błąd, najwyższy czas się nauczyć.
  3. Podać pełny kod i modlić się aby komuś chciało się babrać w ...
0

Debugger nie widzi nic, albo nie umiem z niego korzystać. Kod jest wklejony cały ;)

2
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z pojęciem konstruktora kopiującego, to co napisałeś należy wywalić lub poprawić
  3. Menu raczej należy wypisywać przed każdą prośbą użytkownika o podjęcie wyboru
  4. Przed wczytaniem kolejnego wyboru należy opróżnić bufor klawiatury, przynajmniej cin>>ws;

1 użytkowników online, w tym zalogowanych: 0, gości: 1