Sunteți pe pagina 1din 3

Pointeri i tablouri Alegei varianta de rspuns corect (este una singur la fiecare item): 1.

Fie declaraiile: int a[10],*p; Care din urmtoarele expresii nu este echivalent cu celelalte trei: a) p=&a[0]; b) p=&a; c) p=*a; d) p=a; 2. Ce afieaz secvena urmtoare? int a[100],*p,*q; p=a+4; q=a+40; cout<<(q p); a) 70 b) 36 c) 35 d) 72 e) secvena conine erori 3. Ce afieaz secvena? int a[10],*p,*q=a+10; for ( p=a; p<q; p++) *p=(q p); cout<<a[1]; a) 9 b) 1 c) 10 d) 0 e) secvena conine erori 4. Pentru declaraia: int *p; adresa indicat de p? Care din urmtoarele instruciuni afieaz corect coninutul de la

a) cin>>*p; b) cin>>&p; c) cout<<*p; d) cout<<&(*p) ; 5. Ce valori afieaz secvena? int a=3,*adr=&a; ++ (*adr); cout<<*adr<< <<a; a) 3 3 b) 4 4 c) 3 4 6. Ce afieaz secvena? int a[10],*p, i; *p=a; for (i=0;i<10;i++) { *p=i; p++; } cout<<*(a+3); a) 3 b) 4 c) 5 d) 55 e) secvena conine erori 7. Fie declaraiile de variabile: int a[10], i=1, *p, **q; Care din urmtoarele atribuiri este eronat? a) *q=p; b) q=&p; c) i=*(a + i); d) *q=*a; 8. Ce afieaz secvena urmtoare? int a=10,b=20,&x=a,&y=b; x=30; x ++; y ++; cout<<a<< <<b;

d) 4 3

e) secvena conine erori

a) 31 21 b) 30 20 c) 31 20 d) 30 21 e) secvena conine erori Ce va afia pe ecran urmtoarea secven de instruciuni? #include<iostream.h> void main(){ int *p, *q; int a=3; float b=7.5; *p=a; *q=b; cout<<*p<<" "<<*q<<endl; } a) 3 7 b) 7 3 c) 3 7.5 d) 7.5 3 e) Se produce eroare la execuia programului Raspunsuri: 1. c 2. b 3. a 4. c 5. b 6. e 7. d 8. a 9. e Probleme

1.

Se citete un numr natural n, reprezentnd un cod ce trebuie reprezentat binar. S se scrie un program care face aceast transformare, folosind pointeri.

Rezolvare: Problema se reduce la a transforma un numr din baza 10 n baza 2. Algoritmul de transformare presupune mprirea numrului respectiv la 2 i reinerea restului acestei mpriri i, att timp ct ctul mpririi este diferit de 0, acesta va trece n locul dempritului, operaia repetndu-se. Rezultatul transformrii reprezint succesiunea de resturi obinute, n ordine invers. Programul C++, care face acest transformare i care nu face referirea prin pointeri este urmtorul: #include <iostream.h> #include <conio.h> void main(){ int n, baza2[50],k=0,i; /* vectorul baza2 retine cifrele binare (resturile la 2) ale numarului, in ordinea in care acestea sunt aflate*/ cout<<"Codul =";cin >>n; while (n!=0) { k++; baza2[k]=n%2; n=n/2;} cout<<"Codificarea binara a lui "<<n<<" este ";

for(i=k;i>=1;i--) cout<<baza2[i]; getch(); } Folosirea pointerilor presupune accesul la elementele vectorului baza2 cu ajutorul acestora. n acest caz, programul C++ va fi urmtorul: #include <iostream.h> #include <conio.h> void main(){ int n, baza2[50],*p; cout<<"Codul =";cin >>n; p=baza2; while (n!=0) { p++; *p=n%2; n=n/2; } cout<<"Codificarea binara a lui "<<n<<" este "; while (p>baza2) {cout<<*p;p--;} getch(); }

2. S se scrie un program care citete elementele unui vector de ntregi, cu maxim 20 elemente i
nlocuiete elementul maxim din vector cu o valoare introdus de la tastatur. Se va folosi aritmetica pointerilor.
#include <iostream.h> void main() { int a[20]; int n, *max, indice,i ; cout<<"Nr. elemente:"; cin>>n; for (i=0; i<n; i++) { cout<<"a["<<i<<"]="; cin>> *(a+i);} // citirea elementelor vectorului max= a; indice=0; for (i=0; i<n; i++) if (*max<=* (a+i)) { max= (a+i); indice=i;} // aflarea valorii elementului maxim din vector si a pozitiei acestuia cout<<*max<<endl; cout<<indice<<endl; int val; cout<<"Valoare de inlocuire:"; cin >> val; *(a+indice)=val; // citirea valorii cu care se va nlocui elementul maxim for (i=0; i<n; i++) cout<< *(a+i)<<' '; cout<<'\n'; // afisarea noului vector /* n acest mod de implementare, n situatia n care n vector exista mai multe elemente a caror valoare este egala cu valoarea elementului maxim, va fi nlocuit doar ultimul dintre acestea (cel de indice maxim).*/ }