Automat komórkowy(gra w życie)
Ostatnio zmodyfikowano 2015-10-14 13:05
kisiel7 Temat założony przez niniejszego użytkownika |
Automat komórkowy(gra w życie) » 2015-10-13 23:12:57 Stworzyłem program czytający plik tekstowy zawierający liczby 0 i 1 o wymiarze 16x9. Dalej według zasad obliczam kolejne etapy(dokładnie cztery kolejne) i mam je zapisać w 4 plikach tekstowych, problem w tym, że każdemu plikowi muszę podać nazwę co jest strasznie uciążliwe i wydłuża strasznie kod. Przy okazji jestem niemal pewny, że przejście między 3 etapem, a 4 zadziałało nie prawidłowo, sprawdziłem, że suma wyrzuca jakieś dziwaczne liczby, mimo, że jej zapobiegawczo przypisywałem wartość 0, a wymiary tabel zwiększyłem o 2 zarówno w wierszach jak i kolumnach, żeby nie czytać kolumny(wiersza) o indeksie -1. Jakby ktoś był zainteresowany mógłby rozwiać moje wątpliwości. Oto kod: #include<iostream> #include<fstream> #include<string> #include<cstdlib> #include<conio.h> using namespace std; int main() { int j = 0; int A[ 18 ][ 11 ]; while( j < 11 ) { for( int i = 0; i < 18; i++ ) { A[ i ][ j ] = 0; } j++; } j = 1; fstream plik; plik.open( "lifeStart1.txt", ios::in ); if( plik.good() == false ) { cout << "Nie mozna otworzyc pliku"; } while( !plik.eof() ) { for( int i = 1; i < 17; i++ ) { plik >> A[ i ][ j ]; } j++; } j = 0; plik.close(); int B[ 18 ][ 11 ]; while( j < 10 ) { for( int i = 0; i < 18; i++ ) { B[ i ][ j ] = A[ i ][ j ]; } j++; } j = 1; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { cout << A[ i ][ j ]; } cout << endl; j++; } j = 1; int suma = 0; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { suma = A[ i + 1 ][ j ] + A[ i ][ j + 1 ] + A[ i + 1 ][ j + 1 ] + A[ i - 1 ][ j ] + A[ i ][ j - 1 ] + A[ i - 1 ][ j - 1 ] + A[ i + 1 ][ j - 1 ] + A[ i - 1 ][ j + 1 ]; if(( A[ i ][ j ] == 0 ) &&( suma == 3 ) ) { B[ i ][ j ] = 1; } if(( A[ i ][ j ] == 1 ) &&(( suma >= 2 ) &&( suma <= 3 ) ) ) { B[ i ][ j ] = 1; } if(( A[ i ][ j ] == 1 ) &&(( suma >= 4 ) &&( suma <= 8 ) ) ) { B[ i ][ j ] = 0; } if(( A[ i ][ j ] == 1 ) &&(( suma >= 0 ) &&( suma <= 1 ) ) ) { B[ i ][ j ] = 0; } } j++; } j = 1; cout << endl; plik.open( "lifeStart2.txt", ios::out ); while( j < 10 ) { for( int i = 1; i < 17; i++ ) { cout << B[ i ][ j ]; } cout << endl; j++; } j = 1; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { plik << B[ i ][ j ]; } plik << endl; j++; } plik.close(); suma = 0; j = 1; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { suma = B[ i + 1 ][ j ] + B[ i ][ j + 1 ] + B[ i + 1 ][ j + 1 ] + B[ i - 1 ][ j ] + B[ i ][ j - 1 ] + B[ i - 1 ][ j - 1 ] + B[ i + 1 ][ j - 1 ] + B[ i - 1 ][ j + 1 ]; if(( B[ i ][ j ] == 0 ) &&( suma == 3 ) ) { A[ i ][ j ] = 1; } if(( B[ i ][ j ] == 1 ) &&(( suma >= 2 ) &&( suma <= 3 ) ) ) { A[ i ][ j ] = 1; } if(( B[ i ][ j ] == 1 ) &&(( suma >= 4 ) &&( suma <= 8 ) ) ) { A[ i ][ j ] = 0; } if(( B[ i ][ j ] == 1 ) &&(( suma >= 0 ) &&( suma <= 1 ) ) ) { A[ i ][ j ] = 0; } } j++; } j = 1; cout << endl; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { cout << A[ i ][ j ]; } cout << endl; j++; } plik.open( "lifeStart3.txt", ios::out ); j = 1; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { plik << A[ i ][ j ]; } plik << endl; j++; } plik.close(); j = 1; suma = 0; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { suma = A[ i + 1 ][ j ] + B[ i ][ j + 1 ] + B[ i + 1 ][ j + 1 ] + B[ i - 1 ][ j ] + B[ i ][ j - 1 ] + B[ i - 1 ][ j - 1 ] + B[ i + 1 ][ j - 1 ] + B[ i - 1 ][ j + 1 ]; if(( A[ i ][ j ] == 0 ) &&( suma == 3 ) ) { B[ i ][ j ] = 1; } if(( A[ i ][ j ] == 1 ) &&(( suma >= 2 ) &&( suma <= 3 ) ) ) { B[ i ][ j ] = 1; } if(( A[ i ][ j ] == 1 ) &&(( suma >= 4 ) &&( suma <= 8 ) ) ) { B[ i ][ j ] = 0; } if(( A[ i ][ j ] == 1 ) &&(( suma >= 0 ) &&( suma <= 1 ) ) ) { B[ i ][ j ] = 0; } } j++; } j = 1; cout << endl; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { cout << B[ i ][ j ]; } cout << endl; j++; } plik.open( "lifeStart4.txt", ios::out ); j = 1; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { plik << B[ i ][ j ]; } plik << endl; j++; } plik.close(); j = 1; suma = 0; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { suma = B[ i + 1 ][ j ] + B[ i ][ j + 1 ] + B[ i + 1 ][ j + 1 ] + B[ i - 1 ][ j ] + B[ i ][ j - 1 ] + B[ i - 1 ][ j - 1 ] + B[ i + 1 ][ j - 1 ] + B[ i - 1 ][ j + 1 ]; if(( B[ i ][ j ] == 0 ) &&( suma == 3 ) ) { A[ i ][ j ] = 1; } if(( B[ i ][ j ] == 1 ) &&(( suma >= 2 ) &&( suma <= 3 ) ) ) { A[ i ][ j ] = 1; } if(( B[ i ][ j ] == 1 ) &&(( suma >= 4 ) &&( suma <= 8 ) ) ) { A[ i ][ j ] = 0; } if(( B[ i ][ j ] == 1 ) &&(( suma >= 0 ) &&( suma <= 1 ) ) ) { A[ i ][ j ] = 0; } } j++; } j = 1; cout << endl; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { cout << A[ i ][ j ]; } cout << endl; j++; } plik.open( "lifeStart5.txt", ios::out ); j = 1; while( j < 10 ) { for( int i = 1; i < 17; i++ ) { plik << A[ i ][ j ]; } plik << endl; j++; } plik.close(); return 0; }
|
|
pekfos |
» 2015-10-13 23:17:00 Ten kod to 4 razy to samo..? Użyj funkcji, pętli, czegokolwiek, zamiast bezsensownie powielać kod. |
|
kisiel7 Temat założony przez niniejszego użytkownika |
» 2015-10-13 23:31:33 Ok, problem z etapami rozwiązany, po prostu nie zamieniłem A z B w 4 etapie. Co do sugestii. Jest to transformacja i tak naprawdę tylko algorytm zamiany A i B oraz B i A są potrzebne w tym algorytmie, pozostałe 3 są zbyteczne, ale problem jest w tym, że muszę niestety każdy etap zapisać w innym pliku tekstowym(i go niestety nazwać. Gdybym chciał to zapisać w jednym pliku dorzuciłbym ios|app wrzucił w for i by było bez problemu, ale tak nie wiem co zrobić. |
|
carlosmay |
» 2015-10-13 23:55:29 Typ zmiennej to std::string i dla każdego pliku różni się tylko liczbą. std::string file_name = "lifeStart.txt"; tak zapisujesz sobie nazwę ścieżki. Teraz dla każdej pętli masz licznik dopasowany do liczb w nazwie plików i wstawiasz do file_name wartość tego licznika przed 10 znak i nazwa gotowa do użycia w każdej pętli o innej nazwie. edit: taki mały przykład, może się przyda string file_name = "NazwaPliku.txt"; char buff[ 4 ]; for( int i = 1; i <= 4; i++ ) { if( i > 1 ) file_name.erase( 10, 1 ); _itoa( i, buff, 10 ); file_name.insert( 10, buff ); cout << file_name << endl; }
|
|
Monika90 |
» 2015-10-14 13:05:30 carlosmay, a nie można po prostu tak? for( int i = 1; i <= 10; ++i ) { std::ofstream file( "plik-" + std::to_string( i ) + ".txt" ); file << i << std::endl; }
|
|
« 1 » |