Le tour de hanoi

Fermé
sousourossa Messages postés 11 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 mai 2011 - Modifié par ben0123 le 16/05/2011 à 11:30
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 17 mai 2011 à 19:04
Bonjour,

pouvez vous m'aider pour mieux comprendre ce petit programme
ce que je n'ai pas compris,est surtout l'utilité des pointeurs car meme si je fais l'execution à la main pour suivre chaque instruction je n'arrive pas à le comprendre meme si j'ai déjà lu des cours concernant ces pointeurs

merci d'avance


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int N, cpt=0;

int **creermatrice(int l, int c)
{ int i,**p;
p = (int **)malloc(sizeof(int *) * l);
for (i=0 ; i<l ; i++)
{ p[i] = (int *)malloc(sizeof(int) * c); }
return(p);
}

int **liremat(int l)
{ int **p;
int i, j;
p=creermatrice(l,3);

for (i=0 ; i<l ; i++)
{ for (j=0 ; j<3 ; j++)
{ if (j) p[i][j] = 0;
else p[i][j] = i+1;
}
}
return p;
}


void ecriremat(int **p, int l)
{ int i, j;
printf("\n\n" );
for (i=0 ; i<l ; i++)
{ for (j=0 ; j<3 ; j++)
{ if (p[i][j] == 0) printf(".\t" );
else printf("%d\t", p[i][j]); }
printf("\n" );
}
printf("-------------------" );
}


void traiter(int **p, int d, int a, int n)
{
int i=0, v;
while ( (i<n) && (p[i][d] == 0) )
i++;

if (i<n) { v = p[i][d];
p[i][d] = 0;
}
i=n-1;

while ( (i>=0) && (p[i][a] != 0) )
i--;
if (i>=0)
p[i][a] = v;
cpt++;
ecriremat(p, N);
}


void hanoi(int **p, int n, int un, int deux, int trois)
{
if (n == 0 ) {;}
else
{ hanoi(p, n-1, un, trois, deux);

traiter(p, un, trois, N);

hanoi(p, n-1, deux, un, trois);
}
}





int main()
{ int **p;

printf("Nombre d anneaux ? : " );
scanf("%d", &N);

p = liremat(N);
printf("\n\n" );
ecriremat(p, N);

hanoi(p, N, 0, 1, 2);

printf("\n\nRealise en %d operations\n\n", cpt);

return 0;
}

2 réponses

__acron__ Messages postés 60 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 22 juin 2011 4
16 mai 2011 à 11:20
qu'est-ce que tu ne comprends pas à propos des pointers ?
0
sousourossa Messages postés 11 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 mai 2011
16 mai 2011 à 11:24
à quoi ils peuvent nous servir,ca que je vois c'est qu'ils sont bcp utulisés ici c pour ca je n'ai pas compris l'execution e ce programme
0
__acron__ Messages postés 60 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 22 juin 2011 4
16 mai 2011 à 11:35
l'utilité des pointers c'est très vaste...

Il y a une différence entre comprendre ce qu'est un pointer et comprendre à quoi ils servent.
Dans ton cas j'imagine que c'est l'argument int **p qui te pose pb.
Ici, int **p est un tableau à 2 dimensions.

un pointer est une adresse mémoire, donc soit l'adresse d'une variable, soit l'adresse d'un tableau (donc une suite de variable qui se suivent).

donc si on met int *p (avec 1 seul *) on a soit une variable de type int à l'adresse *p, soit une suite de variable de type int à l'adresse *p (tableau). dans le cas présent il s'agit d'un tableau.

Hors ici, on a int **p donc p pointe vers une suite d'adresse. chaque adresse pointant à son tour vers une suite de int.

tu te retrouve alors avec un tableau a 2 dimensions... lorsque tu as int *p, tu peux accéder à chaque entrées du tableau en faisant p[X] avec X compris entre 0 et [taille_du_tableau] (attention à ne pas dépasser).

donc avec ton int **p, si tu fais int p[0] tu obtiens le int *p de la premiere ligne, donc en faisant p[0][0] tu obtiens le premier int de la premiere ligne.

je sais pas si c'est super clair... à mon sens dans la compréhension des pointers, le mieux c'est d'experimenter.

D'ailleurs tu fera gaffe, ya une fuite mémoire dans ton prog.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
16 mai 2011 à 11:28
Les pointeurs ne sont quasiment pas utilisés dans ce programme...
Il y a juste la matrice p = int[N][3] qui est allouée dynamiquement car N est entré par l'utilisateur, et qui permet d'afficher le dessin, mais en soit ça ne rentre pas en compte dans le calcul des tours de Hanoï.

Hanoï en lui même peut se réduire à ceci (avec un affichage réduit) :

#include <stdio.h>

void hanoi(int n, int x=1, int y=2, int z=3)
{
   if (n>0)
   {
      hanoi(n-1,x,z,y);
      printf("%d --> %d\n",x,z);
      hanoi(n-1,y,x,z);
   }
}

int main() 
{
   hanoi(3);
   return 0; 
}
0
__acron__ Messages postés 60 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 22 juin 2011 4
16 mai 2011 à 11:40
mmmh, pas sur que ca l'aide à comprendre le but des pointers;)
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
16 mai 2011 à 12:07
Je crois que sousourossa essaye juste de s'approprier ce code pour rendre à son prof un exercice sur Hanoï qui ait l'air d'être de lui, or si c'est juste Hanoï qui l'intéresse c'est inutile de lui expliquer les pointeurs car on en a pas besoin dans cet algorithme, son prof s'en chargera bien assez tôt...
0
sousourossa Messages postés 11 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 16 mai 2011
16 mai 2011 à 12:11
juste que ce que j'essaye de faire est de comprendre ces pointeurs je lis vos msg et j'essaye de vous suivre donc je ne veux pas juste des codes mais c qui m'interesse c la comprehension
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
16 mai 2011 à 12:16
Pour la compréhension des tours de Hanoï tu n'as pas besoin de prendre des codes aussi "compliqués" qui t'embrouillent plus qu'autre chose.

Prends un code le plus simple possible (comme le mien), et débogue le pas à pas en t'aidant d'articles comme celui de Wikipédia par exemple.
0
__acron__ Messages postés 60 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 22 juin 2011 4
16 mai 2011 à 12:27
... donc sousourossa ce que tu veux comprendre ce sont les pointers ou les tours de Hanoi ?? soit précis sinon on va pas pouvoir t'aider...
0