[C] Frattale

di il
1 risposte

[C] Frattale

Salve, devo scrivere questo programma e sto avendo delle difficoltà. Premetto che sono ancora un pò inesperta. Qualcuno mi da una mano a risolvere?
Si consideri un array 2D nxn, con n=32, in cui ogni casella può essere bianca (rappresentata da uno spazio ‘ ‘) o nera (rappresentata da una ’X’). All’inizio l’array è costituito solo da caselle nere. L’algoritmo esamina m=6 volte la scacchiera. Durante ogni passo aggiorna lo stato di tutte le caselle usando un criterio di suddivisione nel seguente modo: al primo passo l’array 2D viene visto come costituito da 4 blocchi, ognuno di 16x16 caselle; al secondo passo, ogni blocco di 16x16 è visto come costituito da 4 blocchi di 8x8 caselle; e così via. La regola di suddivisione è la seguente: quando un blocco ‘grande’ nero viene suddiviso in 4 blocchi ‘più piccoli’ allora i blocchi ‘piccoli’ diagonali vengono marcati con ‘D’ e il blocco piccolo in alto a destra diventa bianco o marchiato con ‘A’; quando un blocco ‘grande’ bianco viene suddiviso in 4 blocchi ‘più piccoli’ allora tutti i blocchi ‘piccoli’ rimangono bianchi. L’algoritmo visualizza tutto l’array 2D al temine di ogni passo.
Per ora ho fatto questo
int main()
{
    char frattale[N][N];
    compila_array(frattale, N, ('X'));
    printf ("\n\t\t\tFase 1\n\n");
    stampa_array (frattale, N);
    frattale_it(frattale);
}

void compila_array (char a[N][N], int n, char X)
{
    int i, j;
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        a[i][j]=X;
    }
}

void stampa_array (char a[N][N], int n)
{
    int i, j;
    printf ("+-----------------------------------------------------------------+\n");
    for (i=0; i<n; i++)
    {
        printf ("|");
        for (j=0; j<n; j++)
            printf ("%2c", a[i][j]);
            printf (" |");
        printf ("\n");
    }
    printf ("+-----------------------------------------------------------------+\n");
}

void cerca_in_linea(char a[N][N], int i, int j, int m)
{
    while (j<=N)
    {
        if (a[i][j]!=' ')
            blocco_bianco(a, i, j, m);
        j=j+(2*m);
    }
}

void blocco_bianco (char a[N][N], int i, int j, int size)
{
    int l, m;
    for (l=i; l<(size+1); l++)
    {
        for (m=j; m<(size+1); m++)
        a[l][m]=' ';
    }
}
Ora questa diciamo che è la function principale però penso che ci manca qualcosa perchè l'esecuzione del programma è errata
void frattale_it (char a[N][N])
{
    int i, j, m, ciclo;
    for (ciclo=1; ciclo<6; ciclo++)
    {
        i=0;
        m=N/((int)pow(2,ciclo));
        j=m;
        while (i<N)
        {
            cerca_in_linea(a, i, j, m);
            j=m;
            i=i+(2*m);
        }
        printf ("\n\t\t\tFase %d\n\n", ciclo+1);
        stampa_array(a, N);
        system("PAUSE");
        system("cls");
    }
}

1 Risposte

  • Re: [C] Frattale

    Come prima cosa direi che il testo indica che devi partire da 16x16 quindi
    
    m=N/((int)pow(2,ciclo));
    
    è inutile, per le potenze di 2 basta un right shift.

    Nel tuo caso basta un left shift per effettuare la divisione per 2.
    
    unsigned int m= 32;
    ..../ciclo for
    m = m>>1;
    

    In questo modo inoltre il tuo ciclo potrebbe essere ridotto a un while
    
    unsigned int m= 32;
    while (m > 0)
    {
       m = m>>1;
    }
    

    Da una rapida occhiata del codice, non vedo quasi nulla che faccia quello che l'esercizio richiede....
Devi accedere o registrarti per scrivere nel forum
1 risposte