Domanda Risolto Esercizio c++

Stato
Discussione chiusa ad ulteriori risposte.

NeomagusPr0

Utente Electrum
3 Settembre 2012
276
18
48
115
Salve ragazzi, come da titolo avrei bisogno di una dritta su un esercizio in c++ :

Seguendo i principi della programmazione strutturata e della modularità, si sviluppi un programma in C/C++ che:
-richieda all’utente di indicare un numero intero compreso tra 0 e 255;
-calcoli e restituisca, mediante un sottoprogramma, la rappresentazione in binario puro su 8 bit del numero inserito, memorizzata in un vettore (MSB in posizione 0 e così via);
-stampi a video il vettore così calcolato. Esempio: Se il numero inserito è 8, il programma calcola e visualizza a video: 0 0 0 0 1 0 0 0

Facendo in questo modo, riesco a visualizzare il decimale convertito in binario, ma lo fa solamente se inserisco un'altra cifra e non in automatico.

C++:
#include <iostream>
#define  MAX 8

using namespace std;

void conversione (int bin [], int dec );
void stampa (int bin []);


int main (){
    
    int binario [MAX];
    int decimale;
    
    do{
        cout << "Inserire numero ";
        cin >> decimale;
        
    }while (decimale < 0 || decimale > 255);

    
conversione (binario, decimale );
stampa (binario);
    
    return 0;
    
    }
    
    void conversione (int bin [], int decimale){
        int i;
        for(i=0;i<MAX;i++){
        if (decimale %2 ==0)
        
        bin[i]=0;
        else
        bin [i]=1;
        decimale= decimale/2;   
        }
    }
    
        void stampa (int bin []){
        
        int i;
        for (i=8; i>=0; i--){
            
            cout << " Il numero binario è : " << bin [i] << endl ;
            cin >> bin [i];
            
        }
    }
 
Diciamo che più o meno è corretto, ma c'è comunque un errore che ne pregiudica il funzionamento.
Non so se la richiesta del docente è restituire un array allocandolo con "new" oppure no; assumo per corretto quanto hai fatto, poichè non so cosa avete trattato.

Nella funzione stampa c'è un errore: la lettura dell'input non ti serve, è inutile, e vai a sovrascrivere un elemento dell'array. L'errore è l'inizializzazione del ciclo che avviene utilizzando il numero 8. Questo indice in realtà è "out of bounds", superi cioè la dimensione dell'array (stampi una posizione sullo stack che non è in realtà stata allocata per l'array).

Ti mostro una versione corretta di quanto hai fatto:

C++:
#include <iostream>
#define  MAX 8

using namespace std;

void conversione (int bin [], int dec );
void stampa (int bin []);

int main (){
   
    int binario [MAX];
    int decimale;
   
    do{
        cout << "Inserire numero ";
        cin >> decimale;
    }while (decimale < 0 || decimale > 255);

    conversione (binario, decimale );
    stampa (binario);
   
    return 0;
}
   
void conversione (int bin [], int decimale){
    for(int i=0;i<MAX;i++) {
        bin[i] = decimale % 2;
        decimale /= 2;  
    }
}

void stampa (int bin []) {
    cout << "Il numero binario e': ";
    for (int i=7; i>=0; i--)
        cout << bin [i] << " ";
}

Ho rimosso l'if, in quanto il resto di una divisione per 2 è per forza di cose o 0 o 1, e non ti serve un if. Puoi usare direttamente il risultato. Puoi anche compattare la divisione facendo "decimale/=2".

Volendo ci sono alcune finezze, te le dico, ma scegli tu se sostituirle a ciò che fai (non far venire dubbi al docente :nono:).

C++:
bin[i] = decimale % 2;

puoi sostituirla con l'AND bit a bit :

C++:
bin[i] = decimale & 1;

questo avviene in quanto il bit meno significativo ti fa capire se il numero è pari o dispari. Se vale 0, è pari, altrimenti è dispari.
Puoi anche modificare questo:
C++:
decimale /= 2;

In questo:
C++:
decimale >>= 1;

lo shift di una posizione verso destra equivale alla divisione per 2 del numero.
 
Stato
Discussione chiusa ad ulteriori risposte.