Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Cvičení k 16. lekci OOP v C++

C a C++ C++ Objektově orientované programování Cvičení k 16. lekci OOP v C++

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti objektově orientovaného programování v C++ z minulé lekce. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulého tutoriálu a pokuste se na to přijít.

Jednoduchý příklad

Představte si, že programujete internetový obchod. Vytvořte aplikaci, ve které budou figurovat:

  • zákazníci
  • adresy
  • produkty
  • objednávky

Jednotlivým třídám vymyslete vlastnosti a vytvořte konstruktory. Objednávka bude mít odkazy na produkty a zákazníka. Zákazník bude mít atribut určující fakturační a dodací adresu.

Snad do každého internetového obchodu potřebujeme zaintegrovat platební bránu. Takovou platební bránu nám poskytne nějaká externí společnost, určitě si ji nevyrobíme doma na koleni. Od jejího poskytovatele jsme tedy získali rozhraní, které musí implementovat třída Objednavka v našem obchodu, aby ji bylo možné bránou zaplatit. Rozhraní je následující:

Gateway.h

class Gateway
{
public:
    /*
     * Order number
     */
    virtual int getNumber() = 0;

    /*
     * Customer's first name
     */
    virtual string getFirstName() = 0;

    /*
     * Customer's last name
     */
    virtual string getLastName() = 0;

    /*
     * Facturing informations
     */
    virtual string getStreet() = 0;
    virtual string getHouseNumber() = 0;
    virtual string getCity() = 0;
    virtual string getZip() = 0;
    virtual string getCountry() = 0;

    /*
     * Order informations
     */
    virtual const string * const Products() = 0;

    virtual const int * const  Quantities() = 0;

    virtual const double * const  Prices() = 0;

    virtual int countOfProducts() = 0;
};

Vlastnosti jsou:

  • číslo objednávky
  • jméno zákazníka
  • příjmení zákazníka
  • ulice z fakturační adresy zákazníka
  • číslo popisné
  • město
  • PSČ
  • stát
  • pole názvů objednaných produktů
  • pole počtů objednaných produktů
  • pole cen objednaných produktů
  • celkový počet různých objednaných produktů

Implementujte toto rozhraní ve své třídě objednávka. Následně vytvořte instanci adresy, zákazníka a testovací objednávky. Přidejte do aplikace třídu zastupující platební bránu od nějaké firmy. Kód má následující:

GatewayProces­sing.cpp

#include "GatewayProcessing.h"
#include <iostream>
using namespace std;

void GatewayProcessing::process(Gateway & request)
{
    cout << "Objednavka cislo. " << request.getNumber() << endl;
    cout << "=============" << endl;
    cout << "Jmeno:   " << request.getFirstName() << " " << request.getLastName() << endl;
    cout << "Adresa:  " << request.getStreet() << " " << request.getHouseNumber() << endl;
    cout << "         " << request.getZip() << " " << request.getCity() << endl;
    cout << "         " << request.getCountry() << endl;
    cout << "=============" << endl;

    int numberOfProducts = request.countOfProducts();
    const string * const products = request.Products();
    const double * const prices = request.Prices();
    const int * const numbers = request.Quantities();

    for (int i = 0; i < numberOfProducts; i++)
    {
        cout << products[i] << endl << "  " << prices[i] << "Kc x " << numbers[i] << " ks" << endl;
    }

    double price = 0;
    for (int i = 0; i < numberOfProducts; i++)
        price += prices[i] * numbers[i];

    cout << endl << "Celkova cena " << price << "Kc" << endl;

    delete[] products;
    delete[] prices;
    delete[] numbers;
}

GatewayProcessing.h

#ifndef __GATEWAY_PROCESSING_H_
#define __GATEWAY_PROCESSING_H_
#include "Gateway.h"

class GatewayProcessing
{
public:
    void process(Gateway& request);
};

#endif

