#include <stdio.h> /*consente l'uso di printf e scanf*/
#include <conio.h> /*consente l'uso di getch*/
#define N 16
void tasto(void){
getch();
}/*tasto*/
int leggi (const char*st){
int n;
printf("%s", st);
scanf("%d", &n);
return n;
}/*leggi*/
void Leggi_num (int *num_A, int *num_B){
*num_A=leggi("Inserire il primo numero decimale : ");
*num_B=leggi("Inserire il secondo numero decimale : ");
}/*Leggi_num*/
void Convert_decTobin (int n, int *a){
int i, j;
for(i=N-1; i>=0; i--){
a[i]= (n%2)!=0;
n/=2;
}/*for*/
for (j=0;j<=N-1;j++)
printf("%d",a[j]);
}/*Convert_decTobin*/
/*
IP: A[] array contente il primo numero in binario
IP: B[] array contente il secondo numero in binario
OP: Sum[] array contente la somma dei due numeri in binario
*/
void Somma_Bin (int *A, int *B, int *Sum){
int i, j, k;
for (j=0; j< N; j++)
Sum[j]= 0;
for (i=N-1; i>=0; i--){
if (A[i]>0 && B[i]>0){
Sum[i-1]+=1;
}else{
Sum[i]+= A[i]+B[i];
if (Sum[i]==2){
Sum[i]= 0;
Sum[i-1]= 1;
}/*if*/
}/*if-else*/
}/*for*/
for (k=0;k<=N-1;k++)
printf("%d",Sum[k]);
}/*Somma*/
/*Converte tutte le cifre in binario*/
void ConvertiDati(int num_A, int num_B, int *A,int *B){
Convert_decTobin(num_A, A);
printf("\n\n");
Convert_decTobin(num_B, B);
printf("\n\n");
}/*ConvertiDati*/
/*
IOP: B[] array contente il numero in binario da complementare
OP: Complemento del numero in binario
*/
void Comp_Base(int *B){
int i, j, k, stop=N-1;
for (i=N-1; B[i]!=1; i--)
stop=i-1;
for (j=stop-1;j>=0; j--)
(B[j]==0)? (B[j]=1) : (B[j]=0);
for (k=0; k<=N-1; k++)
printf("%d", B[k]);
printf("\n\n");
}/*Comp_Base*/
/*
IP: A[] array contente il primo numero in binario
IP: B[] array contente il secondo numero in binario
OP: Differenza tra i numeri binari
*/
Diff_Bin(int *A, int *B, int *sum){
printf("Facciamo il complemento alla base del secondo termine:\n\n");
Comp_Base(B);
Somma_Bin(A, B, sum);
printf("\n");
}/*Diff_Bin*/
/*Gestisce le operazione da eseguire in base all'indicazione 1 o 2*/
void Scegli_OP (int num_A,int num_B, int *A,int *B,int *Sum, int Oper){
printf("1 = Addizione\n2 = Sottrazione\n");
Oper=leggi("Inserire l'operazione da effettuare : ");
printf("\n");
ConvertiDati(num_A, num_B, A, B);
(Oper==1) ? Somma_Bin(A, B, Sum) : Diff_Bin(A, B, Sum);
}/*Scegli_OP*/
/*
IP: n numero da convertire NUM_N+
OP: a[] Numero convertito in binario
*/
void Risultato(int *R){
int i, Ris_num=0,j=0;
if (R[0]==1)
Comp_Base(R);
for (i=N-1; i>=0; i--,j++)
Ris_num += (R[i]*(pow(2, j)));
printf("Il risultato in decimale (se negativo, complementato) : %d\n", Ris_num);
}/*Risultato*/
int main (void){
int num_A, num_B, Oper, A[N], B[N], Sum[N];
Leggi_num(&num_A,&num_B);
Scegli_OP(num_A,num_B,A,B,Sum,Oper);
Risultato(Sum);
tasto();
}/*main*/