Problème programme c

Problème programme c - C - Programmation

Marsh Posté le 15-12-2010 à 12:58:19    

Bonjour,
j'ai un soucis avec un programme c qui reprend le jeu célèbre de Conway de la vie.
Je ne veut pas qu'on me donne le code ou un programme, juste qu'on m'aide à trouver et résoudre les erreurs qui est dans mon code.
Je vous remercie d'avance pour votre aide.
 
Pour la première partie, je dois créer 2 fichier .c (main et initialisation), ainsi qu'un header .h (initialisation) qui contient 4 prototypes de fonctions.
 
Voici le code du header :

Code :
  1. #ifndef INITIALISATION_H_INCLUDED
  2. #define INITIALISATION_H_INCLUDED
  3. void dimensionnement(int *n, int *m);
  4. void initialisation(char** tab, int n, int m);
  5. int nb_generation();
  6. void affiche(char** tab, int n, int m);
  7. #endif


 
Le but de la première fonction est en fait de faire taper à l'utilisateur 2 nombres entiers supérieurs (ou égaux à 1) et de les affecter aux variables passées en paramètres : c'est les dimensions du plateau de jeu.
 
Le but de la deuxième fonction  est de prendre en paramètre un tableau à deux dimension (le plateau) et ses deux dimensions. Elle doit remplir le tableau de "0" et demander par la suite à l'utilisateur le nombre de cellules vivantes qu'il veut pour la première génération. Ensuite elle lui fait saisir les coordonnées de ces cellules  en lui redemandant de saisir si elles ne sont pas bonnes : en dehors du plateau ou déjà saisi. Puis elle affecte la valeur "1" à ces cases.
 
La troisième fonction fait saisir un nombre supérieur ou égale à 1 qui sera le nombre de générations voulu.
 
La quatrième fonction prend en paramètre un tableau à deux dimensions de caractères (toujours le plateau) et ses dimensions. Elle doit afficher un "." pour les 0 (cellules mortes) et un "o" pour les 1 (cellules vivantes).
 
Les fonctions 1, 2 et 4 ne retournent rien et à aucun moment on doit dimensionner un tableau dans ses fonctions : c'est dans le main que l'on fait ça, une fois la fonction dimensionnement exécutée (donc j'ai du me tromper ici).
 
Voici mon fichier .c initialisation :

Code :
  1. #include "initialisation.h"
  2. void dimensionnement(int *n, int *m)
  3. {
  4.   printf("Saisir votre nombre de lignes : " );
  5.   scanf("%d",&*n);
  6.   printf("Saisir votre nombre de colonnes : " );
  7.   scanf("%d",&*m);
  8. }
  9.  
  10. void initialisation(char** tab, int n, int m)
  11. {
  12.   int i, j, cv, c1, c2;
  13.  
  14.   for(i=0;i<n;i++)
  15.   {  for(j=0;j<m;j++)
  16.         {  tab[i][j]=0;  }
  17.                             } 
  18.  
  19.   printf("Saisir votre nombre de cellules vivantes : " );
  20.   scanf("%d",&cv);
  21.  
  22.   for(i=1;i<cv+1;i++)
  23.   { printf("Saisir les coordonnees de votre cellule numero %d : ",i);
  24.     scanf("%d%d",&c1,&c2); 
  25.       if (c1>n || c2>m) // || c1==c1 && c2==c2)   =  à rajouter le si déjà entré !!
  26.       { while (c1>n || c2>m)
  27.         {   printf("Resaisir de bonnes coordonnees pour votre cellule numero %d : ",i); 
  28.             scanf("%d%d",&c1,&c2);
  29.         }
  30.       }
  31.       tab[c1][c2]=1;
  32.       printf("%d",tab[i][j]);   // et là il ne "veut" pas m'afficher le tableau
  33.       printf("\n" );    //  pour que je puisse vérifier les 0 et 1
  34.   }
  35. }
  36. int nb_generation()
  37.     int nb;
  38.     printf("Saisir votre nombre de generations : " );
  39.     scanf("%d",&nb);
  40.     return(nb);
  41. }
  42. void affiche(char** tab, int n, int m)
  43. {
  44.   int i, j;
  45.  
  46.   for(i=0;i<n;i++)
  47.   { 
  48.       for(j=0;j<m;j++)
  49.         { 
  50.            if (tab[i][j]==1)
  51.            {  tab[i][j]="o";}
  52.            else
  53.            {  tab[i][j]=".";}
  54.      
  55.        printf("%d",tab[i][j]);
  56.        printf("\n" );   
  57.          
  58.         }
  59.   } 
  60. }


 
 
