//******************************************************************
// Election program
// This program reads votes represented by precinct number and
// ballot position from a data file, calculates the sums per
// precinct and per candidate, and writes all totals to an
// output file
//******************************************************************
#include
#include // For setw()
#include // For file I/O
#include // For string class
using namespace std;
const int NUM_PRECINCTS = 4;
const int NUM_CANDIDATES = 4;
typedef int VoteArray[NUM_PRECINCTS][NUM_CANDIDATES];
// 2-dimensional array type
// for votes
void GetNames( string[] );
void OpenForInput( ifstream& );
void OpenForOutput( ofstream& );
void WritePerCandidate( const VoteArray, const string[],
ofstream& );
void WritePerPrecinct( const VoteArray, ofstream& );
void WriteReport( const VoteArray, const string[], ofstream& );
void ZeroVotes( VoteArray );
int main()
{
string name[NUM_CANDIDATES]; // Array of candidate names
VoteArray votes; // Totals for precincts vs. candidates
int candidate; // Candidate number input from voteFile
int precinct; // Precinct number input from voteFile
ifstream voteFile; // Input file of precincts, candidates
ofstream reportFile; // Output file receiving summaries
OpenForInput(voteFile);
if ( !voteFile )
return 1;
OpenForOutput(reportFile);
if ( !reportFile )
return 1;
GetNames(name);
ZeroVotes(votes);
// Read and tally votes
voteFile >> precinct >> candidate;
while (voteFile)
{
votes[precinct-1][candidate-1]++;
voteFile >> precinct >> candidate;
}
// Write results to report file
WriteReport(votes, name, reportFile);
WritePerCandidate(votes, name, reportFile);
WritePerPrecinct(votes, reportFile);
return 0;
}
//******************************************************************
void OpenForInput( /* inout */ ifstream& someFile ) // File to be
// opened
// Prompts the user for the name of an input file
// and attempts to open the file
// Postcondition:
// The user has been prompted for a file name
// && IF the file could not be opened
// An error message has been printed
// Note:
// Upon return from this function, the caller must test
// the stream state to see if the file was successfully opened
{
string fileName; // User-specified file name
cout << "Input file name: ";
cin >> fileName;
someFile.open(fileName.c_str());
if ( !someFile )
cout << "** Can't open " << fileName << " **" << endl;
}
//******************************************************************
void OpenForOutput( /* inout */ ofstream& someFile ) // File to be
// opened
// Prompts the user for the name of an output file
// and attempts to open the file
// Postcondition:
// The user has been prompted for a file name
// && IF the file could not be opened
// An error message has been printed
// Note:
// Upon return from this function, the caller must test
// the stream state to see if the file was successfully opened
{
string fileName; // User-specified file name
cout << "Output file name: ";
cin >> fileName;
someFile.open(fileName.c_str());
if ( !someFile )
cout << "** Can't open " << fileName << " **" << endl;
}
//******************************************************************
void GetNames( /* out */ string name[] ) // Array of candidate
// names
// Reads the candidate names from standard input
// Postcondition:
// The user has been prompted to enter the candidate names
// && name[0..NUM_CANDIDATES-1] contain the input names,
// truncated to 10 characters each
{
string inputStr; // An input string
int candidate; // Loop counter
cout << "Enter the names of the candidates, one per line,"
<< endl << "in the order they appear on the ballot."
<< endl;
for (candidate = 0; candidate < NUM_CANDIDATES; candidate++)
{
cin >> inputStr;
name[candidate] = inputStr.substr(0, 10);
}
}
//******************************************************************
void ZeroVotes( /* out */ VoteArray votes ) // Array of vote totals
// Zeroes out the votes array
// Postcondition:
// All votes[0..NUM_PRECINCTS-1][0..NUM_CANDIDATES-1] == 0
{
int precinct; // Loop counter
int candidate; // Loop counter
for (precinct = 0; precinct < NUM_PRECINCTS; precinct++)
for (candidate = 0; candidate < NUM_CANDIDATES; candidate++)
votes[precinct][candidate] = 0;
}
//******************************************************************
void WriteReport(
/* in */ const VoteArray votes, // Total votes
/* in */ const string name[], // Candidate names
/* inout */ ofstream& reportFile ) // Output file
// Writes the vote totals in tabular form to the report file
// Precondition:
// votes[0..NUM_PRECINCTS-1][0..NUM_CANDIDATES] are assigned
// && name[0..NUM_CANDIDATES-1] are assigned
// Postcondition:
// The name array has been output across one line, followed by
// the votes array, one row per line
{
int precinct; // Loop counter
int candidate; // Loop counter
// Set up headings
reportFile << " ";
for (candidate = 0; candidate < NUM_CANDIDATES; candidate++)
reportFile << setw(12) << name[candidate];
reportFile << endl;
// Print array by row
for (precinct = 0; precinct < NUM_PRECINCTS; precinct++)
{
reportFile << "Precinct" << setw(4) << precinct + 1;
for (candidate = 0; candidate < NUM_CANDIDATES; candidate++)
reportFile << setw(12) << votes[precinct][candidate];
reportFile << endl;
}
reportFile << endl;
}
//******************************************************************
void WritePerCandidate(
/* in */ const VoteArray votes, // Total votes
/* in */ const string name[], // Candidate names
/* inout */ ofstream& reportFile ) // Output file
// Sums the votes per person and writes the totals to the
// report file
// Precondition:
// votes[0..NUM_PRECINCTS-1][0..NUM_CANDIDATES] are assigned
// && name[0..NUM_CANDIDATES-1] are assigned
// Postcondition:
// For each person i, name[i] has been output,
// followed by the sum
// votes[0][i] + votes[1][i] + ... + votes[NUM_PRECINCTS-1][i]
{
int precinct; // Loop counter
int candidate; // Loop counter
int total; // Total votes for a candidate
for (candidate = 0; candidate < NUM_CANDIDATES; candidate++)
{
total = 0;
// Compute column sum
for (precinct = 0; precinct < NUM_PRECINCTS; precinct++)
total = total + votes[precinct][candidate];
reportFile << "Total votes for"
<< setw(10) << name[candidate] << ":"
<< setw(3) << total << endl;
}
reportFile << endl;
}
//******************************************************************
void WritePerPrecinct(
/* in */ const VoteArray votes, // Total votes
/* inout */ ofstream& reportFile ) // Output file
// Sums the votes per precinct and writes the totals to the
// report file
// Precondition:
// votes[0..NUM_PRECINCTS-1][0..NUM_CANDIDATES] are assigned
// Postcondition:
// For each precinct i, the value i+1 has been output,
// followed by the sum
// votes[i][0] + votes[i][1] + ... + votes[i][NUM_CANDIDATES-1]
{
int precinct; // Loop counter
int candidate; // Loop counter
int total; // Total votes for a precinct
for (precinct = 0; precinct < NUM_PRECINCTS; precinct++)
{
total = 0;
// Compute row sum
for (candidate = 0; candidate < NUM_CANDIDATES; candidate++)
total = total + votes[precinct][candidate];
reportFile << "Total votes for precinct"
<< setw(3) << precinct + 1 << ':'
<< setw(3) << total << endl;
}
}