31 mars 2024
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 cmake
de ce document 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^4
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/Polynome.h
et src/Polynome.cpp
pour que ce test soit OK. NB :
src/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/myMain.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);
(sans mentionner le mot-clé
explicit
devant !).unitTests/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 cmake
de ce document).