Et voici le main :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "initialisation.h"
  4. int main(int argc, char *argv[])
  5. {
  6.   int n, m, i;
  7.   char** tab;
  8.   dimensionnement(&n,&m);
  9.  
  10.   printf("*n : %d",n);  // je vérifie que la valeur de n soit correcte
  11.  
  12.   tab=malloc(n*sizeof(char*));      // je dimensionne le nombre de lignes
  13.   for(i=0;i<n;i++)
  14.      { tab[i]=malloc(m*sizeof(char));   // je dimensionne le nombre de colones
  15.        initialisation(tab, n, m); } 
  16.  
  17.   nb_generation();
  18.   tab=malloc(n*sizeof(char*));
  19.   affiche(tab, n, m);
  20.  
  21.   system("PAUSE" );
  22.   return 0;
  23. }


 
Une petite remarque, je n'ai pas encore fait le "redemander à l'utilisateur les coordonnées des cellules vivantes si jamais il a déjà rentrer ces coordonnées" et des fois je fais des tests d'affichages.
 
Encore merci d'avance pour votre aide.


Message édité par Profil supprimé le 15-12-2010 à 16:42:54
Reply

Marsh Posté le 15-12-2010 à 12:58:19   

Reply

Marsh Posté le 15-12-2010 à 14:16:55    

Il existe un fonction recherche...


Message édité par h3bus le 15-12-2010 à 14:17:56

---------------
sheep++
Reply

Marsh Posté le 15-12-2010 à 15:47:56    

Je veux bien, mais je n'ai pas trouvé de cas similaire au mien, où alors je n'ai pas vu...

Reply

Marsh Posté le 15-12-2010 à 16:01:37    

Un truc du genre "tableau 2D"


---------------
sheep++
Reply

Marsh Posté le 15-12-2010 à 16:42:21    

J'ai vu que j'avais mis un * en trop ainsi qu'un y, mais le programme plante toujours.
Je suis désolé mais je n'ai pas trouvé la réponse en recherchant dans les sujets existants déjà.

Reply

Marsh Posté le 15-12-2010 à 16:51:49    

Bon ton initialisation de tableau n'est pas géniale (cf recherche).
 
Par contre ton appel à initialisation dans le for doit faire tout planter:
- Tu appelle n fois la fonction alors qu'une fois suffirait
- Ton tableau n'étant pas complètement initialisé lors des n-1 premiers appels, tu as toutes les chances de faire une erreur de segmentation


---------------
sheep++
Reply

Marsh Posté le 15-12-2010 à 17:15:26    

Effectivement je n'avais pas vu la fonction répété n fois, désolé.
 
Pourquoi, ou, en quoi le tableau n'est pas complètement initialisé lors des n-1 premiers appels ?
 
Merci beaucoup pour ton aide :D

Reply

Marsh Posté le 15-12-2010 à 17:55:01    

Ben ta boucle est là pour initialiser colonnes pas colonnes, et tant que t'en es pas sorti, ton tableau n'est pas alloué à 100%.
 
Mais si tu sors ta fonction initialisation du for, ma remarque est caduque.


---------------
sheep++
Reply

Marsh Posté le 15-12-2010 à 18:33:36    

Ah d'accord je vois.
 
