Vector i touple (Problem z obliczeniem średniej ocen obiektów)

0

Mam vector obiektow klasy Student:

vector<Student>uczen

w nim m.in. znajduje się vector krotek, oraz średnia

vector<tuple<string, double> >my_tuple;
double srednia;

W krotcje(tuple) znajduje się (string Nazwa_przedmiotu, double Ocena)

Chcę sobie stworzyć funkcję, która obliczy średnią dla każdego obiektu i wpisze ją do tego obiektu za pomocą settera.

int i,j;
for (i = 0; i<uczen.size(); i++)
{
	for (j = 0; j < uczen[i].my_tuple.size(); j++)
	{
		suma += get<1>(uczen[i].my_tuple[j]); 
	}
	cout << "******" << suma<<"******";  // suma się nie zmienia i zawsze jest równa zeru.
	srednia = suma/j;
	uczen[i].set_srednia(srednia);
}

Wiem, że prawdopodobnie problem tkwi w tym zapisie

suma += get<1>(uczen[i].my_tuple[j]); 

ale nie wiem co może być źle.

0

@Guaz: Nie wiem jak inaczej Ci odpowiedzieć, zdeklarowałem:

double suma = 0;

więc nie w tym problem :)

0

oj kolego ale tuple dlaczego? std::pair to raz ba nawet lepiej powiem. std::map! A wtedy jak myślisz?

0

@revcorey już niestety zabrałem się za pisanie projektu z tymi tuples'ami a nie mam siły tego wszystkiego zmieniać. Więc na razie czekam, bo zgaduję, że jest jakieś rozwiązanie tego problemu.

0

jejeu jeju rozszerzając mój post. Projekt jest już zły teraz jakieś proste tipy:
a)zobacz sobie przykład z std::tie na liink
b) przepisz to na nowo na mape będziesz szybciej.
c) stary serio using namespace std?
d)dlaczego uczeń nie może mieć metody podajSrednia(). Obecnie wszystko jest w public. Ja bym zrobił może metody int podajSrednia(), float podajOcene(std::string key).

1

Ten Twój wybór tupli to średni pomysł. No ale zakładam chciałeś mieć "zabawę z API".
Masz tu tak mroczny przykład że aż mnie zęby bolały (np. brak hermetyzacji bo nie wiem jaką miałeś). Lepiej zdecyduj się w całości na nazwy angielskie bo get_srednia() wygląda jakbyś był po mikrodawce LSD i tak skanalizował swoją kreatywność. Średniej nie licz na piechotę bo to strata czasu.
Ano masz..

#include <iostream>
#include <vector>
#include <string>
#include <tuple>
#include <numeric>
#include <random>

struct Student {
    Student(const std::string& imie): imie{imie} {}

    void oblicz_srednia() {
        auto sum = std::accumulate(this->przedmioty.cbegin(), this->przedmioty.cend(), 0.0,
            [](double value, auto& tpl) {
                return value + std::get<1>(tpl);
            });
        this->srednia = sum / this->przedmioty.size();
    }

    std::vector<std::tuple<std::string, double>> przedmioty;
    double srednia;
    const std::string imie;
};

int main() {
    std::vector<Student> uczniowie;

    // Z jakiegoś źródła te oceny trzeba wygenerować.
    std::random_device losowe_oceny;
    std::uniform_int_distribution<int> oceny(1, 5);

    // Jakaś symulacja dodawania przedmiotów dla studentów
    for(const auto& name: {"Maciek", "Franek", "Zośka", "Zenek", "Olek" }) {
        uczniowie.emplace_back(name);
        for(const auto& przedmiot: {"mniemanologia", "zbrodniomyślenie", "historia dżdżownic"}) {
            uczniowie.back().przedmioty.emplace_back(przedmiot, oceny(losowe_oceny));
        }
    }

    // Kalkulacja średniej dla każdego ze studentów
    for(auto& student: uczniowie) {
        student.oblicz_srednia();
    }

    // Prezentacja wyników...
    for(auto& student: uczniowie) {
        std::cout << "Student: " << student.imie << '\n';
        for(const auto& przedmiot: student.przedmioty) {
            std::cout << std::get<0>(przedmiot) << ": " << std::get<1>(przedmiot) << '\n';
        }
        std::cout << "średnia = " << student.srednia << '\n';
        std::cout << std::string(30, '-') << '\n';
    }
}
0

Dzięki chłopaki za pomoc(już mi działa), postaram się wdrożyć to o czym mówicie. Bo tak na prawdę piszę w C++ od miesiąca i dużo rzeczy jeszcze nie znam :)

0

tak mnie zastanawia po co ten std::vector<std::tuple<std::string, double>>? Nie lepiej było użyć std::map<std::string, double> albo std::multi_map<std::string, double>?

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