Automat komórkowy, sprawdzenie poprawności działania

0

Proszę o sprawdzenie poprawności działania poniższego (amatorskiego) kodu, to moja pierwsza próba napisania takiego automatu.
Program zapisuje w drugiej tablicy wartości, które otrzymuje dzięki tablicy pierwszej i poniższym regułom (elementy skrajne, które nie posiadają dwóch sąsiadów, generują liczbę na podstawie jednego sąsiada i elementu z drugiego końca tablicy)
Reguły (czarne okienko to 1, białe to 0)
screenshot-20170426201114.png
Moje pytania:
Dlaczego z lewej strony w konsoli kod jest "ładnie" ścięty, a z prawej nie?
Nie rozumiem dlaczego funkcja newF zwraca czasami 5, wydaje mi się że rozpatrzone w niej są wszystkie przypadki dotyczące zer i jedynek, czyli powinna zwracać tylko jedynki lub zera.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define size 30
int newF(int, int, int);
void arprnt(int a[], int);
void arev(int a[], int b[], int s);
int test(int a[], int);

int main()
{
    srand(time(NULL));

    int tab[size], ew[size];

    int i, num=0;

    for(i=0; i<size; ++i)
    {
        tab[i] = rand()%2;
        printf("%d ", tab[i]);
    }


    int stan = 0;

    while(1)
    {

        if(stan)
        {
            arev(ew, tab, size);
            arprnt(tab, size);
            stan = !stan;
            num = test(ew, size);
            if(!num)
            {
                return 0;
            }

        }
        else
        {
            arev(tab, ew, size);
            arprnt(ew, size);
            stan = !stan;
            num = test(tab, size);
            if(!num)
            {
                return 0;
            }
        }


    }



    return 0;
}

int newF(int a, int b, int c)
{
    if(a==0 && b==0 && c==0)
    {
        return 0;
    }

    if(a==1 && b==1 && c==1)
    {
        return 0;
    }

    if(a == 1)
    {
        if(b == 1)
        {
            if(c == 0)
            {
                return 1;
            }
        }
        else if(b == 0)
        {
            if(c == 1)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
    }
    else if(a == 0)
    {
        if(b == 1)
        {
            if(c == 1)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        else
        {
            if(c == 1)
            {
                return 1;
            }
        }
    }

    return 5;
}

void arprnt(int a[], int b)
{
    int i;
    printf("\n");
    for(i=0; i<b; ++i)
    {
        if(a[i] == 5)   // (a[i] == 5 || a[i] == 1) zeby wypisalo same zera
        {
            printf("  ");
        }
        else
        {
            printf("%d ", a[i]);
        }
    }
}

void arev(int a[], int b[], int s)
{
    int i;
    for(i=0; i<s; ++i)
    {
        if(i == 0)
        {
            b[i] = newF(a[size-1], a[0], a[1]);
        }
        if(i == size-1)
        {
            b[i] = newF(a[size-2], a[size-1], a[0]);
        }
        b[i] = newF(a[i-1], a[i], a[i+1]);
    }
}

int test(int a[], int c)
{
    int i, num=0;
    for(i=1; i<c; ++i)
            {
                if(a[0] != a[i])
                {
                    num++;
                }
            }
    return num;
}

1

błąd jest w arev brakuje dwóch else, więc efektywnie wykraczasz poza zakres tablicy.
Ale jeszcze lepiej poprawić to tak:

void arev(int a[], int b[], int s)
{
    int i;
    b[0] = newF(a[s-1], a[0], a[1]);
    for(i=1; i < s-1; ++i)
    {
        b[i] = newF(a[i-1], a[i], a[i+1]);
    }
   b[s-1] = newF(a[s-2], a[s-1], a[0]);
}

albo jeszcze inaczej

void nextGeneration(int tab[], int s)
{
    int i, a, b, c, first;
    a = tab[s - 1];
    first = b = tab[0];
    for (i = 0; i < s - 1; ++i)
    {
         c = tab[i+1];
         tab[i] = newF(a, b, c);
         a = b;
         b = c;
    }
    tab[i] = newF(a, b, first);
}
0

Racja, już widzę ten błąd, dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1