Bjarne Stroustrup “Programming Principles and Practice Using C++”
Chapter 9 Exercise 16
Using std_lib_facilities.h by Bjarne Stroustrup.
[code language=”cpp”]
// Philipp Siedler
// Bjarne Stroustrup’s PPP
// Chapter 9 Exercise 16
#include "std_lib_facilities.h"
enum currency {
USD, EUR, GBP
};
class Money {
public:
long int amount;
currency cur;
//constructors
Money();
Money(double);
Money(currency, double);
//non-modifying operations
long int get_amount() { return amount; }
double get_amount_decimal();
//modifying operations
};
Money::Money() {
amount = 0;
cur = USD;
}
Money::Money(double a) {
double temp_d0 = a;
temp_d0 *= 100;
int temp_i = (int)temp_d0;
double difference = temp_d0 – temp_i;
if (difference >= 0.5) {
temp_i++;
}
amount = temp_i;
cur = USD;
}
Money::Money(currency c, double a) {
double temp_d0 = a;
temp_d0 *= 100;
int temp_i = (int)temp_d0;
double difference = temp_d0 – temp_i;
if (difference >= 0.5) {
temp_i++;
}
amount = temp_i;
cur = c;
}
double Money::get_amount_decimal() {
return double(amount) / 100;
}
double EURtoUSD(double d) {
return d * 1.12;
}
double GBPtoUSD(double d) {
return d * 1.26;
}
double USDtoEUR(double d) {
return d * 0.89;
}
double GBPtoEUR(double d) {
return d * 1.13;
}
double USDtoGBP(double d) {
return d * 0.78;
}
double EURtoGBP(double d) {
return d * 0.88;
}
Money operator+(Money & m1, Money & m2) {
switch (m1.cur) {
case USD: {
switch (m2.cur) {
case USD: {return Money(USD, m1.get_amount_decimal() + m2.get_amount_decimal()); }
case EUR: {return Money(USD, m1.get_amount_decimal() + EURtoUSD(m2.get_amount_decimal())); }
case GBP: {return Money(USD, m1.get_amount_decimal() + GBPtoUSD(m2.get_amount_decimal())); }
}
}
case EUR: {
switch (m2.cur) {
case USD: {return Money(m1.get_amount_decimal() + USDtoEUR(m2.get_amount_decimal())); }
case EUR: {return Money(m1.get_amount_decimal() + m2.get_amount_decimal()); }
case GBP: {return Money(m1.get_amount_decimal() + GBPtoEUR(m2.get_amount_decimal())); }
}
}
case GBP: {
switch (m2.cur) {
case USD: {return Money(GBP, m1.get_amount_decimal() + USDtoGBP(m2.get_amount_decimal())); }
case EUR: {return Money(GBP, m1.get_amount_decimal() + EURtoGBP(m2.get_amount_decimal())); }
case GBP: {return Money(GBP, m1.get_amount_decimal() + m2.get_amount_decimal()); }
}
}
}
}
istream & operator>>(istream & is, Money & m) {
string cur;
char l;
double amount;
while (true) {
is >> l;
if (isalpha(l)) {
cur += l;
}
else {
if (cur == "USD" || cur == "EUR" || cur == "GBP") {
if (cur == "USD") {
m.cur = currency::USD;
}
else if (cur == "EUR") {
m.cur = currency::EUR;
}
else if (cur == "GBP") {
m.cur = currency::GBP;
}
}
else {
cout << "Invalid currency" << cur << endl;
break;
}
is.putback(l);
is >> amount;
m = Money(m.cur, amount);
break;
}
}
return is;
}
ostream & operator<<(ostream & os, Money & m) {
switch (m.cur) {
case(USD):
{
os << "USD " << m.get_amount_decimal();
return os;
}
case(EUR):
{
os << "EUR " << m.get_amount_decimal();
return os;
}
case(GBP):
{
os << "GBP " << m.get_amount_decimal();
return os;
}
}
}
void calculate() {
cout << "Enter first set of money as float: " << endl;
cout << "Supported currencies: EUR, GBP, USD," << endl;
cout << "Format example: USD 12.235" << endl;
Money money1;
cin >> money1;
cout << "Enter second set of money as float: " << endl;
cout << "Supported currencies: EUR, GBP, USD," << endl;
cout << "Format example: USD 12.235" << endl;
Money money2;
cin >> money2;
Money money3 = money1 + money2;
cout << money1 << " + " << money2 << " = ";
cout << money3 << endl;;
}
int main()
try
{
calculate();
keep_window_open();
}
catch (runtime_error e) {
cout << e.what() << endl;
keep_window_open();
}
catch (…) {
cout << "Exiting" << endl;
keep_window_open();
}
[/code]
Output: Enter first set of money as float: Supported currencies: EUR, GBP, USD, Format example: USD 12.235 USD 423.325 Enter second set of money as float: Supported currencies: EUR, GBP, USD, Format example: USD 12.235 EUR 544.234 USD 423.33 + EUR 544.23 = USD 1032.87 Please enter a character to exit