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;
}

Répondre à