PDA

Visualizza la versione completa : [C] Permutazione di vettore!


Fabiuz
03-04-2005, 14:16
Ciao a tutti, eccomi alla presa con 1 altro problema:
Devo permutare gli elementi di un vettore, ovvero scambiarli di posto. Se sono negativi metterli alla destra della met del vettore, se sono positivi devo metterli alla sinistra. Questa la mia soluzione:




#include <stdio.h>
#define N 10

void positiviNegativi(int v[],int dim){
int i;
int *p1,*p2,app=0;
p1=&(v[0]);
p2=&(v[dim-1]);
for (i=0; i<=dim/2; i++){
if (p1<0){
app=*(p1);
*(p1)=*(p2);
*(p2)=app;
p1++;
p2--;
}
}
}

int main(){
int i;
int v[N]={3,-4,6,-8,4,-2,8,-2,7,-12};
printf("Vettore non permutato: \n");
for (i=0; i<=N-1; i++){
printf("%4d", v[i]);}
printf("\n");
positiviNegativi(v,N);
printf("Vettore permutato: \n");
for (i=0; i<=N-1; i++)
printf("%4d", v[i]);
printf("\n");
return 0;
}


ma come mai non funge ??????

Fabiuz
03-04-2005, 20:46
un helpino??????

dekdek
03-04-2005, 20:49
Odio i puntatori. Non mi ricordo mai la sintassi che devo utilizzare. Devo sempre fare cinque sei tentativi prima anche solo di riuscire a compilare. Prova cosi' cmq:



if (*p1<0){
app=*(p1);
p1=*(p2);
p2=app;
p1++;
p2--;
}

Fabiuz
03-04-2005, 21:06
no no! niente da fare!

dekdek
03-04-2005, 21:14
Dovresti specificare cosa fa pero'.
Cioe'... compila ma i numeri sono nell'ordine sbagliato?
Compila e i numeri restano immutati?
Compila e i numeri non sono piu' quelli che hai inserito?
Compila e da errore?
Non compila proprio?

Fabiuz
03-04-2005, 21:49
allora ho risolto cos:



#include <stdio.h>
#define N 10

void positiviNegativi2(int v[],int dim){
int i;
int *p1,*p2,app=0;
p1=&(v[0]);
p2=&(v[dim-1]);
for(i=0; (i<=dim/2); i++){
if (v[i]<=0){
app=*(p1);
*(p1)=*(p2);
*(p2)=app;
p1++;
p2--;
}
}
}

int main(){
int i;
int v[N]={3,-4,6,-8,4,-2,8,-2,7,-12};
printf("Vettore originale: ");
for (i=0; i<=N-1; i++)
printf("%4d", v[i]);
positiviNegativi2(v,N);
printf("\n\n");
printf("Vettore permutato: ");
for (i=0; i<=N-1; i++)
printf("%4d", v[i]);
printf("\n\n");
return 0;
}

ma mi scambia gli elementi nel modo sbagliato! Non deve fare cosi!
dovrebbe portare gli elementi negativi nella porzione finale dell'array mentre gli elementi positivi nella porzione iniziale!

dekdek
03-04-2005, 21:55
Non e' sufficiente spostare solo i negativi a destra.
Ad esempio, se hai v = {-1, 2, -3} il risultato sarebbe {-3, 2, -1}
Hai scambiato -1 e -3 senza risoolvere niente. L'algoritmo va ripensato...

Fabiuz
03-04-2005, 22:05
1 aiutino??

siccome posso solo scorrere l'array solo una volta e non posso usare array di supporto mi venuta in mente solo questa idea qua!

altro non mi viene!
che posso f (p.s anche io odio i puntatori!!) ????

tu come lo faresti (con le condizioni imposte sopra)??




:ciauz:

dekdek
03-04-2005, 22:11
Trova il primo negativo da sinistra.
Trova il primo positivo da destra.
Scambiali.
Ricomincia.
Continua fino a che i due puntatori "si incontrano".

In Java e senza puntatori:



public static void positiviNegativi(int v[],int dim){
int p1 = 0;
// In Java non serve passare dim, ma l'ho fatto per chiarezza
int p2 = dim-1;
int app=0;
while (p1!=p2) {
while ( (v[p1]>=0) && (p1!=p2))
p1++;
while ( (v[p2]<=0) && (p1!=p2))
p2--;
app = v[p1];
v[p1] = v[p2];
v[p2] = app;
}
}


La condizione p1!=p2 e' la condizione di uscita dal ciclo, e va testata anche nei sottocicli. Appena p1==p2 bisogna interrompere.

Fabiuz
03-04-2005, 22:15
ma questo in Java funge??

Loading