Lucrarea nr



Yüklə 0,56 Mb.
səhifə9/20
tarix17.01.2019
ölçüsü0,56 Mb.
#98835
1   ...   5   6   7   8   9   10   11   12   ...   20

3.3Probleme propuse


Problema 1. Să se definească o funcţie care să calculeze şi să afişeze rădăcinile ecuaţiei de gradul doi . Se presupune că parametrii a, b, c ai funcţiei sunt reali şi că . Prototipul funcţiei va fi

void ecuatie(double a, double b, double c) ;


Problema 2. Să se definească o funcţie care să calculeze suprafaţa unui cerc cunoscând raza cercului. Prototipul funcţiei va fi

double aria(double raza);


Problema 3. Să se definească o funcţie care să calculeze media geometrică a unui şir de numere reale

Sirul de numere şi lungimea lui sunt parametrii de intrare ai funcţiei. Prototipul funcţiei va fi

double med(double x[], int n) ;
Problema 4. Să se definească o funcţie care să calculeze n!. Variabila întreagă n va fi parametrul de intrare al funcţiei. Funcţia se va scrie în două variante : recursiv şi nerecursiv. Prototipul funcţiei va fi

int fact(int n) ;

Să se definească o funcţie care să calculeze valoarea . Prototipul funcţiei va fi

int comb(int n, int k);

Pentru calculul factorialului în funcţia comb() se va utiliza funcţia fact().
Problema 5. Să se definescă o funcţie care să calculeze suma a doi vectori, x şi y, cu câte n componente reale fiecare. Prototipul funcţiei va fi

void suma(double x[], double y[], double z[], int n);

unde z este suma vectorilor x şi y, iar n este dimensiunea celor trei vectori.
Problema 6. Să se definească o funcţie generică pentru calculul valorii maxime a unui şir de numere. Prototipul funcţiei va fi

template

T minval(T x[], int n);

Se va utiliza funcţia scrisă pentru calculul maximului unor şiruri de valori de tip int sau double.


Problema 7. Să se definească o funcţie care să calculeze suma primelor n numere naturale impare. Prototipul funcţiei va fi

int suma(int n);


Problema 8. Să se definească o funcţie care să calculeze produsul scalar a doi vectori, x şi y cu n componente reale fiecare. Prototipul funcţie va fi

double prodscalar(double x[], double y[], int n) ;

Indicaţie. Produsul scalar a doi vectori , x şi y are expresia


Problema 9. Să se definească o funcţie care să testeze dacă un număr întreg este par. Prototipul funcţiei va fi

bool estepar(int n) ;


Problema 10. Să se definească o funcţie care să calculeze o cifră hexazecimală a unui număr întreg. Prototipul funcţiei va fi

int hexdigit(int n, int k);

Funcţia va calcula cifra zecimală k a numărului întreg n. De exemplu, pentru numărul întreg n = 0x1b2, hexdigit(n, 0) va avea ca rezultat 2, hexdigit(n, 1) va avea ca rezultat b, etc.


4Pointeri. Referinţe. Alocarea dinamică a memoriei




4.1 Pointeri


Un pointer este o variabilă ce conţine adresa unei alte variabile. O variabilă de tip pointer se defineşte cu instrucţiunea

tip * nume;

Variabilele tip pointer pot fi iniţializate doar cu adrese.

Pentru a calcula adresa unei variabile se utilizează operatorul &. Dacă x este o variabilă oarecare, expresia &x este adresa lui x. De exemplu putem scrie

int n;

int * pn; // pn este o variabila de tipul pointer la int



pn = &n; // initializeazǎ pn cu adresa lui n

Variabilele de tip pointer pot fi iniţializate la declararea lor. Putem scrie de exemplu

int n, *pn = &n;

Pentru a obţine valoarea variabilei indicate de un pointer se utilizează operatorul * (numit şi operator de adresare indirectă).

Fie de exemplu instrucţiunile

int k, n= 10;

int * pn, *pk;

Instrucţiunile

k = n;

şi

pn = &n;



k = *pn;

sunt echivalente, k primeşte valoarea 10. (Variabila pn a fost iniţializată în prealabil cu adresa lui n).

Instrucţiunile

k = n;


şi

pk = &k;


*pk = n;

sunt echivalente.

În final, instrucţiunile

k = n;


şi

pk = &k;


pn = &n;

