Extras din curs
Un prim exemplu de program C++:
#include <iostream.h>
void main
{
int a;
cout << "Dati un numarn";
cin >> a;
cout << "Ati tastat numarul " << a << endl;
}
Obs.: << este operatorul de insertie
>> este operatorul de extractie
n este echivalent cu endl
cout este "console out"
cin este "console in"
Afisarea numerelor double (cu format) se face astfel:
#include <iostream.h>
void main()
{
double b;
cout << "Dati un numar real:" << endl;
cin >> b;
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout << b;
}
Obs: cout.precision(2) face ca numarul sa fie afisat cu 2 zecimale
Daca apoi, se doreste afisarea a trei zecimale, se face doar setarea cout.precision(3);
In general, cout afiseaza un format asemanator cu cel de intrare.
Supraincarcarea functiilor ( caz particular de polimorfism )
Ex:
#include <iostream.h>
double ave(double n1, double n2)
{return ((n1+n2)/2); }
double ave(double n1, double n2, double n3)
{return ((n1+n2+n3)/3.0);}
int main()
{
cout << "Media dintre 6.0, 7.5 si 8.75 este "
<< ave(6.0,7.5,8.75) << endl;
cout << "Media dintre 8.5 si 10 este "
<< ave(8.5,10.0);
return 0;
}
Deci avem 2 functii ave cu numar diferit de parametri. In acest caz compilatorul o va alege pe cea ce are numarul corect de parametri.
Supraincarcarea numelui unei functii
Inseamna definirea a doua sau mai multe functii cu acelasi nume. Cand supraincarcarea numelui unei functii trebuie sa aiba numar diferit de parametri formali sau anumiti parametri formali de tipuri diferite. Cand avem un apel de functie compilatorul foloseste definitia functiei a carei numar si tipuri de parametri formali se potriveste cu argumentele din apelul functiei.
Folosirea aceluiasi nume pentru a desemna lucruri diferite se numeste polimorfism (termen derivat din cuvinte grecesti ce inseamna "multe forme"). Supraincarcarea este un exemplu de polimorfism.
Ex. special de ambiguitate:
void f(int a) { cout << a; }
void f(float a) { cout << a; }
Avem 2 cazuri atunci cand apelam una din functii folosind constante:
I. daca apelam functia f cu o constanta de tip intreg atunci compilatorul
va folosi f(int a) ceea ce este corect;
II. daca apelam functia f cu o constanta de tip float atunci compilatorul
va semanala eroarea "Ambiguity between f(int) and f(float)"
In aceste conditii daca in functia main (sa zicem) apelam:
f(1.2) - "Ambiguity between ..."
f(1) - se executa f(int a)
f(a) - unde int a=2; -> se executa f(int a)
f(x) - unde float x=2.0; -> se executa f(float a)
Apeluri ale functiilor din C++
Se stie ca in C exista 2 tipuri de apeluri ale functiilor:
- prin valoare ( se transmite valoarea )
- prin referinta ( se transmite adresa )
Ex: (interschimbarea a doi intregi)
#include <iostream.h>
void schimba(int& a, int& b)
{
// Preconditie: parametri formali se numesc "parametri adresa".
// Postconditie: valorile celor doi intregi de la aceste adrese
// sunt intershimbate.
// Mecanismul acesta de apel prin referinta (adresa) este nou si
// specific limbajului C++. "Legaturile de adresa" sunt facute de
// catre compilator si sunt transparente programatorului.
// Ideea este ca se aloca spatiu de memorie pentru parametri adresa
// "a" si "b" cu specificarea ca inainte de parasirea functiei, valorile
// de la adresele parametrilor actuali (de exemplu "i" si "j") sunt
// actualizate cu valorile de la adresele lui "a", respectiv "b".
// Pe durata executiei functiei, parametrii actuali sunt inaccesibili
// in cazul nostru, variabilele "i" si "j". Se mai spune ca variabilele
// actuale sunt "trimise cu totul" (in sensul ca le stiu adresa lor).
int aux;
aux = a;
a = b;
b = aux;
}
void schimba(int *adresa1, int *adresa2)
{
// Preconditie: primesc ca parametri adresele celor doua variabile
// Postconditie: valorile celor doi intregi de la aceste adrese
// sunt intershimbate.
// Mecanismul acesta de apel prin referinta (adresa) este vechi si
// specific limbajului C. "Legaturile de adresa" trebuie facute de
// catre programator.
int aux;
aux = *adresa1;
*adresa1 = *adresa2;
*adresa2 = aux;
}
void main()
{
int i = 2, j = 3;
cout << "i = " << i << "; j = " << j << endl;
schimba(i, j);
cout << "i = " << i << "; j = " << j << endl;
schimba(&i, &j);
cout << "i = " << i << "; j = " << j << endl;
Preview document
Conținut arhivă zip
- curs_1(C++).doc
- curs_2(C++).doc
- curs_3(C++).doc
- curs_4(C++).doc
- curs_5(C++).doc
- curs_6(C++).doc