[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux-team] Off-Topic : Problème de programmati on C++
Foy,
Comments inline: (entre // ****)
Enjoy,
JeF
#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;
// ***********
// Cf plus loin, avons besoin de la declarer..
Etape* Suite = NULL;
// *****
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;
// **********************
// Tu assigne la memoire et tu n'en fait rien.. assigne le pointeur a la
place:
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
// Tu alloue ton element a l'exterieur de la boucle --> ca ne sera fait
qu'une fois !!!
// Bougons le donc dans la bouclette..
// *****
while (CurrentVal != 1)
{ //calcule la valeur du terme suivant
if (CurrentVal % 2 ==0)
CurrentVal = CurrentVal / 2;
else
CurrentVal = (3 * (CurrentVal)) + 1;
Suite = new Etape; //déclare un terme qui sera chainé aux autres
//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 ??????????????????????
// ****
// Donc, parcequ'on modifie a chaque fois la meme structure...
// *****
//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();
//****
// Boucle sur le pointer: while (ChaineTete->Suivant != NULL)
// ****
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;
}
----- Original Message -----
From: "Jean-Marie Lambert" <studio.gamma@swing.be>
To: <linux-team@rtfm.be>
Sent: dimanche 11 février 2001 13:34
Subject: [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 !!
[ linux-team@rtfm.be and linux@lists.linuxbe.org in ONE :) ]
[ To subscribe or unsubscribe, go to http://linuxbe.org/ml.php ]
[ http://LinuxBe.org - http://OpenBe.net - listmaster@linuxbe.org ]