Tworzenie nowej tablicy na podstawie innej przez sumowanie poszczególnych wartości
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

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

AutorWiadomość
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
» 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
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
» 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
» 2019-01-27 15:26:56
Tablica evenArray nie jest zainicjalizowana.
P-173713
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
» 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
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 2Następna strona