14 mai 2025
Cet exercice a pour but de :
Pour ce faire, vous allez coder une classe permettant de gérer les
polynômes en vous inspirant de Fraction1.cpp
, Fraction2.cpp
et Fraction3.cpp
.
Appliquez la procédure Construire un projet C++ avec cmake au canevas SampleGoogleTest.zip.
Sans vous lancer dans l’implémentation, décidez de la structure
de données que vous souhaitez employer pour stocker les coefficients
dans votre classe Polynôme
.
Votre classe Polynôme
aura deux constructeurs :
vector
de coefficients. Par exemple,
Polynôme p1{ {1.2, 3, 4, 5} };
crée le polynôme
1.2 + 3X + 4X^2 + 5X^3
map
de paires (degré, coefficient). Par exemple,
Polynôme p2{ {{0,1.2}, {1,3}, {2000,4}} };
crée le
polynôme 1.2 + 3X + 4X^2000
Dans unitTests/unitTests.cpp
, écrivez le test
TEST(Creation, AvecCoefsNonNuls)
(cf. code ci-dessous) et
modifiez src/core/Polynome.h
et
src/core/Polynome.cpp
pour que ce test soit OK. NB :
src/core/Polynôme.h
, la méthode :
bool operator==(const Polynôme&) const = default;
Polynôme p2{ {{0,1.2}, {1,3}, {2,4}, {3,5}} };
du test
ci-dessous, selon vous, vaut-il mieux considérer que p2
est
défini à l’aide d’un vector<pair<int, double>
,
d’une map<int, double>
ou bien encore d’une
unordered_map<int, double>
? N’hésitez pas à en
discuter avec l’intervenant·e si la réponse n’est pas claire pour
vous.(Creation, AvecCoefsNonNuls) {
TEST{ {1.2, 3, 4, 5} };
Polynôme p1{ {{0,1.2}, {1,3}, {2,4}, {3,5}} };
Polynôme p2(p1, p2);
EXPECT_EQ}
<<
pour votre
classe polynôme et, pour vérifier que votre affichage est correct,
affichez un polynôme grâce à du code écrit dans
src/core/myMain.cpp
.Dans Polynome.h
, ajoutez
friend std::ostream &operator<<(std::ostream& os, Polynome const& p);
et implantez cette fonction dans votre .cpp
.
TEST(Creation, AvecCoefsNuls)
pour voir comment votre code
résiste à des coefficients nuls.(Creation, AvecCoefsNuls) {
TEST{ {{0,1}, {1,0}, {2,3}, {3,4}, {2000,0}} };
Polynôme p1{ {{0,1}, {2,3}, {3,4}, } };
Polynôme p2(p1, p2);
EXPECT_EQ}
(Somme, SommeSansRienDeParticulier) {
TEST{ {1, 0, 2, 1} };
Polynôme p1{ {1, 2, 0, 1} };
Polynôme p2{ {2, 2, 2, 2} };
Polynôme somme_ref(p1 + p2, somme_ref);
EXPECT_EQ(p2 + p1, somme_ref);
EXPECT_EQ}
(Somme, SommeOuCoefsSAnnulent) {
TEST{ {1, 0, 2, 1} };
Polynôme p1{ {1, 2, 0, -1} };
Polynôme p2{ {2, 2, 2} };
Polynôme somme_ref(p1 + p2, somme_ref);
EXPECT_EQ(p2 + p1, somme_ref);
EXPECT_EQ}
(Somme, SommeAvecPolynômeNul) {
TEST{ {1, 0, 2, 1} };
Polynôme p;
Polynôme p_nul(p + p_nul, p);
EXPECT_EQ(p_nul + p, p);
EXPECT_EQ}
Polynôme operator+(...)
) :(Somme, SommeAvecConstante) {
TEST{ {0, 0, 2, 1} };
Polynôme pdouble d{ 1.2 };
{ {1.2, 0, 2, 1} };
Polynôme somme_ref(p + d, somme_ref);
EXPECT_EQ(d + p, somme_ref);
EXPECT_EQ}
Polynôme(double const d);
(en mentionnant le mot-clé
explicit(false)
devant !). Voir le cours pour le compromis
que cela représente.src/test/unitTests.cpp
. Vérifiez que
tous les tests sont OK et améliorez votre code si ce n’est pas le
cas.Si vous avez réalisé une implémentation à base de vector
(respectivement map
), faites l’implémentation à base de
map
(respectivement vecteur
). Pour ce faire
:
Polynome.cpp
en
PolynomeVersionVector.cpp
(respectivement
PolynomeVersionMap.cpp
)src/core/CMakeLists.txt
pour qu’il ne
contienne désormais que les lignes suivantes :add_library(lib_core
myMain.cpp myMain.h
Polynome.h PolynomeVersionVector.cpp
)
target_include_directories(lib_core PUBLIC ./)
Polynome.h
, remplacez
std::vector<double> coef;
par
std::map<unsigned int, double> coef;
(ou
vice-versa).PolynomeVersionVector.cpp
en
PolynomeVersionMap.cpp
ou vice-versa.src/core/CMakeLists.txt
, remplacez
PolynomeVersionVector
par PolynomeVersionMap
(ou vice-versa)..cpp
jusqu’à ce que sa
compilation et les tests soient OK.NB :
Corrigé (à exploiter selon la procédure Construire un projet C++ avec cmake).