/*	Election Summary program.
	Allows entry and display of election results for a multiprecinct election 
	as precinct data is entered                                                                          */

#include <iostream.h>
#include <lvp\vector.h>
#include <lvp\matrix.h>
#include <lvp\string.h>
#include <lvp\bool.h>

struct ResultsType {
	ResultsType();    // Constructor 
	const int NumCandidates;
	const int NumPrecincts;
	vector<String> Candidates;
	matrix<int> Votes;
};
//--------------------------------------------------------------------------------
ResultsType::ResultsType()
	: NumCandidates(3), NumPrecincts(5),
	  Votes(NumCandidates, NumPrecincts, 0), Candidates(NumCandidates) 
{
}
//--------------------------------------------------------------------------------
void LoadNames(ResultsType &R)
/*	Prompts user to enter all candidate names, and stores them in Results
	Post: Candidate names are stored in Results                                            */
{
	for (int CNum=0; CNum<R.NumCandidates; CNum++) {
		cout << "Enter name for candidate " << (CNum+1) << ": ";
		cin >> R.Candidates[CNum];
	}
}
//--------------------------------------------------------------------------------
void LoadAPrecinct(ResultsType &R)
/*	Prompts user to choose a precinct, and then prompts for and
	stores votes for each candidate for that precinct
	Post: Votes entered for a precinct                                                */
{
	int UserPct;
	cout << "What precinct? " ;
	cin >> UserPct;
	int PctNum = UserPct - 1;
	for (int CNum=0; CNum<R.NumCandidates; CNum++) {
	cout << "Enter votes for this precinct for " << R.Candidates[CNum] << ": ";
		cin >> R.Votes[CNum][PctNum];
	}
}
//--------------------------------------------------------------------------------
void DisplayCandidateRow(const ResultsType &R, int CNum, const int CField,
							const int VField)
/*	Displays data for one candidate in the format: Name  p1  p2  p3 … Total
	Pre: 0 <= CNum < R.NumCandidates
	Post: Data for candidate CNum displayed                                                   */
{
	cout.setf(ios::left);
	cout.width(CField); cout << R.Candidates[CNum];
	cout.setf(ios::right);
	int Total = 0;
	for (int PNum=0; PNum<R.NumPrecincts; PNum++) {
		cout.width(VField); cout << R.Votes[CNum][PNum];
		Total = Total + R.Votes[CNum][PNum];
	}
	cout.width(VField); cout << Total << endl;
}
//--------------------------------------------------------------------------------
void DisplayAll(const ResultsType &R)
/*	Displays all data entered as well as totals for each candidate
	Post: Candidate names, votes, and total votes displayed         */
{
	const int CandidateField = 10;
	const int VotesField = 6;

	// Display headings
	cout.setf(ios::left);
	cout.width(CandidateField); cout << "Candidate";
	cout.setf(ios::right);
	for (int PNum=0; PNum<R.NumPrecincts; PNum++) {
		cout.width(VotesField); cout << (PNum+1);
	}
	cout.setf(ios::right);
	cout.width(VotesField); cout << "Total" << endl;

	// Display rows
	for (int CNum=0; CNum<R.NumCandidates; CNum++)
		DisplayCandidateRow(R, CNum, CandidateField, VotesField);
}
//--------------------------------------------------------------------------------
int main()
{
	ResultsType Results;
	bool Quit=false;
	LoadNames(Results);
	do {
		cout << endl;
		char Choice;
		cout << "Enter precinct, Display results, Quit: ";
		cin >> Choice;
		switch (Choice){
			case 'E':
			case 'e': LoadAPrecinct(Results); break;
			case 'D':
			case 'd': DisplayAll(Results); break;
			case 'Q':
			case 'q': Quit = true; break;
		}
	} while (!Quit);
	return (0);
}



