View Full Version : [C++] Non inverte ordine elementi di un array
Forzajuve
09-11-2013, 19:50
Salve ragazzi,
dovrei invertire l'ordine degli elementi di un array. Dato un {a,b,c}, dovrebbe darmi {c,b,a}. Applicando ciò a una codifica di un numero in binario, mi aspetterei di ricevere una sequenza di 0 e 1, ma invece mi ritrovo con 4 8 e altri :mbe:
Ho utilizzato:
for(int j=riemp; j>=(riemp/2); j=j--)
{temp=v[j];
v[j]=v[riemp-j+o];
v[riemp-j+0]=temp;
o=o++;
cout<<""<<v[j]<<"";
}
Dove riemp è il riempimento, ossia la quantità inferiore o uguale alla cardinalità dell'array, temp è la variabile di appoggio temporanea.
Ad esempio, immettendo 4, mi trovo un array {0,0,1,0} su 4 bit, mentre dovrebbe essere {0,1,0,0}. La parte di codice qui sopra dovrebbe risolvere il problema, ma mi dà come risposta 011 su 4 bit (e l'altro dove va?) e una stringa di 7-8 numeri su 3 bit :mbe:
Dov'è l'errore?
Forzajuve
09-11-2013, 21:13
La 0 al posto della o è dovuto alla fase di post del messaggio :) controllando c'è o e non 0.
Il problema persiste: con un riempimento di un certo numero di bit riesce a darmi, ad esempio, 4 giusto, ma con bit invertiti. Dopo la parte che dovrebbe scambiare le variabili, dà risultato 014699680 :mbe:
Forzajuve
09-11-2013, 21:55
In effetti, cambiando o con 1 (tra l'altro ho scritto il file in 2 o 3 maniere diverse nell'ultima parte) non va in (quello che sembra) un overflow (o un accesso ad un registro di memoria non dedicato all'array). Ora con
for(int j=riemp; j>0; j=j--)
{temp=v[j];
v[j]=v[riemp-j+1];
v[riemp-j+1]=temp;
cout<<""<<v[j]<<"";
}
restituisce tutti bit. Il problema, stavolta, è che se ad esempio gli chiedo di scrivermi 1 su 10 cifre, nella prima parte me lo scrive invertito (1 e 9 zeri), nella seconda parte invece di invertirmi i valori, presenta tuttti 0. Perché?
Il main è così
int main(int argc, char** argv) {
binario v;
int x, riemp,i=0, o=0, temp=0;
cout<<"Su quanti bit vuoi scrivere il numero?\n";
cin>>riemp;
cout<<"Che numero vuoi convertire da decimale a binario?\n";
cin>>x;
for (; i<riemp; x=x/2, i=i++ )
{if (x%2==0)
{v[i] = 0;
}
else {v[i] = 1;
}
cout<<""<<v[i]<<"";
}
cout<<"\n";
Il cout di v[i] e il relativo \n li ho messi per vedere come cambiavano gli elementi dell' array nei vari passaggi :)
EDIT:
Da un punto di vista concettuale la seconda parte dovrebbe consistere nel prendere gli elementi dell'array fino a quello centrale (che mantiene la sua posizione) e scambiarne l'ordine.
EDIT2:
Avendo definito temp successivamente ora non è più inizializzato con 0.
vendettaaaaa
09-11-2013, 22:07
La 0 al posto della o è dovuto alla fase di post del messaggio :) controllando c'è o e non 0.
Ma non hai fatto copia e incolla? :|
Forzajuve
09-11-2013, 22:11
Ma non hai fatto copia e incolla? :|
Sì ma probabilmente mentre lo copiavo avrò premuto 0 :)
EDIT: Probabilmente un errore sta nel fatto che prima avevo fissato come indice massimo in cui ricercare il riempimento. Ma se gli elementi dell'array vanno a 0 a n-1, in n non lo troverà sicuramente :). Anche se ancora non funziona.
EDIT2:Procedendo per tentativi. Questo restituisce solo bit 0 nella maggior parte dei casi.
for(int j=0; j<riemp; j=j++)
{temp=v[j];
v[j]=v[riemp-j-1];
v[riemp-j-1]=temp;
cout<<""<<v[j]<<"";
}
EDIT3: Non so come, ma la 3 parte di questo programma funziona!
int main(int argc, char** argv) {
binario v;
int x, riemp,i=0, o=0, temp=0;
cout<<"Su quanti bit vuoi scrivere il numero?\n";
cin>>riemp;
cout<<"Che numero vuoi convertire da decimale a binario?\n";
cin>>x;
for (; i<riemp; x=x/2, i=i++ )
{if (x%2==0)
{v[i] = 0;
}
else {v[i] = 1;
}
cout<<""<<v[i]<<"";
}
cout<<"\n";
for(int j=0; j<riemp; j=j++)
{temp=v[j];
v[j]=v[riemp-j-1];
v[riemp-j-1]=temp;
cout<<""<<v[j]<<"";
}
cout<<"\n";
for(int j=riemp-1; j>=0; j=j-1)
{ cout<<""<<v[j]<<"";
}
return EXIT_SUCCESS;
}
EDIT 4: Versione definitiva e funzionante. Potreste dirmi cosa non andava/cosa potevo fare per farlo andare prima?
int main(int argc, char** argv) {
binario v;
int x, riemp,i=0, o=0, temp=0;
cout<<"Su quanti bit vuoi scrivere il numero?\n";
cin>>riemp;
cout<<"Che numero vuoi convertire da decimale a binario?\n";
cin>>x;
for (; i<riemp; x=x/2, i=i++ )
{if (x%2==0)
{v[i] = 0;
}
else {v[i] = 1;
};
}
cout<<"\n";
for(int j=0; j<riemp; j=j++)
{temp=v[j];
v[j]=v[riemp-j-1];
v[riemp-j-1]=temp;
}
cout<<"\n";
for(int j=riemp-1; j>=0; j=j-1)
{ cout<<""<<v[j]<<"";
}
return EXIT_SUCCESS;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.