*pk = *pn;

sunt echivalente;

Menţionăm că orice variabilă tip pointer trebuie iniţializată înainte de a fi utilizată. De exemplu, următoarea secvenţă de instrucţiuni nu este corectă

int *pn;

*pn = 5;


deoarece variabila pn nu a fost iniţializată. O secvenţă corectă este:

int *pn;


int x;

pn = &x;


*pn = 5;

În acest caz variabila pn a fost iniţializată cu adresa unei variabile de tip întreg, x.



Probleme rezolvate

Problema 1. Să se definească o funcţie care să permute valorile a două variabile de tip double. Prototipul funcţiei va fi

void perm(double * a, double * b);

Programul este următorul.
# include

using namespace std;

// functie ce permuta valorile a doua variabile

void perm(int* a, int* b)

{

int c;


c = *a;

*a = *b;


*b = c;

}
// testarea functiei perm


int main()

{

int x = 3, y = -4;



// scrie variabilele inainte de permutare

cout << "x = " << x << " y = " << y << endl;

perm(&x, &y);

// scrie variabilele dupa permutare

cout << "x = " << x << " y = " << y << endl;

return 0;

}
Rezultatele execuţiei programului sunt prezentate în caseta text.



Amintim că, în limbajul C, singura modalitate ca un parametru al unei funcţii să fie un parametru de ieşire este ca el să fie de tip pointer.
Problema 2. Se consideră un vector cu 4 componente întregi. Să se afişeze adresele corespunzătoare componentelor vectorului


  • utilizând operatorul & de calcul al adresei

  • utilizând o variabilă tip pointer ce va primi ca valoare iniţială adresa elementului x[0].

Programul este cel de mai jos.
#include

using namespace std;

int main(){

int x[4], i;

/* afiseaza adr. componentelor cu operatorul & */
cout<<"indice adresa folosind &"<

for(i = 0; i < 4; i++)

cout << i << "\t" << &x[i] << endl;

// afiseaza adreselor componentelor folosind o variabila tip pointer

int * adrx;

adrx = &x[0];

cout<<"indice adresa folosind o variabila.pointer"<

for(i = 0; i < 4; i++) {

cout << i <<"\t" <

adrx = adrx + 1;

}

return 0;



}
Rezultatele execuţiei programului sunt prezentate mai jos.



Problema 3. Să se scrie un program prin care componentele unui vector x cu 10 componente de tip întreg vor primi valorile x[i] = i * i, prin atribuire directă şi utilizând o variabilă tip pointer ce va primi ca valoare iniţială adresa elementului x[0]. Programul este cel de mai jos.
#include

using namespace std;

int main ()

{

int x[5];



int i;

int * adr;


/*componentele vectorului primesc valori prin atribuire directa */

cout<<"valorile componentelor vectorului atribuite direct"<

cout<<"indice"<<"\t"<<"valoare"<

for(i = 0; i < 5; i++) {

x[i] = i * i;

cout << i << "\t"<

}

/*componentele vectorului primesc valori prin intermediul pointerilor */



adr = &x[0];

cout<<"valorile componentelor vectorului atribuite prin pointer"<

cout<<"indice"<<"\t"<<"valoare"<

for(i = 0; i < 5; i++){

*adr = i * i; x[i]=*adr;

cout << i << "\t"<< x[i] << endl;

adr++;

}

return 0;



}
Mai jos sunt prezentate rezultatele execuţiei programului.


Problema 4. Fie un vector cu 6 componente reale. Să se listeze componentele pare ale vectorului direct şi utilizând o variabilă de tip pointer. Programul este prezentat mai jos.
#include

using namespace std;

int main()

{

float a[6] = {1.2, -2.0, 12, 4.35, 0.29, 1.73};



int i;

cout<<" componentele pare afisate direct"<

for(i = 0; i < 6; i = i + 2)

cout << i <<" "<< a[i] << endl;

cout<<" componentele pare afisate cu variabila tip pointer"<

float * adrz;

adrz = a;

for(i = 0; i < 6; i = i + 2)

{ cout << i <<" "<< *adrz << endl;

adrz = adrz + 2;

}

return 0;



}

Mai jos sunt prezentate rezultatele execuţiei programului.






Yüklə 0,56 Mb.

Dostları ilə paylaş:
1   ...   5   6   7   8   9   10   11   12   ...   20




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin