Sunteți pe pagina 1din 13

1.

Tipuri de date, operatori, conversii de date C/C++


Exista 2 tipuri de date : tip date de baza tip date definit de utilizator

Orice limbaj de programare ofera programatorului un numar de tipuri de date de baza: Tipul int short long unsigned unsigned long char float double long double Dimensiunea in biti 16 16 32 16 32 8 32 64 80 Intervalul de valori [-2^15, 2^15-1] [-2^15, 2^15-1] [-2^31, 2^31-1] [0, 2^16-1] [0, 2^32-1] Codul ASCII [3.4*10^(-38), 3.4*10^38] [1.7*10^(-308), 1.7*10^308] [3.4*10^(-4932), 1.1*10^4932]

Constantele caracter in C au tipul int iar in C++ au tipul char. In C++ constantele caracter de tip int sunt doar cele din 2 caractere. O expresie in limbajul C este formata dintrun operand sau mai multi legati prin operatori. Un operand poate fi : constanta, numele unei variabile, numele unui tablou, numele unei structuri, numele unei functii, apelul unei functii, expresie inclusa in paranteze rotunde, referirea la elementul unui tablou, referirea la elementul unei structuri. Unui operand ii corespunde un tip si o valoare. Operatorii pot fi unari sau binari. Operatorul unar se aplica unui singur operand. Operatorul binar se aplica la doi operanzi. Operatorii limajului C pot fi grupati astfel : operatori aritmetici, operatori de relatie, operatori logici, operatori de egalitate etc. Operatorii aritmetici sunt urmatorii dupa prioritate : operatorii unari +, operatori binari multiplicativi *, / si % operatori binari aditivi + si Operatori de relatie : >, >=, <, <=. Au prioritatea mai mica decit operatorii aditivi. Operatorii de egalitate : ==, !=. Au prioritatea mai mica decit operatorii de relatie.

Operatorii logici : negatia logica ! (operator unar) are prioritatea ca si ceilalti operatori unari si logic && are prioritate mai mica decit operatorii de egalitate. sau logic | | prioritate mai mica decit && Operatori logici pe biti : ~ complement fata de unu (operator unar) << deplasare la stinga >> deplasare la dreapta & si logic pe biti ^ sau exclusiv logic pe biti | sau logic pe biti Operatori de incrementare si decrementare :++, --. Regula conversiilor implicite se aplica la evaluarea expresiilor atunci cind un operator binar se aplica la doi operanzi de tipuri diferite. In acest caz operandul de tip inferior (dimensiunea in biti mai mic) se converteste spre tipul superior (dimensiunea in biti mai mare) si rezultatul va fi de tip superior. Inainte de toate se converteste operanzii de tip char si enum in tip int. Conversia explicita se face cu ajutorul expresiei cast : (tip) operand Asfel valoarea operandului se converteste spre tipul indicat din paranteze. 2. Instruciuni C/C++
O functie este alcatuita din antent si corp. Corpul contine intre acolade o succesiune de declaratii urmate de o succesiune de intructiuni. Instructiunile se folosesc pentru prelucrarea datelor. Ordinea in care se executa instructiunile defineste structura de control a programului. Sunt cunoscute urmatoarele structuri de control : secventiala compusa dintro succesiune de instructiuni si se executa una dupa alta. Se realizeaza cu ajutorul instructiunii compuse. alternativa se realizeaze prin instructiunea if selectiva se realizeaze prin instructiunea switch repetitiva conditionata anterior prin intermediul instructiunilor for si while repetitiva conditionata posterior prin interm. instruct. do-while

Instructiunea compusa o succesiune de instructiuni incluse intre acolade. { declaratii instructiuni }

Instructiunea if. Cazul 1: if (expresie) instructiune Cazul 2: if (expresie) instructiune1 else instructiune2 instructiunea while realizeaza structura ciclilca conditionata anterior while (expresie) instructiune instructiunea for. for (exp1; exp2; exp3) instructiune exp1 partea de initializare a ciclului for. exp2 conditia de continuare a ciclului for si joaca acelasi rol cu expresia din ciclul while. exp3 partea de reinitializare a ciclului for. Executarea instructiuni for: 1. Se executa secventa de initializare definita de exp1. 2. Se evalueaza expresia exp2. Daca are valoarea diferita de zero (adevarat), se executa instructiunea care formeaza corpul ciclul. Altfel (expresia are valoarea zero adica fals) se termina executia instructiunii for si se trece la instructiunea urmatoare. 3. Dupa executarea corpului ciclului se executa secventa de reinitializare definita de exp3. Apoi se reia executia de la pasul 2. Instructiunea do-while realizeaza structura ciclilca conditionata posterior. do instructiune while(expresie)

