812347A Olio-ohjelmointi syksy 2015, viikkotehtävä 3

812347A Olio-ohjelmointi syksy 2015, viikkotehtävä 3
Eräs kuukausittain ilmestyvä lehti tarjoaa kahdentyyppisiä tilauksia: normaalissa tilauksessa lehti
tilataan tietyksi ajaksi (tasakuukausina) ja tilaaja maksaa tilauksen keston mukaisen hinnan
kuukausihinnan perusteella. Kestotilaus on voimassa toistaiseksi, tilaajia laskutetaan kerran
vuodessa, ja he saavat prosenttimääräisen alennuksen normaalitilauksen hinnasta. Esimerkiksi, jos
kuukausihinta olisi 10€ ja kestotilaajan alennusprosentti olisi 20, vuoden normaalitilaus maksaisi
120€ ja kestotilaaja maksaisi vuosittain 96€. Toteuta C++-kielellä tilannetta mallintava
luokkarakenne
Subscription
on kaikkien tilausten yhteinen kantaluokka, jonka perivät normaalitilausta
mallintava luokka RegularSubscription ja kestotilausta mallintava luokka
StandingSubscription. Kaikkien tilausten yhteisiä tietoja ovat std::string-tyyppiset
lehden_nimi, tilaajan_nimi ja toimitusosoite sekä double-tyyppinen kuukausihinta.
Normaalitilauksesta tunnetaan tilauksen_kesto (int) ja kestotilauksesta alennusprosentti (int).
Toteuta luokkiin muodostimet sekä jäsenten asetus- ja saantimetodit. Lisäksi on toteutettava laskun
tulostava metodi printInvoice(), joka tulostaa tilauksen tyypin, lehden nimen, tilaajan nimen,
toimitusosoitteen, laskutettavien kuukausien lukumäärän (kestotilauksessa aina 12) ja tilauksen
hinnan. Metodi on toteutettava niin, että jokaisen tilausolion laskutietojen tulostamiseen voi käyttää
kirjoittamaasi funktiota
void printSubscriptionInvoice(Subscription &subs)
Huomaa, että parametrin tyyppi on viite kantaluokkaan Subscription. Em. funktio on vapaa
funktio, ts. se ei sisälly mihinkään luokkaan ja sille annetaan parametriksi jommankumman
tilausluokan (joko RegularSubscription tai StandingSubscription) olio. Näin demonstroidaan
dynaamista sidontaa käyttämällä yliluokan mukaista viitettä erityyppisten olioiden tietojen
tulostamiseen.
Kirjoita lopuksi pääohjelma, jossa testataan luokkaa. Pääohjelmassa on tehtävä ainakin seuraavat
operaatiot:
1. Syötetään näppäimistöltä riittävät tiedot, jotta voidaan luoda vähintään yksi olio
kummastakin luokasta RegularSubscription ja StandingSubscription.
2. Tulostetaan luotujen olioiden laskutustiedot käyttämällä funktiota
printSubscriptionInvoice.
Kirjoita luokkien määrittelyt erillisiin otsikkotiedostoihin (.h), luokan metodien toteutukset
omiin lähdekooditiedostoihinsa (.cpp) ja pääohjelma omaan lähdekooditiedostoonsa
(vt3main.cpp). Tehtävän ratkaisu on palautettava viimeistään 14.10.2015.
812347A Object-oriented programming autumn 2015, weekly assignment 3
A magazine that is issued once a month offers two kinds of subscriptions: by regular subscription a
customer subscribes to fixed number of issues (i.e. number of months); a standing subscription is
valid until cancelled. Regular subscription is paid according to monthly price. Standing subscription
is paid once a year and subscribers get a given percentage discount from monthly price. For
example, if monthly price is 10€, a year’s normal subscription would cost 120€, and, if discount
percentage would be 20, standing subscription would cost 96€ each year. Implement with C++ a
class structure representing the situation.
Subscription is a common base class for all subscriptions; it is inherited by class
RegularSubscription that represents a regular subscription and by class StandingSubscription
that represents standing subscription. Common attributes for all subscriptions are magazine_name,
subscriber_name, subscriber_address (std::string), and monthly_price (double). Regular
subscription also has an attribute for subscriprion_duration (int). Standing subscription has an
attribute for discount_percentage (int). Implement constructors and methods for setting and
getting attributes for each class. Moreover, implement a method printInvoice() for printing an
invoice for customer: it prints subscription’s type, magazine’s name, subscriber’s name and address,
the number of months to be billed (by standing subscription always 12), and the price.
Method shall be implemented so that function
void printSubscriptionInvoice(Subscription &subs)
can be used to print invoices for objects of each class. (You should implement the function
printSubscriptionInvoice). Note that the parameter of the function is a reference to base class
Subscription. Thus you demonstrate dynamic binding by using base class reference when printing
invoice information for different classes.
Write a main program to test the classes. Main program shall contain at least the following
operations:
1. Input from keyboard information to construct objects of both classes
RegularSubscription and StandingSubscription.
2. Print invoice information for created objects using the function
printSubscriptionInvoice.
Define the classes in dedicated header files (.h), Implement the methods of the classes in
separate code files (.cpp) and the main program in one code file (wa3main.cpp). The
assignment should be returned not later than 14.10.2015.