// CIS22B, Fall 2020: Assignment 5 solution #include #include #include #include #include using namespace std; struct NFL_Team { string name; string conference; string division; unsigned short wins; unsigned short losses; unsigned short ties; }; void getNFL_Teams(const string& filename, NFL_Team* teams); void processGames(const string& filename, NFL_Team* teams); int getTeamIndexInString(const string& String, NFL_Team* teams); int getScorefromTeamScoreString(const string& teamScoreString); void printStandings(NFL_Team* teams); void printTeams(NFL_Team* teams); float sortKey(const NFL_Team& team); float percent(const NFL_Team& team); void sortForStandings(NFL_Team a[]); void swap(NFL_Team& a, NFL_Team& b); const int NumTeams = 32; const string TeamsFile = "c:/temp/teams.txt"; const string ScoresFile = "c:/temp/scores.txt"; int main() { NFL_Team teams[NumTeams]; getNFL_Teams(TeamsFile, teams); printTeams(teams); // output for verification only processGames(ScoresFile, teams); printTeams(teams); // output for verification only sortForStandings(teams); printTeams(teams); // output for verification only printStandings(teams); } void getNFL_Teams(const string& filename, NFL_Team* teams) { ifstream fin(filename); string buffer; if (!fin) { cerr << "Unable to open team file " << filename << endl; exit(1); } int i = 0; string conference; string division; size_t pos; while (getline(fin,buffer)) { // skip a blank line if (buffer.size()<2) continue; // remove \r for Unix/Linux/Mac execution if (buffer.back() =='\r') buffer.resize(buffer.size()-1); if (buffer.find("Conference") != string::npos) { pos = buffer.find(' '); conference = buffer.substr(0,pos+1); continue; } else if (buffer.find("FC") != string::npos) { pos = buffer.find(' '); division = buffer.substr(pos+1); continue; } else { teams[i].name = buffer; teams[i].conference = conference; teams[i].division = division; teams[i].wins = 0; teams[i].losses = 0; teams[i].ties = 0; i++; } } if (!fin) fin.clear(); fin.close(); } void processGames(const string& filename, NFL_Team* teams) { string buffer; string team1, team2; string teamscore1, teamscore2; // string to hold team name and score int score1, score2; int team1Index, team2Index; ifstream fin(filename); size_t commaPos; if (!fin) { cerr << "Unable to open games file " << filename << endl; exit(2); } while (getline(fin,buffer)) { if (!fin) break; if (buffer.size() < 1) continue; commaPos = buffer.find(','); teamscore1 = buffer.substr(0,commaPos); teamscore2 = buffer.substr(commaPos+2); team1Index = getTeamIndexInString(teamscore1, teams); team2Index = getTeamIndexInString(teamscore2, teams); // Make sure teams are valid if (team1Index < 0 || team2Index < 0) { cerr << "Unable to process scores record: " << teamscore1 << ", " << teamscore2 << endl; exit(2); } score1 = getScorefromTeamScoreString(teamscore1); score2 = getScorefromTeamScoreString(teamscore2); if (score1 > score2) { teams[team1Index].wins++; teams[team2Index].losses++; } else if (score1 < score2) { teams[team2Index].wins++; teams[team1Index].losses++; } else { teams[team2Index].ties++; teams[team1Index].ties++; } } fin.close(); } int getTeamIndexInString(const string& String, NFL_Team* teams) { for (int i = 0; i < NumTeams; i++) { if (String.find(teams[i].name) != string::npos) return i; } return -1; } int getScorefromTeamScoreString(const string& teamScoreString) { size_t scorePos = teamScoreString.rfind(' ') + 1; return stoi(teamScoreString.substr(scorePos)); } float percent(const NFL_Team& team) { return (team.wins + .5 * team.ties)/ (team.wins + team.losses + team.ties); } void printStandings(NFL_Team* teams) { string div; cout << setprecision(3) << fixed; for (int i = 0; i < NumTeams; i++) { if (i%(NumTeams/2) == 0) cout << endl << teams[i].conference << " Football Conference" << endl; if (teams[i].division != div) { cout << endl << left << setw(6) << teams[i].division << "Division W L T Pct" << endl; div = teams[i].division; } cout << left << setw(25) << teams[i].name << right << setw(3) << teams[i].wins << setw(6) << teams[i].losses << setw(6) << teams[i].ties << setw(8) << percent(teams[i]) << endl; } } void printTeams(NFL_Team* teams) { cout << setprecision(3) << fixed << left; for (int i = 0; i < NumTeams; i++) { cout << setw(25) << teams[i].name << setw(9) << teams[i].conference << setw(6) << teams[i].division << setw(2) << teams[i].wins << setw(2) << teams[i].losses << setw(2) << teams[i].ties << setw(8) << percent(teams[i]) << setw(10) << sortKey(teams[i]) << endl; } cout << endl; } float sortKey(const NFL_Team& team) { char firstCharOfConference = team.conference[0]; char firstCharOfDivision = team.division[0]; int conferenceAsAnInt = static_cast(firstCharOfConference); int divisionAsAnInt = static_cast(firstCharOfDivision); float pctInReverseOrder = 1 - percent(team); float key = 100 * conferenceAsAnInt + divisionAsAnInt + pctInReverseOrder; return key; } void sortForStandings(NFL_Team a[]) { int minIndex; for (int i = 0; i < NumTeams - 1; i++) { minIndex = i; for (int j = i + 1; j < NumTeams; j++) { if (sortKey(a[j]) < sortKey(a[minIndex])) { minIndex = j; } } if (minIndex != i) { swap(a[i], a[minIndex]); } } } void swap(NFL_Team& a, NFL_Team& b) { NFL_Team temp = a; a = b; b = temp; }