Pokud jste implementovali správně rozhraní, půjde přes tuto třídu vytisknout vaše objednávka, i když autor třídy vaši třídu Objednavka nikdy neviděl. Máme zde krásnou praktickou ukázku užitečnosti rozhraní :) Zde je možný kód pro vytvoření objednávky a předání objednávky bráně.

Adresa adresa("Zahradky", "12/45", "Praha", "16000", "Czech Republic");
Zakaznik zakaznik("Karel", "Vomacka", adresa, adresa);

Produkt produkt("Body pro ITnetwork.cz", 200);
Produkt produkt2("Kniha o programovani", 800);

Produkt produkty[3];
produkty[0] = produkt;
produkty[1] = produkt2;
produkty[2] = produkt;
Objednavka objednavka(zakaznik, produkty, 3, 54321);
// Vytvoření brány a předání objednávky bráně
GatewayProcessing p;
p.process(objednavka);

Ukázka obrazovky programu:

Konzolová aplikace
Objednavka cislo. 54321
=============
Jmeno:   Karel Vomacka
Adresa:  Zahradky 12/45
         16000 Praha
         Czech Republic
=============
Body pro ITnetwork.cz
  200Kc x 2 ks
Kniha o programovani
  800Kc x 1 ks

Celkova cena 1200Kc

Středně pokročilý příklad

Vytvořte předka reprezentujícího obecný nástroj. Předek bude disponovat atributy vaha, nazev a abstraktní metodou pracuj(), která nebere žádný parametr a vrací string.

Z nástroje vytvořte potomky Pila, Sroubovak a Kladivo. Kladivo bude mít vlastnost typu bool zda je obouruční. Nástroje budou implementovat metodu pracuj() tak, že kladivo vypíše do konzole "zatloukam" a podobně. Přidejte ještě potomka šroubováku ElektrickySroubovak, který má navíc kapacitu baterie, nastavitelnou v konstruktoru.

V druhé části úkolu vytvořte třídu Bedna, která bude sloužit k uchovávání nářadí. Její vlastností je maximální váha (nosnost, tedy kolik bedna unese) a poté váha nářadí, které je v ní vložené. Implementujte metody pro vložení nástroje do bedny a vyndání nástroje z bedny. Ošetřete, aby se nedal vložit nástroj tak, aby se překročila nosnost bedny. Zamyslete se nad zapouzdřením, pole s nářadím nesmí být veřejné, aby se nedal obejít limit nosnosti.

Vaši práci demonstrujte na testovacích datech. Nakonec nechte všechny nástroje v bedně pracovat.

Konzolová aplikace
V bedne je pila Fiskar, pila obloukova, sroubovak Torx, sroubovak Philips elektricky
rezu
rezu
sroubuji
sroubuji elektricky
V bedne je pila Fiskar, pila obloukova, sroubovak Torx, sroubovak Philips elektricky, male kladivo
rezu
rezu
sroubuji
sroubuji elektricky
zatloukam

Pokročilý příklad

Vytvořte aplikaci, ve které figurují třídy Clovek, který je abstraktním předkem pro třídy Muz a Zena. Člověk má atributy jmeno, prijmeni a datumNarozeni. Jelikož nás datum a čas v kurzu teprve čekají, ukládejte jej pouze jako string.

Člověku přetižte operátor + tak, aby se sečtením dvou lidí opačného pohlaví získal nový člověk (dítě). Nový člověk bude buď Muz nebo Zena, to náhodně vylosujte s pravděpodobností 50:50. Noví muži dostanou jméno "Adam", ženy "Eva" a příjmení po otci, resp. matce. Jako datum narození dětem nastavte řetězec "now". Při sečtení lidí stejného pohlaví získáme hodnotu NULL.

Ukázka obrazovky programu:

Konzolová aplikace
Jan Novy a Pavla Stara spolu maji dite Adam Novy

 

Stáhnout

Staženo 3x (34.44 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

 

Článek pro vás napsal patrik.valkovic
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Miniatura
Následující článek
Šablonové třídy v C++
Aktivity (3)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!