Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
public:pumpa [2011/01/13 09:34]
Petr Svenda [PB161 - závěrečný příklad - Obsluha pumpy]
public:pumpa [2018/02/24 19:10] (aktuální)
Řádek 1: Řádek 1:
 +====== PB161 - závěrečný příklad - Obsluha pumpy ======
 +  * Úkol zadán: **13. 12. 2010**
 +  * Deadline odevzdání:​ **12. 2. 2010**
 +
 +Doplnění zadání (zobrazeno __podtrženě__):​
 +  * 13.1. přidán ukázkový kód pro kompilaci a ukázka výstupu ​
 +
 +=====Úvod=====
 +Představme si nějaký relativně složitý stroj, výrobní linku, linku na plnění lahví nebo něco podobného. Součástí tohoto stroje je čerpadlo, které se používá třeba na pohánění kapaliny v okruhu chlazení, nebo na cokoli jiného. Čerpadlo (a pravděpodobně i celý stroj) je ovládáno pomocí počítače,​ jedná se o jednoduchý typ čerpadla, lze ho pouze zapnout nebo vypnout, pracuje s konstantními otáčkami. Z celého stroje nás bude zajímat pouze toho čerpadlo a ta část programu, která ho řídí. ​
 +Představme si také, že v rámci modernizace našeho stroje bude vyměněno čerpadlo za novější typ, u kterého lze ovládat také počet otáček za sekundu a zapínat nebo vypínat tichý mód chodu čerpadla. Máte k dispozici starou verzi řídícího programu. Vaším úkolem bude rozšířit a vylepšit funkčnost programu tak, aby jím bylo možno ovládat tento nový typ čerpadla. ​
 +
 +=====Zadání=====
 +Prostudujte dosavadní implementaci tříd z balíku {{:​public:​pump.zip|pump.zip}} ​
 +  * Pump (soubory Pump.h a Pump.cc) – čerpadlo  ​
 +  * ParameterBool (soubory ParameterBool.h a ParameterBool.cc) – parametr uchovávajíci logickou hodnotu, která určuje, je-li čerpadlo vypnuté nebo běží  ​
 +  * Logger a ConsoleLogger (soubory Logger.h a Logger.cc) – obstarává logování akcí na konzoli  ​
 +  * a hlavní program (soubor Main.cc), ​
 +
 +Diagram uvedených tříd vypadá takto:
 +
 +{{:​public:​diagramzadani.png|}}
 +
 +  * Změňte třídu ParameterBool,​ aby byla potomkem Parameter<​bool>​. Tato třída se bude používat jako doposud k zapínání a vypínání čerpadla, nově ji budeme používat k zapínání a vypínání tichého módu. ​
 +  * Implementujte třídu ParameterDouble (v souborech ParameterDouble.h a ParameterDouble.cc),​ která bude potomkem Parameter<​double>​. Tuto třídu budeme používat pro nastavení otáček čerpadla. ​
 +  * Implementujte šablonu Parameter (v souboru Parameter.h) a přesuňte co nejvíce ze společné funkcionality ze tříd ParameterBool a ParameterDouble do šablony Parameter. Ta by zejména měla obsahovat jako atribut, který není veřejně přístupný,​ následující: ​
 +    * uchovávanou hodnotu (typu double nebo bool) 
 +    * jméno parametru ​
 +    * ukazatel na logovací objekt ​
 +  * Bude také obsahovat ​
 +    * metody pro přístup k uchovávané hodnotě GetValue, SetValue s prototypem odpovídajícím těmto metodám v původní třídě ParameterBool ​
 +    * metodu pro nastavení ukazatele na logovací objekt SetLogger ​
 +    * metodu pro logování ​
 +    * metodu s tímto předpisem: virtual std::string ToString() = 0;, ta bude využita při logování změny hodnoty ​
 +
 +Zděděné třídy mohou implementovat další potřebné metody, v odůvodněném případě mohou přetížit chování metod předka.
 +Třída ParameterDouble bude navíc obsahovat atributy pro uchování minimální a maximální hodnoty a také metody ​
 +  * void SetLimits( const double& min, const double& max ) a  ​
 +  * void GetLimits( double& min, double& max ) const 
 +pro jejich zadání a vyčtení. ​
 +
 +  * Nezapomeňte na logování ve metodě SetLimits. Volání metody SetValue bude pro třídu ParameterDouble provádět také kontrolu, zda nově nastavená hodnota leží uvnitř mezi minimání a maximální hodnotou (nebo je rovna). Kontrola, zda se právě nastavovaná hodnota liší od hodnoty aktuální, samozřejmě zůstává. ​
 +  * Třída Pump bude vytvářet všechny tyto parametry (nastavovat iniciální hodnoty, logovací objekty a omezení parametrů) a bude obsahovat funkce, které vracejí ukazatel na jednotlivé parametry: void GetTurns(ParameterDouble*&​),​ void GetOnOff(ParameterBool*&​) a void GetSilentMode(ParameterBool*&​). ​
 +  * Vytvořte třídu FileLogger jako potomka třídy Logger. Její konstruktor bude možno volat se jménem souboru, který se má otevřít pro psaní na konec, případně bez argumentů, v tom případě otevře a bude zapisovat na konec souboru log.txt. Nepodaří-li se soubor otevřít, bude o tom uživatel informován. Souborový proud bude uložen jako soukromý atribut a musí být řádně uzavřen. Třída FileLogger bude implementovat metodu void Log(const string message), která bude zapisovat do souboru zadaný text, v rozumném formátu zapíše rovněž aktuální čas. Deklaraci třídy FileLogger uložte do souboru Logger.h, implementaci do souboru Logger.cc. ​
 +
 +Diagram tříd výsledné podoby programu, který máte vytvořit, je takovýto (seznam metod není závazný):
 +
 +
 +{{:​public:​diagramvysledek.png|}}
 +=====Požadavky:​=====
 +  * Odevzdáváte následující soubory (uložte do svého odevzdávacího adresáře:/​export/​e1/​pb161/​váš_login/​zaver): ​
 +    * Pump.h, ​
 +    * Pump.cc, ​
 +    * Parameter.h, ​
 +    * ParameterBool.h, ​
 +    * ParameterBool.cc, ​
 +    * ParameterDouble.h, ​
 +    * ParameterDouble.cc, ​
 +    * Logger.h a 
 +    * Logger.cc  ​
 +=====Testování=====
 +  * Odevzdané soubory by mělo být možné zkompilovat s následujícím souborem pumpamain.cc ​  
 +<code c pumpamain.cc>​
 +#include "​Logger.h"​
 +#include "​Pump.h"​
 +#include "​ParameterBool.h"​
 +#include "​ParameterDouble.h"​
 +
 +using namespace std;
 +
 +int main(int argc, char *argv[])
 +{
 +    // create logger object
 +    Logger* pLogger = new FileLogger( "​logFile.txt"​ );
 +
 +    // create pump instance
 +    Pump* pPump01 = new Pump( pLogger );
 +
 +    // get control parameter pointers
 +    ParameterDouble* pPump01turns;​
 +    pPump01->​GetTurns( pPump01turns );
 +
 +    ParameterBool* pPump01onOff;​
 +    pPump01->​GetOnOff( pPump01onOff );
 +
 +    ParameterBool* pPump01silMode;​
 +    pPump01->​GetSilentMode( pPump01silMode );
 +
 +    // set parameters
 +    pPump01turns->​SetLimits( 0.0, 10.0 );
 +    pPump01turns->​SetValue( 10.0 );
 +    pPump01turns->​SetValue( 10.0 );
 +    pPump01turns->​SetValue( 20.0 );
 +
 +    pPump01onOff->​SetValue( true );
 +
 +    pPump01turns->​SetValue( 300.0 );
 +
 +    pPump01silMode->​SetValue( true );
 +
 + 
 +    // cleanup
 +    delete pPump01;
 +    delete pLogger;
 +    pLogger = NULL;
 +
 +    return 0;
 +}
 +</​code>​
 +
 +  * Odevzdané soubory překládejte pomocí g++ -ansi -pedantic -Wall -o pumpa Logger.cc pumpamain.cc ParameterBool.cc ParameterDouble.cc Pump.cc
 +  * Po spuštění programu ./pumpa vznikne soubor //​logFile.txt//​
 +  * Obsahem výsledného souboru //​logFile.txt//​ by měl být následující výstup:
 +
 +  09:​13:​36 ​ Setting up the pump
 +  09:​13:​36 ​ turns: No need to change
 +  09:​13:​36 ​ on/off: No need to change
 +  09:​13:​36 ​ silent mode: No need to change
 +  09:​13:​36 ​ turns: Limits changed (min: 0, max: 10)
 +  09:​13:​36 ​ turns: Value changed (10)
 +  09:​13:​36 ​ turns: No need to change
 +  09:​13:​36 ​ turns: Value out of the range (20)
 +  09:​13:​36 ​ on/off: Value changed (true)
 +  09:​13:​36 ​ turns: Value out of the range (300)
 +  09:​13:​36 ​ silent mode: Value changed (true)
 +  09:​13:​36 ​ Shutting down the pump
 +
 +
 +=====Poznámky:​=====
 +  * Pro získání aktuálního času můžete použít například funkce time a localtime z hlavičkového souboru <​ctime> ​
 +  * Zdrojové soubory ukázkového řešení mají včetně komentářů tyto délky: Pump.h - 28 řádků, Pump.cc - 60, Parameter.h - 79, ParameterBool.h - 15, ParameterBool.cc - 14, ParameterDouble.h - 23, ParameterDouble.cc - 52, Logger.h - 46, Logger.cc - 52, 
 +  * Autorem úlohy je Vít Klouček (51514@mail.muni.cz)
  
QR Code
QR Code public:pumpa (generated for current page)