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.
Dostları ilə paylaş: |