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.
© Copyright 2024