/*******************************************************************************************
P9rev1.cpp
read data into an array of objects, then display them and some calculations
Uses "safe" array to hold objects.
*******************************************************************************************/
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
#include "safearray.h"
//prototypes
void readDBase(string file, safearray& list);
void readInput(string file, safearray& list);
void XRef(const safearray& DB, safearray& order);
float subTotal(const safearray&);
void showList(const safearray&);
void main() {
string filename;
cout << "Enter the INVENTORY/DATABASE FILE to read: ";
cin >> filename;
safearray DBase;
readDBase(filename, DBase);
cout << "Enter the SCANNER FILE to read: ";
cin >> filename;
safearray Input;
readInput(filename, Input);
float taxRate;
cout << "Enter the tax rate (as a percent): ";
cin >> taxRate;
cout << endl;
// run by the scanner data to see what is a valid item in the order
XRef(DBase, Input);
//perform necessary calculations
float subtotal = subTotal(Input);
float tax = subtotal * taxRate/100.0;
float total = subtotal + tax;
//display the "invoice"
showList(Input);
cout << "----------------------------------" << endl
<< "Subtotal: $" << subtotal << endl;
cout.unsetf(ios::fixed);
cout.precision(6);
cout << "Tax (" << taxRate;
cout.setf(ios::fixed);
cout.precision(2);
cout << "%): $" << tax << endl
<< "Total: $" << total << endl;
}
// ------- Load the database file from disk and init counters -------
void readDBase(string file, safearray& list) {
ifstream fin(file.c_str());
for (int i = 0; i < safearray::maxsize; i++) {
int P;
if (fin >> P) {
list[i].part = P;
fin >> list[i].desc >> list[i].price;
}
else
break;
}
}
// ------- Load the list of scanned part numbers from disk
void readInput(string file, safearray& list) {
ifstream fin(file.c_str());
for (int i = 0; i < safearray::maxsize; i++) {
int P;
if (fin >> P)
list[i].part = P;
else
break;
}
}
// ------- Cross-reference the list and increment the count of items that are ordered
void XRef(const safearray& DB, safearray& order) {
//go thru and see what's been ordered
for (int i = 0; i < order.count(); i++) //for each item ordered
for (int j = 0; j < DB.count(); j++) //find it's corresponding entry
if (order[i].part == DB[j].part) { // in the database list
order[i].desc = DB[j].desc; //copy its info over
order[i].price = DB[j].price;
break;
}
}
// ------- parse the DBase for the subtotal of all items -------
float subTotal(const safearray& list) {
float sum = 0.;
for (int i = 0; i < list.count(); i++)
sum += list[i].price;
return sum;
}
// ------- print out the individual items -------
void showList(const safearray& list) {
//currency formatting
cout.setf(ios::fixed);
cout.precision(2);
for (int i = 0; i < list.count(); i++) //for each item in the list
cout << list[i].desc << " (" << list[i].part << ") $" << list[i].price << endl;
}