Aplicatii propuse pentru operatori

1. Rulati urmatoarele doua secvente, observand conversiile implicite si explicite:

char c='a',cc;
int i=4;
float f=5.95;
printf("%d %f\n",i,f);
i=f; // conversie implicita, trunchiere
printf("%d %f\n",i,f);
f=i+100000; // conversie implicita a rezultatului expresiei
printf("%d %f\n",i,f);
i=-99.001; // conversie implicita, trunchiere
f='a';
c=0x3239; cc=-i; // preluarea ultimului octet
printf("%d %f %c %c\n",i,f,c,cc);

float r1=5/2,
r2=(float)5/2,
r3=(float)(5/2),
r4=5/(float)2,
r5=(float)5/(float)2;
printf("%f %f %f %f %f\n",r1,r2,r3,r4,r5);

2. a) Gasiti valorile expresiilor de mai jos. Verificati rezultatele obtinute, tastand expresiile in fereastra de evaluare ( deschisa cu CTRL/F4 ).

sizeof(int)
sizeof(double)
sizeof(long double)
sizeof('a')
sizeof((char)'a')
sizeof(33000)
sizeof(1.3+'a')
sizeof(1.3f)
sizeof(1.3)
sizeof(1.3l)
sizeof(5/2)
sizeof((float)5/2)

b) Gasiti ce tipareste pe ecran urmatorul program? Verificati, rulandu-l.

#include <stdio.h>
void main (void){
puts("Dimensiunea in octeti ocupata de:");
printf("int\t%d\n",sizeof(int));
printf("char\t%d\n",sizeof(char));
printf("long\t%d\n",sizeof(long));
printf("32780\t%d\n",sizeof(32780));
printf("32780u\t%d\n",sizeof(32780u));
printf("-10000\t%d\n",sizeof(-10000));
printf("'a'\t%d\n",sizeof('a'));
printf("07111111\t%d\n",sizeof(07111111));
printf("22l\t%d\n",sizeof(22l));
}

3. Rulati programele de mai jos pas cu pas, urmarind valorile variabilelor in fereastra Watch, in baza 10 si 16 (nume_variabila,x ):

void main(void){
int i=20000,j=15000,k;
float r;
scanf("%d",&k);
printf("%d %p\n",k,&k);
k=i+j;
r=i+j;
r=(float)i+j;
r=(long)i+j;
r=i/j;
k=i/j;
r=(float)i/j;
k=i%j;
k=+ - - -i;
k=+ - --i;
k=- +j--;
i=k/(j-j);
}

void main(void){
int a,b,c; float z;
a=25000;b=20000;
c=a+b;
z=a+b;
c=(float)a+b;
z=(float)a+b;
c=a/b;
c=a%b;
c=a>b;
c=a==b;
a=3;b=11;
c=a++ + ++b;
c=a&b;
c=a|b;
c=a^b;
c=b<<2;
c=-a>>3;
c=~a;
a=0;
c=a&&b;
c=a||b;
c=!a;
a=4;
c=a&&b;
c=a||b;
c=!a;
a=2;c=3;
c*=a;
b=5;
c=(a>b)?a:b;
}

4. Pentru un intreg x citit de la tastatura, sa se calculeze intr-o singura expresie primele cinci puteri, care apoi sa se afiseze:

int x,x2,x3,x4,x5; // se observa in urma rularii ca 8^5 apare negativ
printf("x=");scanf("%d",&x); // deci se vor face modificarile pentru tipul long
x5=(x4=(x3=(x2=x*x)*x)*x)*x;
printf("%d %d %l %d %d\n",x,x2,x3,x4,x5);

5. Folosind operatorul ternar, sa se tipareasca maximul dintre a,b, relatia dintre a,b si maximul dintre a,b,c cititi de la tastatura. Sa se scrie secventele echivalente folosind instructiunea if:

max_a_b=a>b?a:b;
printf("%d %c %d\n",a,a>b?'>':a<b?'<':'=',b);
max_a_b_c=a>b?(a>c?a:c):(b>c?b:c);

6. Sa se verifice ca secventa urmatoare determina maximul dintre a si b, iar daca a<b, le interschimba, astfel incat secventa a si b sa fie descrescatoare. Sa se scrie  secventa echivalenta folosind instructiunea if:

max_a_b=a<b?(t=b,b=a,a=t):a;

7. Pentru un n citit de la tastatura sa se afiseze valorile mai mari/mai mici decat n de 2,4,8,16 ori obtinute prin inmultiri/impartiri, respectiv deplasari.

8. Pentru valori intregi ( pozitive sau negative ) citite de la tastatura sa se tipareasca valoarea corespunzatoare in binar. Sa se scrie secventa echivalenta, in care cifrele reprezentarii se obtin ca resturi ale impartirii repetate la 2, pana la catul 0 - cifrele sunt obtinute insa incepand cu cea mai putin semnificativa:

int n,i,dim=sizeof(i)*8,masca=1;
while(1){
printf("n=");scanf("%d",&n);
for(i=dim-1;i>=0;i--)
putchar(n&masca<<i?'1':'0');
}

9. Se citesc intregii x,y,a,b ( 0<=a,b<16). Se cere sa se afiseze:
-bitul (a+b) din x
-valoarea obtinuta prin setarea bitilor a si b din x
-valoarea obtinuta prin stergerea bitilor a si b din x
-valoarea obtinuta prin inversarea bitilor a si b in x
-valoarea obtinuta prin negarea, respectiv complementarea lui y
-valorile obtinute prin aplicarea lui x si y a operatorilor si logic, sau logic, si pe biti, sau pe biti, sau exclusiv pe biti.
Obs. Toate citirile si afisarile se vor face in baza 16; bitul 0 este cel mai putin semnificativ, iar 15 este cel mai semnificativ.

10. Fiind date urmatoarele definitii:
int i = 3, j = 5,c1,c2,c3,c4;
determinati valorile tuturor variabilelor, dupa executia secventei:
c1=(i/2) + 'b' + i-- - - - 'c';
c2=(j%8) * i;
c3=(i++) - (--j);
c4=j = (i += 2);

11. Fiind date definitiile:
int a=2, b=2, c=1, d=0, e=4, i = 2, j = 4;
determinati valoarea urmatoarelor expresii:
a) a++ / ++c * --e
b) --b * c++ -a
c) -b - --c
d) e / --a * b++ /c++
e) e / --a * b++ / c++
f) a %= b = d = 1 + e /2
g) j = (i++ , i -j)

12. Se citesc 2 numere intregi x si n unde n este intre 0 si 15. Sa se afiseze:
-bitul n din x
-numarul x in care se seteaza bitul n
-numarul x in care se sterge bitul n
-numarul x in care se complementeaza bitul n.

13. Se citesc intregii x,n,p. Sa se afiseze:
-numarul format din n biti incepand de la pozitia p (spre dreapta )
-numarul obtinut prin setarea celor n biti de la pozitia p
-numarul obtinut prin stergerea celor n biti de la pozitia p
-numarul obtinut prin complementarea celor n biti din pozitia p
( cei n biti incepind din pozitia p sunt bitii p,p-1,...,p+1-n ).

14. Se citesc intregii x,y,n,p. Sa se copiezeze in x, incepand din pozitia p, ultimii n biti din y si sa se afiseze noua valoare a lui x.

15. Se citeste intregul x. Sa se afiseze numarul obtinut prin schimbarea intre ei a octetilor lui x.