Conversione binario=>decimale

di il
10 risposte

Conversione binario=>decimale

Buongiorno, ho scritto il seguente codice che viene eseguito senza rilevare alcun errore, tuttavia l'output è sempre 0. Personalmente penso che l'errore sia nel ciclo While, ma non lo trovo.
Il testo del problema è " Si scriva un programma in linguaggio C che converta un numero binario in un numero
decimale. Il numero binario è rappresentato su N bit, e il valore di N è inserito da tastiera.
L’utente inserisce le cifre del numero binario un bit alla volta, partendo dal bit
meno significativo (ossia dal bit di peso 2 elevato a 0). Il programma visualizzerà il numero decimale
corrispondente"


Sorgente:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int decimale, cifre,A,B, i;

main (){
	
	printf ("inserisci quante cifre, o bit, compongono il binario: ");
	scanf ("%d", &cifre);

	int binario[cifre];	//la dichiarazione del vettore va fatta sempre DOPO lo scanf dell'indice "cifre"
	
	for (i=0; i<cifre; i++){
		printf ("inserisci le cifre del numero binario un bit alla volta, da dx verso sx: "); //bisognerebbe escludere la digitazione di numeri diversi da 1 e 0...
		scanf ("%d", &binario[cifre]);
	}
	
while(i>=0 && i<cifre) {
		A=binario[i];
		A=A * pow(2,cifre);
		i++;
		cifre--;
		decimale=A;
		B= binario[i];
		B=B * pow(2,cifre);
		decimale=A+B;
	
		}
	printf ("il numero decimale e':%d ",decimale);
	system ("PAUSE");
	return 0;
}
	
Dico grazie sin da adesso a tutti coloro che mi aiuteranno.

10 Risposte

  • Re: Conversione binario=>decimale

    Alla fine del ciclo for per la lettura dei numeri, 'i' è uguale a 'cifre', quindi non entra mai nel while.
  • Re: Conversione binario=>decimale

    Altro errore che non avevo visto: quando leggi i numeri fai
    scanf ("%d", &binario[cifre]);
    ma ovviamente 'cifre' va sostituito con 'i'.
  • Re: Conversione binario=>decimale

    minomic ha scritto:


    Alla fine del ciclo for per la lettura dei numeri, 'i' è uguale a 'cifre', quindi non entra mai nel while.
    non ho capito bene che vuoi dire

    minomic ha scritto:


    Altro errore che non avevo visto: quando leggi i numeri fai
    scanf ("%d", &binario[cifre]);
    ma ovviamente 'cifre' va sostituito con 'i'.
    qui ho corretto l'errore, ma ancora non funziona

    Ho provato a cambiare alcune cose ma ancora niente
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    
    int decimale,cifre,A,B,decimale1,decimale2,c,i;
    
    main (){
    	
    	printf ("inserisci quante cifre, o bit, compongono il binario: ");
    	scanf ("%d", &cifre);
    
    	int binario[cifre];	//la dichiarazione del vettore va fatta sempre DOPO lo scanf dell'indice "cifre"
    	
    	for (i=0; i<cifre; i++){
    		printf ("inserisci le cifre del numero binario un bit alla volta, da dx verso sx: "); //bisognerebbe escludere la digitazione di numeri diversi da 1 e 0...
    		scanf ("%d", &binario[i]);
    	}
    	
    for (i=0; i<cifre; i++) {
    	for (c=0; c<cifre; c++){
    		A=binario[i]*pow(2,c);
    		decimale1=A;
    		i++;
    		c++;
    		B=binario[i]*pow(2,c);
    		decimale2=decimale1+B;
    		}}
    		if (decimale1>decimale2){decimale=decimale1;}
    		else {decimale=decimale2;}
    		
    	printf ("il numero decimale e':%d ",decimale);
    	system ("PAUSE");
    	return 0;
    }
    
  • Re: Conversione binario=>decimale

    Onestamente non capisco perché vuoi complicarti la vita.

    1) C'è un motivo particolare di utilizzare variabili globali?
    2) Non ti sembrano un po' tante quelle variabili
    3) Non pensi dovresti inizializzare la variabile che conterrà il numero decimale?

    Basta molto semplicemente una sola istruzione nel ciclo for, nulla di più.
  • Re: Conversione binario=>decimale

    Sono d'accordo SVniko, gradualmente il codice è diventato più complicato.
    Una sola istruzione nel for basterebbe, però continua a generare sempre lo stesso risultato errato, per questo motivo ho pensato di dare istruzioni più esplicite (=complicate?) al pc. Cosa proporresti di preciso ?
  • Re: Conversione binario=>decimale

    Il problema è molto semplice. Intanto se non ci sono ragioni specifiche e non penso ce ne siano, allora via quelle variabili globali.

    Quando si scrive un programma si pensa prima su carta, poi se qualcosa non funziona si cerca di capire con un debug che cosa non funziona, non serve complicare il codice per risolvere un problema, anzi complicando il codice complichi anche il problema.

    Dunque tu hai un numero decimale, es:
    0100 = 2
    per convertirlo non devi fare altro che
    0*2^0+1*2^1+0*2^2+0*2^3

    come faresti in un'unica istruzione?
  • Re: Conversione binario=>decimale

    Moltiplico i valori dell'array (indice che parte da 0 e finisce a n-1) per ogni bit, dal meno significativo (2^0) al più significativo (2^n-1)
    In codice dovrebbe essere:
    for ( i>=0; i<n; i++){
    for (esponente>=0; esponente<n; n++){
    
    esponenti_pari = binario[i]*2^esp;
    decimale=decimale + esponenti_pari;
    esponenti_dispari=  binario[i+1]*2^(esp+1);
    decimale=esponenti_pari+esponenti_dispari;
    }}
    
    Ma nel caso in cui il numero di cifre fosse pari il ciclo for si fermerebbe alla seconda istruzione dopo "x" ripetizioni della stessa, quindi servirebbe un ciclo if-else del seguente tipo:
    if (decimale1>decimale2){decimale=decimale1;}
    		else {decimale=decimale2;}
    e quindi dovrei distinguere i risultati parziali all'interno del ciclo for annidato
  • Re: Conversione binario=>decimale

    
    for ( i>=0; i<n; i++){
       decimale += binario[i]*pow(2,i);
    }
    Questo non basta?
  • Re: Conversione binario=>decimale

    Eviterei di calcolare potenze con la pow e userei lo shift
  • Re: Conversione binario=>decimale

    SVNiko ha scritto:


    
    for ( i>=0; i<n; i++){
       decimale += binario[i]*pow(2,i);
    }
    Questo non basta?
    decisamente più comodo delle precedenti soluzioni! Più tardi lo proverò

    @oregon: ci è stato chiesto di usare le potenze
Devi accedere o registrarti per scrivere nel forum
10 risposte