Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie nowej tablicy na podstawie innej przez sumowanie poszczególnych wartości

Ostatnio zmodyfikowano 2019-02-27 20:09
Autor Wiadomość
4neta
Temat założony przez niniejszego użytkownika
Tworzenie nowej tablicy na podstawie innej przez sumowanie poszczególnych wartości
» 2019-01-27 14:07:19
Witajcie,
tworzę pierwszą ciut większą aplikację - implementację Game Of Life.
Napotkałam problem przy zliczaniu ośmiu sąsiadów komórki - funkcja countNextArray.

Oto mój kod:
C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

void countNextArray( int firstArray[ 10 ][ 10 ], int secondArray[ 10 ][ 10 ] )
{
    int sum[ 10 ][ 10 ];
    for( int i = 0; i < 10; i++ ) {
        for( int j = 0; j < 10; j++ ) {
            sum[ i ][ j ] = 0;
            int temp = 0;
           
            cout << "(" << i << ", " << j << "): ";
           
            for( int k = - 1; k <= 1; k++ ) {
                for( int l = - 1; l <= 1; l++ ) {
                    temp = firstArray[( 10 + i + k ) % 10 ][( 10 + j + l ) % 10 ];
                    cout << temp << " ";
                    sum[ i ][ j ] += temp;
                }
            }
            cout << "\n";
           
            sum[ i ][ j ] -= firstArray[ i ][ j ]; // suma sasiadow = suma 9 komorek - srodkowa
           
            int cell = firstArray[ i ][ j ];
            int sumOfNeighbours = sum[ i ][ j ];
           
            /*            if(cell == 0){
                            if(sumOfNeighbours == 3)
                                secondArray[i][j] = 1;
                            else
                                secondArray[i][j] = 0;
                        }
                        else{ // cell == 1
                            if(sumOfNeighbours == 2 || sumOfNeighbours == 3)
                                secondArray[i][j] = 1;
                            else
                                secondArray[i][j] = 0;
                        }
            */
            if( cell == 0 && sumOfNeighbours == 3 )
                 secondArray[ i ][ j ] = 1;
            else if( cell == 0 && sumOfNeighbours != 3 )
                 secondArray[ i ][ j ] = 0;
            else if( cell == 1 &&( sumOfNeighbours == 2 || sumOfNeighbours == 3 ) )
                 secondArray[ i ][ j ] = 1;
            else
                 secondArray[ i ][ j ] = 0;
           
           
           
        }
    }
   
    cout << "\n array of sum: \n";
    for( int i = 0; i < 10; i++ ) {
        for( int j = 0; j < 10; j++ ) {
            cout << sum[ i ][ j ] << ".";
        }
        cout << endl;
    }
    cout << "\n";
}

void displayArray( int array[ 10 ][ 10 ] ) {
    for( int i = 0; i < 10; i++ ) {
        for( int j = 0; j < 10; j++ ) {
            array[ i ][ j ] = rand() % 2;
           
            if( array[ i ][ j ] == 0 )
                 cout << "_";
            else
                 cout << "X";
           
        }
        cout << endl;
    }
    cout << endl;
}

int main()
{
    int evenArray[ 10 ][ 10 ], oddArray[ 10 ][ 10 ];
   
   
    cout << "evenArray: \n";
    displayArray( evenArray );
   
    countNextArray( evenArray, oddArray );
   
    cout << "oddArray: \n";
    displayArray( oddArray );
   
    return 0;
}

Program w niektórych miejscach źle zlicza sąsiadów, a w niektórych źle wnioskuje o zmianie stanu komórki.
Czy ktoś widzi jaki może być tego powód?
P-173708
rafallauterbach
» 2019-01-27 14:36:57
Jaki problem napotkales przy zliczaniu sumy i jakie są błędy w tej wypisywanej tablicy? Trudno mi wyczytać błąd a nie mam kompilatora przed sobą
P-173710
4neta
Temat założony przez niniejszego użytkownika
odp
» 2019-01-27 14:49:50
Może pokażę co pojawia się w konsoli:

