Witam, mam napisaną strukturę Student przechowującą informacje o studentach oraz strukturę Group, która posiada pola nazwa i studenci w postaci vector'a obiektów typu student. Mam także napisane funkcję wyliczającą średnią ocen studenta oraz funkcję dodającą studenta do grupy. Moim następnym zadaniem jest napisanie funkcji best_groups_name(), która będzie zwracała nazwę najlepszej grupy, czyli takiej, której mediana średnich ocen wszystkich studentów jest najwyższa. Przy próbie uruchomienia mojego kodu, wyświetla mi następującą informację:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted (core dumped)
Mój kod:
#include <iostream>
#include <string>
#include <vector>
struct Student
{
std::string imie;
std::string nazwisko;
std::vector<int> oceny;
Student(std::string im, std::string naz, std::vector<int> o)
{
imie = im;
nazwisko = naz;
oceny = o;
}
};
auto average_of(Student a) -> float
{
int x = 0;
for(size_t i = 0; i < a.oceny.size(); i++)
{
x = x + a.oceny[i];
}
return float(x)/float(a.oceny.size());
}
struct Group
{
std::string nazwa;
std::vector<Student> studenci;
Group(std::string naz, std::vector<Student> s)
{
nazwa = naz;
studenci = s;
}
};
void add_to_group(Group& g, Student const& st)
{
g.studenci.push_back(st);
}
auto best_groups_name(std::vector<Group> gr) -> Group
{
auto tmp = average_of(gr[0].studenci[0]);
auto best = gr[0];
for(size_t i = 0; i < gr.size(); i++)
{
if(gr[i].studenci.size() % 2 == 0) // jeśli ilość studentów jest parzysta porównaj sumę średnich dwóch studentów w środku do tmp
{
if(average_of(gr[i].studenci[gr[i].studenci.size()/2-1]) + average_of(gr[i].studenci[gr[i].studenci.size()/2+1]) > tmp)
{
tmp = average_of(gr[i].studenci[gr[i].studenci.size()/2-1]) + average_of(gr[i].studenci[gr[i].studenci.size()/2+1]);
best = gr[i];
}
}
else // jeśli ilość studentów w grupie nie jest parzysta porównaj średnią ocen środkowego studenta z tmp
{
if(average_of(gr[i].studenci[gr[i].studenci.size()/2]) > tmp)
{
tmp = average_of(gr[i].studenci[gr[i].studenci.size()/2]);
best = gr[i];
}
}
}
return best;
}
auto main() -> int
{
auto Stasiek = Student("Stasiek", "Kowalski", {3,4,5,5});
auto Grzesiek = Student("Grzesiek", "Nowak", {6,6,4,5});
auto c = Group("c", {});
add_to_group(c, Stasiek);
add_to_group(c, Grzesiek);
auto Mikolaj = Student("Mikolaj", "Kowalski", {2,1,5,5});
auto Kuba = Student("Kuba", "Nowak", {6,6,4,5,4,4});
auto Piotr = Student("Piotr", "Nowak", {2,2,1,5,4,4});
auto b = Group("b", {});
add_to_group(b, Mikolaj);
add_to_group(b, Kuba);
add_to_group(b, Piotr);
auto vec = std::vector<Group>{c,b};
auto najgrupa = best_groups_name(vec);
std::cout<<najgrupa.nazwa<<std::endl;
return 0;
}
Czy ktoś byłby w stanie pomóc w poprawie tego kod? Z góry dzięki!
Edit: Przypomniało mi się, że aby obliczyć medianę należy jeszcze posortować wartości rosnąco , ale szczerze i tak nie wiem jak to zaimplementować do kodu.