bancuri, glume, imagini, video, fun, bancuri online, bancuri tari, imagini haioase, videoclipuri haioase, distractie online Pe HaiSaRadem.ro vei gasi bancuri, glume, imagini, video, fun, bancuri online, bancuri tari, imagini haioase, videoclipuri haioase, distractie online. Nu ne crede pe cuvant, intra pe HaiSaRadem.ro ca sa te convingi.

#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