Bonjour,
J'ai trouvé un petit exercice dans un des cours du site. (ici)
Donc objectif réussi pour ma part. Voila la solution que j'ai trouvé :
Et voici celui de la correction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 /************************************** JEU DE LA VIE ****************************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> #define TAILLE_SUR_MATRICE 50 /* Taille de la matrice contenant */ /* les cellules + 2 pour la bordure */ /****************************************/ /******* P R O T O T Y P E S ********/ /****************************************/ /* Initialisation de la matrice de départ */ void init(int matrice [][TAILLE_SUR_MATRICE ]); /* Indique pour la cellule de coordonnées (ligne,colonne) */ /* le nombre de cellules voisines vivantes */ int nombre_voisins (int matrice [][TAILLE_SUR_MATRICE], int ligne, int colonne); /* Réalise une étape de plus dans la mise à jour de la matrice: */ /* autrement dit, on réalise un cycle de vie */ void mise_a_jour(int matrice[][TAILLE_SUR_MATRICE]); /* Affichage de la matrice en cours */ void affiche_matrice(int matrice [][TAILLE_SUR_MATRICE]); /****************************************/ /******* F O N C T I O N S **********/ /****************************************/ int main() { int i,y,nb=0; int nbr_cycles; int matrice[TAILLE_SUR_MATRICE] [TAILLE_SUR_MATRICE ]; init(matrice); printf("entrer le nombre de cycles voulus: "); scanf("%d",&nbr_cycles); do{ affiche_matrice(matrice); mise_a_jour(matrice); nb++; }while(nb!=nbr_cycles); } //3=bordure 0=vide 1=cellule void init(int matrice [][TAILLE_SUR_MATRICE]) { int i,y; srand(time(NULL)); for(i=0;i<TAILLE_SUR_MATRICE;i++){ for(y=0;y<TAILLE_SUR_MATRICE;y++){ if(i<2 || i>TAILLE_SUR_MATRICE-3 || y<2 || y>TAILLE_SUR_MATRICE-3)//creer la bordure matrice[i][y]=3; else matrice[i][y]=rand()%2; } } } void affiche_matrice(int matrice [][TAILLE_SUR_MATRICE]){ int i,y; for(i=0;i<TAILLE_SUR_MATRICE;i++){ for(y=0;y<TAILLE_SUR_MATRICE;y++){ if(matrice[i][y]==0) printf("%c",32); else if(matrice[i][y]==1) printf("%c",219); else printf("%c",43); } printf("\n"); } } void mise_a_jour(int matrice[][TAILLE_SUR_MATRICE]){ int i,y,nb_voisins=0; for(i=0;i<TAILLE_SUR_MATRICE;i++){ for(y=0;y<TAILLE_SUR_MATRICE;y++){ nb_voisins=nombre_voisins(matrice,i,y); if((matrice[i][y]==1) && (nb_voisins<2 || nb_voisins>3) ) matrice[i][y]=0; if(matrice[i][y]==0 && nb_voisins==3) matrice[i][y]=1; } } } int nombre_voisins (int matrice [][TAILLE_SUR_MATRICE], int ligne, int colonne){ int i,y,nb_voisins=0; if(matrice[ligne][colonne]==3)//si c est une bordure on ne fait pas de calcul return(1); else{ for(i=ligne-1;i<ligne+2;i++){ for(y=colonne-1;y<colonne+2;y++){ if(matrice[i][y]!=3) nb_voisins=nb_voisins+matrice[i][y]; } } nb_voisins=nb_voisins-matrice[ligne][colonne]; return(nb_voisins); } }
J'ai un peu de mal à voir en quoi la solution proposée est plus optimisée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 /*************************************** JEU DE LA VIE ***************************************/ #include <stdio.h> #include <stdlib.h> #define TAILLE_SOUS_MATRICE 7 /* On peut avoir 7 * 7 cellules vivantes */ #define TAILLE_SUR_MATRICE 9 /* On place une bordure autour qui facilite la vie du programmeur... */ /***************** PROTOTYPES ***********************/ void init(int matrice [][TAILLE_SUR_MATRICE ]); int nombre_voisins (int matrice [][TAILLE_SUR_MATRICE ], int ligne, int colonne); void mise_a_jour(int matrice[][TAILLE_SUR_MATRICE ]); void affiche_matrice(int matrice [][TAILLE_SUR_MATRICE ]); void ligne(int largeur); /*****************************************************/ int main( ) { int i; int nbr_cycles; int matrice[TAILLE_SUR_MATRICE] [TAILLE_SUR_MATRICE ]; char s[2]; printf("Nombre de cycles : "); scanf("%i",&nbr_cycles); init(matrice); printf("La population au départ : \n"); affiche_matrice(matrice); printf("Pressez sur ENTER pour continuer...\n"); gets(s); for(i=0; i<nbr_cycles; i++) { mise_a_jour (matrice); printf("La population après %d cycles: \n", i+1); affiche_matrice (matrice); printf("Pressez sur ENTER pour continuer...\n"); gets(s); } return 0; } /****************************************/ /* Initialisation de la matrice */ void init(int matrice [][TAILLE_SUR_MATRICE ]) { /****************************************/ int i,j; for(i=0; i<TAILLE_SUR_MATRICE; i++) { for(j=0; j<TAILLE_SUR_MATRICE; j++) { if (i<=j && i>0 && j<=7) matrice[i][j]=1; else matrice[i][j]=0; } } /* On pourrait aussi faire une initialisation aléatoire */ } /****************************************/ /* Calcul du nombre de voisins vivants */ int nombre_voisins (int matrice[][TAILLE_SUR_MATRICE ], int ligne, int colonne) { /****************************************/ int compte=0; /* compteur de cellules */ int i,j; /* On additionne les 9 cellules centrées en ligne,colonne */ for (i=ligne-1;i<=ligne+1;i++) for(j=colonne-1;j<=colonne+1;j++) compte=compte+matrice[i][j]; /* Puis on retire celle du milieu... */ compte -= matrice[ligne][colonne]; return compte; } /****************************************/ /* Correspond à l'étape n+1 */ void mise_a_jour(int matrice[ ][TAILLE_SUR_MATRICE ]) { /****************************************/ int i,j; int nbr_voisins; int matrice_densite[TAILLE_SOUS_MATRICE][TAILLE_SOUS_MATRICE]; /* matrice qui comptabilise le nombre de voisins */ /* et cela, case par case */ for(i=0; i< TAILLE_SOUS_MATRICE; i++) for(j=0; j< TAILLE_SOUS_MATRICE; j++) matrice_densite[i][j]=nombre_voisins(matrice,i+1,j+1); /* i+1 et j+1 car on passe de la SOUS_MATRICE à la MATRICE */ for(i=0; i< TAILLE_SOUS_MATRICE; i++) for(j=0; j< TAILLE_SOUS_MATRICE; j++) { nbr_voisins=matrice_densite[i][j]; if(nbr_voisins==2) matrice[i+1][j+1]=1; else if (nbr_voisins==0 || nbr_voisins==4) matrice[i+1][j+1]=0; } } /****************************************/ /* Affichage à l'écran des cellules vivantes */ void affiche_matrice(int matrice[ ][TAILLE_SUR_MATRICE ]) { /****************************************/ int i,j; for(i=1; i<=TAILLE_SOUS_MATRICE; i++) { ligne(7); for(j=1; j<= TAILLE_SOUS_MATRICE; j++) if (matrice[i][j]==1) printf("|%c",'*'); else printf("|%c",'|'); printf("|\n"); } ligne(TAILLE_SOUS_MATRICE); } /****************************************/ /* Tracé d'une ligne */ void ligne(int largeur) { /****************************************/ int i; for(i=0; i<largeur; i++) printf("+-"); printf("+\n"); }
D'autre part je ne comprend pas pourquoi je peux passer la variable matrice de main aux autres fonctions et que les modifications sur matrice soit prisent en compte sans passer par des pointeurs.
Puis faire plus simple dans la déclaration des fonctions ?
Merci.
Partager