2015-10-10 1 views
-2

J'essaye d'écrire du code pour utiliser des tableaux 1D pour montrer la règle 110, pour un tableau de 30 entiers, pour 20 lignes.Implémentation d'une règle 110 automates cellulaires utilisant des tableaux 1D

#include <stdio.h> 

void rule(int t[]); 

int main(void) 
{ 
int count = 0; 
int i; 
int t[] = {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}; 
while (count++ < 20) 
{ 
    for (i = 0; i < 30; i++) 
    { 
     rule(t); 
     printf("%d", *t); 
    } 
    printf("\n"); 
} 
return 0; 
} 

void rule(int t[]) 
{ 

int t1[30]; 
int ix; 
int i; 
for (ix=0; ix < 30; ix++) 
    { 
    if ((t[ix-1] == 0) && (t[ix] == 0) && (t[ix+1] == 0)) 
     { 
     t1[ix] = 0; 
     } 
     else if ((t[ix-1] == 0) && (t[ix] == 0) && (t[ix+1] == 1)) 
     { 
     t1[ix] = 1; 
     } 
     else if ((t[ix-1] == 0) && (t[ix] == 1) && (t[ix+1] == 0)) 
     { 
     t1[ix] = 1; 
     } 
     else if ((t[ix-1] == 0) && (t[ix] == 1) && (t[ix+1] == 1)) 
     { 
     t1[ix] = 1; 
     } 
     else if ((t[ix-1] == 1) && (t[ix] == 0) && (t[ix+1] == 0)) 
     { 
     t1[ix] = 0; 
     } 
     else if ((t[ix-1] == 1) && (t[ix] == 0) && (t[ix+1] == 1)) 
     { 
     t1[ix] = 1; 
     } 
     else if ((t[ix-1] == 1) && (t[ix] == 1) && (t[ix+1] == 0)) 
     { 
     t1[ix] = 1; 
     } 
     else if ((t[ix-1] == 1) && (t[ix] == 1) && (t[ix+1] == 1)) 
     { 
     t1[ix] = 0; 
     } 
    } 
    for (i = 0; i < 30; i++) 
     { 
     t[ix] = t1[ix]; 
     } 


} 

Il crée une taille de tableau 30 rempli de la plupart 0 et deux de 1, puis dans la fonction de la règle, il crée une nouvelle et remplit en fonction de ce que le tableau précédent contient, puis copie ce dans la première array et ceci est passé à main. Cependant le mien semble seulement imprimer beaucoup de 0.

Il devrait ressembler à: enter image description here

Où 0 est vide, et 1 est rempli.

+1

Si pas 'printf ("% d", * t)' 'être printf ("% d", * (t + i));' – ameyCU

+0

@ameyCU qui changent l'original imprime juste tableau: beaucoup de fois –

+2

A part: vous devez gérer les conditions de bord, 't [ix-1]' est ** comportement non défini ** quand 'ix == 0'. –

Répondre

1

Il y a plusieurs erreurs dans mon code que j'ai commentées. J'ai également ajouté du code pour gérer les conditions de bord.

#include <stdio.h> 

#define WIDTH 30   // don't hard code the dimensions etc. 

void rule(int t[]); 

int main(void) { 
    int count = 0, i; 
    int t[] = {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}; 
    while (count++ < 20) { 
     for (i = 0; i < WIDTH; i++) { 
      printf("%d", t[i]);    // error here was *t 
     } 
     printf("\n"); 
     rule(t);       // moved outside of print loop 
    } 
    return 0; 
} 

void rule(int t[]) { 
    int t1[WIDTH]; 
    int ix, lx, rx, i; 

    for (ix=0; ix < WIDTH; ix++) { 
     lx = (ix + WIDTH - 1) % WIDTH;  // left pixel wraps to other end 
     rx = (ix + 1) % WIDTH;    // right pixel wraps to other end 

     if ((t[lx] == 0) && (t[ix] == 0) && (t[rx] == 0)) { 
      t1[ix] = 0; 
     } 
     else if ((t[lx] == 0) && (t[ix] == 0) && (t[rx] == 1)) { 
      t1[ix] = 1; 
     } 
     else if ((t[lx] == 0) && (t[ix] == 1) && (t[rx] == 0)) { 
      t1[ix] = 1; 
     } 
     else if ((t[lx] == 0) && (t[ix] == 1) && (t[rx] == 1)) { 
      t1[ix] = 1; 
     } 
     else if ((t[lx] == 1) && (t[ix] == 0) && (t[rx] == 0)) { 
      t1[ix] = 0; 
     } 
     else if ((t[lx] == 1) && (t[ix] == 0) && (t[rx] == 1)) { 
      t1[ix] = 1; 
     } 
     else if ((t[lx] == 1) && (t[ix] == 1) && (t[rx] == 0)) { 
      t1[ix] = 1; 
     } 
     else 
      t1[ix] = 0; 
    } 
    for (i = 0; i < WIDTH; i++) { 
     t[i] = t1[i];     // error here was t[ix] = t1[ix] 
    } 
} 
+0

Il existe un moyen plus simple de calculer la prochaine génération que d'utiliser tous ces 'if..else', en construisant un nombre à 3 bits à partir de' t [lx] ',' t [ix] 'et' t [rx] ' puis en recherchant la valeur suivante à partir d'un tableau à 8 éléments. –