Array considerato ad anello in C

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Array considerato ad anello in C

    Programma aggiornato. Per mia comodità ho lasciato i casuale1,2,3 e per la dimensione di population ho pensato che dovrebbe essere T, ma ovviamente non lo potevo mettere come dimensione di un array, allora sbaglio io o c'è un modo per farlo?
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define MAX 100
    int main()
    {
    int life[MAX]={0},N,T,i=0,j,newlife[MAX],temp,seed,casuale1,casuale2,casuale3;
    seed = time(NULL);
    srand(seed);
    
    do{
       printf("Inserisci un numero N, 1<=N<=100\n");
       scanf("%d",&N);
      }while(N <= 0 || N> MAX);
        
    do{
        printf("Inserire un numero positivo minore uguale di 1000\n");
                 scanf("%d",&T);
      } while(T<=0 || T>1000);
        int population[MAX]={0};
    for (i=0;i<T;i++)
      {
          
              casuale1 = rand() % N;
              casuale2 = rand() % N;
              casuale3 = rand() % N;
              life[casuale1] = 1;
              life[casuale2] = 1;
              life[casuale3] = 1;
              if ((casuale1)==(casuale2))
              {
                  casuale1+=1;
              }
              else if ((casuale1)==(casuale3))
              {
                  casuale1+=1;
              }
              else if ((casuale2)==(casuale3))
              {
                  casuale3=casuale2+2;
              }
            
            for(j=0;j<N;j++)
            {
              if ((j-1) == (N))
                 {
                   life[j+1] = life[0];
                 }
              else if ((j) == (-1))
                 {
                   life[j-1] = life[N-1];
                 }
              else if (life[j+1]==1 && life[j-1]==1)
                 {
                   newlife[j]=0;
                 } 
              else if (life[j+1]==1 || life[j-1]==1)
                 {
                   newlife[j]=!life[j];
                 }  
              else if ((life[j+1] && life[j-1])==0)
                 {
                   temp = newlife[j];
                   newlife[j]=temp;
                 } 
              else if (newlife[j]==1 || life[j]==1)
                 {
                   population[i]++;
                 }
            }
            for (j=0;j<N;j++)
            {
              printf("newlife[%d]=%d\n",j,newlife[j]);
              printf("\n");
              life[j] = newlife[j];
              newlife[j]=0;
            }
      }  
    int min=population[0];
    int max=population[0];
    for(i=0;i<N;i++)
    {
      if(population[i] > max)
       {
         max = population[i];
       }  
    } 
    for(i=0;i<N;i++)
    {
      if(population[i] < min)
        {
           min = population[i];
        }  
    } 
                               
    printf("Il massimo valore di population[] e': %d\n",max);
    printf("Il massimo valore di population[] e': %d\n",min);
    printf("L'ultimo valore di population[] e': %d\n",population[MAX-1]);
    return 0;
    }
  • Re: Array considerato ad anello in C

    Https://www.kernel.org/doc/html/v4.10/process/coding-style.html. Credo possa servirti…

    Il lavoro sui casuale1, casuale2, casuale3 non ha senso, oltre ad essere errato. Un semplice caso è 2, 0, 0. Va preferito un ciclo essendo più leggibile (e corretto…).

    T ha una limitazione, come dice il testo.
  • Re: Array considerato ad anello in C

    @nexus99
    RISCRIVI TUTTO DA CAPO.

    Continui a modificare un codice che e' sbagliato NON formattato, che contiene COSE INUTILI, NON seguendo le indicazioni che ti sono state date.

    Come in fisica, 30 gradi Celsius NON SONO la stessa cosa di 30 gradi Kelvin
    Se ti cade su un piede un mattone di 10 grammi NON E' la stessa cosa se te ne cade uno di 10 kg.
    Scrivere un programma NON E' come buttare i vestiti in armadio, alla rinfusa.

    Serve ORDINE, LOGICA e CAPIRE quelli che si sta scrivendo.
    Se NON TI E' CHIARO, non andare a tentativi, in quanto la probabilita' di azzeccarci e' la stessa di una scimmia che scrive un brano di sheakspeare.

    Per IL MOMENTO, EVITA l'inserimento dei dati da tastiera: decidi i numeri ed usa SEMPRE quelli.
    Aggiungere l'inserimento da tastiera e' questione di UN PAIO DI RIGHE DI CODICE.
  • Re: Array considerato ad anello in C

    La stai facendo troppo complicata. La prima parte, seguendo i consigli che ti hanno dato sul modulo, la puoi scrivere semplicemente così
    
    #include <stdio.h>
    #include <time.h>
    
    #define MAX_N 100
    #define MAX_T 1000
    
    int main(){
        int i, j, N, T, casuale1, casuale2, casuale3;
        bool b;
          
        do{
            printf("Inserisci il numero di caselle (1 <= N <= %d)\n", MAX_N);
            scanf("%d",&N);
        }while(N <= 0 || N > MAX_N);     
        do{
            printf("Inserire il numero massimo di cicli di vita (T <= %d)\n", MAX_T);
            scanf("%d",&T);
        }while(T < 0 || T > MAX_T);
        
        srand(time(NULL));
        casuale1 = rand() % N; casuale2 = rand() % N; casuale3 = rand() % N;                 
        
        int life[N] = {0}, newlife[N];
        life[casuale1] = life[casuale2] = life[casuale3] = -1;
        
        // stampa linea iniziale
        for(i=0;i<N;i++)
            if(life[i]) printf("*");
            else        printf(" ");
        printf("\n");
        
        for(j=0;j<T;j++){ 
            // calcola popolazione
            for(i=0;i<N;i++)
                if(life[(i+1)%N] && life[(i+N-1)%N])
                    newlife[i] = 0;
                else if(life[(i+1)%N] ^ life[(i+N-1)%N])
                    newlife[i] = ~life[i];           
                else
                    newlife[i] = life[i];            
            // aggiorna popolazione
            for(b=false,i=0;i<N;i++){
                life[i] = newlife[i];
                if(life[i]) b = true;
            }
            // stampa linea aggiornata
            for(i=0;i<N;i++)
                if(life[i]) printf("*");
                else        printf(" ");
            printf("\n");   
            
            if(!b) break; // fine popolazione
        }     
       
        getchar();
        return 0;
    }
    
  • Re: Array considerato ad anello in C

    Io invece come detto in precedenza eviterei di aggiornare di volta in volta l'array life utilizzando dei puntatori (anche se in realtà per fare il tutto basterebbe un solo array e 2 variabili intere in cui salvare il primo elemento e il generico elemento precedente).
    Inoltre stando alla traccia si ricava che:

    010 ==> 1
    ----
    110 ==> 0
    011 ==> 0
    ----
    111 ==> 0
    ------------
    000 ==> 0
    ----
    100 ==> 1
    001 ==> 1
    ----
    101 ==> 0

    ossia l'elemento newlife[j] sarà uguale a 1 solo se la somma di life[j-1], life[j] e life[j+1] è pari a 1.

    Quindi in definitiva farei qualcosa del genere:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define T 1000
    #define N 70
    #define INITIAL_POP 3
    
    int main()
    {
        srand(time(0));
        int u[N] = {0};
        int v[N];
        int *life = u;
        int *new_life = v;
        int *temp;
        int a;
        int i;
        int min_pop = INITIAL_POP;
        int max_pop = INITIAL_POP;
        for(i = 0; i < INITIAL_POP; ++i)
        {
            while(u[a = rand() % N]);
            u[a] = 1;
        }
        for(i = 0; i < N; ++i)
        {
            printf("%d", life[i]);
        }
        for(i = 0; i < T && min_pop; ++i)
        {
            a = 0;
            printf("\n");
            for(int j = 0; j < N; ++j)
            {
                new_life[j] = life[(j + N - 1) % N] + life[j] + life[(j + 1) % N] == 1;
                a += new_life[j];
                printf("%d", new_life[j]);
            }
            if(a < min_pop)
            {
                min_pop = a;
            }
            else if(a > max_pop)
            {
                max_pop = a;
            }
            temp = life;
            life = new_life;
            new_life = temp;
        }
        if(!min_pop)
        {
            printf("\nPOPOLAZIONE COMPLETAMENTE DECEDUTA ALLA %d GENERAZIONE!", i);
        }
        printf("\nMIN_POP = %d\nMAX_POP = %d\nLAST_POP = %d", min_pop, max_pop, a);
        return 0;
    }
Devi accedere o registrarti per scrivere nel forum
19 risposte