#include #include #include #include #include #include #include using namespace std; struct Votes { int total {}; int electorial {}; }; struct State { string name{}; int electorial{}; int total{}; int trump{}; int clinton{}; }; istream & operator>>(istream & is, State & s) { getline(is, s.name, '\t'); is >> s.electorial >> s.total >> s.trump >> s.clinton; return is; } int main(int argc, char* argv[]) { if ( argc != 2 ) { cerr << "Anropas enligt \"" << argv[0] << "\" DATAFIL\n"; return 1; } ifstream ifs{ argv[1] }; if ( ! ifs ) { cerr << "Kunde inte öppna filen \"" << argv[1] << "\"\n"; return 2; } ifs.ignore(numeric_limits::max(), '\n'); Votes clinton; Votes trump; vector states; copy(istream_iterator{ifs}, istream_iterator{}, back_inserter(states)); trump = accumulate(begin(states), end(states), Votes{}, [](Votes v, State const & s) { v.total += s.trump; if (s.clinton < s.trump ) v.electorial += s.electorial; return v; }); clinton = accumulate(begin(states), end(states), Votes{}, [](Votes v, State const & s) { v.total += s.clinton; if (s.clinton > s.trump ) v.electorial += s.electorial; return v; }); int total_votes = accumulate(begin(states), end(states), 0, [](int v, State const & s) { return v+s.total;}); cout << "Clinton: " << fixed << setprecision(2) << 100*(clinton.total / static_cast(total_votes)) << "% " << clinton.electorial << '\n' << "Trump: " << 100*(trump.total / static_cast(total_votes)) << "% " << trump.electorial << endl; }