D'ailleurs voici le code que j'ai changé (il affiche le tableau de 0 mais plante lorsque qu'il doit afficher le tableau de 0 et 1).
 
Le main :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "initialisation.h"
  4. #include "heredite.h"
  5. int main(int argc, char *argv[])
  6. {
  7.   int n, m, i, gen;
  8.   char** tab;
  9.   dimensionnement(&n,&m);
  10.  
  11.  
  12.   tab=malloc(n*sizeof(char*));
  13.   for(i=0;i<n;i++)
  14.      { tab[i]=malloc(m*sizeof(char)); }
  15.   initialisation(tab, n, m);
  16.  
  17.   gen=nb_generation();
  18.    
  19.   affiche(tab, n, m);
  20.  
  21.   system("PAUSE" );
  22.   return 0;
  23. }


 
 
Le initialisation :

Code :
  1. #include "initialisation.h"
  2. void dimensionnement(int *n, int *m)
  3. {
  4.   printf("Saisir votre nombre de lignes : " );
  5.   scanf("%d",&*n);
  6.   while (*n<0)
  7.      { printf("Saisir un nombre de lignes strictement positif : " );
  8.        scanf("%d",&*n);}
  9.   printf("Saisir votre nombre de colonnes : " );
  10.   scanf("%d",&*m);
  11.   while (*m<0)
  12.      { printf("Saisir un nombre de colonnes strictement positif : " );
  13.        scanf("%d",&*m);}
  14.  
  15. }
  16.  
  17. void initialisation(char** tab, int n, int m)
  18. {
  19.   int i, j, cv, c1, c2;
  20.  
  21.   for(i=0;i<n;i++)
  22.   {  for(j=0;j<m;j++)
  23.         {  tab[i][j]=0; 
  24.            printf("%d",tab[i][j]);
  25.         }
  26.      printf("\n" );     
  27.   } 
  28.        
  29.  
  30.   printf("Saisir votre nombre de cellules vivantes : " );
  31.   scanf("%d",&cv);
  32.  
  33.   for(i=1;i<cv+1;i++)
  34.   { printf("Saisir les coordonnees de votre cellule numero %d : ",i);
  35.     scanf("%d%d",&c1,&c2); 
  36.       if (c1<n && c2<m)
  37.        {  if (tab[c1][c2]==0)
  38.           {  tab[c1][c2]=1; }
  39.           else
  40.           {   printf("Vous avez deja rentre ces coordonnees\n" );
  41.               i--;   }
  42.        }
  43.       else
  44.        {   printf("Cette cellule n'est pas sur le plateau\n" ); 
  45.            i--;   }
  46.      
  47.   }
  48. }
  49.                
  50. int nb_generation()
  51.     int nb;
  52.     printf("Saisir votre nombre de generations : " );
  53.     scanf("%d",&nb);
  54.     return(nb);
  55. }
  56. void affiche(char** tab, int n, int m)
  57. {
  58.   int i, j;
  59.  
  60.   for(i=0;i<n;i++)
  61.   { 
  62.       for(j=0;j<m;j++)
  63.         { 
  64.            if (tab[i][j]==1)
  65.            {  tab[i][j]='o';}
  66.            else
  67.            {  tab[i][j]='.';}
  68.      
  69.       printf("%c",tab[i][j]);
  70.         }
  71.       printf("\n" ); 
  72.   }


 
C'est bizarre sachant qu'avant le printf("\n" ), les deux lignes (de 0 puis de 0 et 1) s'affichait correctement.
Aurais-je oublier quelque chose ?
Il faut d'ailleurs que je revoie la fin de mon code, car le remplacement des 0 et 1 par . et o ne se fait pas.
 
Encore merci pour ton aide.
 
EDIT : le tableau de . et o s'affiche, mais c'est lors du remplacement de certain 0 par 1 que c'est pas bon, car les coordonnées ne corresponde pas forcément graphiquement ...


Message édité par Profil supprimé le 15-12-2010 à 22:28:27
Reply

Marsh Posté le 15-12-2010 à 21:12:12    

Mouai réfléchis un peu plus sur les coordonnées dans ton tableau, tu as des problèmes d'index là.


---------------
sheep++
Reply

Marsh Posté le 15-12-2010 à 21:12:12   

Reply

Marsh Posté le 15-12-2010 à 21:30:08    

En fait c'est bon, j'ai rien dit.
 
Par contre, je bloque sur une solution idéale pour que l'utilisateur ressaisisse ses coordonnées de cellules vivantes (donc de 1) si jamais il donne des coordonnées hors plateau ou si il a déjà donné ces coordonnées ... Pourrais-tu m'aider stp ?
Sachant qu'on m'a conseillé de rajouter un bord au tableau rempli de 0 pour mieux voir la création par la suite de cellule, donc avec un tableau à n+2 lignes et m+2 colonnes. Mais c'est pas obligatoire.
 
EDIT : en fait c'est bon, jviens de changer le code


Message édité par Profil supprimé le 15-12-2010 à 22:27:28
Reply

Marsh Posté le 16-12-2010 à 09:19:17    

Par contre j'ai un autre soucis :
je veux faire apparaître les générations avec les tableaux modifiés après la première et le programme plante.
 
Voici le main :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "initialisation.h"
  4. #include "heredite.h"
  5. int main(int argc, char *argv[])
  6. {
  7.   int n, m, i, gen;
  8.   char** tab1;
  9.   char** tab2;
  10.   dimensionnement(&n,&m);
  11.  
  12.  
  13.   tab1=malloc(n*sizeof(char*));
  14.   tab2=malloc(n*sizeof(char*));
  15.   for(i=0;i<n;i++)
  16.      { tab1[i]=malloc(m*sizeof(char));
  17.        tab2[i]=malloc(m*sizeof(char)); }
  18.   initialisation(tab1, n, m);
  19.  
  20.   gen=nb_generation();
  21.  
  22.   for(i=1;i<gen;i++)
  23.      { printf("Generation numero %d\n\n",i);
  24.      
  25.   affiche(tab1, n, m);
  26.  
  27.   generation_suivante(tab1, tab2, n, m);
  28.  
  29.   duplication(tab1, tab2, n, m);
  30.  
  31. // system("cls" ) ;  
  32.   }
  33.  
  34.   system("PAUSE" );
  35.   return 0;
  36. }


 
 
 
Voici le initialisation :

Code :
  1. #include "initialisation.h"
  2. void dimensionnement(int *n, int *m)
  3. {
  4.   printf("Saisir votre nombre de lignes : " );
  5.   scanf("%d",&*n);
  6.   while (*n<0)
  7.      { printf("Saisir un nombre de lignes strictement positif : " );
  8.        scanf("%d",&*n);}
  9.   printf("Saisir votre nombre de colonnes : " );
  10.   scanf("%d",&*m);
  11.   while (*m<0)
  12.      { printf("Saisir un nombre de colonnes strictement positif : " );
  13.        scanf("%d",&*m);}
  14.  
  15. }
  16.  
  17. void initialisation(char** tab, int n, int m)
  18. {
  19.   int i, j, cv, c1, c2;
  20.  
  21.   for(i=0;i<n;i++)
  22.   {  for(j=0;j<m;j++)
  23.         {  tab[i][j]=0; 
  24.            printf("%d",tab[i][j]);
  25.         }
  26.      printf("\n" );     
  27.   } 
  28.        
  29.  
  30.   printf("Saisir votre nombre de cellules vivantes : " );
  31.   scanf("%d",&cv);
  32.  
  33.   for(i=1;i<cv+1;i++)
  34.   { printf("Saisir les coordonnees de votre cellule numero %d : ",i);
  35.     scanf("%d%d",&c1,&c2); 
  36.       if (c1<n && c2<m)
  37.        {  if (c1>0 && c2>0)
  38.               {  if (tab[c1][c2]==0)
  39.                  {  tab[c1][c2]=1; }
  40.                                     } 
  41.           else
  42.           {   printf("Vous avez deja rentre ces coordonnees\n" );
  43.               i--;   }
  44.        }
  45.       else
  46.        {   printf("Cette cellule n'est pas sur le plateau\n" ); 
  47.            i--;   }
  48.      
  49.   }
  50. }
  51.                
  52. int nb_generation()
  53.     int gen;
  54.     printf("Saisir votre nombre de generations : " );
  55.     scanf("%d",&gen);
  56.     return(gen);
  57. }
  58. void affiche(char** tab, int n, int m)
  59. {
  60.   int i, j;
  61.  
  62.   for(i=0;i<n;i++)
  63.   { 
  64.       for(j=0;j<m;j++)
  65.         { 
  66.            if (tab[i][j]==1)
  67.            {  tab[i][j]='o';}
  68.            else
  69.            {  tab[i][j]='.';}
  70.         }
  71.   }   
  72.      
  73.   for(i=0;i<n;i++)
  74.   { 
  75.       for(j=0;j<m;j++)
  76.         {   printf("%c",tab[i][j]);  }
  77.       printf("\n" ); 
  78.   } 
  79. }


 
 
