[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-team] Off-Topic : Problème de programmation C++
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;
}