AngoLinux

Conversione di un numero decimale in una base a scelta (ottale, binario, esadecimale)

- A cura del Prof. Stefano Salvi -


Proseguiamo con gli esercizi sui cambiamenti di base. Ancora i ragazzi non sanno usare i parametri.

Il testo dell'esercizio è il seguente:

Scrivere un programma C che:
  • Legga un numero decimale da tastiera
  • Chieda la base in cui convertirlo (scelta tra binario, ottale ed esadecimale), verificando la scelta fatta dall'utente
  • Converta il numero nella base richiesta, lasciando il numero convertito in un array di interi, una cifra per ogni intero (usare una funzione per ogni base)
  • Stampi il numero convertito (usare una funzione)
Utilizzare delle funzioni per i vari compiti, come indicato.

Una possibile soluzione è la seguente:
// Tizio - Caio - 3AIN
// converte un numero decimale in una base a scelta (ottale, binario,
// esadecimale) 
 
#include<stdio.h>

#define DIM 32       // dimensione di un vettore int (4 byte) 

void visualizza();   // visualizza il numero convertito nella base scelta
void binario();      // converte il numero decimale in binario 
void ottale();       // converte il numero decimale in ottale
void esadecimale();  // converte il numero decimale in esadecimale


int vet[DIM]; // vettore per memorizzare le cifre del numero convertito
int n;        // numero decimale da convertire


main()   // funzione principale
{
int i;	// Conatore
int k;	// scelta del menu iniziale
	
  for(i=0;i<DIM;i++)  // azzeramento elementi del vettore
  {
    vet[i]=0;
  }
	
  printf("Numero decimale: "); scanf("%d",&n); // immissione del valore

  printf("\n1) Binario\n2) Ottale\n3) Esadecimale\n\nScelta: "); // menu
  do {
    scanf("%d",&k);
  } while(k<1 || k>3);   // controllo sui valori del menu (data entry)
	
  if(k==1) binario();
  else if(k==2) ottale();
  else if(k==3) esadecimale();
	
  visualizza();
}

/* Funzione che converte il numero in 'n' in binario nel vettore 'vet'
 *
 * Ogni elemento di vet contiene un numero tra 0 e 1
 * Il primo elemento di vet (vet [0]) contiene la cifre piu' significativa,
 * l'ultimo (vet [DIM-1]) la meno significativa
 */
void binario()          
{
int i;	// Conatore
  for (i = 0;i<DIM; i++)// memorizzazione a partire dall'ultimo
  {			// elemento del vettore
    vet[DIM-1-i]=n%2;	// resto della divisione
    n=n/2;		// quoziente della divisione
  }	
}

/* Funzione che converte il numero in 'n' in ottale nel vettore 'vet'
 *
 * Ogni elemento di vet contiene un numero tra 0 e 7
 * Il primo elemento di vet (vet [0]) contiene la cifre piu' significativa,
 * l'ultimo (vet [DIM-1]) la meno significativa
 */
void ottale()
{
int i;	// Conatore
  for (i = 0;i<DIM; i++)// memorizzazione a partire dall'ultimo
  {			// elemento del vettore
    vet[DIM-1-i]=n%8;	// resto della divisione
    n=n/8;
  }	
}

/* Funzione che converte il numero in 'n' in esadecimale nel vettore 'vet'
 *
 * Ogni elemento di vet contiene un numero tra 0 e 15
 * Il primo elemento di vet (vet [0]) contiene la cifre piu' significativa,
 * l'ultimo (vet [DIM-1]) la meno significativa
 */
void esadecimale()
{
int i;	// Conatore
  for (i = 0;i<DIM; i++)// memorizzazione a partire dall'ultimo
  {			// elemento del vettore
    vet[DIM-1-i]=n%16;	// resto della divisione
    n=n/16;		// quoziente della divisione
  }	
}

/* Funzione che visualizza il contenuto del vettore 'vet'
 */
void visualizza()
{
int j; // contatore
	
  for(j=0;j<DIM;j++)
  {
    if(vet[j]>=10) printf("%c ",vet[j]+ 'A' - 10);	// controllo per la
    else printf("%c ",vet[j]+'0');           		// visulizzazione delle
  }                                           		// lettere esadecimali
  // visualizza anche gli zeri a sinistra del numero convertito 
  printf("\n\n");
}	

Per provare il programma, scaricare il sorgente, compilarlo con il comando cc conversione.c ed eseguirlo con il comando ./a.out.


[Home Page dell'ITIS "Fermi"] [Indice Terza] [Precedente] [Successivo]

© Ing. Stefano Salvi - Released under GPL licence