Convertire un numero da decimale a binario

Vediamo un altro esercizio semplice per gli studenti più giovani, ma utile a comprendere l’utilizzo del ciclo do-while e di come le variabili “shiftino” di significato tra un ciclo e l’altro.

Il codice è molto semplice e, del resto, lo è anche il problema matematico che vogliamo risolvere, ampiamente studiato e affrontato dai ragazzi soprattutto degli istituti tecnici nella materia Tecnologie e Progettazione di Sistemi Informatici.

Vediamo il codice pezzo per pezzo.

Cominciamo col creare una valore costante, una speciale variabile che per svariati motivi di sicurezza non dovrebbe essere mai sovrascritta. Voi direte: “basta non farci su nessuna assegnazione!” e tutti i torti non li avreste, ma è bene sapere che le variabili const vengono trattate diversamente dal compilatore aumentando le prestazioni del nostro nostro software quando deve usare o accedere a tali variabili.

const int DIVISORE = 2;

Come vedete, il nome della variabile l’ho messo in maiuscolo, prassi un po’ bizzarra ma spesso usata sulle variabili proprio per capire che sono “strane”, in questo caso costante, appunto. Passiamo poi a cercare di comprendere quali variabili ci occorrono. Agli alunni dico sempre: partite intanto a dichiarare le variabili che vi servono per fare l’input e l’output del problema. Potrete sempre aggiungere contatori, accumulatori o generiche variabili di lavoro mano a mano che scendete nel problema. Come posso individuarle? Beh il metodo migliore è sempre quello di mettersi su un foglietto di carta e scriversi i passaggi che si farebbero nella realtà per risolvere il problema assegnato. Leggere qualcosa, un caso pratico anche numerico, ci aiuta ad elaborare la strategia risolutiva e correggere errori poi nel codice. Fissare lo schermo, fidatevi, non vi farà apparire in testa la soluzione, soprattutto se siete alle prime armi del codice.

Letto il numero decimale in ingresso ci addentriamo nel nostro ciclo. In questo esercizio non abbiamo filtrato il numero in ingresso con un controllo. Diamo per scontato che si inseriscano numeri positivi maggiori di zero. Usiamo il do-while, perché almeno un giro di operazioni abbiamo determinato serva. Ovvero facciamo una prima divisione per due, per prelevare resto e quoziente.

     quoziente = dividendo / DIVISORE;
     resto = dividendo % DIVISORE;

Adesso la parte più complessa da comprendere ed astrarre. Il primo giro del ciclo funziona, ma dobbiamo metterci nelle condizioni di avere i dati giusti per fare il secondo giro e così via. Qui c’è quello che io chiamo uno shift, un cambio di significato tra le variabili ad ogni passo del ciclo. Nel nostro caso, il risultato della prima divisione, diventa il dividendo della successiva divisione per due: ecco perché tocca ri-assegnarla nel modo giusto. Fatto ciò, stampo il resto che letto al contrario, ci darà il risultato finale.

     dividendo = quoziente;
     cout << resto <<endl;

Come nelle divisioni vere, ci si ferma quando il risultato arriva a zero, idem quindi nella condizione del ciclo.

L’esercizio completo:

#include <iostream>
using namespace std;

const int DIVISORE = 2;
int main() {
    int dividendo;
    int quoziente;
    int resto;
    
    
    cout << "Inserisci il numero decimale da convertire";
    cin >> dividendo;
    
    do
    {
     quoziente = dividendo / DIVISORE;
     resto = dividendo % DIVISORE;
     
     dividendo = quoziente;
     cout << resto <<endl;    
    }
    while(dividendo > 0);
    
    return 0;
}

Ultima modifica 22 Marzo 2023

Lascia un commento