Bonjour,
Je suis en train de refaire tous les TP que j'ai fais en cours C++ pour m'entrainer à la dérivation de classe, polymorphisme... Car j'ai du mal avec ces notions.
J'ai une correction de l'exercice mais il y a plusieurs bouts de code que je ne comprends pas. Je mets la consigne en premier :
Je mets le code IntegrTrapezes.cxx :
Voici la correction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 /** * * @file IntegrTrapezes.cxx * * @authors D. Mathieu * * @date 06/11/2007 * * @version V1.0 * * @brief Integration par la methodes des trapezes au moyen de * pointeurs de fonctions * **/ #include <iostream> #include <cmath> // cos(), sin(), M_PI_2 using namespace std; namespace { template <typename T, typename TRes> class IUnaryFunction { public: virtual ~IUnaryFunction(void) {} virtual TRes operator () (const T &) const throw () = 0; }; // IUnaryFunction typedef double(*FdeX) (double); double IntegrTrapezes(FdeX f, double a, double b, unsigned n) { double S = (f(a) + f(b)) / 2.0; double Delta = (b - a) / double(n); for (; --n;) S += f(a += Delta); return S * Delta; } // IntegrTrapezes void TestIntegrTrapezes(void) { cout << "IntegrTrapezes : \n\n"; cout << "Methode des trapezes : \n"; cout << "S (cos (x)) entre 0 et +Pi/2 avec 5 intervalles = " << IntegrTrapezes(cos, 0, M_PI_2, 5) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 10 intervalles = " << IntegrTrapezes(cos, 0, M_PI_2, 10) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 50 intervalles = " << IntegrTrapezes(cos, 0, M_PI_2, 50) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 100 intervalles = " << IntegrTrapezes(cos, 0, M_PI_2, 100) << '\n'; cout << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 5 intervalles = " << IntegrTrapezes(sin, -M_PI_2, 0, 5) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 10 intervalles = " << IntegrTrapezes(sin, -M_PI_2, 0, 10) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 50 intervalles = " << IntegrTrapezes(sin, -M_PI_2, 0, 50) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 100 intervalles = " << IntegrTrapezes(sin, -M_PI_2, 0, 100) << '\n'; } // TestIntegrTrapezes() } // namespace anonyme int main() { TestIntegrTrapezes(); return 0; } // main()
La première ligne que je ne comprends pas c'est dans le fichier IntegrTrapezes.cxx ligne 23,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 /** * * @file FunctorIntegrTrapezes.cxx * * @authors D. Mathieu * * @date 07/12/2011 * * @version V1.0 * * @brief Integration par la methodes des trapezes au moyen de * functor * **/ #include <iostream> #include <cmath> // cos(), sin(), M_PI_2 using namespace std; #define classdef typedef namespace { template <typename T, typename TRes> class IUnaryFunction { public : virtual ~IUnaryFunction (void) {} virtual TRes operator () (const T &) const throw () = 0; }; // IUnaryFunction typedef IUnaryFunction <double, double> CUnFctor_dd; struct CFctor_cos : public CUnFctor_dd { virtual ~CFctor_cos() {} virtual double operator() (const double & x) const throw () { return cos (x); } // operator() }; // CFctor_cos struct CFctor_sin : public CUnFctor_dd { virtual ~CFctor_sin() {} virtual double operator() (const double & x) const throw () { return sin (x); } // operator() }; // CFctor_sin double IntegrTrapezes (const CUnFctor_dd & f, double a, double b, unsigned n) { double S = (f (a) + f (b)) / 2.0; double Delta = (b - a) / double (n); for ( ; --n; ) S += f (a += Delta); return S * Delta; } // IntegrTrapezes void TestIntegrTrapezes (void) { cout << "IntegrTrapezes : \n\n"; cout << "Methode des trapezes : \n"; cout << "S (cos (x)) entre 0 et +Pi/2 avec 5 intervalles = " << IntegrTrapezes (CFctor_cos(), 0, M_PI_2, 5) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 10 intervalles = " << IntegrTrapezes (CFctor_cos(), 0, M_PI_2, 10) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 50 intervalles = " << IntegrTrapezes (CFctor_cos(), 0, M_PI_2, 50) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 100 intervalles = " << IntegrTrapezes (CFctor_cos(), 0, M_PI_2, 100) << '\n'; cout << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 5 intervalles = " << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0, 5) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 10 intervalles = " << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0, 10) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 50 intervalles = " << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0, 50) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 100 intervalles = " << IntegrTrapezes (CFctor_sin(), -M_PI_2, 0, 100) << '\n'; } // TestIntegrTrapezes() } // namespace int main() { TestIntegrTrapezes (); return 0; } // main()Je ne comprends pas pourquoi faire un pointeur mélangé avec un double... J'ai du mal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef double (*FdeX) (double);
Maintenant dans le fichier FunctorIntegrTrapezes.cxx
Si j'ai bien compris, on dérive la classe IUnaryFunction en deux nouvelles classes cos et sin mais pourquoi faire cela car on utilisait une seule classe avant ? Est-ce pour qu'elle accepte plusieurs types de données ? ça ne m'a pas l'air d'être cela car on définit un typedef juste après (je ne comprends pas non plus ce typedef :ligne 35.
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef IUnaryFunction <double, double> CUnFctor_dd;
Enfin ligne 37, on définit une structure que l'on dérive, pourquoi faire cela ? Quand j'ai essayé de faire l'exercice j'ai crée une classe et non une structure :.
Code : Sélectionner tout - Visualiser dans une fenêtre à part struct CFctor_cos : public CUnFctor_dd
Merci de votre aide !
Partager