BluePink BluePink
XHost
Servere virtuale de la 20 eur / luna. Servere dedicate de la 100 eur / luna - servicii de administrare si monitorizare incluse. Colocare servere si echipamente de la 75 eur / luna. Pentru detalii accesati site-ul BluePink.

#include<conio.h>
#include<stdio.h>
#include<alloc.h>
#include<string.h>
int n;
void norm(char *a);
char* suma(char *a,char *b);
char* diff(char *a,char *b);
void corec(char *a);
void comp10(char *a);
void comp2(char *a);
void afisare(char *a);
char* baza2(char *a);
int main(int argc,char **argv)
{
char *a,*b,*s,*d;
int la,lb;
la=4*(strlen(argv[1])+1);
lb=4*(strlen(argv[1])+1);
n=(la>lb)?la:lb;
a=baza2(argv[1]);
b=baza2(argv[2]);
s=suma(a,b);
corec(s);
d=diff(a,b);
corec(d);
printf("\nsuma este:");afisare(s);
printf("\ndiferenta este:");afisare(d);
return 0;
}

functia de adunare a 2 numere scrise in baza doi
char* suma(char *a,char *b)
{
int c,i;
int m;
char *s;

s=(char*)malloc(sizeof(char)*(n+1));
c=0;

s[n]='\0';
for(i=n-1;i>=0;i--)
{
s[i]=((a[i]=='1')^(b[i]=='1')^(c==1))+'0';
c=((a[i]=='1')+(b[i]=='1')+c)>=2;
}
return s;
}

se declara variabilele c,i,m

unde c este folosit pentru transport i pentru parcurgere n este o variabila globala care exprima lungimea in biti a vectorilor a si b

dupa alocarea spatiului pentru s folosind malloc c are initial valoare zero si in ciclu for in care se efectueaza suma acelor 2 numere
void norm(char *a)
{
int m,i;
m=n-strlen(a);
for(i=n;i>=m;i--)
{
a[i]=a[i-m];
}
for(i=0;i<m;i++)
a[i]='0';
}

Aceasta functie este o functie care deplaseasa cu m pozitii la stanga unde m=n-strlen(a) si strlen este functia de determinare a lungimii sirului
void comp2(char *a)
{
int i;
for(i=0;i<n;i++)
{
a[i]=(a[i]=='0')+'0';
}
i=n-1;
while(i>=0 && a[i]=='1')
{
a[i]='0';
i--;
}
a[i]='1';
}

aceasta functie calculeaza complementul fata de doi a unui numar aflat in baza doi primul ciclu inverseaza bitii iar al doilea efectueaza adunarea cu unu.
char* diff(char *a,char *b)
{
char *c,*cb;
int i;
c=(char*)malloc(sizeof(char)*(n+1));
cb=(char*)malloc(sizeof(char)*(n+1));
strcpy(cb,b);
comp10(cb);
corec(cb);
c=suma(cb,a);
free(cb);
return c;
}
aceasta functie este o functie care intai calculeaza complementul fata de doi dupa care efectueaza o suma
void comp10(char *a)
{
int i,c;
char *b;
char *aux;

b=(char*)malloc(sizeof(char)*(n+1));
aux=(char*)malloc(sizeof(char)*n);
b[n]='\0';
b[0]='1';
b[1]='0';
b[2]='1';
b[3]='0';
for(i=n-1;i>=4;i--)
b[i]='0';
c=1;
for(i=n-1;i>=0;i--)
{
aux[i]=(b[i]=='1')^(a[i]=='0')^c+'0';
c=((b[i]=='1')+(a[i]=='0')+c)>=2;
}
for(i=0;i<n;i++)
a[i]=aux[i];
free(aux);
free(b);
}

aceasta functie calculeaza complementul fata de 10 in felul urmator

  1. stabileste un b=10n
  2. scade din b acela a dar carry are initial valoarea 1 deoarece acesta este un caz de scadere


void corec(char *a)
{
int i,j,c;
char *aux;
int k;
aux=(char*)malloc(sizeof(char)*4);
c=0;
for(i=n-1;i>=0;i=i-4)
{
if(c)
{
for(j=i;j>=i-3;j--)
{
if(a[j]=='1')
a[j]='0';
else
{
a[j]='1';
break;
}
}

}
if(a[i-3]=='1' && (a[i-2]=='1' || a[i-1]=='1'))
{
k=4;
for(j=i;j>=i-3;j--)
{
aux[k]=(a[j]=='1')^((j==i-1)||(j==i-2))^(c==1)+'0';
k--;
c=((a[j]=='1')+(j==i-1 || j==i-2)+c)>=2;
}
k=4;
for(j=i;j>=i-3;j--)
{
a[j]=aux[k];
k--;
}
}
}
}
void afisare(char *a)
{
int i,c;
for(i=0;i<n;i=i+4)
{
c=8*(a[i]=='1')+4*(a[i+1]=='1')+2*(a[i+2]=='1')+(a[i+3]=='1');
if(c<10)
printf("%i",c);
else
printf("%c",c-10+'A');
}
}

Aceasta este o functie de afisare care in acel for i-a fiecare tetrada si ii calculeaza valoarea in baza 16 si il afiseaza pe ecran cu printf

functia de transformare a unui numar zecimal in baza 2 format BCD
char* baza2(char *a)
{
int i,j,m;
char *b;
b=(char*)malloc(sizeof(char)*(n+1));
m=n-4*strlen(a);
j=m;
for(i=0;a[i]!='\0';i++)
{
b[j]=((a[i]-'0')/8)%2+'0';
j++;
b[j]=((a[i]-'0')/4)%2+'0';
j++;
b[j]=((a[i]-'0')/2)%2+'0';
j++;
b[j]=(a[i]-'0')%2+'0';
j++;
}
for(i=0;i<m;i++)
b[i]='0';
b[n]='\0';
return b;
}

Se aloca un spatiu pentru b de n+1 caractere cu ajutorul functiei  malloc

in ciclu for se ia fiecare cifra in parte din sirul de caractere a si se transforma in baza doi si se concateneaza la b ia in ultimul ciclu al functiei se completeaza cu zero restul dupa care se termina sirul pe pozitia n

Biblografie

[1]http://www.cplusplus.com/

[2]http://en.wikipedia.org/wiki/Binary-coded_decimal