Dichotomie

Résolu
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

kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Bonjour,

Qu'est ce qui te pose problème là dedans?
0
bibeul
 
Je voudrais l'écrire en C++
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Oui mais qu'est ce qui te pose problème dans la traduction en C++?
0
bibeul
 
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
bibeul
 
help me SVP
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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   Statut Contributeur Dernière intervention   1 846
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Je sais pas ce que je ferais sans toi, tu me rattrappes toutes mes erreurs en ce moment :-)
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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   Statut Contributeur Dernière intervention   1 846
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846 > kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention  
 
Oui, rien ne vaut le C :d
0
bibeul
 
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
bibeul
 
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   Statut Contributeur Dernière intervention   1 846
 
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
bibeul
 
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   Statut Contributeur Dernière intervention   1 846
 
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
bibeul
 
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
bibeul
 
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   Statut Contributeur Dernière intervention   1 846
 
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
bibeul
 
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
bibeul
 
Je viens de me rendre compte d'une dernière chose la valeur m ne s'affiche pas à la fin
0