Executarea instructiuni do-while: 1. Se executa instructiunea 2. Se evalueaza expresia, daca aceasta are valoarea diferita de zero (adevar) se revine la pasul 1si se executa din nou instructiunea, altfel (expresia are valoarea zero adica fals) se trece la instructiunea urmatoare instructiunii dowhile. Instructiunea do-while este echivalenta cu secventa: instructiune while (expresie) instructiune In cazul instructiunii do-while corpul ciclului se executa cel putin o data spre deosebire de cazul instructiunilor while si for, cind este posibil sa nu se execute niciodata. Instructiunea switch realizeaza structura selectiva. Este o generalizare a structurii alternative. Poate fi realizata prin instructiuni if imbricate, dar prin switch programul devine mai clar. switch (expresie){ case c1: sir_1 break; case c2: sir_2 break; ... case cn: sir_n break; default: sir } unde: c1,...,cn constante. sir_1,...,sir_n,sir succesiuni de instructiuni. Executarea instructiunii switch: 1. Se evalueaza expresia din parantezele rotunde. 2. Se compara pe rind valoarea expresiei cu valorile constantelor c1,...,cn. Daca valoarea expresiei coincide cu una din constante de exemplu ci atunci se executa secventa sir_i, apoi se trece la instructiunea urmatoare instructiunii switch. Daca valoarea expresiei nu coincide cu nici una din constante, atunci se executa succesiunea de instructiuni sir, apoi se trece la instructiunea urmatoare instructiunii switch.

3. Funcii n C/C++, definirea, prototip, apel, transmitere parametri


O functie are urmatoarea structura : tip nume(lista declaratiilor parametrilor formali) { declaratii instructiuni } Primul rind reprezinta antentul functiei, iar partea inclusa intre acolade corpul functiei. tip din antentul functiei defineste tipul valorii returnate de functie. Pentru functiile ce nu returneaza nimic se foloseste cuvintul cheie void in calitate de tip. Daca functia nu are nici un parametru, antentul functiei va fi urmatorul : tip nume() sau tip nume(void) Parametri se utilizeaza pentru a permite transferuri de date la o functie in momentul apelului ei. Astfel se face o abstractizare de valorile concrete care vor fi prezente abia la executia programului, iar la compilare este necesar numai cunoasterea tipurilor valorilor pe care le vor primi parametri la executie. Valorile parametrilor formali se definesc la apelul functiei prin parametrii efectivi. Intrun program o functie poate avea o definitie si unul sau mai multe apeluri. O functie poate fi apelata folosind constructia : nume(lista_parametrilor_efectivi) la apel se atribuie parametrilor formali valorile parametrilor efectivi si executia se continua cu prima instructiune din corpul functiei apelate. Apelurile functiei nu pot fi precedate totdeauna de definitia ei. In asa cazuri definitia functiei apelate se inlocuieste cu prototipul ei. Prototipul functiei are un format asemanator cu antentul ei care reprezinta o informatie pentru compilator cu privire la: tipul valorii returnate existenta si tipurile parametrilor functiei Formatul prototipului : tip nume(lista tipurilor parametrilor formali) ; Compilatorul utilizeaza datele din prototip pentru a verifica tipurile parametrilor de la apel(parametri efectivi).

4. Pointeri i tablouri n C/C++


Un pointer este o variabila care are ca valori adrese. Pointerii se utilizeaza pentru a face referire la date cunoscute prin adresele lor. Astfel p este o variabila de tip pointer avind valoare adresa lui x, atunci *p reprezinta chiar valoarea lui x. In constructia *p, caracterul * se considera ca fiind un operator unar ce furnizeaza valoarea din zona de memorie a carei adresa este continuta in p. Pentru a atribui o adresa unei variabile de tip pointer se poate folosi operatorul unar &. Pentru ca p sa pointeze spre x, se va utiliza atribuirea : p=&x ; Operatorul unar & este numit operator adresa sau de referentiere, iar operatorul unar * se numeste operator de indirectare sau de dereferentiere. Pointerii sunt utili mai ales in cazul scrierii programelor de sistem. In general ei permit a scrie programe mai optimale. Alt beneficiu este posibilitatea alocarii dinamice a memoriei prin alte mijloace decit cel utilizat la alocarea datelor automatice. Un pointer se declara astfel : tip *nume ; nume este un pointer care pointeaza(indica) spre o zona de memorie ce contine o data de tipul tip. Tabloul este o multime ordonata de date de acelasi tip alocate intr-o zona de memorie continua. Numele tabloului si limitele superioare pentru fiecare indice, incluse intre paranteze patrate : tip nume [lim1] [limi] [limn] Limitele limi sint expresii constante, adica expresii care pot fi evaluate la compilare. Numele tabloului este un simbol care are ca valoare adresa primului sau element.

