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