mateczek |
» 2017-12-03 22:36:59 a co sądzisz o takim programie??. Jeśli odpowiednio zdefiniować klasę matrix to taki program główny w zupełności wystarczy bool czyByla( matrix & tab, list < matrix > & kolejka ) { for( matrix & element: kolejka ) { if( element == tab ) return true; } return false; } int main() { fstream plik( "dane.txt" ); matrix tablica( 10, 10 ); plik >> tablica; cout << tablica << endl; list < matrix > kolejka; kolejka.push_front( tablica ); for( int i = 0; i < 50; i++ ) { tablica = tablica.liveNextCycle(); cout << tablica << endl; if( czyByla( tablica, kolejka ) ) break; kolejka.push_front( tablica ); if( kolejka.size() > 10 ) kolejka.pop_back(); } }
//tutaj małe wyjaśnienie jak można iterować tablicę pętlą for !!! #include <iostream>
using namespace std;
int main() { int tablica[] = { 1, 2, 3, 3, 4, 4, 5, 6, 1 }; for( int element: tablica ) { cout << element << endl; } } |
|
mateczek |
» 2017-12-04 23:46:14 Przykładowa całość z komentarzami #include <iostream> #include<vector> using namespace std;
struct punkt { int baseW; int baseK; punkt( int w, int k ) { baseW = w; baseK = k; } vector < punkt > generateNebers( int size ) { vector < punkt > punkty; if((( baseW - 1 ) >= 0 ) &&(( baseK - 1 ) >= 0 ) ) { punkty.push_back( punkt( baseW - 1, baseK - 1 ) ); } if(( baseW - 1 ) >= 0 ) { punkty.push_back( punkt( baseW - 1, baseK ) ); } if((( baseW - 1 ) >= 0 ) &&(( baseK + 1 ) < size ) ) { punkty.push_back( punkt( baseW - 1, baseK + 1 ) ); } if(( baseK - 1 ) >= 0 ) { punkty.push_back( punkt( baseW, baseK - 1 ) ); } if((( baseK + 1 ) < size ) ) { punkty.push_back( punkt( baseW, baseK + 1 ) ); } if((( baseW + 1 ) < size ) &&(( baseK - 1 ) >= 0 ) ) { punkty.push_back( punkt( baseW + 1, baseK - 1 ) ); } if(( baseW + 1 ) < size ) { punkty.push_back( punkt( baseW + 1, baseK ) ); } if((( baseW + 1 ) < size ) &&(( baseK + 1 ) < size ) ) { punkty.push_back( punkt( baseW + 1, baseK + 1 ) ); } return punkty; } }; class matrix { int * tab = NULL; int rozmiar; int wiersze = 0, kolumny = 0; public: friend ostream & operator <<( ostream & s, matrix & m ); friend istream & operator >>( istream & s, matrix & m ); matrix( int w, int k ) : wiersze( w ) , kolumny( k ) { rozmiar = w * k; tab = new int[ rozmiar ]; for( int i = 0; i < rozmiar; i++ ) tab[ i ] = 0; } matrix() { } ~matrix() { if( tab ) { delete[] tab; tab = NULL; } } int & operator ()( int w, int k ) { return tab[ w * kolumny + k ]; } int row() { return wiersze; } int column() { return kolumny; } matrix liveNextCycle(); matrix & operator =( matrix && wzor ); matrix( const matrix & wzor ); matrix( matrix && wzor ); matrix & operator =( const matrix & wzor ); bool operator ==( const matrix & m ); };
matrix & matrix::operator =( matrix && wzor ) { cout << "jestem operator przenoszenia" << endl; std::swap( tab, wzor.tab ); std::swap( wiersze, wzor.wiersze ); std::swap( kolumny, wzor.kolumny ); std::swap( rozmiar, wzor.rozmiar ); return * this; }
matrix::matrix( const matrix & wzor ) { cout << "jestem konstruktor kopiujący" << endl; wiersze = wzor.wiersze; kolumny = wzor.kolumny; rozmiar = wzor.rozmiar; tab = new int[ rozmiar ]; for( int i = 0; i < rozmiar; i++ ) { tab[ i ] = wzor.tab[ i ]; } }
matrix::matrix( matrix && wzor ) { cout << "jestem konstruktor przenoszący" << endl; std::swap( tab, wzor.tab ); std::swap( wiersze, wzor.wiersze ); std::swap( kolumny, wzor.kolumny ); std::swap( rozmiar, wzor.rozmiar ); } matrix & matrix::operator =( const matrix & wzor ) { cout << "jestem operator przypisania" << endl; wiersze = wzor.wiersze; kolumny = wzor.kolumny; rozmiar = wzor.rozmiar; if( tab ) delete[] tab; tab = new int[ rozmiar ]; for( int i = 0; i < rozmiar; i++ ) { tab[ i ] = wzor.tab[ i ]; } return * this; } bool matrix::operator ==( const matrix & m ) { for( int i = 0; i < rozmiar; i++ ) { if( m.tab[ i ] != tab[ i ] ) return false; } return true; } matrix matrix::liveNextCycle() { matrix tabPom( wiersze, kolumny ); for( int w = 0; w < wiersze; w++ ) { for( int k = 0; k < kolumny; k++ ) { punkt p( w, k ); vector < punkt > listaSasiadow = p.generateNebers( wiersze ); int licznikZywych = 0; for( const punkt & pTemp: listaSasiadow ) { if(( * this )( pTemp.baseW, pTemp.baseK ) == 1 ) licznikZywych++; } if(( * this )( w, k ) == 1 ) { if(( licznikZywych == 2 ) ||( licznikZywych == 3 ) ) { tabPom( w, k ) = 1; } else { tabPom( w, k ) = 0; } } else { if( licznikZywych == 3 ) tabPom( w, k ) = 1; } } } return tabPom; }
ostream & operator <<( ostream & s, matrix & m ) { for( int w = 0; w < m.wiersze; w++ ) { for( int k = 0; k < m.kolumny; k++ ) { s << m( w, k ) << " "; } s << endl; } return s; }
istream & operator >>( istream & s, matrix & m ) { for( int w = 0; w < m.wiersze; w++ ) { for( int k = 0; k < m.kolumny; k++ ) { m( w, k ) = 0; } } int w, k; while( s >> w >> k ) { m( w, k ) = 1; } return s; }
#include<fstream> #include<list> bool czyByla( matrix & tab, list < matrix > & kolejka ) { for( matrix & element: kolejka ) { if( element == tab ) return true; } return false; } int main() { fstream plik( "dane.txt" ); matrix tablica( 10, 10 ); plik >> tablica; cout << tablica << endl; list < matrix > kolejka; kolejka.push_front( tablica ); for( int i = 0; i < 50; i++ ) { tablica = tablica.liveNextCycle(); cout << tablica << endl; if( czyByla( tablica, kolejka ) ) break; kolejka.push_front( tablica ); if( kolejka.size() > 10 ) kolejka.pop_back(); } } |
|
paula1902 Temat założony przez niniejszego użytkownika |
» 2017-12-06 13:54:58 Na ten moment nie używamy klas. Programujemy nieobiektowo. Dlatego też ten program musi być napisany w jak najprostszy sposób... #include <iostream> #include <fstream> #include <Windows.h> #include <cstdlib> #define TABSIZE1 10 #define TABSIZE2 10 #define CYKLE 10 using namespace std;
short czy_rozne( short tab[][ TABSIZE1 ][ TABSIZE2 ], short pokolenie, short cykl ) { short ile_razy_spr; short tab_pom2[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ] = { 0 }; if( pokolenie < CYKLE ) ile_razy_spr = pokolenie; else ile_razy_spr = CYKLE; for( short i = 0; i < ile_razy_spr; i++ ) { if( i == cykl ) continue; for( short j = 0; j < TABSIZE1; j++ ) for( short k = 0; k < TABSIZE2; k++ ) { if( tab[ cykl ][ j ][ k ] != tab[ i ][ j ][ k ] ) tab_pom2[ i ][ j ][ k ] = 1; } } if( tab_pom2 != 0 ) return 0; }
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 = 50; short l_zywych_sasiadow; short x; short y; short cykle = pokolenie % 10; 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; pokolenie++; cout << endl << "cykl nr " << cykle << endl; 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; } } } if( pokolenie < 10 ) cykle = pokolenie; else cykle = pokolenie % 10; 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, cykle ) ) == 0 ) &&( pokolenie <= ile_pokolen ) ); system( "pause" ); return 0; } cały czas mam tylko problem z tym porównywaniem. Dla powyższego kodu działa wszystko oprócz tej funkcji czy_rozne. Pokazuje mi tak jakby cały czas warunek pętli do while był prawda (dopoki pokolenie<=50),a więc że zwraca mi wartosć 0. Próbowałam i od razu zwracać wartość w pętli, i za pomocą zmiennej, jednak nic z tego nie działa poprawnie. Więc w którym momencie powinnam dać return? I czy zwykłe return 0 lub 1 wystarczy? Czy powinnam zwrócić coś innego? |
|
mateczek |
» 2017-12-06 18:10:01 problem z tak liniowo pisanym kodem jest taki, że jeśli chcesz coś poprawić na początku kodu to psujesz na końcu. Bo w całym kodzie korzystasz z tych samych zmiennych. Jeśli Ci zależy na nauce programowania to zapoznaj się z klasami podziel kod na mniejsze kawałki i testuj. Żaden nauczyciel programowania nie będzie miał nic przeciwko gdy zaprezentujesz coś więcej niż tylko liniowe programowanie. przetestowanie funkcji która lata po tablicy tab[10][10][10] i szuka powtórzeń jest na tyle wk..wiające, że prawie nikomu by się nie chciało tego robić. Z racji tego że testowanie tego to droga przez mękę proponuje olać i zwyczajnie policzyć ilość zgodnych elementów w tablicy. Jeśli wszystkie 100 elementów z tablicy 10X10 będzie zgodne tablica była w kolejce i przerywamy program #include <iostream> #include <fstream> #include <cstdlib> #define TABSIZE1 10 #define TABSIZE2 10 #define CYKLE 10 using namespace std;
short czyByla( short tab[ 10 ][ TABSIZE1 ][ TABSIZE2 ], short pokolenie ) { short ile_razy_spr; if( pokolenie < CYKLE ) ile_razy_spr = pokolenie; else ile_razy_spr = CYKLE; for( short i = 0; i < ile_razy_spr; i++ ) { if( i == pokolenie % 10 ) continue; int counter = 0; for( short j = 0; j < TABSIZE1; j++ ) { for( short k = 0; k < TABSIZE2; k++ ) { if( tab[ pokolenie % 10 ][ j ][ k ] == tab[ i ][ j ][ k ] ) { counter++; } } } if( counter == 100 ) 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 = 0; short ile_pokolen = 50; short x; short y; short cykle = pokolenie % 10; short tab[ CYKLE ][ TABSIZE1 ][ TABSIZE2 ] = { 0 }; short tab_pom[ TABSIZE1 ][ TABSIZE2 ]; ifstream plik; plik.open( "dane.txt" ); if( !plik.good() ) { cout << "Nie udalo sie otworzyc pliku!"; return 0; } while( !plik.eof() ) { plik >> x; plik >> y; tab[ cykle ][ x ][ y ] = 1; } wyswietl( tab, cykle ); plik.close(); do { cout << endl << "Pokolenie nr " << pokolenie << endl; cout << endl; cout << endl << "cykl nr " << cykle << endl; for( short x = 0; x < TABSIZE1; x++ ) { for( short y = 0; y < TABSIZE2; y++ ) { if( nowa_tablica( tab, pokolenie % 10, x, y ) == 1 ) { tab_pom[ x ][ y ] = 1; } else { tab_pom[ x ][ y ] = 0; } } } pokolenie++; for( short x = 0; x < TABSIZE1; x++ ) for( short y = 0; y < TABSIZE2; y++ ) tab[ pokolenie % 10 ][ x ][ y ] = tab_pom[ x ][ y ]; wyswietl( tab, pokolenie % 10 ); if( czyByla( tab, pokolenie ) ) break; } while( pokolenie <= ile_pokolen ); system( "pause" ); return 0; }
|
|
1 2 « 3 » |