Bonjour !
J'ai un probl�me (sans doute) simple de programmation
en C++, concernant des pointeurs.
L'exercice est d'impl�menter l'algorithme de COLLATZ.
cad: L'utilisateur entre un nombre entier. A chaque �tape,
- si le nombre est pair, il le divise par 2.
- si le nombre est impair, il le multiplie par 3 et
ajoute 1.
L'algorithme d'ach�ve quand on atteint le nombre 1.
exemple : Du nombre de d�part 6, on a :
6 - 3 - 10 - 5 - 16 - 8 - 4 - 2 - 1
Actuellement, on ne sait pas si l'algorithme s'ach�ve pour
chaque valeur enti�re de d�part. (en en est presque sur,
mais on ne peut pas le prouver...)
Puisqu'on ne sait pas si la suite de nombres sera finie ou
infinie, pour impl�menter cet algo, il faut "chainer" des
nombres, donc allocation dynamique de la m�moire, d'o�
l'id�e des pointeurs.
J'ai essay� d'�crire un petit prog. en C++, mais il y a un
probl�me... ca ne fonctionne pas comme voulu...
Il a �t� �crit sous C++Builder 3.0, en console (donc sans
tout l'environnement graphique).
Je joins le code (fichier collp.cpp) o� est d�crit plus en
d�tails le probl�me. Je ne le comprends pas vraiment.
Il semble y avoir deux pointeurs qui occupent la m�me
adresse m�moire !!
Merci d'avance pour votre aide !!
#pragma hdrstop
#include <condefs.h>
#include "iostream.h" //pour cin, cout
#include "conio.h" //pour getch()
//Definition d'un membre de la suite de Collatz
struct Etape {
int Valeur; //Valeur du nombre
Etape* Suivant; //Adresse du nombre suivant dans la suite
};
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char **argv)
{
int CurrentVal;
cout << "ALGORITHME DE COLLATZ"<<endl;
cout << "====================="<<endl<<endl;
cout << "Entrez le nombre de d�part (ENTIER) : " ;
cin >> CurrentVal; //Saisit le nombre entr� par l'utilisateur
//d�finit la chaine de nombres de Collatz :
Etape* Chaine = new Etape;
//Place le nombre introduit par l'utilisateur dans la chaine, et "termine" la chaine.
Chaine->Valeur = CurrentVal;
Chaine->Suivant = NULL;
//sauvegarde la t�te de la chaine pour pouvoir la relire en entier par la suite
Etape* ChaineTete = new Etape;
ChaineTete = Chaine;
//CALCULE LES VALEURS DES NOMBRES SUCCESSIFS DE COLLATZ, JUSQU'A ATTEINDRE 1
Etape* Suite = new Etape; //d�clare un terme qui sera chain� aux autres
while (CurrentVal != 1)
{ //calcule la valeur du terme suivant
if (CurrentVal % 2 ==0)
CurrentVal = CurrentVal / 2;
else
CurrentVal = (3 * (CurrentVal)) + 1;
//inscrit dans le terme Suite le terme suivant
Suite->Valeur = CurrentVal;
Suite->Suivant = NULL;
//EN FAISANT CES DEUX INSTRUCTIONS, IL A MODIFIE DE LA MEME
//MANIERE CHAINE QUE SUITE. POURQUOI ??????????????????????
//Lie le nouveau terme au pr�c�dent
Chaine->Suivant = Suite;
//passe au terme suivant pour lier correctement le terme suivant
Chaine = Chaine->Suivant;
}
delete Suite;
//affiche les �tapes
getch();
while (ChaineTete->Valeur != 0)
{ cout << ChaineTete->Valeur<<endl;
ChaineTete= ChaineTete->Suivant;
}
cout << ChaineTete->Valeur<<endl;
//Attend une touche pour terminer le programme
cout<<"Appuyez sur une touche pour terminer";
getch();
//Nettoie la m�moire
delete Chaine;
delete ChaineTete;
return 0;
}