En vous référant à la documentation disponible sous ce lien et en n'hésitant pas à demander à l'enseignant de vous accompagner, installer un environnement de développement sur votre ordinateur.
En fonction de l'environnement, essayer de créer un projet “console” et ensuite ajouter le code suivant dans ce projet.
rational.hpp
#ifndef rationalHPP #define rationalHPP #include<exception> #include<stdexcept> #include<iostream> class rational { private: long m_numerator; long m_denominator; template<typename charT, typename charTraits> friend inline std::basic_ostream<charT, charTraits>& operator << ( std::basic_ostream<charT, charTraits>& aStream, const rational& aRational); public: rational() : m_numerator(0), m_denominator(1) {} rational(long theNumerator) : m_numerator(theNumerator), m_denominator(1) {} rational(long theNumerator, long theDenominator) { if (theDenominator == 0) throw std::invalid_argument("denominator is 0"); if (theDenominator < 0) { theNumerator *= -1; theDenominator *= -1; } m_numerator = theNumerator; m_denominator = theDenominator; } rational(const rational& aRational): m_numerator(aRational.m_numerator), m_denominator(aRational.m_denominator) {} operator double() const { return (double)m_numerator / (double)m_denominator; } rational operator + (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator + m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } rational operator - (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator - m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } rational operator * (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_numerator, m_denominator * m_numerator); } rational operator / (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator - m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } }; template<typename charT, typename charTraits> inline std::basic_ostream<charT, charTraits>& operator << ( std::basic_ostream<charT, charTraits>& aStream, const rational& aRational) { aStream << aRational.m_numerator; if (aRational.m_denominator != 1) aStream << "/" << aRational.m_denominator; return aStream; } #endif
main.cpp
#include"rational.hpp" #include<iostream> int main() { try { rational valueA = { 1, 0 }; } catch (std::exception& e) { std::cout << e.what() << std::endl; } rational valueA = { 4, 3 }; rational valueB = { 3, 4 }; std::cout << "A + B = " << (valueA + valueB) << std::endl; std::cout << "A - B = " << (valueA - valueB) << std::endl; std::cout << "A * B = " << (valueA * valueB) << std::endl; std::cout << "A / B = " << (valueA / valueB) << std::endl; std::cout << "4 * B = " << (4 * valueB) << std::endl; return 0; }
Assurez vous que le projet compile et s'exécute correctement.
Créer un projet “console” vide dans votre environnement de développement.
Ajoutez un fichier Counter.h
ou Counter.hpp
ou Counter.hh
dans votre fichier et introduisez la structure de la classe Counter
dans ce fichier.
class MyCounter { public: unsigned counter; unsigned max; };
Ajoutez les fonctions membres à votre compteur :
class MyCounter { public: ... void increment() { counter ++; if(counter > max) counter = 0; } void reset() { counter = 0; } };
Expliquer ce que font ces fonctions membres.
Testez le code avec le programme main.cpp
suivant :
#include<iostream> #include "counter.hpp" void testCounter() { MyCounter counterA; counterA.counter = 0; counterA.max = 2; MyCounter counterB; counterB.counter = 0; counterB.max = 4; for(int i = 0; i < 4; i++) { std::cout << "compteur A: (" << counterA.counter << ", " << counterA.max << ")" << std::endl; std::cout << "compteur B: (" << counterB.counter << ", " << counterB.max << ")" << std::endl; counterA.increment(); counterB.increment(); } } int main() testCounter(); return 0; }
Expliquer le comportement des compteurs.
Nous voyons dans le code précédent que nous créons un compteur
et que nous l'initialisation en mettant à jour les valeurs counter
et max
.
Cependant, ceci n'est pas optimal pour plusieurs raisons:
max
ou le champ counter
a été initialisé,max
est inférieur à la valeur du counter
, ce qui ne doit jamais se produire.Vérifier le problème de la mauvaise initialisation d'un objet en exécutant le code suivant.
void createArrayOfCounters() { MyCounter counters[4]; for(int i = 0, i < 4; i ++) std::cout << i << " : " << counters[i].counter << "/" << counters[i].max << std::endl; } void main() { createArrayOfCounters(); return 0; }
Proposer des constructeurs pour les compteurs pour s'assurer que le compteur est bien initialisé.
On proposera au moins deux constructeurs :
counter
à 0 et max
à une valeur maximale passée en paramètre et strictement supérieure à 0,counter
et max
à des valeurs passées en paramètre. Cependant si counter
est supérieur à max
on met counter
à 0. Ajouter ces constructeurs à votre classe.
Modifier la fonction testCounter
pour utiliser ces constructeurs afin de créer et d'initialiser les objets counterA
et counterB
.