PDA

Visualizza la versione completa : [C] Conversione decimale binario


slashino
24-12-2011, 18:26
Salve,
ho fatto un programma che dovrebbe convertire una serie di numeri decimali nei corrispondenti binari a 10 bit in notazione modulo e segno.
Non riesco assolutamente a capire perchè il programma funziona(bene) solo sul primo numero. Per esempio:
http://img688.imageshack.us/img688/4817/perhtml.png (http://imageshack.us/photo/my-images/688/perhtml.png/)

Uploaded with ImageShack.us (http://imageshack.us)
La parte di codice riguardante la conversione è il seguente;


void elabora(int dim, int dec[M], char str[][10])
{
int i,a,k,z;
for(i=0;i<dim;i=i+1) /*Inserisco il bit indicante il segno*/
{
if(dec[i]>=0)
{
str[i][0]='0';
}
else
{
str[i][0]='1';
}
}
for(i=0;i<dim;i=i+1) /*Azzero tutta la stringa*/
{
for(k=1;k<10;k=k+1)
{
str[i][k]='0';
}
str[i][10]='\0';
}
for(i=0;i<dim;i=i+1) /*effettuo la conversione vera e propria*/
{
z=9;
a=dec[i];
while((a/2)!=0)
{
if((a%2)==0)
{
str[i][z]='0';
}
else
{
str[i][z]='1';
}
a=a/2;
z=z-1;

}
str[i][z]='1';
}
}

ramy89
24-12-2011, 19:00
Fai vedere anche il codice del main ?

oregon
24-12-2011, 19:12
Per prima cosa se usi 10 cifre (e quindi 10 caratteri) l'array deve essere di

str[][11]

per il terminatore di ogni stringa.

Inoltre, il ciclo di conversione non mi sembra corretto ...

Non deve essere

while((a/2)!=0)

ma

while(a)

e devi eliminare la

str[i][z]='1';

(a che serve?)

slashino
24-12-2011, 21:49
str[i][z]='1' mi serve ad inserire l'ultima cifra significativa a sinistra, dal momento che una volta che esce dal ciclo per la condizione (a/2)!=0 l'ultimo valore rimane non inserito. Comunque ho corretto la dimensione fisica a 11 e funziona perfettamente...ti ringrazio :D Come si spiega il modo in cui stampava i valori? Cioè perchè tenendo la dimensione fisica a 10 si limitava a stampare solo il primo?

oregon
24-12-2011, 22:01
Il motivo del problema era dovuto al fatto che sovrascrivevi il terminatore (nul) della stringa.

Se la stringa è lunga 10 caratteri devi prevederne uno in più per il terminatore.

Per la questione della riga

str[i][z]='1';

continuo a non seguirti. Non ci va.

Se il valore da convertire è 0, perché inserisci quel bit a 1 ?

E il ciclo while deve essere corretto.

slashino
24-12-2011, 22:09
Allora io ragiono così:
divido il numero per due fino a quando il quoziente non è 0, e mano mano salvo il resto che può essere solo 0 o 1, ovviamente. Nel momento in cui il resto è 0 significa che siamo giunti necessariamente alla situazione 1/2, la quale restituisce zero con il resto di uno. Arrivati a questo punto l'ultima operazione( 1/2 appunto ) non viene eseguita dal momento che c'è il controllo del ciclo che precede l'operazione(il quoziente della divisione del numero per due deve essere diverso da 0). Quindi l'ultimo resto ( uno appunto; la cifra significativa più a sinistra è sempre 1 per questo motivo) non viene inserito. Quindi lo inserisco manualmente...
ps: per quanto riguarda l'altro discorso, ho capito!

slashino
24-12-2011, 22:22
@ramy89
Scusa se non ti ho risposto si sono sovrapposte le email e ho notato solo ora! Grazie dell'interesse comunque, ho trovato chi mi aiuta anche a natale :malol:

oregon
24-12-2011, 22:25
Originariamente inviato da slashino
Allora io ragiono così:
divido il numero per due fino a quando il quoziente non è 0, e mano mano salvo il resto che può essere solo 0 o 1, ovviamente. Nel momento in cui il resto è 0 significa che siamo giunti necessariamente alla situazione 1/2, la quale restituisce zero con il resto di uno. Arrivati a questo punto l'ultima operazione( 1/2 appunto ) non viene eseguita dal momento che c'è il controllo del ciclo che precede l'operazione(il quoziente della divisione del numero per due deve essere diverso da 0). Quindi l'ultimo resto ( uno appunto; la cifra significativa più a sinistra è sempre 1 per questo motivo) non viene inserito. Quindi lo inserisco manualmente...
ps: per quanto riguarda l'altro discorso, ho capito!

Questo tuo ragionamento non è corretto ... ad esempio, per il valore 0, come lo converti?

slashino
24-12-2011, 22:31
Ho dimenticato di dire che 0 era escluso dalla specifiche...Nel caso avrei inserito un costrutto selettivo a parte..altrimenti quale potrebbe essere un algoritmo migliore? :)

oregon
24-12-2011, 22:35
Originariamente inviato da slashino
Ho dimenticato di dire che 0 era escluso dalla specifiche...

Ops ... piccola dimenticanza ...


Nel caso avrei inserito un costrutto selettivo a parte..altrimenti quale potrebbe essere un algoritmo migliore? :)

Con questo



for(i=0; i<dim; i++)
{
z=9;
a=dec[i];
while(a)
{
if((a%2)==0)
str[i][z]='0';
else
str[i][z]='1';

a=a/2;
z=z-1;
}
}


risolvi tutti i casi senza problemi.

Loading