paula1902 Temat założony przez niniejszego użytkownika |
» 2017-12-02 14:22:05 Właśnie w tym rzecz, że gdy zwiększam zmienną cykle przed petlą lub w pętli nie działa. To w którym momencie powinnam inkrementować cykle? Tak. Dokładnie o to chodzi. Ma sprawdzać ostatnie 10 pokoleń. A więc zamiast short cykle = 0; wystarczy short cykle = pokolenie % 10; ? Czyli dla pokolenie<10 muszę coś zmienić w funkcji czy_rozne ? |
|
mateczek |
» 2017-12-02 14:45:16 Czyli dla pokolenie<10 muszę coś zmienić w funkcji czy_rozne ? |
Właściwie dla pokolenie większe od 10. Bufor kołowy wygląda tak: 10 11 12 13 14 15 _5_ 6 7 8 9
pokolenie =16; indexTablicy 16%10 =6; czyli aktualnie piszesz tam gdzie znajduje się cyfra "5" czyli nowe pokolenie musisz porównać z całą tablicą !!! A nie tylko <od zera do sześciu> jak masz aktualnie. Proponował bym napisanie funkcji czy_rozne( tablica3D, tablicaPomocnicza, pokolenie ) { if( pokolenie < 10 ) zakres = pokolenie; else zakres = 10; for( int i = 0; i < zakres; i++ ) { } }
|
|
paula1902 Temat założony przez niniejszego użytkownika |
» 2017-12-02 19:29:50 No to wiem, że trzeba porównać z całą resztą, po to stworzyłam tablice trójwymiarową. Eh nwm poprawiłam to ale teraz to już calkiem jest zle. Wyświetla prawidłowo tylko 1 stan(wczytany z pliku). Reszta jest wyzerowana i wyświetla się max pokolen. A więc ani prawidłowo nie wyznacza sąsiadów ani nie przerywa jak się powtarza. Załamka normalnie. A ta tablica pomocnicza była tylko do tego, aby prawidłowo oceniać sąsiadów, bez niej gdy komórka przykładowo stawała się żywa to dla sprawdzenia kolejnej komórki była traktowana już jako żywa. Więc po co mi ona jako argument funkcji czy_rozne? #include <iostream> #include <fstream> #include <Windows.h> #include <cstdlib> #define TABSIZE1 10 #define TABSIZE2 10 #define CYKLE 10 using namespace std;
bool czy_rozne( short tab[][ TABSIZE1 ][ TABSIZE2 ], short pokolenie ) { short zakres; if( pokolenie < 10 ) zakres = pokolenie; else zakres = 10; for( short k = 0; k < zakres; k++ ) { for( short i = 0; i < TABSIZE1; i++ ) { for( short j = 0; j < TABSIZE1; j++ ) { if( tab[ zakres ][ i ][ j ] != tab[ k ][ i ][ j ] ) return true; } } } return false; }
short pozycjax( short wspolrzedna ) { if( wspolrzedna >= 0 || wspolrzedna < TABSIZE1 ) return wspolrzedna; if( wspolrzedna <= - 1 ) return TABSIZE1 - 1; if( wspolrzedna >= TABSIZE1 ) return 0; }
short pozycjay( short wspolrzedna ) { if( wspolrzedna >= 0 || wspolrzedna < TABSIZE2 ) return wspolrzedna; if( wspolrzedna <= - 1 ) return TABSIZE2 - 1; if( wspolrzedna >= TABSIZE2 ) return 0; }
short nowa_tablica( short( & tab )[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ], short cykle, short x, short y ) { int l_zywych_sasiadow = 0; if( tab[ cykle ][ pozycjax( x - 1 ) ][ pozycjay( y - 1 ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ pozycjax( x - 1 ) ][ pozycjay( y ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ pozycjax( x - 1 ) ][ pozycjay( y + 1 ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ pozycjax( x ) ][ pozycjay( y - 1 ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ pozycjax( x ) ][ pozycjay( y + 1 ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ pozycjax( x + 1 ) ][ pozycjay( y - 1 ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ pozycjax( x + 1 ) ][ pozycjay( y ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ pozycjax( x + 1 ) ][ pozycjay( y + 1 ) ] == 1 ) l_zywych_sasiadow++; if( tab[ cykle ][ x ][ y ] == 1 ) { if( l_zywych_sasiadow == 2 || l_zywych_sasiadow == 3 ) return 1; else return 0; } else if( l_zywych_sasiadow == 3 ) return 1; }
void wyswietl( short tab[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ], short cykle ) { for( short i = 0; i < TABSIZE1; i++ ) { for( short j = 0; j < TABSIZE2; j++ ) cout << tab[ cykle ][ i ][ j ] << " "; cout << endl; } }
int main( int argc, char * argv[] )
{ short pokolenie = 1; short ile_pokolen = 15; short l_zywych_sasiadow; short x; short y; short cykle = 1; short tab[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ] = { 0 }; short tab_pom[ TABSIZE1 ][ TABSIZE2 ]; ifstream plik; if( argc > 1 ) { string parametr; parametr = argv[ 1 ]; plik.open( argv[ 1 ] ); } else cout << "Nie podano wlasciwego parametru!"; if( !plik.good() ) { cout << "Nie udalo sie otworzyc pliku!"; return 0; } while( !plik.eof() ) { plik >> x; plik >> y; tab[ cykle ][ x ][ y ] = 1; } plik.close(); do { wyswietl( tab, cykle ); cout << endl << "Pokolenie nr " << pokolenie << endl; cout << endl << "cykl nr " << cykle << endl; cout << endl; pokolenie++; cykle = pokolenie % 10; for( short x = 0; x < TABSIZE1; x++ ) { for( short y = 0; y < TABSIZE2; y++ ) { if( nowa_tablica( tab, cykle, x, y ) == 1 ) { tab_pom[ x ][ y ] = 1; } else { tab_pom[ x ][ y ] = 0; } } } for( short x = 0; x < TABSIZE1; x++ ) for( short y = 0; y < TABSIZE2; y++ ) tab[ cykle ][ x ][ y ] = tab_pom[ x ][ y ]; } while((( czy_rozne( tab, pokolenie ) ) == true ) &&( pokolenie <= ile_pokolen ) ); system( "pause" ); return 0; } |
|
mateczek |
» 2017-12-02 19:39:26 oczywiście że jest źle. Dlatego jest źle że w tablicy 3D masz element ostatni i porównujesz go z samym sobą !!! Spróbuj oswoić się z debuggerem !!! ikonka robaka w twoim IDE pozwoli Ci analizować kod w pracy krokowej sam zobaczysz co nie działa zgodnie z twoim pomysłem. |
|
paula1902 Temat założony przez niniejszego użytkownika |
» 2017-12-02 19:45:58 Racja.. dodałam warunek i nadal nie działa ;(( bool czy_rozne( short tab[][ TABSIZE1 ][ TABSIZE2 ], short pokolenie ) { short zakres; if( pokolenie < 10 ) zakres = pokolenie; else zakres = 10; for( short k = 0; k < zakres; k++ ) { if( k != zakres ) { for( short i = 0; i < TABSIZE1; i++ ) { for( short j = 0; j < TABSIZE1; j++ ) { if( tab[ zakres ][ i ][ j ] != tab[ k ][ i ][ j ] ) return true; } } } } return false; } |
|
mateczek |
» 2017-12-02 20:04:53 widzisz ja miałem taki pomysł by w tablicy 3D trzymać poprzednie cykle i porównywać je z tablicą pomocniczą gdzie masz ostatnio obrabiany !!! Jeśli już to funkcje można poprawić w ten sposób. musisz albo przekazać albo wyliczyć index ostatnio dodanego elementu aby go porównać z resztą zapamiętanych. Zdajesz sobie sprawę że teraz w kolejce masz 9 ostatnich pokoleń+aktualne pokolenie i aktualne pokolenie porównujesz do 9 poprzednich?? bool czy_rozne( short tab[][ TABSIZE1 ][ TABSIZE2 ], short pokolenie ) { short zakres; if( pokolenie < 10 ) zakres = pokolenie; else zakres = 10; int ostatni_obrabiany = pokolenie % 10; for( short k = 0; k < zakres; k++ ) { if( k == ostatni_obrabiany ) continue; for( short i = 0; i < TABSIZE1; i++ ) { for( short j = 0; j < TABSIZE1; j++ ) { if( tab[ ostatni_obrabiany ][ i ][ j ] != tab[ k ][ i ][ j ] ) return true; } } } return false; } |
|
paula1902 Temat założony przez niniejszego użytkownika |
» 2017-12-02 21:05:56 No dobrze, ale w takim razie dlaczego kolejne stany wyswietlaja sie poprawnie ale gdy zmienna cykle się nie zmienia. if( pokolenie < 10 ) cykle = pokolenie; else cykle = pokolenie % 10; Po tym warunku wszystko szlag trafia.. Nie mogę znalezc błedów.. a gdy daję to przed pętlą do while, nie zmienia się numer cyklu.. to dziala dla tych danych. 2 2 3 3 2 7 3 4 4 3 5 5 6 5 7 1 8 6 |
|
mateczek |
» 2017-12-02 22:05:24 myślę że nie ma sensu łatać tego kodu . proponuje napisać od nowa if( tab[ zakres ][ i ][ j ] != tab[ k ][ i ][ j ] ) return true;
[ cpp ] short cykle = 1;
|
|
1 « 2 » 3 |