evenArray:
XX__X_____
XXXXXXX_X_
X__X__X__X
X_X_X_XXX_
XX_XX_XXX_
X__XXXXXX_
_X________
_X_X___XX_
XX______X_
_X_XX___XX

(0, 0): 1 0 1 0 1 1 0 1 1
(0, 1): 0 1 0 1 1 0 1 1 1
(0, 2): 1 0 1 1 0 0 1 1 1
(0, 3): 0 1 1 0 0 1 1 1 1
(0, 4): 1 1 0 0 1 0 1 1 1
(0, 5): 1 0 0 1 0 0 1 1 1
(0, 6): 0 0 0 0 0 0 1 1 0
(0, 7): 0 0 1 0 0 0 1 0 1
(0, 8): 0 1 1 0 0 0 0 1 0
(0, 9): 1 1 0 0 0 1 1 0 1
(1, 0): 0 1 1 0 1 1 1 1 0
(1, 1): 1 1 0 1 1 1 1 0 0
(1, 2): 1 0 0 1 1 1 0 0 1
(1, 3): 0 0 1 1 1 1 0 1 0
(1, 4): 0 1 0 1 1 1 1 0 0
(1, 5): 1 0 0 1 1 1 0 0 1
(1, 6): 0 0 0 1 1 0 0 1 0
(1, 7): 0 0 0 1 0 1 1 0 0
(1, 8): 0 0 0 0 1 0 0 0 1
(1, 9): 0 0 1 1 0 1 0 1 1
(2, 0): 0 1 1 1 1 0 0 1 0
(2, 1): 1 1 1 1 0 0 1 0 1
(2, 2): 1 1 1 0 0 1 0 1 0
(2, 3): 1 1 1 0 1 0 1 0 1
(2, 4): 1 1 1 1 0 0 0 1 0
(2, 5): 1 1 1 0 0 1 1 0 1
(2, 6): 1 1 0 0 1 0 0 1 1
(2, 7): 1 0 1 1 0 0 1 1 1
(2, 8): 0 1 0 0 0 1 1 1 0
(2, 9): 1 0 1 0 1 1 1 0 1
(3, 0): 1 1 0 0 1 0 0 1 1
(3, 1): 1 0 0 1 0 1 1 1 0
(3, 2): 0 0 1 0 1 0 1 0 1
(3, 3): 0 1 0 1 0 1 0 1 1
(3, 4): 1 0 0 0 1 0 1 1 0
(3, 5): 0 0 1 1 0 1 1 0 1
(3, 6): 0 1 0 0 1 1 0 1 1
(3, 7): 1 0 0 1 1 1 1 1 1
(3, 8): 0 0 1 1 1 0 1 1 0
(3, 9): 0 1 1 1 0 1 1 0 1
(4, 0): 0 1 0 0 1 1 0 1 0
(4, 1): 1 0 1 1 1 0 1 0 0
(4, 2): 0 1 0 1 0 1 0 0 1
(4, 3): 1 0 1 0 1 1 0 1 1
(4, 4): 0 1 0 1 1 0 1 1 1
(4, 5): 1 0 1 1 0 1 1 1 1
(4, 6): 0 1 1 0 1 1 1 1 1
(4, 7): 1 1 1 1 1 1 1 1 1
(4, 8): 1 1 0 1 1 0 1 1 0
(4, 9): 1 0 1 1 0 1 1 0 1
(5, 0): 0 1 1 0 1 0 0 0 1
(5, 1): 1 1 0 1 0 0 0 1 0
(5, 2): 1 0 1 0 0 1 1 0 0
(5, 3): 0 1 1 0 1 1 0 0 0
(5, 4): 1 1 0 1 1 1 0 0 0
(5, 5): 1 0 1 1 1 1 0 0 0
(5, 6): 0 1 1 1 1 1 0 0 0
(5, 7): 1 1 1 1 1 1 0 0 0
(5, 8): 1 1 0 1 1 0 0 0 0
(5, 9): 1 0 1 1 0 1 0 0 0
(6, 0): 0 1 0 0 0 1 0 0 1
(6, 1): 1 0 0 0 1 0 0 1 0
(6, 2): 0 0 1 1 0 0 1 0 1
(6, 3): 0 1 1 0 0 0 0 1 0
(6, 4): 1 1 1 0 0 0 1 0 0
(6, 5): 1 1 1 0 0 0 0 0 0
(6, 6): 1 1 1 0 0 0 0 0 1
(6, 7): 1 1 1 0 0 0 0 1 1
(6, 8): 1 1 0 0 0 0 1 1 0
(6, 9): 1 0 1 0 0 0 1 0 0
(7, 0): 0 0 1 0 0 1 0 1 1
(7, 1): 0 1 0 0 1 0 1 1 0
(7, 2): 1 0 0 1 0 1 1 0 0
(7, 3): 0 0 0 0 1 0 0 0 0
(7, 4): 0 0 0 1 0 0 0 0 0
(7, 5): 0 0 0 0 0 0 0 0 0
(7, 6): 0 0 0 0 0 1 0 0 0
(7, 7): 0 0 0 0 1 1 0 0 1
(7, 8): 0 0 0 1 1 0 0 1 0
(7, 9): 0 0 0 1 0 0 1 0 1
(8, 0): 0 0 1 0 1 1 1 0 1
(8, 1): 0 1 0 1 1 0 0 1 0
(8, 2): 1 0 1 1 0 0 1 0 1
(8, 3): 0 1 0 0 0 0 0 1 1
(8, 4): 1 0 0 0 0 0 1 1 0
(8, 5): 0 0 0 0 0 0 1 0 0
(8, 6): 0 0 1 0 0 0 0 0 0
(8, 7): 0 1 1 0 0 1 0 0 1
(8, 8): 1 1 0 0 1 0 0 1 1
(8, 9): 1 0 0 1 0 1 1 1 0
(9, 0): 0 1 1 1 0 1 0 1 1
(9, 1): 1 1 0 0 1 0 1 1 0
(9, 2): 1 0 0 1 0 1 1 0 0
(9, 3): 0 0 0 0 1 1 0 0 1
(9, 4): 0 0 0 1 1 0 0 1 0
(9, 5): 0 0 0 1 0 0 1 0 0
(9, 6): 0 0 0 0 0 0 0 0 0
(9, 7): 0 0 1 0 0 1 0 0 0
(9, 8): 0 1 0 0 1 1 0 0 0
(9, 9): 1 0 1 1 1 0 0 0 1

 array of sum:
