Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1743 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Problème programme c

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème programme c

n°2042306
Profil sup​primé
Posté le 15-12-2010 à 12:58:19  answer
 

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
mood
Publicité
Posté le 15-12-2010 à 12:58:19  profilanswer
 

n°2042338
h3bus
Troll Inside
Posté le 15-12-2010 à 14:16:55  profilanswer
 

Il existe un fonction recherche...


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

---------------
sheep++
n°2042385
Profil sup​primé
Posté le 15-12-2010 à 15:47:56  answer
 

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

n°2042405
h3bus
Troll Inside
Posté le 15-12-2010 à 16:01:37  profilanswer
 

Un truc du genre "tableau 2D"


---------------
sheep++
n°2042427
Profil sup​primé
Posté le 15-12-2010 à 16:42:21  answer
 

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à.

n°2042430
h3bus
Troll Inside
Posté le 15-12-2010 à 16:51:49  profilanswer
 

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++
n°2042444
Profil sup​primé
Posté le 15-12-2010 à 17:15:26  answer
 

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

n°2042462
h3bus
Troll Inside
Posté le 15-12-2010 à 17:55:01  profilanswer
 

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++
n°2042473
Profil sup​primé
Posté le 15-12-2010 à 18:33:36  answer
 

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
n°2042504
h3bus
Troll Inside
Posté le 15-12-2010 à 21:12:12  profilanswer
 

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


---------------
sheep++
mood
Publicité
Posté le 15-12-2010 à 21:12:12  profilanswer
 

n°2042509
Profil sup​primé
Posté le 15-12-2010 à 21:30:08  answer
 

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
n°2042578
Profil sup​primé
Posté le 16-12-2010 à 09:19:17  answer
 

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
n°2042580
h3bus
Troll Inside
Posté le 16-12-2010 à 09:28:43  profilanswer
 

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


---------------
sheep++
n°2042584
Profil sup​primé
Posté le 16-12-2010 à 09:49:48  answer
 

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
n°2042790
supworld
Posté le 17-12-2010 à 09:14:49  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Problème programme c

 

Sujets relatifs
Perl [Modification d'un programme existant] Probleme avec Ifproblème pour écrire un programme
Problème du connexion à BD Mysql dans un programme CProblème sur un programme VBA lorsqu'on ouvre 2 fichiers excel
Problème d'exec() d'un programme C++ sous PHPDébutant ==> Problème avec un programme
probleme programme passage differentes basesproblème d'execution d'un programme
[C++]Problème dans mon programmeProblème avec vector lors de l'exécution du programme
Plus de sujets relatifs à : Problème programme c


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR