// 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");
}
|