ex2-3.cpp - Example 2-3 Reference Variables - function parameters (2)

// File:  ex2-3.cpp   Reference Variables - function parameters

#include <iostream>
#include <string>
using namespace std;

const int 	NumTeams = 5;
const int 	NumScores = 11;

struct team {
  char		name[10];
  unsigned	won;
  unsigned	lost;
  unsigned	tied;
};

struct league {
  team		teams[NumTeams];
};

struct score {
  char      teamname[2][10];
  unsigned	points[2];
};

// function prototypes
void 	initializeLeague(league& L);
void 	enterScores(score S[]);
int	getTeamNumFromName(league& L, const char* Name);
void	updateWonLostTied(league& L, score* S);
void	printLeagueStats(league& L);

int main (void) {
  league		Birds;
  score		Scores[NumScores];

  initializeLeague(Birds);
  enterScores(Scores);
  updateWonLostTied(Birds,Scores);
  printLeagueStats(Birds);

  return 0;
}

// Assign team names and zero out won, lost, tied
void initializeLeague(league& L) {
  for (int i = 0; i < NumTeams; i++)
  {
    cout << "Enter team name => ";
    cin >> L.teams[i].name;
    L.teams[i].won = 0;
    L.teams[i].lost = 0;
    L.teams[i].tied = 0;
  }
  cout << endl << NumTeams << " teams initialized\n\n";
}

void enterScores(score S[]) {
  cout << "Enter " << NumScores << " scores:\n";
  for (int i = 0; i < NumScores; i++)
  {
    cout << "<team #1> <score #1> <team #2> <score #2> => ";
    cin >> S[i].teamname[0] >> S[i].points[0]
        >> S[i].teamname[1] >> S[i].points[1];
  }
  cout << endl << NumScores << " scores entered\n\n";
}

// lookup and return the teamno
int	getTeamNumFromName(league& L, const char* Name) {
  for (int i = 0; i < NumTeams; i++)
  {
    if (strcmp(L.teams[i].name,Name) == 0) return i;
  }
  cerr << "Error: unable to find team: " << Name << endl;
  return -1;		// team name not found
}

void	updateWonLostTied(league& L, score* S)
{
  int		i,
  			team0,
            team1;

  for (i = 0; i < NumScores; i++)
  {
    team0 = getTeamNumFromName(L,S[i].teamname[0]);
    team1 = getTeamNumFromName(L,S[i].teamname[1]);

// if team name is bad, don't use the score
    if (team0 == -1 || team1 == -1) continue;

    if (S[i].points[0] > S[i].points[1]) {	// team0 won
      L.teams[team0].won++;
      L.teams[team1].lost++;
    }
    if (S[i].points[0] < S[i].points[1]) {	// team1 won
      L.teams[team1].won++;
      L.teams[team0].lost++;
    }
    if (S[i].points[0] == S[i].points[1]) {	// tie game
      L.teams[team0].tied++;
      L.teams[team1].tied++;
    }
  }
}

void	printLeagueStats(league& L) {
  int	i;
  cout << "\nName\tWon\tLost\tTied\n";
  for (i = 0; i < NumTeams; i++)
  {
    cout << L.teams[i].name << '\t'
         << L.teams[i].won << '\t'
         << L.teams[i].lost << '\t'
         << L.teams[i].tied << '\n';
  }
}

/************************  Sample Run  ****************************

Enter team name => coots
Enter team name => ducks
Enter team name => eagles
Enter team name => finches
Enter team name => geese

5 teams initialized

Enter 11 scores:
<team #1> <score #1> <team #2> <score #2> => coots 5 ducks 2
<team #1> <score #1> <team #2> <score #2> => coots 3 eagles 7
<team #1> <score #1> <team #2> <score #2> => coots 1 finches 0
<team #1> <score #1> <team #2> <score #2> => coots 0 geese 0
<team #1> <score #1> <team #2> <score #2> => ducks 1 eagles 4
<team #1> <score #1> <team #2> <score #2> => ducks 5 finches 2
<team #1> <score #1> <team #2> <score #2> => ducks 2 geese 1
<team #1> <score #1> <team #2> <score #2> => eagles 7 finches 7
<team #1> <score #1> <team #2> <score #2> => eagles 8 geese 5
<team #1> <score #1> <team #2> <score #2> => finches 3 geese 2
<team #1> <score #1> <team #2> <score #2> => gooses 9 ducks 2

11 scores entered

Error: unable to find team: gooses

Name    Won     Lost    Tied
coots   2       1       1
ducks   2       2       0
eagles  3       0       1
finches 1       2       1
geese   0       3       1

******************************************************************/



CIS27: Programming in C++    Instructor: Joe Bentley