/*Questo programmma accetta numeri interi senza segno*/
/*decimali/binari e li converte in binario/decimale*/


#include <stdio.h>
#include <math.h>

#define MAX 32

int inizializza(int []);
int scegli_conversione(void);
int leggi_intero(void);
int leggi_binario(int []);
int dectobin(int [], int);
int stampa_bin (int [], int);
int bintodec(int []);
int stampa_dec (int [], int);

int main(void)
{
int binario[MAX], boolean, i, decimale, temp=1;
do {
   inizializza(binario);
   boolean=scegli_conversione();
   switch(boolean){
   case 0: temp=0; break;
   case 1: decimale=leggi_intero(); dectobin(binario, decimale); stampa_bin(binario, decimale); break;
   case 2: leggi_binario(binario); decimale=bintodec(binario); stampa_dec(binario, decimale); break;
   }
}while(temp);
return 0;
}




int scegli_conversione(void)
{
int flag;
char risposta;
/*string risposta;*/
do
{
printf("Che tipo di conversione vuoi effettuare (D=dec_to_bin, B=bin_to_dec, U=Uscire\n)");
scanf("%s", &risposta);
/*risposta=GetLine();*/
switch (risposta){
case 'D':flag=1; break;
case 'B':flag=2; break;
case 'U':flag=0; break;
default: printf("Hai  Sbagliato! Riprova\n"); flag=-1; break;
}
}while(flag==-1);
return (flag);
}



int inizializza (int bin[])
{
int i;
for(i=0;i<MAX;i++)
bin[i]=0;
return 0;
}



int leggi_intero(void)
{
int intero;
float numero;
do{
   printf("Inserisci un intero positivo\n");
   /*numero=GetReal();*/
   scanf("%f", &numero);
   intero=numero;
   if (numero==intero && intero>=0) break;
   else
   printf("Hai Sbagliato! Riprova\n");
}while(1);
return(numero);
}



int leggi_binario(int bin[])
{
int i, j, temp, flag=1;
for(j=0, i=(MAX-1);i>=0;i--, j++) {
do
{
flag=1;
printf("Inserisci il bit %d-esimo (-1 per terminare)\n", j);
scanf("%d", &temp);
/*temp=GetInteger();*/
switch (temp){
case -1: i=-1; flag=0;break;
case 0: bin[i]=temp;flag=0; break;
case 1: bin[i]=temp;flag=0; break;
default:printf("Devi inserire un binario (0/1)\n"); break;
}
}while(flag);
}
return 0;
}

int dectobin(int bin[], int dec)
{
int i, j;
for(i=(MAX-1), j=0; i>=0; i--, j++)
{
bin[i]=dec>>j&1;
//printf("%d\n",dec);
}
return 0;
}



int stampa_bin (int bin[], int dec)
{
int i;
printf("La codifica binaria di %d e': ", dec);
for(i=0; i<MAX;i++) printf("%d",bin[i]);
printf("\n");
return 0;
}


int bintodec (int bin[])
{
int i,j, dec;
for(dec=0,i=(MAX-1), j=0; j<MAX; i--, j++)
dec+=(pow(2,j)*bin[i]);
return (dec);
}


int stampa_dec (int bin[], int dec)
{
int i,j;
printf("La conversione decimale di ");
for(i=0; i<MAX; i++) printf("%d",bin[i]);
printf(" e' %d\n", dec);
return 0;
}


