PDA

Visualizza la versione completa : [C] bilanciamento vettore


Iso90
12-12-2012, 08:41
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:


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:


/*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:


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!

Iso90
12-12-2012, 09:27
Ho risolto, avevo sbagliato a impostare la grandezza del vettore che conteneva gli zeri.

Loading