Dichotomie
Résolu
bibeul
-
bibeul -
bibeul -
Bonjour,
pourriez vous m'aide à écrire cet algorithme en c++ :
Module principal
Variables : a,b : réels
p : réel
m : réel
y : réel
yl : réel
trouvé : booléen ;
Lire a, b ;
Lire p ;
yl <- f(a) ;
trouvé <- Faux ;
Tant que ((|a - b| > p) ET (trouvé == Faux))
m <- (a + b)/2 ;
y <- f(m) ;
Si (y==0) Alors trouvé <- Vrai ;
Sinon
Si (y et yl sont de signes contraires) Alors b <- m ;
Sinon
a <- m ; yl <- y ;
fin Sinon
fin Si
fin Sinon
fin Si
fin Tant que
Si (trouvé==Vrai) Alors Afficher "solution exacte : "
Sinon Afficher " solution approchée : " ;
Afficher m ;
fin Module principal
Merci d'avance, cordialement
17 réponses
Tout me pose problème, je n'ai jamais traduit d'algorithme en c++ mais j'ai vraiment besoin de ce programme.
Si vous pouviez me donner un coup de pouce, par exemple comment traduire " Si (y et yl sont de signes contraires) Alors b <- m " ou encore " Tant que ((|a - b| > p) ET (trouvé == Faux)) " et pour les variables ... Après je peux essayer de faire quelque chose et vous me dites si ça le fait ou pas.
En tout cas, merci beaucoup de vous pencher sur mon sujet.
Cordialement,
Si vous pouviez me donner un coup de pouce, par exemple comment traduire " Si (y et yl sont de signes contraires) Alors b <- m " ou encore " Tant que ((|a - b| > p) ET (trouvé == Faux)) " et pour les variables ... Après je peux essayer de faire quelque chose et vous me dites si ça le fait ou pas.
En tout cas, merci beaucoup de vous pencher sur mon sujet.
Cordialement,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Si (y et yl sont de signes contraires) Alors b <- m
Tant que ((|a - b| > p) ET (trouvé == Faux))
A noter que abs() a besoin de stdlib.h
D'autres soucis?
if ( (y < 0 && y1 > 0) || (y > 0 && y1 < 0) ) { b = m; }
Tant que ((|a - b| > p) ET (trouvé == Faux))
while (abs(a - b) > p && !trouve) { //.... }
A noter que abs() a besoin de stdlib.h
D'autres soucis?
Si (y et yl sont de signes contraires) Alors b <- m "
if( y*yl < 0) b=m;
Tant que ((|a - b| > p) ET (trouvé == Faux))
while( fabs(a-b) > p && ! trouve){
//bla bla
}
a,b : réels
double a,b;
if( y*yl < 0) b=m;
Tant que ((|a - b| > p) ET (trouvé == Faux))
while( fabs(a-b) > p && ! trouve){
//bla bla
}
a,b : réels
double a,b;
Allez, je mets tout :-)
#include <stdlib.h> #include <iostream> using std; int main() { double a, b, p, m, y, yl; bool trouve; cout << "Entrez la valeur de a: "; a << cin; cout << "Entrez la valeur de b: "; b << cin; cout << "Entrez la valeur de p: "; p << cin; yl = f(a); trouve = false; while (abs(a - b) && !trouve) { m = (a + b)/2; y = f(m) ; if (!y) { trouve = true; } else { if ((y < 0 && yl > 0) || (y > 0 && yl < 0)) { b = m ; } else { a = m ; yl = y; } } } if (trouve) cout << "Solution exacte: "; else cout << "Solution approchée: "; cout << m << endl; return 0; }
Tout d'abord, je vous remercie beaucoup pour votre aide, c'est super sympa. Mais le programme me trouve un erreur à la ligne " yl = f(a); " je ne comprends pas pourquoi.
Et sinon ça n'a rien avoir mais pouvez-vous m'expliquer la différence entre C et C++ car apparemment vous êtes plus pour le C
Et sinon ça n'a rien avoir mais pouvez-vous m'expliquer la différence entre C et C++ car apparemment vous êtes plus pour le C
Voila le log de la compilation
Compilateur: Default compiler Building Makefile: "C:\Users\Bibeul\Desktop\Makefile.win" Exécution de make... make.exe -f "C:\Users\Bibeul\Desktop\Makefile.win" all g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" main.cpp: In function `int main()': main.cpp:20: error: `f' undeclared (first use this function) main.cpp:20: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp:23: error: call of overloaded `abs(double)' is ambiguous C:/Dev-Cpp/include/stdlib.h:365: note: candidates are: int abs(int) C:/Dev-Cpp/include/c++/3.4.2/cstdlib:153: note: long long int __gnu_cxx::abs(long long int) C:/Dev-Cpp/include/c++/3.4.2/cstdlib:123: note: long int std::abs(long int) make.exe: *** [main.o] Error 1 Exécution terminée
Salut
yl = f(a);
Oui, c'est à toi de te faire la fonction f() qui va correspondre à ta fonction. On ne l'a pas fait car on ne sait pas ce que vaut ta fonction. Par exemple :
sera la fonction carrée.
La faute pour abs a été signalée plus haut dans nos posts. Tu dois utiliser fabs() à la place, enlever stdlib.h et rajouter à la place math
la différence entre C et C++
C++ est une couche apportée au C pour donner l'aspect objet, qui est quand même un concept intéressant.
apparemment vous êtes plus pour le C
Non pas spécialement. Tout dépend pour quoi en fait. Mais le C demande plus de vigilances de la part du programmeur si on ne veut pas faire n'importe quoi. (C'est vrai en C++ aussi d'ailleurs, mais un peu moins).
yl = f(a);
Oui, c'est à toi de te faire la fonction f() qui va correspondre à ta fonction. On ne l'a pas fait car on ne sait pas ce que vaut ta fonction. Par exemple :
double f (double x){ return x*x; }
sera la fonction carrée.
La faute pour abs a été signalée plus haut dans nos posts. Tu dois utiliser fabs() à la place, enlever stdlib.h et rajouter à la place math
la différence entre C et C++
C++ est une couche apportée au C pour donner l'aspect objet, qui est quand même un concept intéressant.
apparemment vous êtes plus pour le C
Non pas spécialement. Tout dépend pour quoi en fait. Mais le C demande plus de vigilances de la part du programmeur si on ne veut pas faire n'importe quoi. (C'est vrai en C++ aussi d'ailleurs, mais un peu moins).
ok donc la compilation se passe bien et à l'exécution après avoir entré les valeurs a, b et p le fenêtre se ferme toute seule. Ca pourrait venir d'où ? Encore merci pour votre aide !
Le programme se ferme tout seul
Tout simplement, cela vient du fait que le programme n'a pas été lancé à partir de la console. Donc la fenêtre se ferme à la fin du programme, et comme ça va vite ^^.
Astuce :
rajoute avant le return 0 final :
N'oublie pas d'inclure : #include <limits> ;)
Cdlt
Tout simplement, cela vient du fait que le programme n'a pas été lancé à partir de la console. Donc la fenêtre se ferme à la fin du programme, et comme ça va vite ^^.
Astuce :
rajoute avant le return 0 final :
cout << "entrée pour finir"; cin.ignore( numeric_limits<streamsize>::max(), '\n' );
N'oublie pas d'inclure : #include <limits> ;)
Cdlt
C'est bon tout marche nickel il fallait juste rajouter system("pause") car j'utilise dev C++ . Encore merci c'est cool . A la prochaine
Bon en fait tout n'est pas nickel :) . Juste une dernière chose, que faut-il modifier si je veux trouver par exemple le réel tel que f(x)=1 à la place de f(x)=0 ?
Salut,
Oui pour system, mais ce n'est pas très propre. Vaut mieux utiliser la solution plus C++ que je t'ai donné plus haut. Enfin c'est toi qui gère ;)
Sinon pour résoudre f(x)=1; c'est comme si tu voulais résoudre f(x)-1=0; et si tu poses g(x)=f(x)-1, tu te retrouves avec g(x)=0; ;)
Oui pour system, mais ce n'est pas très propre. Vaut mieux utiliser la solution plus C++ que je t'ai donné plus haut. Enfin c'est toi qui gère ;)
Sinon pour résoudre f(x)=1; c'est comme si tu voulais résoudre f(x)-1=0; et si tu poses g(x)=f(x)-1, tu te retrouves avec g(x)=0; ;)