Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156

    [C] Conversione decimale binario

    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:


    Uploaded with ImageShack.us
    La parte di codice riguardante la conversione è il seguente;
    codice:
    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';
        }
    }

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Fai vedere anche il codice del main ?

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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?)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    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 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?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    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!

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    @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

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    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?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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

    codice:
       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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.