Deliverables:
1) A phone number, made up of three integers:
area_code (3 digits),
prefix (3 digits),
last_four (4 digits).
In other words, if the number for a phone object was to be (650)949-7777, then area_code=650, prefix=949,
and last_four=7777.
2) Two per/minute rates (doubles): one local and one long distance:
local_rate: basic charge for local calls, per minute.
ld_rate: basic charge for long distance calls, per minute.
These rates will be modified under certain conditions listed below.
3) Values (doubles) that constantly change:
local_minutes: the number of local minutes that this phonehas used since last bill.
ld_minutes: the number of long distance minutes that this phone has used since last bill.
total_charges: the accumulated charges since the last bill.
Public member functions:
void Phone::Init(long ac, long pfx, long last4
This method will set the phone number to the arguments passed in and all the remaining private members to 0.
This could be done
by a constructor, althought we have not officially had them yet,
so we can use an ordinary member function for this assignment.
-----
void Phone::SetCharges( double local_rt, double ld_rt )
This method will set the local_rate and ld_rate according to the
values passed in. If either argument is negative, it prints an
error and does not change the private members.
-----
void Phone::MakeCall( Phone callee, long duration_in_secs )
The most complex of the member functions, this method will compute
the charges for a single call to callee that lasts duration_in_secs
seconds.
The algorithm for this function is as follows:
The object that is used to call this function is the call-er. The first parameter is the call-ee, that is, the number that the caller is calling.
If the area code of the callee and the object doing doing the calling
(the call-ER) are the same, the local_rate applies.
If the area code of the callee and the object doing doing the calling
(the call-ER) are different, the ld_rate applies.
Further adjustments to the rate must then be made:
For local calls, if the prefix of the callee differs from the prefix
of the caller by more than 200 then the local_rate should be doubled.
e.g., (650) 949-7384 and (650)949-5250 would be local_rate, while
(650) 949-7384 and (650)748-5610 would be 2*local_rate.
For long distance calls, if the area code of the callee differs from
the area code of the caller by more than 200 then the ld_rate should
be doubled.
e.g., (650) 949-7384 and (464)850-5250 would be ld_rate, while
650) 949-7384 and (408)555-5610 would be 2*ld_rate.
Once the rate for the call is determined, the charge for that one call
should be calculated and added to the accumulated total_charges for that
month.
-----
void
Phone::PrintBillAndReset();
This should report the summary of charges for the month by printing the total charges and the number of local and long-distance minutes used. It should also clear out these three values in preparation for a new month of billing.
Test this out by creating several (3 - 5) Phone objects and having
them call each other. They should be in various area codes and prefixes
(although at least 2 should be local to each other). Print out the
phone bill for these Phones, then make a call or two more, and print again
to confirm that the old charges were erased when the first bill was
printed.
Here is an example of the start (but not completion!) of a main that
tests this class:
-----------------
Phone me, mom, dad, flynn, tenya;
me.Init(415, 435, 9792);
mom.Init(415, 940, 6654);
dad.Init(561, 324, 7693);
flynn.Init(561, 320, 1208);
tenya.Init(969, 234, 1221);
me.SetCharges(.03, .10);
mom.SetCharges(.03, .10);
dad.SetCharges(.03, .10);
flynn.SetCharges(.04, .8);
tenya.SetCharges(.02, .15);
me.MakeCall( mom, 300);
dad.MakeCall( mom, 240);
me.MakeCall( dad, 121);
// the main() function continues to go on and test ...
// ... the test would consist of printing bills ...
me.PrintBillAndReset();
mom.PrintBillAndReset();
dad.PrintBillAndReset();
// etc ...
// and checking that the output matches your program.
---------------------