AngoLinux

Converte un numero da una base a scelta (binaria, ottale, decimale, esadecimale) ad una qualunque altra base (sempre binaria, ottale, decimale, 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:
  • Chieda la base in cui si vuole operare (scelta tra binario, ottale ed esadecimale), verificando la scelta fatta dall'utente (usare una funzione)
  • Per ognuna delle basi scelte scrivere una funzione che:
    • Legga da tastiera una stringa (una serie di caratteri) costituita da sole cifre nella base scelta. La stringa terminerà con il primo carattere che non è una cifra enlla base scelta
    • Converta la stringa letta in un numero in rappresentazione interna (un int)
    • Stampi il numero ottenuto
Utilizzare delle funzioni per i vari compiti, come indicato.

Una possibile soluzione è la seguente:
// Pinco - Tizio - 3AIN - 18/01/02
// Converte un numero da una base a scelta (binaria, ottale, decimale, esadecimale)
// ad una qualunque altra base (sempre binaria, ottale, decimale, esadecimale)

#include<stdio.h>
#include<math.h>	// Per la funzione 'pow'

#define DIM 32		// Dimensione del vettore di caratteri

void visualizza();	// Visualizza un vetore numerico
void bin_dec();		// Converte una stringa binaria in un int
void ott_dec();		// Converte una stringa ottale in un int
void esa_dec();		// Converte una stringa ottale in un int
void dec_bin();		// Converte un int in binario
void dec_ott();		// Converte un int in ottale
void dec_esa();		// Converte un int in esadecimale
void menu();		// Stampa i due menu' per le due basi

int partenza=0;		// Base di partenza
int destinazione=0;	// Base di visualizzazione
int dec=0;		// Numero convertito / da convertire
int vet[DIM];		// Vettore che contiene il numero convertito

main()
{
  menu();	// Legge le due basi

  // Esegue la prima conversione (da input)
  if (partenza == 1)
  {
    bin_dec();
  }
  if (partenza == 2)
  {
    ott_dec();
  }
  if (partenza == 3)
  {
    printf("Numero binario: "); scanf("%d",&dec);
  }  
  if (partenza == 4)
  {
    esa_dec();
  }

  // Esegue la seconda conversione (in output)
  if (destinazione == 1)
  {
    dec_bin ();
    visualizza();
  }
  if (destinazione == 2)
  {
    dec_ott ();
    visualizza();
  }
  if (destinazione == 3)
  {
    printf("\nIl numero decimale e': %d\n",dec);
  }  
  if (destinazione == 4)
  {
    dec_esa ();
    visualizza();
  }
}

/* Stampa prima un menu' per la base di partenza, quindi uno per la base di destinazione
 * Lascia la base di partenza in n, la base di destinazione in k
 */ 
void menu()
{
  do {
    printf("Base di Partenza\n1)Binario\n2)Ottale\n3)Decimale\n4)Esadecimale\nScelta: ");
    scanf("%d",&partenza);		// Legge la scelta dell'utente
  }while(partenza<1 || partenza>4);	// Finche' l'utente non fa' una scelta valida

  do {
    printf("\nBase di conversione\n1)Binario\n2)Ottale\n3)Decimale\n4)Esadecimale\nScelta: ");
    scanf("%d",&destinazione);	// Legge la scelta dell'utente
  }while(destinazione<1 ||	// Finche' l'utente non fa' una scelta valida 
    destinazione>4);
  getchar ();	// Serve per terminare la 'scanf'
}

/* Fuzione per la conversione di un numero binario:
 *  
 * memorizza la sequenza dei caratteri immessi, all'interno del vettore
 * "binario" di dimensione DIM, fino a quando incontra un carattere che non sia una
 * cifra binaria;
 * La sequenza immessa va' terminata con invio;
 * Il numero convertito viene lasciato nella variabile globale 'dec'
 */
void bin_dec()
{
int i=0,w=0;     // contatori
int lung=0;      // lunghezza del numero da convertire  
int binario[DIM];// Vettore per cifre lette

  printf("\nNumero binario: "); 
  do {
    binario[w]=getchar();
    w++;		
  }while((binario[w-1]=='1') || (binario[w-1]=='0') && w < DIM);

  lung=w-1;
  for(i=0;i<=lung-1;i++)
  {
    dec=dec+(binario[i]-'0')*pow(2,(lung-1)-i);
  }
}

/* Fuzione per la conversione di un numero ottale:
 *  
 * memorizza la sequenza dei caratteri immessi, all'interno del vettore
 * "ottale" di dimensione DIM, fino a quando incontra un carattere che non sia una
 * cifra ottale;
 * La sequenza immessa va' terminata con invio;
 * Il numero convertito viene lasciato nella variabile globale 'dec'
 */
void ott_dec()
{
int i=0,w=0;    // contatori
int lung=0;     // lunghezza del numero da convertire
char ottale[DIM];

  printf("\nNumero ottale: ");
  do {
    ottale[w]=getchar();
    w++;		
  }while((ottale[w-1]>='0') && (ottale[w-1]<='7') && w < DIM); 

  lung=w-1;
  for(i=0;i<=lung-1;i++) 
  {
    dec=dec+(ottale[i]-'0')*pow(8,(lung-1)-i);
  }
}

/* Fuzione per la conversione di un numero esadecimale:
 *  
 * memorizza la sequenza dei caratteri immessi, all'interno del vettore
 * "esadecimale" di dimensione DIM, fino a quando incontra un carattere che non sia una
 * cifra esadecimale;
 * La sequenza immessa va' terminata con invio;
 * Il numero convertito viene lasciato nella variabile globale 'dec'
 */
void esa_dec()
{
int i=0,w=0;   // contatori
int lung=0;    // lunghezza del numero da convertire 
char esadecimale[DIM];

  printf("\nNumero esadecimale: ");
  do {
    esadecimale[w]=getchar();
    w++;		
  } while((((esadecimale[w-1]>='0') && (esadecimale[w-1]<='9')) || 
   ((esadecimale[w-1]>='A') && (esadecimale[w-1]<='F')) || 
   ((esadecimale[w-1]>='a') && (esadecimale[w-1]<='f')))  && w < DIM);

  lung=w-1;
  for (i=0;i<=lung-1;i++)
  {
    if(esadecimale[i]>='A' && esadecimale[i]<='F')
    {
      dec=dec+(esadecimale[i]-'A' + 10)*pow(16,(lung-1)-i);
    } else if(esadecimale[i]>='a' && esadecimale[i]<='f')
    {
      dec=dec+(esadecimale[i]-'a' + 10)*pow(16,(lung-1)-i);
    } else {
      dec=dec+(esadecimale[i]-'0')*pow(16,(lung-1)-i);
    }
  }
} 

/* Funzione che converte il numero in 'dec' 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 dec_bin()          
{
int i;	// Conatore
  for (i = 0;i<DIM; i++)// memorizzazione a partire dall'ultimo
  {			// elemento del vettore
    vet[DIM-1-i]=dec%2;	// resto della divisione
    dec=dec/2;		// quoziente della divisione
  }	
}

/* Funzione che converte il numero in 'dec' 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 dec_ott()
{
int i;	// Conatore
  for (i = 0;i<DIM; i++)// memorizzazione a partire dall'ultimo
  {			// elemento del vettore
    vet[DIM-1-i]=dec%8;	// resto della divisione
    dec=dec/8;
  }	
}

/* Funzione che converte il numero in 'dec' 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 dec_esa()
{
int i;	// Conatore
  for (i = 0;i<DIM; i++)// memorizzazione a partire dall'ultimo
  {			// elemento del vettore
    vet[DIM-1-i]=dec%16;// resto della divisione
    dec=dec/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 -lm conversione3.c ed eseguirlo con il comando ./a.out.


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

© Ing. Stefano Salvi - Released under GPL licence