5. Tipuri de date definite de utilizator n C/C++


Limbajul C/C++ ofera facilitati de prelucrare atit a datelor singulare cit si celor grupate. Un mod simplu de grupare a datelor o ofera tablourile. Adesea este nevoie de a grupa datele care nu neaparat sint de acelasi tip. Structura este un exemplu de astfel de grupare a datelor. Exemplu de structura : data_calendaristica ce contine 3 date elementare (zi,luna,an). Componentele zi si an sint de tip intreg, iar luna sir de caractere. Structura este un tip de date definit de utilizator.

Forma generala de declarare a unei structuri : struct nume { lista_de_declaratii } nume1, nume2,,numen ; Daca nume este absent atunci cel putin nume1 trebuie sa fie prezent, iar daca lista nume1,,numen este absenta, atunci trebuie sa fie prezent nume. Daca nume este prezent atunci el defineste un tip nou, care poate fi utilizat in continuare pentru a defini date de acest tip, asa cum definim date de tipuri predefinite. Daca nume este absent atunci avem un tip de date anonim. Lista nume1,,numen sint structuri de tip nume (variabile de tip nume). Prin lista_de_declaratii intelegem una sau mai multe declaratii prin care se declara componentele structurii de tip nume. Exemplu : struct data_calendaristica { int zi ; char luna[11] ; int an ; } data_nasterii, data_angajarii ; sau : struct { int zi ; char luna[11] ; int an ; } data_nasterii, data_angajarii ; (in cazul tipului anonim) sau : struct data_calendaristica { int zi ; char luna[11] ; int an ; }; struct data_calendaristica data_nasterii, data_angajarii ; Prima declaratie introduce tipul utilizator data_calendaristica. Declaratia a doua defineste datele data_nasterii si data_angajarii ca fiind structuri de tip data_calendaristica. Accesul la elementele structurii se face cu ajutorul operatorului . (punct). Exemplu : data_nasterii.zi data_nasterii.an

Alt mod de grupare a datelor este uniunea. Gruparea se face cu scopul de a pastra in aceeasi zona de memorie date de tipuri diferite in momente de timp diferite. Uniunea la fel este un tip definit de utilizator si declaratia se aseamana cu cea a structurii cu exceptia ca in loc de cuvintul-cheie struct se scrie union. union nume { lista_de_declaratii } nume1, nume2,,numen ; Exemplu : union aria { int x ; float r ; double w ; char t[5] ; } f1,f2,f3[6],*z ; La alocarea memoriei, spre deosebire de structura, unei uniuni i se aloca memoria necesara pentru a pastra date de acel tip al componentelor uniunii, care necesita numarul maxim de octeti. In exemplul de mai sus pentru fiecare uniune declarata se vor aloca 8 octeti, numarul maxim. Alt tip definit de utilizator este tipul enumerare. Acesta permite de a folosi nume sugestive pentru valori numerice. De exemplu, in locul numarului unei luni calindaristice este mai sugestiv sa folosim denumirea lunii respective sau o prescurtare. Declararea unei enumarari : enum nume {nume0,nume1,,numek} d1,d2,,dn ; nume este numele tipului de enumerare introdus prin aceasta declaratie. Lista nume0,,numek sunt nume care se utilizeaza in locul valorilor numerice si anume numei are valoarea i. Lista d1,,dn sint date care se declara de tipul nume. Exemplu : enum {ileg,ian,feb,mar,apr,mai,iun,iul,aug,sep,oct,noi,dec} luna ; Astfel luna=3 este identic cu luna=mar deoarece mar are valoarea 3.

6. Clase i obiecte n C/C++