Et le  heredite :

Code :
  1. #include "heredite.h"
  2. int nb_voisins(char** tab, int i, int j)
  3. {
  4.     int nbcv=0;
  5.    
  6.     if (tab[i-1][j-1]=='o')
  7.        {nbcv++;}
  8.      
  9.     if (tab[i-1][j]=='o')
  10.        {nbcv++;}
  11.    
  12.     if (tab[i-1][j+1]=='o')
  13.        {nbcv++;} 
  14.    
  15.     if (tab[i][j-1]=='o')
  16.        {nbcv++;}
  17.      
  18.     if (tab[i][j]=='o')
  19.        {nbcv++;}
  20.    
  21.     if (tab[i][j+1]=='o')
  22.        {nbcv++;}
  23.    
  24.     if (tab[i+1][j-1]=='o')
  25.        {nbcv++;}
  26.      
  27.     if (tab[i+1][j]=='o')
  28.        {nbcv++;} 
  29.      
  30.     if (tab[i+1][j+1]=='o')
  31.        {nbcv++;}
  32.    
  33.     return(nbcv); 
  34. }
  35. void duplication(char** tab1, char** tab2, int n, int m)
  36. {
  37.      int i, j;
  38.    
  39.      for(i=0;i<n;i++)
  40.      {  for(j=0;j<m;j++)
  41.         {   tab2[i][j]=tab1[i][j];    }
  42.                                            }   
  43. }
  44. void generation_suivante(char** tab1, char** tab2, int n, int m)
  45. {
  46.     int i, j, nbcv;
  47.    
  48.     for (i=0;i<=n;i++)
  49.     {   for (j=0;j<=m;j++)
  50.         {   nbcv=(nb_voisins(tab2,i, j));
  51.             if (nbcv == 3)
  52.                {tab1[i][j]=1;}
  53.             if (nbcv == 2)
  54.                {tab1[i][j]=tab2[i][j];}
  55.             if ((nbcv <= 1) || (nbcv >= 4))
  56.                {tab1[i][j]=0;} 
  57.         }
  58.      }
  59. }


Message édité par Profil supprimé le 16-12-2010 à 09:20:28
Reply

Marsh Posté le 16-12-2010 à 09:28:43    

Attention aux indices, exemple quand t'appelle nb_voisins avec i=0 et j=0


---------------
sheep++
Reply

Marsh Posté le 16-12-2010 à 09:49:48    

Aux indices ?  
En fait je dois mettre dans mon main i=1 et i<n+1 sinon je suis hors tableau non ?


Message édité par Profil supprimé le 16-12-2010 à 09:59:51
Reply

Marsh Posté le 17-12-2010 à 09:14:49    

Si non bien le tp ? @DarkLord66 ?
Obtiens-tu l'image de fin ?
avec le fichier crypté ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed