M2103-TP1-Exo-1-Corrigé


/**
*
* \file    Duree.cpp
*
* \authors M. Laporte
*
* \date    02/04/2018
*
* \version V2.0
*
* \brief  classe Duree et test de cette classe
*
**/
#include <iostream>
#include <iomanip>   // setw()

using namespace std;

typedef unsigned long long ULLong_t;

namespace
{
class Duree
{
private :
    ULLong_t       myDuree;
    short unsigned mySeconds;
    short unsigned myMinutes;
    short unsigned myHours;
    ULLong_t       myDays;

    void normaliser (void);

public :
    Duree  (const ULLong_t duree);

    ULLong_t getDuree (void) const;

    void display (void) const;

    void incr (const ULLong_t delta = ULLong_t (0));
    void decr (const ULLong_t delta = ULLong_t (0));

}; // Duree

Duree::Duree  (const ULLong_t duree) : myDuree (duree)
{
    normaliser ();

} // Duree()

void Duree::normaliser (void)
{
    myDays    =  myDuree / 86400;
    myHours   = (myDuree % 86400) / 3600;
    myMinutes  = (myDuree % 3600) / 60;
    mySeconds =  myDuree % 60;

} // normaliser()

ULLong_t Duree::getDuree (void) const { return myDuree; }

void Duree::display (void) const
{
    cout << setw (10) << myDays    << " jour(s)"
    << setw (3)  << myHours   << " heure(s)"
    << setw (3)  << myMinutes << " minute(s)"
    << setw (3)  << mySeconds << " seconde(s)";

} // display()

void Duree::incr (const ULLong_t delta /* = ULLong_t (0) */)
{
    myDuree += delta;
    normaliser ();

} // incr()

void Duree::decr (const ULLong_t delta /* = ULLong_t (0) */)
{
    myDuree -= (delta > myDuree) ? myDuree : delta;

} // decr()

void testDureeDeBase (void)
{
    ULLong_t oneDuree;
    for (cin >> oneDuree; ! cin.eof (); cin >> oneDuree)
    {
        Duree duree (oneDuree);
        duree.display();
        cout << endl;
    }
    Duree d1 (0);
    d1.incr (1);
    cout << "Nbre sec. " << setw (6) << d1.getDuree ()
            << ", soit : ";
    d1.display ();
    cout << '\n';

    d1.decr (1);
    cout << "Nbre sec. " << setw (6) << d1.getDuree ()
            << ", soit : ";
    d1.display ();
    cout << '\n';

    d1.incr (3662);
    cout << "Nbre sec. " << setw (6) << d1.getDuree ()
            << ", soit : ";
    d1.display ();
    cout << '\n';

    d1.decr (10000);
    cout << "Nbre sec. " << setw (6) << d1.getDuree ()
            << ", soit : ";
    d1.display ();
    cout << '\n';

} // testDureeDeBase()

} // namespace

int main (void)
{
    testDureeDeBase ();
    return 0;

} // main()