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^3map 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^2000Dans 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. TEST(Creation, AvecCoefsNonNuls) {
Polynôme p1{ {1.2, 3, 4, 5} };
Polynôme p2{ {{0,1.2}, {1,3}, {2,4}, {3,5}} };
EXPECT_EQ(p1, p2);
}<< 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. TEST(Creation, AvecCoefsNuls) {
Polynôme p1{ {{0,1}, {1,0}, {2,3}, {3,4}, {2000,0}} };
Polynôme p2{ {{0,1}, {2,3}, {3,4}, } };
EXPECT_EQ(p1, p2);
} TEST(Somme, SommeSansRienDeParticulier) {
Polynôme p1{ {1, 0, 2, 1} };
Polynôme p2{ {1, 2, 0, 1} };
Polynôme somme_ref{ {2, 2, 2, 2} };
EXPECT_EQ(p1 + p2, somme_ref);
EXPECT_EQ(p2 + p1, somme_ref);
}
TEST(Somme, SommeOuCoefsSAnnulent) {
Polynôme p1{ {1, 0, 2, 1} };
Polynôme p2{ {1, 2, 0, -1} };
Polynôme somme_ref{ {2, 2, 2} };
EXPECT_EQ(p1 + p2, somme_ref);
EXPECT_EQ(p2 + p1, somme_ref);
}
TEST(Somme, SommeAvecPolynômeNul) {
Polynôme p{ {1, 0, 2, 1} };
Polynôme p_nul;
EXPECT_EQ(p + p_nul, p);
EXPECT_EQ(p_nul + p, p);
}Polynôme operator+(...)) : TEST(Somme, SommeAvecConstante) {
Polynôme p{ {0, 0, 2, 1} };
double d{ 1.2 };
Polynôme somme_ref{ {1.2, 0, 2, 1} };
EXPECT_EQ(p + d, somme_ref);
EXPECT_EQ(d + p, somme_ref);
}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).