"podwójny" map

0

Witam!

Jestem tu nowy, więc z góry przepraszam za moje lamerstwo.

Chcę przechować dane: int ID_ucznia, int ID_przedmiotu i vector<float> oceny tak, by zajmowały jak najmniej miejsca. Zaproponowano mi powdójne uzycie map. Udało mi się tam dane wpisać, niestety nie wiem jak zastosować iteratory by wyświetlić, np. uczeń o ID_ucznia ma z przedmiotu ID_przedmiotu nastepujące oceny...

map<int,map<int,vector<float> > > oceny_uczn;
...

{
cout<<"Podaj nr przedmiotu "<<endl;
cin>>ID_przedmiotu;
cout<<"Podaj ocene "<<endl;
cin>>ocena;
cout<<"uczen: "<<ID_ucznia<<" ma z przedmiotu: "<<ID_przedmiotu<<" ocene: "<<ocena<<endl;
oceny_uczn[ID_ucznia][ID_przedmiotu].push_back(ocena);
}

0
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <map>
using namespace std;

map< int, map<int,vector<float> > > oceny_uczn;

int main()
{
    float tab[4] = {1,2,3.5,0.111111};
    vector<float> vinit( &tab[0], &tab[4] );
    
    oceny_uczn[0][0] = vinit;
    
    vector<float> &vv = oceny_uczn[0][0];
    copy( vv.begin(), vv.end(), ostream_iterator<float>(cout, "\t") );
}

[???] Ale czemu float?

0

Dzięki, działa!

Co do float - chodzi o "połówki" - 3.5; 4.5 ...

Czy można ten sposób wykorzystać przy obliczniu, np. średniej ocen z danego przedmiotu?

0

Wszystko można...
np.:

#include <numeric>
[...]
    if ( vv.size() > 0 )
    {
        float s = accumulate( vv.begin(), vv.end(), 0.0 ) / vv.size();
        cout << "srednia: " << s << endl;
    }

P.S. Ale te oceny to na studiach rozumiem? A nie: 3-, 4+, 3= :D

0

Witam po raz kolejny!
Dzieki za już z prośbą o dalsze rady :-)

Dokładnie chodzi o to, że mam klasę Dane_ucznia, o następujących polach:

Uczeń (a dokładnie ID_ucznia z klasy z danymi osobowymi)
Przedmiot (ID_przedmiotu z klasy z przedmiotami)
Ocena (nieznana ilość ocen, powiązanych z każdym z przedmiotów)
Ocena_zachowania
Obecność
Uwagi

oraz metody:

Wpisz()
Wyświetl()
Drukuj()

Jak można takie dane zapisać, np w "podójnym map", jak się po zapisanych danych "poruszać" - wielokrotnie odczytywać dla różnych uczniów, umożliwić wykorzystanie danych przez inne klasy (np. klasa średnia z metodami Pobierz_dane() i Oblicz() ). I wreszcie jak te dane zapisać i odczytać z pliku (w przypadku klasy z danymi osobowymi dane zapisałem są w wektorze, wyprowadzam do pliku strumieniem ofstream przy użyciu przeciążonego operatora <<).

Z góry dzieki za wszelkie wskazówki!

0

Coś ty na ten "podwójny map" tak się uparł?? :)

A ta klasa DaneUcznia to chyba tak powinna wyglądać (chyba załapiesz o co chodzi bo to nie żaden kod):
id_ucznia (??? czy potrzebne, mamy związek w map<Uczen,DaneUcznia> patrz niżej)
map<Przedmiot, Oceny> oceny; // Oceny to kolejna klasa z np. metodą srednia() itp.
...

Możesz zapisać w tym swoim map:
map<Uczen, DaneUcznia> oceny_ucznia;
i wtedy:
const Uczen &jakis_uczen = BazaUczniow.getById( 0 );
oceny_ucznia[jakis_uczen].oceny[przedmiot].drukujOceny();
albo
oceny_ucznia[jakis_uczen].oceny[przedmiot].dodaj( 5+ ); // :)

Łapiesz ideę [???] Zaprojektuj dobrze klasy i związki między nimi.

Natomiast zapis to już całkiem inna sprawa... Szukaj o serializacji, boost::serialize, itd.

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