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

Automat komórkowy(gra w życie)

Ostatnio zmodyfikowano 2015-10-14 13:05
Autor Wiadomość
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:
C/C++
#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;
}
P-138531
pekfos
» 2015-10-13 23:17:00
Ten kod to 4 razy to samo..? Użyj funkcji, pętli, czegokolwiek, zamiast bezsensownie powielać kod.
P-138533
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ć.
P-138535
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
C/C++
string file_name = "NazwaPliku.txt";
char buff[ 4 ]; // bufor na liczbe
for( int i = 1; i <= 4; i++ ) {
    if( i > 1 ) file_name.erase( 10, 1 ); // usuwa liczbe z nazwy
   
    _itoa( i, buff, 10 ); // konwersja z int na string
    file_name.insert( 10, buff ); // wstawianie liczby do nazwy
    cout << file_name << endl;
}
P-138539
Monika90
» 2015-10-14 13:05:30
carlosmay, a nie można po prostu tak?
C/C++
for( int i = 1; i <= 10; ++i )
{
    std::ofstream file( "plik-" + std::to_string( i ) + ".txt" );
    file << i << std::endl;
}
P-138547
« 1 »
  Strona 1 z 1