Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53

    [C] bilanciamento vettore

    Voglio realizzare una funzione che prende in ingresso un vettore, composto di 0 e 1, e inserisce o toglie numero fino ad arrivare a un certo numero di uni. Es:
    numero uni: 3
    input: 0 0 1 0 output: 1 0 1 1
    dove mettere o togliere gli uni si può fare in maniera casuale.
    Ho realizzato una funzione ma non gira, mi si blocca in uno strano punto:
    codice:
    void bilancia(int *v, int costante_uni, int dim)
    {
        int i,j, num_uni, differenza;
        int *zeri, *uni, *da_cambiare;
        
        num_uni = conta_n(v, dim, 1);
        /*se ci sono troppi uno*/
        if(num_uni>costante_uni)
        {
            printf("troppi uni\n");
            /*metto gli indici degli uni in un vettore*/
            uni = (int *)malloc(sizeof(int) * num_uni);
            for(i=0, j=0;i<dim;i++)
            {
                /*scrivo gli indici degli uni in un altro vettore*/
                if(v[i] == 1)
                {
                    uni[j] = i;
                    j++;
                }
            }
            differenza = num_uni - costante_uni;
            /*alloco il vettore che conterrà gli indici dei numeri da cambiare*/
            da_cambiare = (int *)malloc(sizeof(int) * differenza);
            genera_indici(num_uni, differenza,uni, da_cambiare);
            /*ora faccio le modifiche*/
            for(i=0;i<differenza;i++)
            {
                v[uni[da_cambiare[i]]] = 0;
            }
            
        }
        else if(num_uni < costante_uni)/*ci sono troppi zeri*/
        {
            printf("Troppi zeri\n");
            /*metto gli indici degli zeri in un vettore*/
            zeri = (int *)malloc(sizeof(int) * num_uni);
            for(i=0, j=0;i<dim;i++)
            {
                /*scrivo gli indici degli zeri in un altro vettore*/
                if(v[i] == 0)
                {
                    zeri[j] = i;
    
                    j++;
                }
            }
            differenza = costante_uni - num_uni;
            /*alloco il vettore che conterrà gli indici dei numeri da cambiare*/
            da_cambiare = (int *)malloc(sizeof(int) * differenza);
            genera_indici(num_uni, differenza, zeri, da_cambiare);
            /*ora faccio le modifiche*/
            for(i=0;i<differenza;i++)
            {
                individuo[zeri[da_cambiare[i]]] = 1;
            }
        }
    }
    Vi scrivo anche le due funzioni che utilizzo in essa, una che conta il numero di occorrenze di un numero in un vettore di interi:
    codice:
    /*funzione che conta il numero di occorrenze del numero passato in un vettore*/
    int conta_n(int *v, int dim, int n)
    {
        int contatore=0, i;
        
        for(i=0;i<dim;i++)
        {
            if(v[i] == n)
            {
                contatore++;
            }                 
        }
        
        return(contatore);
    }
    E una funzione che genera casualmente due indici di un vettore passatogli:
    codice:
    void genera_indici(int dim, int k, int *v, int *r)
    {
       int i, x,j, doppioni;
       
       for(i=0;i<k;i++)
       {
               doppioni = 0;
               r[i] = RANDOM(dim);
    
               for(j=0;j<k;j++)
               {
                  if(r[i] ==r[j])
                  {
                      doppioni++;
                  }
               }
               if(doppioni>1)
               {
                   /*voglio un altro numero che sostituisca quello corrente*/
                   i--;
               }
    
       }
    }
    Aiuto!

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Ho risolto, avevo sbagliato a impostare la grandezza del vettore che conteneva gli zeri.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.