O clas reprezint un tip de date definit de programator. Acest tip de date (class) permite declararea unor date protejate sau private, aceste date nefiind vizibile in afara clasei, nici mcar de ctre obiectele de tipul respectiv. In C++, un obiect reprezint o variabil definit ca fiind de tipul clasei din care face parte. Controlul accesului la componentele unei clase poate fi realizat utilizind specificatorii: public membrul poate fi accesat de orice funcie atit din afara cit si din interiorul clasei; private membrul este accesibil numai de funcii din interiorul clasei sau de ctre funcii prietene (friend) ale clasei; protected similar cu private dar accesul se extinde pentru funciile membre i prietene derivate din clasa respectiv. Specificatorul de acces va fi utilizat in cadrul unei clase indicind numele acestuia urmat de :. Eticheta public grupeaz membrii clasei pe care programul ii poate accesa cu operatorul punct. Pentru a ascunde detalii elementare ale unui obiect, C++ permite separarea definiiei clasei in pri private, protejate i publice. Singura posibilitate de accesare a datelor i metodelor private este prin intermediul metodelor publice. Pentru clasa de baz, obiectele derivate pot accesa membrii protejai, ca i cum ar fi publici. O funcie membr a unei clase are acces la toate datele membre din clasa respectiv, indiferent de specificatorul de acces. Dac nu specificm tipul de acces, membrii vor fi private in mod implicit. Forma general a declaraiei unui tip class este similar cu a tipurilor struct din C: class nume_clasa : lista_clase_baza { lista_membri } lista_var; - nume_clasa este numele tipului clas declarat i trebuie s fie unic in domeniul in care este valabil declaraia. - lista_clase_baza este lista claselor din care este derivat clasa declarat (dac este cazul) - lista_membrii reprezint secvena de declaraii ale membrilor clasei. Lista conine declaraii de date membre sau definiii de funcii membre. Datele membre pot fi de orice tip, mai puin tipul de clas declarat. - lista_var este lista numerelor variabilelor de tip nume_clasa.

Exemplu: definire clas student. class Student { public: char Nume[100]; char Prenume[100]; int Varsta; protected: char Facultatea[30]; char Sectia[30]; int anul; int nr_ restante; private: long media_ultim_an; double bursa; public: Student(); Long aflaMedia(); void schimbaMedia(long MediaNoua); private: int Afla_nr_restante(); };

Prin mecanismul de motenire sau derivare se pot crea clase noi pe baza unor clase existente. Clasa din care se motenete se numete clas de baz, clasa care motenete se numete clas derivat. Clasa derivat motenete toi membrii clasei de baz, dar nu va putea avea acces niciodat la membrii declarai private in clasa de baz. Practic, datele i metodele se transfer de la clasa de baz la clasa derivat beneficiind deci de proprieti i de un comportament asemntoare cu cele ale clasei de baz. Exist i conceptul de motenire multipl o clas derivat poate s moteneasc de la mai multe clase de baz. Exemplu: class A { private: int i2; }; class B: public A { public: int i3; };

Membrul i2 din clasa A, fiind declarat private, nu este vizibil in clasa derivat B, indiferent de mofificatorul de acces. 7. Supradefinirea operatorilor n C/C++
Supraincrcarea funciilor i operatorilor (overloading) sunt elemente eseniale in programarea C++. Ele ofer o baza importanta pentru polimorfism in timpul compilrii, dind o extensibilitate i flexibilitate limbajului. In C++, se pot supraincrca aproape toi operatorii, astfel incit ei s efectueze diverse operaii in mai multe clase create. La supraincrcarea unui operator, nu se pierde nimic din semnificaiile sale originale, ci doar se extinde tipul obiectelor crora li se poate aplica. Supraincrcarea operatorilor se refer la o facilitate specifica limbajului C++. Este vorba de a oferi posibilitatea programatorului s atribuie operatorilor i alte sensuri decit cele predefinite. Un operator binar suprancrcat, de exemplu *, poate realiza operaia de inmulire i intre obiecte de tip matrice, numere complexe, numere raionale. Funciile operator pot fi sau nu funcii membru ale clasei in care opereaz. De obicei, funciile operator, care nu sunt funcii membru ale clasei, sunt funcii friend. Sintaxa unei funcii operator membru a unei clase; tip_ret iden_clasa::operator semn_op(lista_par) { // operaii} Cuvintul operator este un cuvint cheie, iar la crearea unei funcii operator, semn_op reprezint simbolul operatorului supraincrcat. Funcia operator membru care supraincarc un operator binar conine un singur parametru. Motivul const in faptul ca operandul din stinga operatorului binar este plasat implicit funciei prin pointerul this care este ataat funciei operator. Operandul din dreapta operatorului binar este transmis funciei operator prin parametrul existent in funcie. Apelul funciei operator este generat de obiectul ce reprezint operandul sting al operatorului binar respectiv. Exemplu: Sa se implementeze clasa complex realizind operaiile aritmetice adunare, scdere, inmulire i imprire prin supraincrcarea operatorilor respectivi cu funcii operator membru. #include<iostream.h> #include<conio.h> #include<math.h> class complex{ double re,im; public: complex(double a=0.0,double b=0){re=a;im=b;} void cit(){ cout<<"Dati partea reala. ";cin>>re;

cout<<"Dati partea imaginara. ";cin>>im; getch(); } complex operator+(complex &c1); complex operator-(complex &c2); complex operator*(complex &c3); complex operator/(complex &c4); void afis(){ if(im<0)cout<<re<<im<<"*i"; else cout<<re<<"+"<<im<<"*i"; } }; complex complex::operator+(complex &c1){ complex u; u.re=re+c1.re; u.im=im+c1.im; return u; } complex complex::operator-(complex &c2){ complex v; v.re=re-c2.re; v.im=im-c2.im; return v; } complex complex::operator*(complex &c3){ complex t; t.re=re*c3.re-im*c3.im; t.im=re*c3.im+im*c3.re; return t; } complex complex::operator/(complex &c4){ complex z; z.re=(re*c4.re+im*c4.im)/(c4.re*c4.re+c4.im*c4.im); z.im=(im*c4.re-re*c4.im)/(c4.re*c4.re+c4.im*c4.im); return z; } void main(){ complex z1,z2,z3; int n; clrscr(); z1.cit(); z2.cit(); z3=z1+z2; cout<<"\nSuma este: ";z3.afis(); z3=z1-z2; cout<<"\nDiferenta este: ";z3.afis(); z3=z1*z2;

cout<<"\nProdusul este: ";z3.afis(); z3=z1/z2; cout<<"\nRaportul este: ";z3.afis(); getch(); }