5.5.6.6.5.5.2.3.3.5.
5.5.4.4.4.4.2.3.1.5.
4.6.5.5.5.6.4.6.4.5.
4.5.3.5.3.5.4.6.4.6.
3.4.4.5.5.7.6.8.5.6.
3.4.4.3.4.4.4.5.3.4.
3.2.4.3.4.3.4.5.4.3.
4.3.4.0.1.0.1.2.2.3.
4.3.5.3.3.1.1.4.4.5.
6.4.4.2.2.2.0.2.2.4.

oddArray:
XXX___X_X_
XX___XXXX_
__X_XXX_X_
__X___XXXX
XXXXXXX_X_
____X__X_X
_X_X_XXX__
X____X_X__
X_XX____XX
_X_XXX_XX_

Weźmy komórkę (1,1). Sąsiedzi są dobrze odczytani - 1 1 0 1 1 1 1 0 0. Suma jest dobra: 6-1=5 (odejmuję stan środkowej komórki, aby dostać sumę 8 sąsiadów). Wniosek jest źle wyciągnięty, bo w ostatniej tablicy komórka (1,1) wciąż żyje (X). Zdawało mi się, że ify wpisałam poprawnie.
_______________________________________________

Widzę błąd w funkcji displayArray. Linia array[j] = rand()%2;. Zapisałam ją na samym początku pisania, przed stworzeniem tej funkcji. Gdy ją usunę, na kosoli pojawia się taka tablica sum:
array of sum:
1981545979.-372878757.-370723219.1969346433.38124344.38948058.35112713.21600347.21474442.20254289.
1121089067.29429455.2032058653.2031628307.2030802683.33290786.29490634.18055254.1111847574.1106768951.
-1896422469.35703805.1976147994.-17612439.-373513640.1991034896.1974984590.1969980243.36750604.-1050617845.
-1961913701.2033976891.1696063729.1753062209.1622888200.23331865.1960807356.1976936627.-1966112722.-1297776873.
908992333.-305245796.-358421768.-367309207.-1449372822.902114795.-1041695981.-312454373.-1387607278.-1334471985.
-382619349.2036122801.1684160483.1684153041.-571064781.-1892987500.1745911269.2037475762.1984299786.1971213380.
-710775326.-351669300.-366020753.1586306014.-1005563837.-1440390098.-604257359.1635911773.-660947766.1291152480.
-112718265.-1043013421.1976544725.1976157904.-1881293067.79099424.482274748.1593711683.567270659.-509966025.
-1778412371.-1435712219.1587341244.1591219614.-358574641.-354222214.1983203521.1575095246.558692572.497639542.
-106630581.-1047473638.1975544508.1973576079.32491618.45609712.46263977.1984674524.-1384878921.-115784016.
Gdzie oddzielam każdy element kropką, by rozpoznać co się stało (chociaż wciąż nie wiem).

