Dichotomie

Résolu/Fermé
bibeul - 14 déc. 2008 à 01:31
 bibeul - 15 déc. 2008 à 13:49
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

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 déc. 2008 à 01:58
Bonjour,

Qu'est ce qui te pose problème là dedans?
0
Je voudrais l'écrire en C++
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 déc. 2008 à 13:55
Oui mais qu'est ce qui te pose problème dans la traduction en C++?
0
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,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
help me SVP
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
15 déc. 2008 à 01:12
Si (y et yl sont de signes contraires) Alors b <- m
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?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
15 déc. 2008 à 01:22
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;
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
15 déc. 2008 à 01:26
Ah, oui....
Bien vu pour la multiplication. Et effectivement, c'est fabs pour les nombre flottants et surtout pas abs comme je l'ai mis...
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
15 déc. 2008 à 01:30
Je sais pas ce que je ferais sans toi, tu me rattrappes toutes mes erreurs en ce moment :-)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
15 déc. 2008 à 01:25
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;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
15 déc. 2008 à 01:33
Quelle générosité !
Quelques petites coquilles néanmoins :

using namespace std;
Les entrée cin sont dans le mauvais sens : cin >> a;
Il vaut mieux utiliser fabs() de math pour les double qu'abs de stdlib.h

Cdlt (eh oui je continue)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
15 déc. 2008 à 01:36
Rah!
C'est le prix à payer pour avoir lâché le C++ quelques temps et ne faire plus que du C... :-s
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
15 déc. 2008 à 01:40
Oui, rien ne vaut le C :d
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
0
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
15 déc. 2008 à 02:02
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 :
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).
0
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 !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
15 déc. 2008 à 02:28
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 :
cout << "entrée pour finir";
cin.ignore( numeric_limits<streamsize>::max(), '\n' );


N'oublie pas d'inclure : #include <limits> ;)
Cdlt
0
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
0
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 ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
15 déc. 2008 à 09:54
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; ;)
0
Merci à tous, c'est vrai pour f(x)=1 je n'y avais pas pensé mais c'est logique. Encore merci. A la prochaine.
0
Je viens de me rendre compte d'une dernière chose la valeur m ne s'affiche pas à la fin
0