/*******************************************************************************************
09P.cpp
read data into an array of objects, display them and do some calculations on them
*******************************************************************************************/
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class soldier_t {
public:
string first;
string last;
string rank;
};
class result_t {
public:
string rank;
int count;
float percent;
};
//prototypes
void readData(string file, soldier_t[], const int size, int& count);
void readCriteria(string file, result_t list[], const int size, int& count);
void calcKnowns(soldier_t[], const int, result_t[], const int);
int countOfRank(string rank, soldier_t[], const int size);
void addUnknown(const int init, result_t results[], int& count);
void displayResults(result_t results[], const int numResults);
void main() {
//setup storage "material"
const int MaxSoldiers = 100;
soldier_t soldiers[MaxSoldiers];
int numSoldiers = 0;
const int MaxResults = 30+1;
result_t results[MaxResults];
int numResults = 0;
//get user input
string filename;
cout << "Enter the DATA FILE name: ";
cin >> filename;
readData(filename, soldiers, MaxSoldiers, numSoldiers);
cout << "Enter the RANK FILE name: ";
cin >> filename;
readCriteria(filename, results, MaxResults, numResults);
cout << endl;
calcKnowns(soldiers, numSoldiers, results, numResults);
addUnknown(numSoldiers, results, numResults);
displayResults(results, numResults);
}
// ------- Load the specified data file into the list -------
void readData(string file, soldier_t list[], const int size, int& count) {
ifstream fin(file.c_str());
for (int i = 0; i < size; i++) {
if(fin >> list[i].rank >> list[i].first >> list[i].last)
count++;
else
break;
}
}
// ------- Loat the specified criteria file into the list --------
void readCriteria(string file, result_t list[], const int size, int& count) {
ifstream fin(file.c_str());
for (int i = 0; i < size; i++) {
if(fin >> list[i].rank)
count++;
else
break;
}
}
// ------- Cross-reference and calculate between lists -------
void calcKnowns(soldier_t data[], const int numData, result_t results[], const int numResult) {
for (int i = 0; i < numResult; i++) {
results[i].count = countOfRank(results[i].rank, data, numData);
results[i].percent = (float)results[i].count / numData;
}
}
// ------- return the count of a given rank -------
int countOfRank(string rank, soldier_t list[], const int size) {
int sum = 0;
for (int i = 0; i < size; i++)
if (list[i].rank == rank)
sum++;
return sum;
}
// ------- Tweak the result array to include a final "other" category count -------
void addUnknown(const int init, result_t results[], int& count) {
results[count].rank = "Other";
results[count].count = init;
results[count].percent = 1.0;
for (int i = 0; i < count; i++) {
results[count].count -= results[i].count;
results[count].percent -= results[i].percent;
}
count++; //include the unknown data
}
// ------- Display the results in the prescribed format -------
void displayResults(result_t results[], const int numResults) {
^Icout.precision(0);
cout.setf(ios::fixed);
int total = 0;
for (int i = 0; i < numResults; i++) {
cout << results[i].rank << "s: " << results[i].count
<< " (" << results[i].percent*100 << "%)" << endl;
total += results[i].count;
}
cout << "------------------------------------" << endl
<< "Total: " << total << endl;
}