2015-03-11 3 views
0

Я пытаюсь создать сотовый автомат на основе this. Мне удалось сделать это простым способом, который будет следовать только правилу 90, но когда я изменил его, чтобы принять любое правило, я сделал что-то неправильно.Сотовый автомат не работает

Вот как должен выглядеть результат. http://natureofcode.com/book/imgs/chapter07/ch07_12.png

Это мой код:

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

int main() 
{ 
    FILE *myFile = fopen ("input.txt" , "r"); 
    int i, j, cell, iterations=100, current[80], previous[80], ruleCase, rule=90; 
    for(i=0;i<80;i++){ 
     fscanf(myFile, "%1d", &previous[i]); 
     if(previous[i]==0)printf("%c",176); 
     else printf("%c",178); 
    } 
    for(i=0;i<=iterations;i++){ 
     for(cell=0;cell<80;cell++) 
     { 
      if((cell>0) && (cell<79)) 
      { 
       ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[cell+1]; 
      } 
      else if(cell==0) 
      { 
       ruleCase=1*previous[79]+2*previous[cell]+3*previous[cell+1]; 
      } 
      else if(cell==79) 
      { 
       ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[0]; 
      } 
      if(rule & (128 >> ruleCase)) 
      { 
       current[cell]=1; 
       printf("%c",178); 
      } 
      else 
      { 
       current[cell]=0; 
       printf("%c",176); 
      } 
     } 
     for(j=0;j<80;j++){ 
      previous[j]=current[j]; 
     } 
    } 
    return 0; 
} 

следующим input.txt 00000000000000000000000000000000000000100000000000000000000000000000000000000000

Спасибо!

+0

Правописание: слово «автоматы» является множественным. Единственным является «автомат» (исправлено). –

+0

Очень полезно ... –

ответ

1

Вы обнаружили ошибки в вычислениях ruleCase. Например, в общем случае, если вы ...

ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[cell+1] 

... но вы пытаетесь интерпретировать значение ячеек в качестве двоичных цифр. Следовательно, коэффициенты должны иметь степень 2:

ruleCase=1*previous[cell-1]+2*previous[cell]+4*previous[cell+1] 

Аналогично для особых случаев.

+0

Теперь это полезно, спасибо :) –

1

Неисправность с этой линией:

ruleCase=1*previous[cell-1]+2*previous[cell]+3*previous[cell+1]; 

Когда я изменить 3 к 4 программе производит Серпинский треугольники.

ruleCase=1*previous[cell-1]+2*previous[cell]+4*previous[cell+1]; 

и другие две подобные линии.

+0

Благодарим за помощь! –

Смежные вопросы