Jak powinnam poprawnie zapisać funkcję displayArray, aby działała na wejściowej tablicy, tzn. na jej kopii?
P-173711
rafallauterbach
» 2019-01-27 15:25:29
Przyanam ze przegladam całość od 30 minut i nie wiem co jest nie tak. Może ktoś pomoże szybciej a jak nie, to ja napiszę wieczorem doopiero jak będę mógł testować na kompie.
Wydaje mi się zbt skomplikowany ten kod ale to tylko jak na mój gust.
P-173712
pekfos
» 2019-01-27 15:26:56
Tablica evenArray nie jest zainicjalizowana.
P-173713
4neta
Temat założony przez niniejszego użytkownika
» 2019-01-27 15:28:42
Dziękuję bardzo. :) Mi również wydaje się za duży, jak na to, co ma wykonywać, jednak lepsze pomysły jak na razie nie przychodzą mi do głowy. Na początku niech zadziała.
P-173714
rafallauterbach
» 2019-01-27 15:48:45
W display array generujesz i wypisujesz zawsze losowe liczby. Czy to nie jest źródłem problemu? Może oddziel wyświetlanie tablicy od losowania. Wydaje mi się że wyświetlasz zupełnie niezwiazane ze soba (losowe) tablice.
 
Edit:
Aha przepraszam - nie doczytałem dopisku pod spodem. W takim razie musisz jeszcze zainicjować tablice tak jak napisal pekfos..
P-173715
4neta
Temat założony przez niniejszego użytkownika
» 2019-01-27 15:58:41
Tablicę evenArray inicjuję w funkcji main, bo jedynie tam się "znajduje". W innych funkcjach działam na zmiennych lokalnych. Czy popełniam błąd?

Zgadza się, w displayArray mam błędną linię. Gdy ją usuwam, pojawiają się tam z pozoru losowe, duże liczby. Wydaje mi się, że powinno działać, ponieważ funkcja działa na zmiennej lokalnej array. Dopiero przy zastosowaniu funkcji w głównej funkcji wybieram która to tablica ma zostać wyświetlona.
P-173716
« 1 » 2
  Strona 1 z 2 Następna strona