8. Principii OOP: incapsulare, instaniere, polimorfism Incapsularea - este un mecanism care leag impreun cod i date i le pstreaz pe ambele in siguran fa de intervenii din afar i de utilizri greite. Mai mult , incapsularea este cea care permite crearea unui obiect. Obiectul este o entitate logic ce incapsuleaz atit date cit i cod care manevreaz aceste date. Intr-un obiect o parte din cod i/sau date pot fi particulare acelui obiect i inaccesibile pentru orice din afara sa. In acest fel, un obiect dispune de un nivel semnificativ de protecie care impiedic modificarea accidental sau utilizarea incorect a prilor proprii obiectului de ctre seciuni ale programului cu care nu are legtur. Motenirea permite definirea unor noi clase pornind de la cele existente. Marele avantaj al motenirii este obinerea prin derivare a datelor i metodelor in clasa creat. Caracteristicile motenite de clasa creat pot fi ajustate dup necesiti. Este posibil de asemenea derivarea unei clase din mai multe clase de baz (motenire multipl). Prin motenire se pot obine obiecte specializate pe baza unor obiecte mai generale. Avantajul apare cind, pentru a crea un obiect, nu mai trebuie s pornim de la zero, ci putem deriva obiectul dintr-o clas care are proprieti comune cu obiectul care dorim s-l obinem. Polimorfismul - este caracteristica ce permite unei interfee s fie folosit cu o clas general de aciuni. Aciunea specific selectat este determinat de natura precis a situaiei. Un exemplu din practica zilnic pentru polimorfism este un termostat. Nu are important ce combustibil se ntrebuineaz pentru nclzirea casei (gaze , petrol , electricitate etc.) , termostatul lucreaz n acelai fel. n acest caz termostatul (care este interfaa) este acelai indiferent de combustibil (metoda). Acelai principiu se poate aplica i programrii. De exemplu , putem avea un program care definete trei tipuri de memorie stiv. Una este folosit pentru valori intregi, una pentru valori tip caracter i una pentru valori in virgul mobil . Datorit polimorfismului , putem crea trei perechi de funcii numite pune ( ) i scoate ( ) cite una pentru fiecare tip de date. Conceptul general ( interfa ) este cel de a pune i de a scoate date dintr-o memorie stiv. Funciile definesc calea specific (metoda) care se folosete pentru fiecare tip de date. Cind punem date n memoria stiv , tipul de date va fi cel care va determina versiunea particular a lui pune ( ) care va fi apelat. Polimorfismul ajut la reducerea complexitii permiind aceleiai interfee s fie folosit pentru a specifica o clas general de aciuni. Rolul compilatorului este s aleag aciunea specific (metoda) care se aplica fiecrei situaii. Programatorul nu trebuie s execute personal aceasta aciune. Nu trebuie decit s-i aminteasc i s foloseasc interfaa general.

S-ar putea să vă placă și