Hagamos un ejemplo sencillo en C++ utilizando STL, queremos calcular el promedio general de un curso. Es decir, el promedio del promedio de todos los alumnos.
Entonces tenemos a la clase Alumno:
class Alumno
{
private:
char * nombre;
std::vector<int> notas;
public:
Alumno(char * nombre);
char *getNombre() const;
void setNombre(char *newNombre);
double promedio();
void addNota(int nota);
};
Y Curso:
class Curso
{
private:
char * nombre;
std::vector<Alumno> alumnos;
public:
Curso(char * nombre);
char *getNombre() const;
void setNombre(char *newNombre);
void addAlumno(Alumno a);
double promedioGeneral();
};
No copio todo el cpp porque me va quedar un post muy largo, pero es fácil de implementar. Ahora bien, primero calculamos el promedio de los alumnos:
double Alumno::promedio()
{
int sum = std::reduce(this->notas.begin(),
this->notas.end(),
0);
return sum / this->notas.size();
}
Y luego el promedio de los alumnos, para esto pasamos el vector de alumnos a un vector de promedios y luego calculamos el promedio:
double Curso::promedioGeneral()
{
std::vector<double> promedios;
std::transform(this->alumnos.begin(),
this->alumnos.end(),
std::back_inserter(promedios),
[](Alumno elem) {
return elem.promedio();
});
double acu = std::reduce(promedios.begin(),
promedios.end(),
0);
return acu / promedios.size();
}
Ya sé que podria solo calcular el promedio con reduce pero hago el transform, solo para hacer más completo el ejemplo.
Y para probarlo podemos hacer :
using namespace std;
int main()
{
Alumno unAlumno("Juan");
unAlumno.addNota(65);
unAlumno.addNota(75);
unAlumno.addNota(85);
Alumno otroAlumno("Pedro");
otroAlumno.addNota(64);
otroAlumno.addNota(56);
otroAlumno.addNota(85);
Curso cpp("curso c++");
cpp.addAlumno(unAlumno);
cpp.addAlumno(otroAlumno);
cout << "Promedio general :" << cpp.promedioGeneral() << endl;
return 0;
}
Y listo!!
No hay que olvidarse importar vector y numeric:
#include <vector>
#include <numeric>