Hi,
As you are
very new to c++ there is no reason why you should use C arrays in your code. Leave them to the experts :)
Here is a starting point for your problem:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
enum e_Day {Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat};
struct Balloon
{
int day;
int time;
int distance;
Balloon() : day(0), time(0), distance(0)
{}
Balloon(std::istream& in)
{
in >> day >> time >> distance;
}
struct IsDayBalloon
{
e_Day day;
IsDayBalloon(e_Day d) : day(d)
{}
bool operator() (const Balloon& balloon)
{
return balloon.day == day;
}
};
static bool CompareDistance(const Balloon& b1, const Balloon& b2)
{
return b1.distance < b2.distance;
}
static double AddDistance(double distance, const Balloon& balloon)
{
return distance + balloon.distance;
}
};
typedef std::vector<Balloon> Balloons;
Balloons DayBalloons(const Balloons& balloons, e_Day day)
{
Balloons day_balloons;
std::copy_if(balloons.begin(), balloons.end(), std::back_inserter(day_balloons), Balloon::IsDayBalloon(day));
return day_balloons;
}
Balloon MaxDistance(const Balloons& balloons)
{
return balloons.size() ?
*std::max_element(balloons.begin(), balloons.end(), Balloon::CompareDistance) :
Balloon();
}
Balloon MaxDayDistance(const Balloons& balloons, e_Day day)
{
return MaxDistance(DayBalloons(balloons, day));
}
Balloons MaxDistances(const Balloons& balloons)
{
Balloons max_dist_balloons;
for (int day = Sun; day <= Sat; ++day)
max_dist_balloons.push_back(MaxDayDistance(balloons, (e_Day)day));
return max_dist_balloons;
}
double AverageDistance(const Balloons& balloons)
{
return balloons.size() ?
std::accumulate(balloons.begin(), balloons.end(), double(), Balloon::AddDistance) / balloons.size() :
0;
}
double AverageDayDistance(const Balloons& balloons, e_Day day)
{
return AverageDistance(DayBalloons(balloons, day));
}
std::vector<double> AverageDayDistances(const Balloons& balloons)
{
std::vector<double> average_distances;
for (int day = Sun; day <= Sat; ++day)
average_distances.push_back(AverageDayDistance(balloons, (e_Day)day));
return average_distances;
}
size_t ReadBalloons(std::istream& in, Balloons& balloons)
{
balloons.clear();
while (in)
{
balloons.push_back(Balloon(in));
}
return balloons.size();
}
int main()
{
Balloons balloons;
std::ifstream in("test.txt");
ReadBalloons(in, balloons);
Balloons max_dist_balloons = MaxDistances(balloons);
std::vector<double> average_distances = AverageDayDistances(balloons);
std::cout << "Average distance: " << AverageDistance(balloons) << std::endl;
return 0;
}
When you have understood and completed it you will still be
very new to c++ and still learning a lot but on a better learning track.
cheers,
AR