Program Are Orientata Obiect in C++

Embed Size (px)

Citation preview

  • 8/3/2019 Program Are Orientata Obiect in C++

    1/137

    CPOO++ Pr e jmer ean Va sil e

    C l u j- N a poca 2004

  • 8/3/2019 Program Are Orientata Obiect in C++

    2/137

    C++ POO

    09.01.12 1

    1. Redactarea programelor C

    1.1. G eneralit iMediul Borland C a fost extins la Visual C i C++ Builder, adaptate program rii

    orientate obiect i interfe ei grafice Windows 95. Limbajul C a fost extins la C++ permi ndaplicarea conceptelor program rii prin abstractizarea datelor i program rii orientate spreobiecte.

    Fi ierele surs pot avea extensia C, CP, sau CPP.

    1.2. Structura unui programUn program C este con ine o func ie principal (main) i eventual alte func ii

    secundare, apelate de c tre func ia principal , situate la acela i nivel (far imbricare).Structura unui program este urm toarea:

    Directive de procesare, Declara ii de date globale, Declara ii de func ii, sau doar [ Antete de func ii ( prototipuri ) ] Func ia principal ; q

    [ Descrierea func iilor (implement ri ) ]

    Se observ c descrierea func iilor se poate face fie n ntregime naintea func ieimain fie doar prototipul nainte, iar corpul dup aceasta.

    Comentariilese scriu ntre caracterele /* i */ ( ... /*comentariu */ ... ), sau lanivelul unui rnd dup caracterele // ( ... //comentariu ).

    nainte de compilare, un program esteprecompilat, de c tre un preprocesor, care permite includerea unor fi ier surs , definirea i apelul unror macrouri, precum i ocompilare condi ionat .

    Includereaunui fi ier surs (*.h sau *.c) se realizeaz prin directivaincludeastfel:# include specificator_fi ier // pentru fi iere utilizator

    sau# include< specificator_fi ier > // pentru fi iere standard

    Exemplu:#include; // Standard InputOutputHeader #include< iostream.h>; // ConsoleIn put, ConsoleOut put

  • 8/3/2019 Program Are Orientata Obiect in C++

    3/137

    C++ POO

    09.01.12 2

    Constantele simbolicese definesc cu ajutorul directiveidefineastfel:#define Nume_constant ir_caractere

    Exemplu:#define Pi 3.141592 // nlocuie te Pi cu 3.141592

    O constant simbolic poate fi redefinit sau anulat (#undef Nume_constant ).

    1.3. F unc iiO func ie este format dintr-un antet i un bloc (corp). Ea poate fi apelat dac a

    fost definit n ntregime sau doar antetul s u.Antetul unei func ii are urm torul format:

    T ip Nume ( List _parametri_formali )

    unde: T ip este tipul valorilor func iei (codomeniul);

    Nume este un identificator (liter urmat eventual de alte litere sau cifre); List _parametri_formali con ine parametrii formali separa i prin ,.

    Exemplu: int Min (int a, int b){ if (a< b) return a; else return b; }

    Observa ie. Prototipul unei func ii este antetul acesteia urmat de ; .Corpulunei func ii are urm toarea structur :

    { Declara ii Instruc iuni

    }Exemple: intCmmdc(int a, int b) // Cmmdc(a,b)

    {if (b= =0) return a;

    else return Cmmdc(b,a% b); // Cmmdc(b,a M od b); }

    intcmmdc(int a, int b) // cmmdc(a,b){ int rest;

    do { rest=a% b; a=b; b=rest; }

    while (rest!=0); // rest{ 0; return a;

    }

  • 8/3/2019 Program Are Orientata Obiect in C++

    4/137

    C++ POO

    09.01.12 3

    1.4. E lementele limbajuluiAlfabetul limbajului C este format din litere mari i mici, cifre i caractere speciale

    (\n=CrLf, \t=Tab).Identificatorii sunt forma i din liter _ urmat eventual de litere_ sau cifre

    (caracterul _ poate fi utilizat pe post de liter ).Exist cuvinte cheiecare pot fi utilizate doar n contextul definit (de exemplucase, float, int, long, return, short, static, structure, switch, union, unsigned, void ).

    T ipurile predefinitesunt urm toarele:

    int (Z [-215,215-1]), short (Z [-215,215-1]), long (Z [-231,231-1]), unsigned (N [0,216-1]), float (Q * [-3.410-38, 3.41038]), double (Q * [-1.710-308, 1.710308]), char (cod ASCII).

    Constantele numerice pot fi zecimale (123, 123L ong, 111long), octale (0 77), hexa(0x abba,0X fac), sau flotante (2.71828, 6.023e23, 6.023E23).

    Constantele de tip caracter pot fi afi abile ('A', '0', '"') sau func ionale ('\b'= Backspace , '\r'= Return , '\n'= Newline , '\''= Apostrof , '\\'= Backslash , '\v'=Verticaltab ,'\f'=Salt de pagin , '\0'= Null .

    Constantelede tip ir de caractere se scriu ntre ghilimele ("Mesaj").

    Declararea variabilelor simplese face astfel:T ip List _identificatori_de_variabile;

    Exemplu:int i, j; float x,y; char c;

    Declararea unui tablouse realizeaz astfel:T ip Nume_ T ablou [d 1] [d 2] ... [d i] ... [d n]; // indicelek i: 0e k i

  • 8/3/2019 Program Are Orientata Obiect in C++

    5/137

    C++ POO

    09.01.12 4

    2. V ariabileVariabilele pot fi statice sau dinamice, locale sau globale.

    2.1. V ariabile globaleD eclararea unei variabile globale se face la nceputul unui fi ier surs (n afara

    tuturor func iilor) i poate fi referit pn la sfr itul programului (n orice func ie).Utilizarea lor n alte fi iere surs se poate face doar dac acestea sunt declarate ca variabileexterne:

    ex tern declara ie_variabil Exemplu:

    V E x terne.Cpp:#include; #include "Fs.h"; floatPi=3.14; // variabil global

    void main (void){ float r ; printf("D ati raza cercului : "); scanf("%f",&r); printf(" Lungimea cercului = %f \n",LungC(r)); scanf ("\n");

    }

    Fs.h:float LungC (float r){

    ex tern floatPi; // variabil externreturn 2*Pi*r ;

    }

    2.2. V ariabile localeO variabil local este utilizabil (vizibil ) doar n modulul sau n func ia n care a

    fost definit , putnd fi alocat dinamic (variabil automatic , alocat pe stiv ) sau static(variabil static , alocat n zona de memorie a programului). Implicit o variabil localeste automatic , iar dac dorim ca aceasta s fie static , declara ia ei trebuie s fie precedatde cuvntul cheiestatic:

    static declara ie_variabil

    Func iile au implicit atributul extern, deci pot fi apelate din alte fi iere surs , dar dac dorim ca acest apel s nu fie permis, atunci se vor declara statice prin scriereacuvntului cheiestatic naintea antetului acesteia (static antet_func ie ) ?! .

  • 8/3/2019 Program Are Orientata Obiect in C++

    6/137

    C++ POO

    09.01.12 5

    Exemplu:V L ocale.Cpp:

    #include; #include "Sursa.h"; void main (void){ int n; printf("D ati un numar < 256 : "); scanf("%d",&n);

    printf(" Valoarea in Hexa este "); Print_Hexa(n);

    // Print_Byte(n/256); Print_Byte(n%256); !? scanf ("\n");

    }

    Sursa.h:static int Cifra_Hexa (int s){

    static int c; if (s

  • 8/3/2019 Program Are Orientata Obiect in C++

    7/137

  • 8/3/2019 Program Are Orientata Obiect in C++

    8/137

    C++ POO

    09.01.12 7

    3. E x presiiO ex presieeste format dinoperanzi, operatori i paranteze pentru prioritate, i

    are ovaloare i un tip. Asociereaoperatorilor se face de la stnga la dreapta, cu excep iaoperatorilor unari i de atribuire, care se asociaz de la dreapta la stnga.

    Operanzii pot fi: constante, constante simbolice, variabile simple sau structurate(tablouri, structuri, sau elemente ale acestora), func ii sau apeluri de func ii.

    3.1. Operatori

    Operatorii, n ordinea descresc toare a priorit ii sunt urm torii:

    ( ) [ ] (unar ) + (unar ) * (unar ) & (unar ) ! ~ ++ (tip) si zeof * / % + > < = > = = != & ^ | && | | ?:(ternar ) = *= /= %= += = > = &= ^= |= ,

    Operatorii aritmeticisunt urm torii:

    + , , * , / , % (mod ), pentru adunare, sc dere, nmul ire, ct (mp r ire), rest.Exemple:

    int i, j; int cat = i / j; // 13 / 5 = 2int rest = i % j; // 13%5 = 3

  • 8/3/2019 Program Are Orientata Obiect in C++

    9/137

    C++ POO

    09.01.12 8

    Operatorii rela ionalisunt urm torii:

    < , , >= , == , != , pentru< , e , > , u , = , { , rezultatul (valoareaexpresiei rela ionale) fiind1 pentruadev rat , iar 0 pentru fals .Exemple:

    int i=1; int j=2; ... i (deplasare la dreapta), & ( And bit cu bit), ^ ( Xor bit cu bit), | (Or bit cu bit).

    Exemplu:// ASCII

    #include; #include; int Cifra(int c) // cifra hexa: 01...9AB...F{

    if (c> 4),Cifra(c&0xF)); }

    while (c!=0x1B); }

  • 8/3/2019 Program Are Orientata Obiect in C++

    10/137

    C++ POO

    09.01.12 9

    Opera ia de atribuire se realizeaz astfel:Var = Expr esie ; // expr esie de atribuire cu tipulVar

    Exist posibilitatea realiz rii de atribuiri multiple prin expresii de forma:

    Var n = ... = Var 2 = Var 1 = Exp resie ; Mai exist o facilitate utiliznd o opera ie de atribuire de forma:

    Var = Expr esie ; // unde {+, , *, /,%, &, ^, | , > }avnd semnifica ia:

    Var = Var Expr esie ; Exemple:

    v = e = 2.7181828; // v = (e = 2.7181828); x += dx; y = dy; // x = x+dx; y = y dy; n

  • 8/3/2019 Program Are Orientata Obiect in C++

    11/137

    C++ POO

    09.01.12 10

    Conversiile implicite (realizate automat) se fac astfel:

    a) char p int , b) float p double ,c) (double ,*)p (double ,double )=double ,d) (long ,*)p (long ,long )=long ,e) (unsigned ,*)p (unsigned ,unsigned )=unsigned .

    Operatorul pentru dimensiune ( sizeof ) determin lungimea n octe i a uneivariabile simple sau structurate, precum i a unui tip de dat :

    sizeof ( Data ) ; Exemplu:

    int a;

    printf(" SizeOf int = %d \n", sizeof(a)); // Si z

    eOf int = 2 printf(" SizeOf short = %d \n", sizeof(short)); // Si zeOf short =2

    Operatorii condi ionali? : sunt utiliza i n construc ii de forma: Expr e sie1 ? Expr e sie2 : Expr e sie3 ;

    Valoarea expresiei rezultat este Expr e sie2 dac Expr e sie 1 este nenul , altfel este Expr e sie 3 .Exemplu:

    Max = a> b ? a : b; // D ac a> b Atunci Max=a Altfel Max=b;

    Operatorul virgul permite gruparea mai multor expresii ntr-una singur , aceastaavnd valoarea ultimei expresii:

    Expr e sie1 , Expr e sie2 , ... , Expr e sie n ; Exemplu:

    float x0,y0,r, x, y; printf("D ati C(x0,y0,r) = "); scanf("%f %f %f",&x0,&y0,&r); // Cercul C printf("D ati P(x,y) = "); scanf("%f %f", &x, &y ); // Punctul P

    printf("%s",((x-=x0, y-=y0, x*=x, y*=y, x+y)==r *r)?

    "P e pe C" : "P nu e pe C");

  • 8/3/2019 Program Are Orientata Obiect in C++

    12/137

  • 8/3/2019 Program Are Orientata Obiect in C++

    13/137

    C++ POO

    09.01.12 12

    Exemplu:short Zi=1; char Luna[]="Ianuarie"; unsigned An=2003; float Ina=1.8; printf("Zi:%d, Luna:%3.3s.,An:%u \n",Zi,Luna,An); // Zi:1, Luna:Ian., An:2003 printf("Inaltime(m):%4.2f \n",Ina); // Inaltime(m):1.80

    4.2. F unc ia S c anf Aceast func ie realizeaz citirea datelor dup un ablon, avnd urm torul format:

    int sc anf (Control , List _ Adr ese _de_ Variabile ); unde Control este ablonul (formatul) scris sub forma unui ir de caractere care con ineeventual texte ( obligatorii la intrare ) i specificatori de format corespunz tori tipurilor variabilelor din list . Specificatorii de format sunt asem n tori celor prezenta i la func ia prin t f , realiznd ns conversiile inverse:% [*] [m] [l] [ f ] , unde:

    [*] - un caracter op ional, [m] - precizeaz lungimea maxim a cmpului, [ l ] - conversia se va efectua din format internlong , [ f ] - determin tipul conversiei precizat prin unul din urm toarele caractere:

    d - int n zecimal extern, o - int n octal extern, x - int n hexa extern (0...9,a...f), X - int n Hexa extern (0...9,A...F), u - unsigned n zecimal extern (f r semn), c - binar intern n caracter (char ), s - string n ir de caractere terminat la spa iu sau dimensiunea m, f - float n flotant extern.

    Adresele variabilelor de intrare sunt date prin operatorul de adrese& plasat nainteaidentificatorului fiec rei variabile (simple!): [&] Variabil (nu este necesar pentru tablouri). Exemplu:

    short Zi; char Luna[13]; unsigned An; float Ina; scanf("%d %s %u %f ", &Zi, Luna, &An, &Ina); // 1 Ianuarie 2003 1.80

    Func ia sc anf returneaz num rul de cmpuri citite corect. Sfr itul de fi ier (Ctrl/Z) poate fi verificat prin valoarea returnat EOF:

    if (EOF = = sc anf (Control , List _Expresii )) ... Sfr it ... ; Exemplu:

    if (EOF==scanf("%d %s %u %f", &Zi, Luna, &An, &Ina)) printf("Ctrl/Z"); else { printf(" Zi:%d, Luna:%3.3s., An:%u \n",Zi,Luna,An); printf(" Inaltime(m):%4.2f \n",Ina); }

  • 8/3/2019 Program Are Orientata Obiect in C++

    14/137

    C++ POO

    09.01.12 13

    4.3. F unc ia P u tC h ar Aceast func ie realizeaz tip rirea unui caracter al c rui codASCII este precizat

    printr-o expresie: pu t ch ar ( Expresie );

    4.4. F unc ia G e tC h ar Aceasta, returneaz codulASCIIal caracterului citit (pentruCtrl/Z p EOF=-1):

    g et ch ar ( ); Exemplu:

    char c; do putchar (((c=getchar())> 'Z')? c^' ' : c); // Litere micip LITERE MARI while (c!='.'); // se termin cu .

    q Litere mici in Litere MARI ! p getchar LITERE MICI IN LITERE MARI ! putchar n Se termina la . (Punct) p getchar SE TERMINA LA . putchar n

    4.5. F unc ia G e tC h e Func ia returneaz codul caracterului cititdirect i l afi eaz (n ecou ):

    int g et ch e ( ); Exemplu:

    do putchar (((c=getche())> 'Z')? c^' ' : c); while (c!='.'); // se termin cu .q

    LLiItTeEr R eE mMiIcCiI iIn N LLiItTeEr R eE MMAAR R II. .

    4.6. F unc ia G e tC h Aceast func ie returneaz codul caracterului citit (direct ) f r ca acesta s mai fie

    afi at:int g et ch ( );

    Exemplu:

    do putchar (((c=getch())> 'Z')? c^' ' : c); while (c!='.'); // se termin cu .q

    LITERE MICI IN LITERE MARI. // S-a tastat: Litere mici in Litere MARI.

  • 8/3/2019 Program Are Orientata Obiect in C++

    15/137

  • 8/3/2019 Program Are Orientata Obiect in C++

    16/137

    C++ POO

    09.01.12 15

    5.4. Instruc iunea I f Structura alternativ cu una sau dou ramuri poate fi scris astfel:

    if ( e x pr e sie ) in st r uctiune1; [ el se in st r uctiune2; ]

    Exemplu:{ P( x, y) p I-ul Cadran (D ac x sau y este negativ se schimb semnul)float x, y; printf("D ati P(x,y) = "); scanf("%f %f", &x,&y); // Punctul Pif (x>0) if (y

  • 8/3/2019 Program Are Orientata Obiect in C++

    17/137

    C++ POO

    09.01.12 16

    Exemplu:// Nr.Zile / lun \\

    #include #include void main (void){ int l,a;

    cout > a;cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    18/137

    C++ POO

    09.01.12 17

    5.8. Instruc iunea F or

    Structura repetitiv Pentru (! ) poate fi descris astfel:

    for (e x pr e sie1; e x pr e sie2; e x pr e sie3) in st r uctiune ;

    Instruc iunea are acela i efect ca i:e x pr e sie1; wh ile (e x pr e sie2) { in st r uctiune; e x pr e sie3 ; }

    i invers (veziwh ile): for (;e x pr e sie;) in st r uctiune ;

    Exemplu:int i,n; long f ; // f:=n! printf("\nD ati n : "); scanf ("%d", &n); f=1; for ( i=1; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    19/137

    C++ POO

    09.01.12 18

    if (e x pr 2) g ot o et ; ...}

    ... et : ... // instr uc iune

    5.12. Apelul unei func ii Instruc iunea de apel a unei func ii este un caz particular al instruc iunii expresie:

    Nume_f unc ie (List _par amet ri _ac tua li );

    O func ie poate fi apelat i n cadrul unei expresii dintr-o instruc iune:

    ... Nume_f unc ie (List _par amet ri _ ac tua li ) ... ;

    O func ie poate fi utilizat doar dac a fost definit sau cel pu in a fost declarat pro t ot i pul ei ntr-una din urm toarele moduri:

    a) T

    ip_ f unc ie

    Nume_ f unc ie

    ( Lista_par amet rilor _f orm ali ); b) T ip_ f unc ie Nume_ f unc ie ( Lista_tipurilor_par amet rilor _f ormali); c) T ip_ f unc ie Nume_ f unc ie (Void ); // nu sunt parametri formali d) T ip_ f unc ie Nume_ f unc ie ( ); // nu se fac verific rile de tip

    Apelul implicit pentru variabile simple (de baz ) este prin valoare , iar pentrutablouri prin referin . Apelul prin referin se ob ine prin intermediul variabilelor de tip poin t er i a operatorului de adres&.

    Revenirea dintr-o func ie se poate realiza fie prin instruc iuneare t urn , fie automatdup ultima instruc iune a func iei (situa ie n care nu se returneaz nici o valoare):

    re t urn [ e x pr e sie ] ; fiind returnat valoarea expresiei (dac exist ).Ex. 1:

    #include #include int u1,v1, u2,v2; float a, b, c, d; int u (float x) { return ((x-a)/(b-a)*(u2-u1)+u1); }int v (float y) { return ((y-d)/(c-d)*(v2-v1)+v1); }void InitGraf(void) { int Gd =D ETECT, Gm; initgraph(&Gd, &Gm, "c:\\Bc\\Bgi"); }void ViewPort(int x1,int y1,int x2,int y2) {u1=x1; v1=y1; u2=x2; v2=y2; /*rectangle(u1,v1,u2,v2);*/ }void Window(float x1,float y1,float x2,float y2) { a=x1; d=y1; b=x2; c=y2; }void Rectangle(float x1,float y1,float x2,float y2) { rectangle(u(x1),v(y1),u(x2),v(y2)); }void Bar(float x1,float y1,float x2,float y2) { bar(u(x1),v(y1),u(x2),v(y2)); }void Linie(float x1,float y1,float x2,float y2) { line(u(x1),v(y1),u(x2),v(y2)); }void Muta(float x,float y) { moveto(u(x),v(y)); }void Trag(float x,float y) { lineto(u(x),v(y)); }void Rot(float &x,float &y, float x0, float y0, float Alfa) { float xp;

    xp=(x-x0)*cos(Alfa)-(y-y0)*sin(Alfa)+x0; y =(x-x0)*sin(Alfa)+(y-y0)*cos(Alfa)+y0; x = xp; }

    Ex. 2:// Ultima cifr nenul a lui n! \\

    #include; #include; int Sf (int& f, int k)

  • 8/3/2019 Program Are Orientata Obiect in C++

    20/137

    C++ POO

    09.01.12 19

    { int p=0;while (!(f%k)) { f/=k; p++; }return p;

    }main () { clrscr(); int n; int f2=0; int Uc=1;

    cout > n;for (int i=2; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    21/137

    C++ POO

    09.01.12 20

    6. Pointeri

    O variabil p de tip poin t er con ine adresa unei variabile a c rei valoare se ob ineutiliznd operatorul* (* p = valoarea variabilei de la adresa con inut n p).

    Adresa unei variabilev se poate ob ine prin operatorul & (&v = adresa variabileiv),deci putem atribui unui pointer p adresa unei variabilev astfel:

    p = &v;

    6.1. Declararea unui P oin t er

    D efinirea unei variabile de referin (legat de unT ip) se face astfel:T ip *Var _ Referin ;

    D eci, tipul referin se ob ine prin urm toarea construc ie:T ip *

    D eclararea unui pointer (care con ine o adres nefiind ns legat de un anumit tip) seface astfel:

    voi d *Var _ Pointer ; Exemplu:

    #include; #include; #include "Crt.Cpp"; int Cifra(int c) { if (c> 4),Cifra(b&0xF)); }void main (void){ int *Pointer_Int; void *p; unsigned *Pointer_Word; int x; printf("D ati x : "); scanf("%d",&x); p=Pointer_Int=&x; Pointer_Word=(unsigned *) p; printf(" x =%u \n",*Pointer_Word); printf(" |x|=%d \n",sizeof *Pointer_Word); printf(" |&x|=%d \n",sizeof Pointer_Word); printf("*(&x)="); Cifre(*Pointer_Word>> 8); Cifre(*Pointer_Word&0xFF); printf("\n"); getch();

    }

    Date :D

    ati x : 43962 Date :D

    ati x : -1 Re zultate : x =43962 Re zultate : x = 65535|x| =2 |x| =2|&x|=2 |&x|=2*(&x)=ABBA *(&x)=FFFF

    6.2. Opera ii cu P oin t eri Aceste opera ii sunt opera ii cuadresele con inute n variabilele de tip pointer .

  • 8/3/2019 Program Are Orientata Obiect in C++

    22/137

    C++ POO

    09.01.12 21

    6.2.1. Incrementare / DecrementareAceste opera ii m resc/mioc oreaz valoarea de adres spre urm torul element (cu o

    valoare egal cu lungimea tipului referit):

    Var _ Pointer + +; Var _ Pointer ; Exemplu:

    int Zile[]={31,28,31,30,31,30,31,31,30,31,30,31}; int *Pointer_Int; int Luna; // 0,1,...,11 printf("D ati luna (1-12):"); scanf("%d",&Luna); Pointer_Int=&Zile[Luna]; Pointer_Int--; // &Zile[Luna-1] printf(" Nr.Zile =%d \n",*Pointer_Int);

    6.2.2. Adunare / Sc dere a unui num r ntregAceste opera ii m resc/mioc oreaz valoarea de adres spre alt element (cu o

    valoare egal cun lungimea tipului referit).

    Var _ Pointer +n Exemplu:

    int Zile[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int *Pointer_Int; int Luna; printf(" Luna (1-12) : "); scanf("%d",&Luna); Pointer_Int=Z ile+L una; printf(" Nr.Zile=%d \n",*Pointer_Int); Pointer_Int=Zile; printf(" Nr.Zile=%d \n",*(Pointer_Int+L una));

    6.2.3. ComparareD oi pointeri ale elementului aceluia i tablou pot fi compara i utiliznd operatorii

    rela ionali. ValoareaNU LL marcheaz faptul c un pointer nu refer nici un element.... p1 < p2 ... ; ... p1 = = p2 ... ; ... p1 != p2 ... ; ... p = = NU LL ...;

    Exemplu:int Zile[]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int *luna; int Zi,Luna,An, NrZile; printf(" Zi, Luna, An : "); scanf("%d %d %d",&Zi,&Luna,&An); if (An&3) Zile[2]=28; if ((Zi>Zile[Luna]) || (Luna>12)) luna=NULL; else luna=Zile; if (luna!= NU LL ) { NrZile=Zi; do NrZile+=*(luna++); while (luna*luna; luna++) Ziua =*luna; printf(" Zi:%d, Luna:%d, An:%d \n",Ziua,luna Z ile,An);

  • 8/3/2019 Program Are Orientata Obiect in C++

    23/137

    C++ POO

    09.01.12 22

    Exemplu:// Opera ii cu pointeri \\

    #include #include void Tip (int *x, int n){ int *p=x;

    while ( p-x < n ) cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    24/137

    C++ POO

    09.01.12 23

    Numele unei func ii fiind un pointer la acea func ie, ea poate fi parametru actual, ievident trebuie descris ca parametru formal:

    ... tip (* f ) ( ), ... Exemplu:

    // Pointeri la func ii (1) \\

    #include #include #include #include #include #include "G raf .h" #define Pi 3.1415926float Sin (float x) { return sin (x); } float Cos(float x) { return cos (x); }float Sqr (float x) { return pow (x,2);} float Sqrt(float x) { return sqrt(x); }void Grafic(float(*f )(float),float a,float b,int u1,int v1,int u2,int v2){ float x, p, c,d, y; ViewPort (u1,v1,u2,v2); rectangle (u1,v1,u2,v2); p=(b-a)/(u2-u1)*5;

    x=a; c=d=(*f )(x ); do { x+=p; y=(*f )(x ); if (yd) d=y; } while (x< b); W indow (a,d,b,c); x=a; M oveT o(x,(*f )(x )); do { x+=p; LineT o(x,(*f )(x )); } while (x< b);

    }void main(void){ Init G raph ();

    Grafic (Sin, -Pi,Pi,10,10, (int) getmaxx()/2-5, (int) getmaxy()/2-5); Grafic (Cos, -Pi,Pi,(int) getmaxx()/2+5,10,getmaxx()-10, (int) getmaxy()/2-5); Grafic (Sq r, -Pi,Pi,10,(int) getmaxy()/2+5, (int) getmaxx()/2-5, getmaxy()-10); Grafic (Sq rt, 0,Pi,(int) getmaxx()/2+5,(int) getmaxy()/2+5,getmaxx()-10, getmaxy()-10); getch(); closegraph();

    }

    Urm torul exemplu construie te un tabel cu valorile a patru func ii dintr-un intervaldat [a ,b] pentru o diviziune precizat (n):

    // Pointeri la func ii (2) \\ # include # include # include # include

    double X(double x) { return x; }typedef double (*Pointer_la_Functie)(double);Pointer_la_Functie Functia[] = { X, sin, cos, tan };

    char* Functii = {" x Sin Cos Tg "};int Nr_Functii=3;void main(void){ clrscr();

    double a,x,b; int n;cout > a >> b >> n; clrscr(); cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    25/137

    C++ POO

    09.01.12 24

    6.5. U t ilizarea parametrilor din linia de comandApelul unui program poate fi nso it de o list de parametri:

    > Nume_Program List _Parametri

    care se poate accesa scriind antetul func iei principale astfel: main ( int A r g C , char * A r gV [ ] )

    unde: A r g C este o variabil ntreag care con ine num rul de parametri plus unu (!), A r gV este un tablou care con ine adresele parametrilor din list :

    y A r gV [0] - pointer la Nume_Program (!),y A r gV [1] - pointer la primul parametru,y ...y A r gV [ A r g C -1] - pointer la ultimul parametru

    Exemplu:#include; #include< stdlib .h>; // Calendar 2003

    void main (int ArgC, char *ArgV[]){ char *Sapt[]={"Luni","Marti","Miercuri","Joi","Vineri","Sambata","D uminica"}; int Zile[]={31,28,31,30,31,30,31,31,30,31,30,31}; int Zi,Luna,luna; if (ArgC==3){ Zi=atoi (ArgV[1]); Luna=atoi (ArgV[2]);

    for (luna=1; lunaCalendar 15 3

    6.6. Declararea c on s t an t elor

    O alt modalitate de a defini o constant estemodificatorul C on st astfel: [ T ip ] c on st Nume [ = Valoare ] ; sau c on st [ T ip ] Nume [ = Valoare ] ;

    Unui parametru formal declarat cumodificatorul C on st nu i se mai poate schimbavaloarea n subprogramul respectiv.Exemplu:

    #include; #include; int Cifra(const int c){ constchar Z ero ='0'; int constC40H =0x40;

    if (c> 4),Cifra(c&C0F )); }while (c!= Esc );

    }

    6.7. S t iv a

  • 8/3/2019 Program Are Orientata Obiect in C++

    26/137

    C++ POO

    09.01.12 25

    Prin st iv n elegem o list cu disciplina Last I n F irst O ut pentru care vom definiurm toarele trei func ii:

    P u sh - adaug un element n stiv , P o p - extrage un element din stiv , C lear - ini ializarea stivei (stiv vid ), V i d a - verific dac stiva este vid :

    // F ac t .Cpp \\ #include #include #include " S t iva.h "void main(void){

    int n; unsigned long f ; printf("D ati n : "); scanf("%d",&n); C lear (); while (n) P u sh (n--); f=1; while (!V i d a()) f*= P o p(); printf(" n! = %15lu \n",f); getch();

    }

    // S t iva.h \\ #defineD imMax 13static intStiva [D imMax]; static Next=0; void P u sh (int x){

    if (Next0) returnStiva [--Next];

    else { printf(" Stiva vida \n"); return 0; }}voidC lear () { Next=0; }int V i d a() { return (Next= =0); }

    7. RecursiviateExist posibilitatea de a defini o func ie prin ea ns i (recursiv).

    Exemplu:#include #include< iostream.h> #define M ax (x,y) (x>y ? x : y)

    int a[100]; int M axim (int n){

    if (n= =1) return a[1]; else return M ax ( M axim (n-1),a[n]);

    }void main(void){ int i,n; clrscr();

    cout> n; cout a[i]; cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    27/137

    C++ POO

    09.01.12 26

    8. T ipuri de date

    Exist posibilitatea de a defini noi tipuri de date i chiar de a le denumi.

    8.1. Definirea unui t i p de dat ( typ ed ef )

    Asignarea uneidenumiri unuitip de dat se realizeaz astfel:typed ef tip Denumire_ T ip ;

    Exemplu:typed ef int I n t e g er ; typed ef float Real ; I n t e g er i,j; Real X[10];

    8.2. T ipul enumerare (enum ) D efinirea acestui tip se face astfel:

    enum [ Denumire ] { Id 0 [= Expr 0], Id 1[= Expr 1],..., Id n[= Expr n] } [ List _Var ];

    Implicit Expr 0=0, iar Expr i=Expr i-1+ 1, iar dac se declar o list de variabileavnd acest tip atunci denumirea tipului enumerare definit poate lipsi.

    Exemplu:#include; // 2003 \\#include; enum { False , T rue } Zi_Lucratoare; enum Z ileSapt { Luni , M arti , M iercuri , Joi , Vineri , Sambata , Duminica }; enum Z ileSapt Zi_Sapt; // sau Z ileSapt Zi_Sapt;

    void main (void){int Zile[]={31,28,31,30,31,30,31,31,30,31,30,31}; int Zi,Luna,luna; printf(" Zi, Luna : "); scanf("%d %d",&Zi,&Luna); for (luna=1; luna

  • 8/3/2019 Program Are Orientata Obiect in C++

    28/137

    C++ POO

    09.01.12 27

    8.3. Definirea unei st ru c t uri ( st ru c t ) D efinirea unei st ru c t uri ( nregistr ri ) se face astfel:

    st ru c t [ Denumire ] { List _De cl ara ii _C m puri } [ List _Var ];

    D

    ac se declar o list de variabile avnd acest tip atunci denumirea structurii poatelipsi.Referirea componentelor unei st ru c t uri se face astfel:

    Denumire . Com ponent ;

    Exemplu:#include; #include; typedef float Real; st ru c t Punct { Real x, y; }; st ru c t Cerc { Punct Centru;

    Real Raza; }; Real Sqr(Real x){ return x*x; }void main (void){

    Punct O = { 0, 0 }; Cerc C; printf(" \n Cerc : "); scanf("%f %f %f",&C.Centru.x,&C.Centru.y,&C.Raza); printf(" \n C(x0,y0,r)= %5.2f %5.2f %5.2f",C.Centru.x,C.Centru.y,C.Raza); if (Sqr(C.Centru.x-O.x)+Sqr(C.Centru.y-O.y)Com ponent ;

    Exemplu:... st ru c t Cerc { float x, y; float Raza; }; void TipCerc(Cerc *C){ printf(" \nC(x,y,r)= %5.2f %5.2f %5.2f ", (*C) . x , (* C) . y , C > Raza) ; }void main (void)

    { Cerc C={1,2,3}; TipCerc(&C); }

  • 8/3/2019 Program Are Orientata Obiect in C++

    29/137

    C++ POO

    09.01.12 28

    8.4. Re d efinirea unei date (union )

    Redefinirea unei zone de memorie se poate face n cadrul uneiuniuni astfel:union [ Denumire ] { List _De cl ara ii } [ List _Var ];

    Toate componentele aflate n List _De cl ara ii ocum aceea i zon de memorie (se

    suprapun), lungimeauniunii fiind dat de maximul lungimilor declara iilor .Referirea componentelor uneiuniuni se face astfel:

    Denumire . Com ponent ; sau pentru o variabil de tip referin :

    ( *Var_Ref ). Com ponent ; sau Var_Ref >Com ponent ; Exemplu:

    ...

    union U { float Real; long unsigned Hexa; } x;

    int Cifra(int c) { if (c> 4),Cifra(b&0xF)); }void Print(unsigned x) { Cifre(x>> 8); Cifre(x&0xFF); }void main (void){ do { printf("D ati un numar : "); scanf("%f",&x .Real); printf(" ... Hexa = ");

    Print (x .Hex a>> 16); Print(x .Hex a&0xFFFF); printf(" ... \n"); }while (x .Hexa!=0); getch();

    }

    8.5. C m puri de b i t i Exist posibilitatea definirii unei st ru c t uri ale c rei cmpuri s fie formate dintr-o

    secven de bi i consecutivi (ai unui cuvnt). Aceste cmpuri au tipulunsigned avnd

    fiecare olungime precizat (n num r de bi i): st ru c t [ Denumire ] { Cmp 0; Cmp 1; ... ; Cmp n; } [ List _Var ];

    undecmpurile Cmp i sunt de forma: un si g ned [ Nume_Cmp i ] : Lungime i

    Exemplu:#include; structC am p _ B i t i { un si g ned B__0__3: 4; un si g ned B__4__7: 4;

    un si g ned B__8_11: 4; un si g ned B_12_15: 4; }; union { int Intreg; C am p _ B i t i Cifre_Hexa ; } x ; void Cifra(int c) { if (c

  • 8/3/2019 Program Are Orientata Obiect in C++

    30/137

    C++ POO

    09.01.12 29

    9. Structuri de date d inami c e

    Pentru a implementa structura liniar (lista simplu nl n uit ) i structura de tiparbore binar vom apela la structuri definite recursiv.

    9.1. L ist simplu nl n uit ordonatConsider m o list nevid fiind format din primul element i sublista aflat la adresa

    de leg tur memorat n fiecare element pe lng informa ia propriuzs .n exemplul urm tor vom crea o list care va con ine monoamele unui polinom n

    ordinea descresc toare a gradelor. Un element din list va con ine pe lng informa ia propriuzis (coeficientul i gradul monomului) i adresa urm torului monom (adresasublistei). D e exemplu, pentru polinomul P( x)=120 x12+77 x7+130 x3+22 x2 lista va con ine patru elemente avnd informa iile (20,12); (77,7); (130,3); (22,2), indiferent de ordineaintroducerii monoamelor.D eoarece coeficien ii sunt nenuli, introducerea datelor se terminla primul coeficient nul.

    # include # include # include # define Nil (NULL) struct Monom { int Coef, Grad ; };struct Elem { Monom Inf; Elem* Leg; };typedef Elem* Polinom ; // List de monoame ordonate decresc tor dup grad int Citit(Monom &M){ cin >> M.Coef; if (M.Coef) cin >> M.Grad; return M.Coef;}void Ado(Polinom &P, Monom M){ int lung=sizeof(Elem); Polinom Nou;

    if ((P==Nil)|(P->Inf.GradInf=M; Nou->Leg=P; P=Nou;}

    else Ado(P->Leg,M);}void Cre(Polinom &P){ Monom M; P=Nil;

    while (Citit(M)) Ado(P,M);}void Tip(Polinom P){ if (P!=Nil) { cout Inf.Coef Leg!=Nil) cout Leg); }}void main (void){ Polinom P;

    cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    31/137

    C++ POO

    09.01.12 30

    Exemplu: // List simpl ordonat cresc tor \\

    # include # include "Crt.Cpp"typedef int Info;struct Elem;typedef Elem* Lista ;struct Elem {Info Inf; Lista Urm;};int Citit(Info& inf){ cin >> inf; return inf; }void Ado(Lista& L, Info inf){ if (L && (L->InfUrm,inf);// else {Lista Nou=new Elem; Nou->Inf=inf; Nou->Urm=L; L=Nou;} //sau

    else {Elem el={inf,L}; Lista Nou = new Elem (el); L=Nou;}}void Cre(Lista& L){ Info El; L=NULL; while (Citit(El)) Ado(L,El); }void Tip(Lista L){ if (L) {cout Inf Urm); } cout LegSt,inf); else Ado(A->LegDr,inf);

    else { A=new Nod; A->Inf=inf; A->LegSt=NULL; A->LegDr=NULL;}}void Ado(Arb& A, Info inf){ if (A) if (infInf) Ado(A->LegSt,inf);

    else Ado(A->LegDr,inf);// else { A=new Nod; A->Inf=inf; A->LegSt=NULL; A->LegDr=NULL;} //sau

    else { Nod n={inf,0,0}; A=new Nod (n); }}void Cre(Arb& A){ Info El; A=NULL; while (Citit(El)) Ado(A,El); }void Ino(Arb A){ if (A) { Ino(A->LegSt); cout Inf LegDr); } }void main (void){ Arb A; ClrScr();

    cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    32/137

    C++ POO

    09.01.12 31

    n exemplul urm tor se citeste un arbore genealogic ascendent (dnd pentru fiecare persoan nume p rin ilor), apoi se va reprezenta grafic arborele construit ntr-o fereastrecran precizat (u1,v1,u2,v2). D istan a dintre dou nivele se calculeaz innd cont deadncimea arborelui.

    # include # include # include # include # include # include

    typedef char TInf [13] ;

    struct Nod { TInf I nf ; // Radacin \\ Nod* Ls ; Nod* Ld ; // Sub.St, Sub.Dr

    } ;typedef Nod* Arb ;

    int Citit(TInf &Inf){ cin >> Inf; return (Inf[0]!='.'); }void Gen(Arb &A){ TInf Inf; int Lung=sizeof(Nod);

    if (Citit(Inf)) { A=(Arb) malloc(Lung);strcpy (A->Inf,Inf); // A->Inf=Inf; cout Ld,m,v1+p,u2,v2,p); } // Dr

    }int Max (int a, int b){ return (a>b ? a : b); }int Adi(Arb A){ if (A==NULL) return -1; else return Max(Adi(A->Ls),Adi(A->Ld))+1; }

    void main (void){ Arb A;

    cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    33/137

    C++ POO

    09.01.12 32

    1 0 . U tilizarea fi ierelor

    Prelucrarea fi ierelor se poate efectua la dou nivele: Nivelul inferior - face apel direct la sistemul de operare; Nivelul superior - utilizeaz proceduri speciale pentru opera ii de intrare/ie ire.

    10 .1. N ivelul inferiorPrelucr rile la acest nivel permit urm toarele cinci opera ii:

    10 .1.1. Deschiderea unui fi ier (O pen /C rea t )

    int o pen ( const char * cale , int acces ); unde:

    ca le - este specificatorul de fi ier, acces - poate fi o combina ie (utiliznd operatorul |) a urm toarelor valori:

    O_R D ONLY (fi ier deschis numai pentru citire),O_WRONLYsau O_CREAT(numai pentru scriere - creare),O_R D WR (citire/scriere),O_APPEND (deschis pentruad ugare la sfr it),O_BINARY(pentru prelucrare binar ),O_TEXT(pentru fi ier detip text).

    D ac deschiderea fi ierului s-a realizat corect, atunci func ia returneaz o valoarentreag reprezentnddescriptorul de fi ier (LUN, care va fi utilizat n continuare la celelelteopera ii efectuate asupra acestui fi ier), iar n caz de nereu it se va returna valoarea -1.

    Pentru a putea utiliza func iaOpen trebuie incluse fi ierele header io.h i fcntl .h.

    Exemplu:...int Lun;

    Lun = open (Fisier.D at ,OR D ONLY); ...

    Pentru crearea unui fi ier se va apela func iaCreat :

    int c rea t ( const char * cale , int mod ); unde:

    mod - poate lua una dintre valorile:S_IREAD (fi ierul se poate citi),S_IWRITE

    (scriere n fi ier),S_IEXEC(execu ia programului din fi ierul specificat).Pentru a putea utiliza func iaCreat trebuie incluse fi iereleio.h i stat .h.Fi ierele text sunt implicite.

  • 8/3/2019 Program Are Orientata Obiect in C++

    34/137

    C++ POO

    09.01.12 33

    10 .1.2. Citirea dintr-un fi ier ( Rea d )

    int rea d ( int Lun, void * buffer, unsigned lung ); unde:

    Lun - este descriptorul definit la deschidere (0=STD IN, 1=STD OUT, 2=STD ERR ,3=STD PRN, 4=STD AUX),

    buffer - este zona de memorie n care se cite te, lung - este lungimea (n octe i) a nregistr rii citite.

    Func ia returneaz num rul de octe i citi i (cel multlung), 0 la sf r it, sau -1 n cazde eroare. Automat, dup o citire (a articolului curent) se trece la urm torul articol, implicit prima pozi ionare fiind la nceput de fi ier (acces secven ial).

    Pentru a utiliza func iile Read , W rite , LSeek sauClose trebuie inclus fi ierulio.h.

    10 .1.3. Scrierea ntr-un fi ier (W ri t e)

    int wri t e ( int Lun, void * buffer, unsigned lung );

    Func ia returneaz num rul de octe i scri i n fi ier, reprezentnd lungimeaarticolului =lung, sau -1 n caz de eroare.

    10 .1.4. Pozi ionarea ntr-un fi ier ( L S eek ) Aceast func ie permite accesul aleator printr-un apel de forma:

    long l seek ( int Lun, long *deplasament,int origine ); unde:

    deplasament - reprezint num rul de octe i peste care se deplaseaz capul decitire/scriere,

    origine - reprezint punctul din care se m soar deplasament-ul (0=nceputulfi ierului, 1=pozi ia curent , 2=sfr itul fi ierului).

    Func ia returneaz pozi ia curent fa de nceputul fi ierului, sau -1 la eroare.

    10 .1.5. nchiderea unui fi ier (C lo se)

    int c lo se ( int Lun) ;

    Func ia returneaz 0 la o nchidere corect , sau -1 la eroare.

    10 .1.6. Stergerea unui fi ier (U n Link )

    int unlink (const char * cale);

    Func ia returneaz 0 la o tergere corect , sau -1 la eroare.

  • 8/3/2019 Program Are Orientata Obiect in C++

    35/137

    C++ POO

    09.01.12 34

    Exemple:// Creare \\

    # include < io . h># include < fcntl . h># include # include # include

    void main (void){

    int Lun;clrscr();Lun= open ("Fis.Txt",O_CREAT|O_TEXT);if (Lun!= -1 )

    {cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    36/137

    C++ POO

    09.01.12 35

    10 .2. N ivelul superiorLa acest nivel sunt posibile urm toarele opera ii:

    10 .2.1. Deschiderea unui fi ier ( FO pen )

    FILE * fo pen ( const char * cale , const char * mod ); unde: mod - poate fi r pentru deschidere n citire, w pentru scriere, a pentru

    ad ugare, r+ pentru modificare (citire/scriere), rb pentru citire binar , wb pentru scriere binar , sau r+b pentru citire/scriere binar .D ac la deschiderea fi ierului s-a ales modul w sau a , fi ierul va fi creat (recreat).Func ia returneaz un pointer spre tipul FILE definit n fi ierul stdio .h, iar n caz de

    nereu it se va returna valoarea NULL( stdin , stdout, stderr, stdaux i stdprn sunt pointerispre tipul FILE permi nd transferuri f r a fi necesar deschiderea sau nchiderea lor).

    Exemplu:...FILE* Pf ;

    Pf =fopen(Fisier.D at , w ); ...

    10 .2.2. Prelucrarea pe caractere a unui fi ier ( P u tC, G etC )

    int pu t c ( int c , FILE* Pf ) ; unde:

    c - este codul caracterului scris, Pf - este valoarea returnat la deschidere sau stdin , stdout , stderr , stdaux , stdprn .

    Func ia returneaz valoarea lui c sau -1 la eroare.

    int g et c (FILE* Pf ) ;

    Func ia returneaz codul caracterului citit, sau valoareaEOF la sfr itul fi ierului,sau -1 la eroare.

    Exemplu:#include< stdio .h> void main (void){ int c;

    while ((c=getc( stdin ))!=EOF)putc(c, stdout ); }

  • 8/3/2019 Program Are Orientata Obiect in C++

    37/137

    C++ POO

    09.01.12 36

    10 .2.3. nchiderea unui fi ier ( F C lo se)

    int f c lo se ( FILE* Pf ) ;

    Func ia returneaz 0 la nchiderea corect a fi ierului sau 1 la eroare.

    10 .2.4. Citirea/Scrierea cu format ( F S c an F , F P rin t F )

    int f sc anf ( FILE* Pf , control, list _variabile);

    Parametrii control i list _variabile au aceea i semnifica ie ca i pentru func ia scanf .Func ia returneaz num rul de cmpuri citite sauEOF.

    int f prin t f ( FILE* Pf , control, list _expresii);

    Func ia returneaz num rul de caractere scrise n fi ier sau -1 la eroare.

    Ex.1: // Creare fi ier text cu Nume, Prenume \\# include # include int Citit(char *x, char*y){ printf (" Nume prenume : "); return (scanf(" %s%s",x,y)!=EOF); }void main (void){ char Nume[25], Prenume [15]; clrscr();

    FI LE *Pf= fopen ("Fis_Text.Dat"," w");while (Citit(Nume,Prenume)) fprintf (Pf,"%s %s\n", Nume, Prenume );fclose (Pf); getche();

    }

    Ex.2: // Creare fi ier text cu format (articole :(D en, Cant, Pre )) \\# include # include void main (void){ FI LE *Produse ; int n=0; int Eof ;

    char Den[20]; textmode(1);int Cant; textbackground(BLUE);float Pret; textcolor(WHITE);

    clrscr();if ( Produse =fopen ("Fis_Form.Txt"," w")) {do {

    printf (" Articolul %d \n",++n);printf (" - Den. : "); Eof =( scanf ("%s",Den)== EOF); if(! Eof ){printf (" - Cant.: "); scanf ("%d",&Cant);printf (" - Pret : "); scanf ("%f",&Pret);fprintf ( Produse ,"%-20s%4d%7.2f\n",Den,Cant,Pret);} }

    while (! Eof ); fclose ( Produse ); }else printf (" Open incorect"); getchar();

    }

    // Listare fi ier text \\

  • 8/3/2019 Program Are Orientata Obiect in C++

    38/137

    C++ POO

    09.01.12 37

    # include # include void main (void){ FI LE *Produse ; int n=0;

    char Den[20]; textmode(1);int Cant; textbackground(BLUE) ;float Pret; textcolor(WHITE);

    clrscr();if ( Produse =fopen ("Fis_Form.Txt"," r ")) {

    while ( fscanf (Produse,"%s%d%f",Den,&Cant,&Pret)!= EOF) {printf (" Articolul %d : \n",++n);printf (" - Den. : %-20s \n",Den);printf (" - Cant.: %4d \n",Cant);printf (" - Pret : %7.2f \n",Pret); }

    fclose ( Produse ); }else printf (" Fisier Absent"); getchar();

    }

    10 .2.5. Intr ri/Ie iri de iruri de caractere ( F G et S , F P u t S )

    char * f g ets ( char *s, int n, FILE* Pf ) ; unde:

    s - zona receptoare (tablou de tip char de dimensiunee n, terminat cu NUL=\0), n-1 - num r maxim de caractere (n-1),

    Func ia returneaz adresa irului s, sau laEOF returneaz NULL.

    int f pu ts ( char *s, FILE* Pf ) ;

    Func ia returneaz codul ultimului caracter scris sau -1 la eroare.

    Urm torul program nlocuie te cuvintele din fi ierul F_Niv_S .Cpp aflate n parteastng a dic ionarului Dic io .T xt cu cele corespunz toare din partea dreapt , rezultatul fiinddepus n fi ierul F_Niv_S . Pas , a a cum se poate vedea n schema de mai jos.

    F in_Niv_ S .Cpp D i c t io.Tx t

    F in_Niv_ S . P a s

    Tra d u c e

  • 8/3/2019 Program Are Orientata Obiect in C++

    39/137

    C++ POO

    09.01.12 38

    // Tra d uc e Fi ier text - String \\# include # include # include # include # include int Length(char* s){ return strlen(s); }

    /*int Pos(char* s, char* S){ for (int i=0; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    40/137

    C++ POO

    09.01.12 39

    unde deplasamnet i or igine au aceea i semnifica ie ca i la func ialseek .Func ia fseek returneaz 0 la pozi ionare corect sau o valoare{0 la eroare.

    long f t ell ( FILE* Pf );

    Func ia ftell returneaz pozi ia curent (fa de nceputul fi ierului, n octe i).

    10 .2.7. Prelucrarea fi ierelor binare ( F Rea d, FW ri t e) Acest tip de prelucrare permite transferul mai multor articole aflate ntr-o zon

    tampon astfel:unsigned frea d (void *Pzt, unsigned dim,unsigned nrart,FILE* Pf) ;

    unde: Pzt - este adresa zonei tampon, dim - reprezint lungimea unui articol, nrart - reprezint num rul de articole care se transfer (citesc),

    unsigned f wri t e (const void *Pzt, unsigned dim,unsigned nrart,FILE* Pf) ;

    Ambele func ii returneaz num rul de articole transferate sau -1 la eroare.Exemple:

    # include typedef struct { char Den[10];

    int Cant;float Pret;

    } Articol;void main (void){ FILE *Pf; Articol Art; int n,i;

    if ((Pf=fopen("Fis_Tip.Dat","wb")) == NULL) printf (" Open incorect");printf ("\n Numarul de articole : "); scanf ("%d",&n);for (i=1; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    41/137

    C++ POO

    09.01.12 40

    11. F unc ii standard

    11.1. M acrouri de clasificareMacrourile din aceast categorie (aflate n fi ierulc type.h ) verific dac un caracter

    este de un anumit tip:int i sa sc ii (int car); car [0,127] ?int i sal ph a (int car); car este codul unui caracter alfanumeric ?int i salnum (int car); car este codul unei litere ?int i su pper (int car); car este codul unei litere mari ?int i slower (int car); car este codul unei litere mici ?int i sd i g i t (int car); car este codul unei cifre zecimale ?int i s x d i g i t (int car); car este codul unei cifre hexa ?int i s g ra ph (int car); car este codul unui caracter afi abil ?int

    i sprin t (int car);

    car

    este codul unui caracter imprimabil ?int i sspac e (int car); car este spa iu, tab, Cr, Lf, Vt sau Np ?

    11.2. M acrouri de transformare a simbolurilorMacrourile din aceast clas (aflate n fi ierulc type.h ) transform un caracter astfel:

    int t oa sc ii (int car); car p [0,127] (returneaz ultimii 7 bi i)int t ou pper (int car); car p liter mare (transform din l n L)int t olower (int car); car p liter mic (transform din L n l)

    11.3. ConversiiFunc iile care urmeaz (aflate n fi ierul std li b .h ) realizeaz conversii far format.

    Format intern n Format ( z ecimal) extern

    int at oi (const char * ptr); binar (int) n z ecimal extern long at ol (const char * ptr); binar (long) n z ecimal extern double at of (const char * ptr); virgul flotant (dubl preci zie) n z ecimal extern

    Format exter n n Format intern

    char *i t oa (int v,char *s , int b); s n v b (valoarea v de tipint , scris n baza b)char *l t oa (long v,char *s, int b); s n v b (valoarea v de tiplong scris n baza b)

  • 8/3/2019 Program Are Orientata Obiect in C++

    42/137

    C++ POO

    09.01.12 41

    11.4. F unc ii de prelucrare a irurilor de caractereFunc iile din aceast categorie se afl n fi ierul st rin g .h .

    11.4.1. Copiere ( S t r [n]Cpy ) char * st r [n]c py (char *destina ie, const char *sursa [, unsigned n]) ;

    unde sursa este copiat n destina ie, eventual doar primii n octe i (cel mult n).

    11.4.2. Concatenare ( S t r [n]C a t ) char * st r [n]c a t (char *destina ie, const char *sursa [, unsigned n]) ;

    unde sursa este copiat la sfr itul dest ina iei, eventual doar primii n octe i ai sursei.

    11.4.3. Comparare ( S t r [n][i ]C m p) int st r [n][i ]c m p (char * ir 1, const char * i r 2 [, unsigned n]) ;

    unde ir 1 este comparat cu ir 2 (eventual doar primiin octe i, i eventuali gnornd diferen adintre literele mari i cele mici), iar rezultatul compar rii este un num r negativ dacir 1< ir 2, este un num r pozitiv dac ir 1> ir 2 sau zero dac ir 1= ir 2.

    11.4.4. L ungimea unui ir ( S t r Len ) unsigned st rlen (char * ir) ;

    returneaz lungimea irului (de caractere, f r caracterul NULcare l termin ).

    11.5. F unc ii de calculAceste func ii se afl n fi ierulma t h .h (abs i labs i n std li b .h * ): P ro t ot i p S emnifi caie double lo g (double x); ln(x)

    double sin (double x); sin(x) double lo g 10 (double x); lg(x) double c o s (double x); cos(x) double c eil (double x); [ x]double a sin (double x); arcsin(x) double floor (double x); trunc ( x)double ac o s (double x); arccos(x) double fa b s (double x); | x|double at an (double x); arctg(x) int ab s (int x); * | x|double sinh (double x); sh(x) long la b s (long x); * | x|double c o sh (double x); ch(x) double a t an 2 (double y ,double x); arctg(y/x)

    double t an h (double x); th(x) double pow (double x, double y); x y

    double sqr t (double x); x double c ab s ( struct complex z ); | z|double ex p (double x); e x double pol y (double x , int n, double a []); P(x)

    11.6. F unc ii pentru controlul proceselorUrm toarele func ii se afl n fi ierele std li b .h i pro c e ss.h .

  • 8/3/2019 Program Are Orientata Obiect in C++

    43/137

    C++ POO

    09.01.12 42

    P ro t o t i p S emnifi c a ie void ab or t (void ); termin un program la eroare void exi t (int cod_ r etur ); termin un program returnnd un cod de retur int syst em (const char * comand ); execut o comand i returnea z cod_ r etur (0=Ok ).

    11.7. F unc ii pentru timpAceste func ii se refer la dat i or , i sunt definite n fi ieruld o s.h mpreun cu

    urm toarele dou tipuri:

    struct date {int da_year;int da_day;int da_mon;

    }

    struct t im e {unsigned char ti_min;unsigned char ti_hour;unsigned char ti_hund;unsigned char ti_sec;

    }

    S emnifi c a ie P ro t o t i p Cite te Data curent : void g etd at e ( struct date * Data ); M odific Data curent : void setd a t e (const struct date * Data ); Cite te Ora Exact : void g ett ime ( struct time * OraExact ); M odific Ora Exact : void sett ime (const struct time * OraExact );

    Exemplu:# include ; // Timp : Data, Ora \\# include ;void main (void)

    { struct date DataC; getdate(&DataC);struct time OraEx; gettime(&OraEx);printf(" Data : %2d %2d %4d \n", DataC.da_day,DataC.da_mon,DataC.da_year);printf(" Ora : %2d:%2d:%2d \n", OraEx.ti_hour,OraEx.ti_min,OraEx.ti_sec);

    }

    11.8. F unc ii diverseAceste func ii sunt definite n fi ierulc onio .h :

    P ro t ot i p S emnifi caie p 3. void slee p (unsigned sec ); W ait (sec) 1. void c lr sc r (double x); Clear Screen o 4. void soun d (unsigned H z ); Sound (Fr) 2. void d ela y (unsigned ms ); W ait (ms) p 5. void no soun d (void ); NoSound

  • 8/3/2019 Program Are Orientata Obiect in C++

    44/137

    C++ POO

    09.01.12 43

    12. E cranul n mod tex t

    Exist posibilitatea de a defini urm toarele moduri de lucru:

    void t ex t mo d e ( int mod );

    unde mod poate fiC40 (=1 pentru 40 coloane),C80 (=3 pentru 80 coloane),C435 0 (=64 pentru 43/50 linii), i altele.

    D efinirea unei ferestre ecran (implicit este tot ecranul) se realizeaz astfel:

    void w ind ow ( int u1, int v1, int u2, int v2) ;

    tergerea unei ferestre ecran :

    void c lr sc r (void ) ;

    Pozi ionareacursorului :

    void g ot ox y ( int x, int y) ; // col , lin

    Pozi iacursorului :

    int wh erex ( void ) ; // col

    int wh ere y ( void ) ; // lin

    Un caracter poate fi afi at pe ecran clipitor (BL INK =1), pe o culoare de fond (0-7)i ntr-o anumit culoare de scriere (0-15), culorile posibile fiind urm toarele:

    C olori n ch i se C olori d e sch i se0 = BL ACK 8 = DAR K G R AY 1 = BL UE 9 = L IGHT BL UE 2 = G R EEN 10 = L IGHT GR EEN 3 = CYAN 11 = L IGHTCYAN 4 = R ED 12 = L IGHTR ED 5 = M AG ENTA 13 = L IGHT M AG ENTA 6 = BROWN 14 = YE LL OW 7 = L IGHT GR AY 15 = WHITE

    Culoarea de fond se poate stabili prin func ia:

    void t ex t b ac k g roun d ( int cu lf ) ; // cu lf {0,...,7}

    Culoarea de scriere se poate schimba printr-un apel de forma:void t ex t c olor ( int cu ls ) ; // cu ls {0,...,15}

    13. E cranul n mod graficT recerea n modul grafic:

  • 8/3/2019 Program Are Orientata Obiect in C++

    45/137

    C++ POO

    09.01.12 44

    void far ini t g ra ph ( int far *graphdriver,int far *graphmode,char far * path);

    Ie irea din modul grafic:void c lo se g ra ph (void ) ;

    Setarea / Citirea culorii de fond :void far set b k c olor (int cu lf ) ; / int far g et b k c olor (void ) ;

    Setarea / Citirea culorii de scriere :void far set c olor (int cu ls ) ; / int far g et c olor (void ) ;

    Alte func ii: S emnifi c a ie F un c ii

    Num r de pixeli ( Ori z. /Vert . ) getmaxx (); getmaxy (); Coordonatele LPR ( U ltimul Punct Referit ) getx (); gety (); M ut LPR (Abs . /Rel . ) moveto ( x, y); moverel (dx,dy); T rasea z segment din LPR lineto ( x, y); linerel (dx,dy); T rasea z segment line ( x1, y1, x2, y2); Desenea z dreptunghi rectangle ( x1, y1, x2, y2); Desenea z cerc circle ( x,y,r ); Scrie mesaj [ din LPR ] outtext [ xy] ([ x, y,] mesaj ); Pagin activ / Pagin vi zual setactivepage ( pag ); set visual page ( pag );

    Exemple:#include< g ra ph i c s .h > // G rafi c ul unei su prafe e \\#include " g raf. h "#include< stdlib.h> #include< stdio.h> #include< conio.h> #include< math.h>

    float Sqr (float x) { return x*x; }float z (float x, float y) { return sin(Sqr(x)+Sqr(y)); } // z=f(x,y)void main(void){ float x; float y; float px; float py; int i; int j; int n=40; int m=40;

    I ni t G raf (); V iewP or t (10,10,getmaxx()-10,getmaxy()-10); float l=3; float x1=-l; float x2=l; float y1=-l; float y2=l; // D om (x,y) D ef P r (1./2,1); // D efPr (r,a)a=PrX(x1,z(x1,y1)); b=a; c=PrY(y1,z(x1,y1)); d=c; for (i=0; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    46/137

    C++ POO

    09.01.12 45

    W ind ow(a,d,b,c); setbkcolor(BLUE); for (i=0; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    47/137

    C++ POO

    09.01.12 46

    int u1,v1, u2,v2; // ViewPortfloat a, b, c, d; // Windowfloat Raza, Alfa; // Pr (r,E)int u (float x) { return ((x-a)/(b-a)*(u2-u1)+u1); }int v (float y) { return ((y-d)/(c-d)*(v2-v1)+v1); }void I ni t G raf (void)

    { int Gd =D ETECT, Gm; initgraph(&Gd, &Gm, "c:\\Bc\\Bgi"); }voidV iewP or t (int x1,int y1,int x2,int y2){ u1=x1; v1=y1; u2=x2; v2=y2; /* rectangle(u1,v1,u2,v2);*/ }voidW ind ow(float x1,float y1,float x2,float y2){ a=x1; d=y1; b=x2; c=y2; }void M u t a(float x,float y){ moveto(u(x),v(y)); }

    voidTra g (float x,float y){ lineto(u(x),v(y)); }

    void D ef P r (float r, float a){ Raza=r ; Alfa=a; }

    float P rX (float x, float z){ return x+Raza*z*cos(Alfa); }float P rY (float y, float z){ return y+Raza*z*sin(Alfa); }

  • 8/3/2019 Program Are Orientata Obiect in C++

    48/137

    C++ POO

    09.01.12 47

    14. F acilit i C++

    Limbajul C++ ofer n plus fa de limbajul C unele facilit i noi. Un avantajimportant l constituie no iunea declas (prin care se define te unT AD), iar acestea potforma oierarhie , deci putem vorbi de o programare orientat obiect .

    14.1. E x tensii ale limbajului Cn C++ exist un nou tip decomentariu (deja utilizat n exemplele anterioare):

    . . . // C omen t ariu D ac n limbajulC declara iile erau scrise nainte de instruc iuni, nC++ ele pot fi

    scrise oriunde.D ispozitivelor standard de intrare-ie ire li s-au ata at streamurile standard c in

    (pentru stdin ) i respectivc ou t (pentru stdout), care permit efectuarea opera iilor de intrare-ie ire aplicnd operatorul>> streamului c in , respectiv;void main (void){ int i; cout > i;

    cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    49/137

    C++ POO

    09.01.12 48

    14.2. Operatori

    14.2.1. Operatorul de rezolu ie (::)

    Acest operator (::) se utilizeaz cnd dorim s referim o variabil global redefinitntr-o func ie, astfel:

    :: V aria b il Exemplu:

    # include ;# include ;unsigned x; // Variabile Globale (::)char y[10];int i=99;void main (void){ clrscr();

    unsigned x; // Variabile Localeint y;cout > ::x >> x;cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    50/137

    C++ POO

    09.01.12 49

    Exemple:# include ; / / R e d efinirea unei varia b i le # include ;void main (void){ int a[1]; int * b = a; int & c = a[0];

    cout > a[0];

    cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    51/137

    C++ POO

    09.01.12 50

    {int *i = new int;

    cout > *i;cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    52/137

    C++ POO

    09.01.12 51

    14.3. Structur , uniune i enumerareReferirea acestor tipuri se poate face nC++ f r a mai fi nevoie de cuvntul

    corespunz tor st ru c t , union , respectivenum . D e asemenea, parametrii i valoarea uneifunc ii pot fi structuri , pointeri la structuri sau referin e la structuri . Sunt permise iatribuiri de structuri.

    Referirea componentelor unei uniuni anonime din interiorul unei structuri se face lafel ca i referirea componentelor structurii, iar prima component se poate ini ializa.

    n C++, variabilelor de tip enumerare nu se mai pot atribui dect valori ale acestuitip (nu i numerele asociate acestor elemente).

    Exemple:# include ; # include ; # include ;typedef float Real;enum Figura { punct, cerc };struct Punct { Real x, y; };struct Cerc { Punct Centru;

    Real Raza; };struct Obiect { Figura FIG;union { Punct PUNCT;

    Cerc CERC;}; };

    Obiect Translatat ( Obiect o, Punct T ){ o.PUNCT.x = o.PUNCT.x + T.x;

    o.PUNCT.y = o.PUNCT.y + T.y;return o;

    }void main (void){ Punct P = { 3,7 };

    Obiect O = { punct, { 1,2 } };Obiect C; C.FIG=cerc; C.CERC.Centru=O.PUNCT; C.CERC.Raza=10;Obiect D; D= Translatat (C,P);cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    53/137

    C++ POO

    09.01.12 52

    // Simetrizeaza cel mai apropiat punct fata de origine \\# include # include "crt.h"struct Punct { float x, y;

    Punct & CitP ();void TipP ();float D2 () { return x*x + y*y; }Punct & SimO () { x=-x; y=-y; return *this; }

    };Punct & Punct::CitP () { cin >> x >> y; return *this; }void Punct::TipP () { cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    54/137

    C++ POO

    09.01.12 53

    15. F unc ii C++

    15.1. F unc ii I nline Acestemacrouri se pot defini astfel:

    # d efine nume m ( Li st _ parame t ri _f ormali ) ir_ c ara c t ere Apelurile macrourilor se vor nlocui cu irul de caractere precizat, f r a face

    verific ri de tipuri, ceea ce poate conduce la erori.Aceste erori pot fi eliminate dac utiliz m func iileinline , caz n care se vor face

    conversiile de tip necesare. Aceste func ii se declar prin scrierea cuvntuluiinline lanceputul antetului, a a cum se pate vedea n exemplele urm toare:Ex. 1:

    # include ; # include ;# define Abs_G(x) (x)> 0 ? (x) : -(x) // Gresit ! # define Abs_g(x) ( x > 0 ? x : - x ) // gresit ! # define Abs_c(x) ( (x)> 0 ? (x) : -(x) ) // Macro corect inline long A bs (long x) // Functie Inline {

    return x > 0 ? x : - x ;}void main (void){ long x;

    cout > x; long y=-x;cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    55/137

    C++ POO

    09.01.12 54

    15.2. F unc ii de tip referinAntetul unei func ii cu valoare de tip referin este:

    t i p & nume f ( Li st _ parame t ri_formali ) Exemplu:

    # include ; # include ; # include ; # include ;

    int & A lba_ Neagra ( int & A lbe , int & Negre ) // Ref . la int{ if (random(2)) return A lbe ; // Ref . la A l be

    else return Negre ; // Ref . la Ne g re }void main (void){ int Albe=0; int Negre=0; int i,n; randomize();

    cout > n;

    for(i=1;i

  • 8/3/2019 Program Are Orientata Obiect in C++

    56/137

    C++ POO

    09.01.12 55

    / / E x . R e f e r i n \ \ # include ; # include "Crt.Cpp"void suma (int x,int y,int *z)

    { *z = ++x * ++y; }void Suma (int x,int y,int &z)

    { z = ++x * ++y; }int* max (int& x, int& y)

    { return ( x > y ? &x : &y ); }int& Max (int& x, int& y){ return ( x > y ? x : y ); }struct Punct { int x,y; };Punct Atrib (int x, int y){ Punct P; P.x=x; P.y=y; return P; }Punct sim (Punct P){ P.x=-P.x; P.y=-P.y; return P; }Punct& Sim (Punct& P){ P.x=-P.x; P.y=-P.y; return P; }Punct* Psim(Punct P){ P.x=-P.x; P.y=-P.y; return &P; }void Tip (Punct P){ cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    57/137

    C++ POO

    09.01.12 56

    15.3. Supranc rcarea func iilorAceast proprietate d posibilitatea utiliz rii unor func ii avnd acela i nume, dar

    diferite (nrudite, cu antete diferite).Exemple:

    # include ; # include ; # include ; # include ;

    double A rcTg (double x) { return atan (x); }double A rcTg (double y, double x) { return atan2(y,x); }double A rcTg (complex z) { return real (atan(z)); }void main (void){ complex w(1,0);

    cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    58/137

    C++ POO

    09.01.12 57

    15.4. Ini ializarea parametrilor formaliParametrii formali pot avea o valoare implicit , dac ace tia lipsesc din lista

    parametrilor actuali, valoare dat de oex pre sie. n lista parametrilor formali, cei cu valoareimplicit (ini ializa i) se vor scrie ultimii astfel:

    t i p nume = ex pre sie Exemplu:

    # include ; # include ; # include ;struct Obiect { float x,y; float r; };int ELipsa () { return -1; }int Este_Punct (Obiect o) { return o.r==ELipsa(); }Obiect Init ( float x0=0, float y0=0, float raza=ELipsa() ){ Obiect o;

    o.x=x0; o.y=y0; o.r=raza;return o;

    }Tip ( Obiect o )

    { if (Este_Punct(o)) cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    59/137

    C++ POO

    09.01.12 58

    struct Segment { Punct A, B; } ;Segment Init ( Punct A, Punct B = Init() ){

    Segment AB = {{A.x,A.y,A.z},{B.x,B.y,B.z}};return AB;

    }void Tip ( Segment AB )

    { cout > x >> y; return *this; }void Punct::TipP () { cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    60/137

    C++ POO

    09.01.12 59

    # include # include "crt.h"struct Punct { float x, y;

    Punct () { cin >> x >> y; }void TipP() { cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    61/137

    C++ POO

    09.01.12 60

    n exemplul urm tor, pentruT ad M ul ime , fi ierele vor fiPM ult.Cpp, M ult.h iM ult.Cpp:

    // PM ult.Cpp \\# include # include # include "Mult.h"void main (void){ clrscr();

    Multime A, B, C, D;Init(A); Init(B); Init(C); Init (D);cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    62/137

    C++ POO

    09.01.12 61

    int Card (Multime A){ return A->card; }void CitM (Multime A){ cin >> A->card;

    if (Card(A)>Cm-2) cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    63/137

    C++ POO

    09.01.12 62

    void AdEl(TEl x, Multime A){

    if (!Apart(x,A))if (Card(A)>Cm-2) {cout card=0;}void Init(Multime &A){

    A = new Cet; Vida(A);}int E_Vida(Multime A){

    return (A->card)==0;}

    // E lM ult .h \\# define Cm 255typedef int TEl; // Tipul elementelor mul imii

    Un tip abstract de dat realizeaz o unificare (printr-o grupare de tip struct ) ntredate (date membru ) i opera iile ( func ii membru ) lor caracteristice. Func iile membru suntconsiderate de tipinline iar definirea lor n afara structurii se face prin operatorul dere zolu ie (::). n acest mod ns nu se realizeaz o protec ie a datelor (accesul la date se poate face i prin alte func ii, nu numai prin celemembru ), aceast protec ie putnd firealizat (a a cum vom vedea n cele ce urmeaz ) cu ajutorulclaselor .

    Exemplu: # include ; # include ; # include ;# define Pi 3.141592 struct Cerc { float x,y;

    float r;void Init (float x0, float y0, float raza)

    { x=x0; y=y0; r=raza;}float Lung ();float Aria ();

    };float Cerc :: Lung () { return 2*Pi*r; }float Cerc :: A ria () { return Pi*r*r; }void main (void){ Cerc C; C. Init (1,2,3);

    cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    64/137

    C++ POO

    09.01.12 63

    17. Programare orientat obiect (OOP)

    OOP este o metod de implementare n care:a) Obiectele sunt elementele de baz , b) Orice obiect este o instan a uneiclase ,c) Clasele sunt legate (asociate) unele cu altele prinmo tenire .

    Unlimbajesteorientat obiectdac :a) Utilizeaz obiecte , b) Oblig obiectele s apar in uneiclase ,c) Permitemo tenirea .

    Limbajul C++ ofer no iunea declas , prin care se pot formaierarhii , deci putemvorbi de o pro g ramare orien t a t ob iec t (OOP).

    OOP nseamn realizarea unor programe alc tuite dintr-o mul ime deobiectecareinterac ioneaz pentru a rezolva problema propus , i permite reutilizarea elementelor

    descrise (a interfe ei i a codului).Un obiectare o stare i un comportament (opera ii descrise n interfa a obiectului)aceste dou componente fiind definite prindatele membru (variabile de instan ) irespectiv prin func iile membru (metode ).

    OOP utilizeaz orm toareleconcepte:j c l a s a - implementarea unuiTAD , j o b i e c t u l - instan a unei clase,

    j m e t o d a - mesajul prin care se asigur interfa a (opera iile).

    OOP are urm toarelecaracteristici( propriet i) de baz :

    j nca psularea - gruparea datelor i a opera iilor definite pentru acestea, precum i protec iaacestor date (ele neputnd fi accesate dect prin func iile membru).

    j mo t enirea - p strarea elementelor (date i func ii ale) unei clase (de ba z ), cu definireade noi elemente construind o nou clas (derivat ), formnd n felul acestaierarhii de clase. M o tenirea poate fi imultipl dac o clas mo tene temai multe clase.

    j polimorfi sm - redefinirea ( supra nc rcarea ) opera iilor (func iilor). ntr-o ierarhie pot fimai multe func ii cu acela i nume, deci va fi efectuat opera ia

    corespunz toare obiectului care o apeleaz .D eterminarea opera iei se poate face la compilare (legare static ) sau la execu ie (legare dinamic , prin func ii vituale ).

  • 8/3/2019 Program Are Orientata Obiect in C++

    65/137

    C++ POO

    09.01.12 64

    17.1. DefinireaC la selor O clas se declar ca i o structur , nlocuind cuvntul st ru c t cu c la ss. Protec ia

    datelor se define te scriind modificatorul dorit ( private , protected sau public ) urmat de :.D escrierea uneiclase con ine att datele membru (variabilele de instan ) ct i

    func iile membru (metodele), preciznd pentru acestea gradul de protec ie, astfel:c la ss Nume_clas {

    { [ M odificator_de_protec ie : ] List _membrii } };

    unde: j M odificator_de_protec ie { private , protected , public } , private fiind implicit,

    j private nu permite accesul din afara clasei, j protected permite accesul din clasele derivate, # j public permite accesul din afara clasei; +

    j

    List _membrii { List _declara ii_date_membru, List _ declara ii _func ii_membru } D atele de tip private ( ) pot fi accesate doar de func iilemembru sau func ii prietene

    ( frien d ). O func iemembru a unei clase poate fi func ie prieten a altei clase, iar dac toatesunt prietene , atunci se poate declara clas prieten ( frien d ). // V ezi C8

    Fiecare obiect al unei clase de ine un set dedate membru(variabile de instan ).Func iile membru publice pot fi utilizate din orice func ie din program, pe cnd cele

    private doar din func iile membru ale clasei.D efinireafunc iilor membru(metodelor ) se poate realiza:

    a)

    imediat(complet,antet plus corp ) n defini ia clasei (ca func ieinline ) dac func ia nucon ine multe instruc iuni i nu con ine structuri repetitive (apelul nu se face prin salt curevenire), astfel:

    c la ss Nume_clas { Ti p _fun c ie Nume_metod ( ... ) { . . . }; // antet +corp

    }; b) ulterior (dac a fost declarat n defini ia clasei doar prototipul func iei), utiliznd

    operatorul de rezolu ie (de scop) astfel:Ti p _fun c ie Nume_ c la s : : Nume_metod ( ... ) // :: operatorul de re zolu ie

    { . . . }; // corpul func iei

  • 8/3/2019 Program Are Orientata Obiect in C++

    66/137

    C++ POO

    09.01.12 65

    Exemplu: // C l a s a P u n c t \\

    // ----------------------------- \\# include # include

    class Punct { float x, y; // private: (x,y) e R2

    public:Punct ( ) { x=0; y=0; }Punct (float x0, float y0) { x=x0; y=y0; }Punct (Punct & P) { x=P.x; y=P.y; }

    void CitP (char* Mes);void TipP (char* Mes);Punct & SimPb ( );

    };

    void Punct::CitP (char* Mes) { cout > x >> y ; }void Punct::TipP (char* Mes) { cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    67/137

    C++ POO

    09.01.12 66

    Alocarea ( i ini ializarea) obiectelor se face cu o func ie membru specific numitconstructor (cu numeleC la s ) iar dealocarea cu o func iedestructor (cu numele~ C la s ).Exemplu:

    // Constructori - Destructori \\// ---------------------------- \\

    # include # include # include # include # include # define Cale "c:\\BorlandC\\Bgi"

    class Grafic { int Gd, Gm;public: Grafic (int gd) { Gd=gd; initgraph(&Gd,&Gm,Cale);}

    ~Grafic ( ) { closegraph(); }};

    class Punct { float x, y; // private: (x,y) e R2 public:

    Punct ( ) { x=0; y=0; }

    Punct (float x0, float y0) { x=x0; y=y0; }Punct (Punct& P) { x=P.x; y=P.y; }Punct (int, int, int);

    ~Punct ();

    int X0 () { return int(x); }int Y0 () { return int(y); }Punct& Transl(Punct&);

    };

    Punct:: Punct (int x0,int y0,int c) { x=x0; y=y0; setcolor(c); circle(x,y,5);}Punct:: ~Punct ( ) { setcolor(BLACK); circle(x,y,5);}

    Punct& Punct::Transl(Punct& T) { x+=T.x; y+=T.y; return *this; }

    void main (void){Grafic Mod(DETECT);Punct C(getmaxx()/2,getmaxy()/2,WHITE); getche(); // Centrufor (float Alfa=-1.57;Alfa

  • 8/3/2019 Program Are Orientata Obiect in C++

    68/137

    C++ POO

    09.01.12 67

    Componentele claselor (datele i func iile membru) se refer prin operatoruly sauca i n cazul unei structuri. Func iile membru refer direct componentele clasei (f r ace tioperatori, utiliznd poinetrult h i s declarat automat ca pointer la obiectul curent).Exemplu:

    // Operatorii y i > \\// ---------------------------- \\

    # include # include # include # include # include # define Cale "c:\\BorlandC\\Bgi"

    class Grafic { int Gd, Gm;public: Grafic (int gd) { Gd=gd; initgraph(&Gd,&Gm,Cale);}

    ~Grafic ( ) { closegraph(); }};

    class Punct { float x, y;public:

    Punct ( ) { x=0; y=0; }Punct (float x0, float y0) { x=x0; y=y0; }Punct (const Punct& P) { x=P yx; y=P yy; }

    Punct (int, int, int);~Punct ();

    Punct* Init (float x0, float y0) { x=x0; y=y0; return this ; }int X0 () { return int(x); }int Y0 () { return int(y); }Punct* Transl(const Punct*);

    };

    Punct:: Punct(int x0,int y0,int c) { x=x0; y=y0; setcolor(c); circle(x,y,5);}

    Punct::~Punct( ) { setcolor(BLACK); circle(x,y,5);}

    Punct* Punct::Transl(const Punct* T){ x+=T >x; y+=T >y; return this ; }

    void main (void){

    Grafic Mod(DETECT);Punct* C = new Punct(getmaxx()/2,getmaxy()/2,WHITE); getche();float Raza=100;Punct* M = new Punct; // M C for (float Alfa=-1.57;AlfaInit(Raza*cos(Alfa),Raza*sin(Alfa)) >Transl(C);Punct * P=new Punct(M >X0(),M >Y0(),YELLOW); delay(3); // Desen. P delete P; } // Sterge P

    delete M; getche();delete C; getche();

    }

  • 8/3/2019 Program Are Orientata Obiect in C++

    69/137

    C++ POO

    09.01.12 68

    17.2. C on st ru c t ori i D e st ru c t ori

    Un obiect este creat de unc on st ru c t or al clasei i este ters (distrus) de c tred e st ru c t or .

    C on st ru c t orii permit ini ializarea obiectelor cu (mai multe) func ii membru omonime(avnd acela i nume cu clasa i care difer prin lista parametrilor formali), f r a returna ovaloare. Constructorul este apelat automat la crearea unui obiect. O clas trebuie scon in cel pu in doi constructori:

    j un c on st ru c t or im pli c i t (f r parametri, care ini ializeaz obiectele cu o valoareimplicit ),

    j un c on st ru c t or d e c o piere (care ini ializeaz cu valoarea unui obiect existent, de acela itip).

    Exemplu:

    // Constructori String \\# include # include # include class String { char* s;

    public:String (); // Constructor implicitString (const String&); // Constructor de copiere String (const char*); // Constructor de conversieString& operator=(const String&); // Operator de atribuire

    ~String (); // Destructorint Length (); // Lungimea sirului

    void Print (); // Tipareste sirul};

    String::String () { s=new char; s[0]=0; }String::String (const String& S) { s=new char[S.Length( )+1];strcpy(s,S.s);}String::String (const char* S) { s=new char[ strlen(S)+1];strcpy(s,S); }String& String::operator=(const String& S){ if (s!=S.s) {delete []s; s=new char[S.Length()+1]; strcpy(s,S.s);}

    return *this;}String::~String () { delete []s;}int String::Length () { return strlen(s); }void String::Print () { cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    70/137

  • 8/3/2019 Program Are Orientata Obiect in C++

    71/137

    C++ POO

    09.01.12 70

    n exemplul urm tor se poate urm rii momentul n care ac ioneaz constructorul idestrucorul:

    // Obiecte alocate dinamic (operatorul delete)

    # include ;# include ;

    class Natural { char* Numar;public:

    Natural (char* Nr);~Natural ();

    };

    Natural::Natural(char* Nr){ Numar = new char[strlen(Nr)+1];

    strcpy(Numar,Nr);cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    72/137

    C++ POO

    09.01.12 71

    18. S pec ifi c area c la selor Limb ajul U M L(U nified M odeling Language )

    UM L specific en t i t ile (clasele) dintr-un program irela iile dintre ele astfel:j S pec ifi c area en t i t ilor : numele clasei, date membru - pro t ec ie nume_ d a t : t i p func ii membru - pro t ec ie nume_fun c ie (t i p par.formali ) : t i p _fun c ie

    ( pro t ec ie poate fi (private),# (protected) sau+ (public) ).

    j S pec ifi c area rela iilor d in t re c la se :

    rela ia de asociere : // prietenie

    rela ia de derivare :

    // mo tenire

    Punct- x : float- y : float+ Punct ( )+ Punct (Punct&)+~Punct ( )

    numele c la sei

    d a t e mem b ru

    fun c ii mem b ru

    Exemplu:

    Punct- x : float - y : float + Punct ( )+ Punct (Punct&)+~Punct ( )

    Segment- A :Punct - B :Punct + Segment ( )+ Segment(Segment&)+~Segment ( )

    Persoan- Nume :String + Persoan ( )+ Persoan (Persoan &)+~Persoan ( )

    Student- Facultate:String - Varst : int + Student ( )+ Student (Student &)+~Student ( )

  • 8/3/2019 Program Are Orientata Obiect in C++

    73/137

    C++ POO

    09.01.12 72

    1 9 . F un c i i i C la s e P r i e t ene ( F r i e n d ) O func ieesteprieten cu o clas dac are acces la datele membru private ale acelei

    clase. O func ie prieten poate fi o func ieglobal sau chiar o func iemembru a altei clase.O clas este prieten cu o alt clas dac ea are acces la datele membru ale

    acesteia.O func ie, respectiv oclas prieten se declar utiliznd cuvntul frien d astfel:

    a) frien d Ti p _fun c ie Nume_fun c ie ( List _parametri_formali ); // Func ie frien d global b) frien d Ti p _fun c ie Nume _ c la s :: Nume _fun c ie( List_par . _formali ); // Func ie frien d membru c) frien d Nume _ c la s ; // Clas frien d

    Urm torul exemplu, nu este corect, deoarece elementulC.y nu este accesibil:// Func ie frien d membru

    # include # include class Punct { float x,y ; // private:

    public: Punct ( ) { x= 0, y= 0; }Punct (float x0, float y0) { x=x0, y=y0; }

    };class Cerc { Punct C; float r;

    public: Cerc (Punct O, float raza) { C=O, r=raza;}int TaieOx() { return fabs( C.y )

  • 8/3/2019 Program Are Orientata Obiect in C++

    74/137

    C++ POO

    09.01.12 73

    Exemple:

    // F un c t ie g lo b ala frien d \\# include # include # include # include # define Cale "c:\\BorlandC\\Bgi"class Grafic { int Gd, Gm;

    public: Grafic(int gd) { Gd=gd; initgraph(&Gd,&Gm,Cale);}~Grafic( ) { closegraph(); }

    };class Punct { int x, y;

    public: Punct (int x0=0,int y0=0) { x=x0; y=y0;putpixel(x,y,x+y);}

    Punct (Punct& P) { x=P.x; y=P.y; }void Muta () { moveto(x,y); }void Trag () { lineto(x,y); }

    ~Punct () { }friend Punct Mijloc (Punct,Punct); // Functii globalefriend Punct A fin (Punct,Punct,float); // friend

    };Punct Mijloc (Punct A, Punct B) { Punct M (int((A.x+B.x)/2),

    int((A.y+B.y)/2));return M; }

    Punct A fin (Punct A, Punct B,float t) { Punct M (int((1-t)*A.x+t*B.x+0.5),int((1-t)*A.y+t*B.y+0.5));

    return M; }class Segment {Punct A, B; // Capetele Segm.

    public:Segment ( ) : A(), B() { }Segment (Punct P, Punct Q) { A=P; B=Q;

    A.Muta();B.Trag(); }Segment (Segment& AB) { A=AB.A; B=AB.B; }

    ~Segment () { A.Muta();B.Trag(); }Punct Mijloc s () { return Mijloc (A,B);} //::Mijloc Punct Afin s (float t) { return A fin (A,B,t);} //::Mijloc

    };void main (void){

    Grafic Mod(DETECT); setwritemode(XOR_PUT); setbkcolor(BLUE);Punct* A = new Punct (300,100); // APunct* B = new Punct (100,300); // BPunct* C = new Punct (500,300); // CSegment* AB = new Segment (*A,*B); // ABSegment* BC = new Segment (*B,*C); // BCSegment* CA = new Segment (*C,*A); // CAfor (float Alfa=0; AlfaAfin s (Alfa));Punct* Q=new Punct(CA->Afin s (Alfa));Segment*PQ = new Segment (*P,*Q);PQ->Mijloc s(); delay(22); // [Punct M=]delete PQ; delete P; delete Q;

    } delete AB; delete A; delete B; getche();delete BC; delete CA;

    }

  • 8/3/2019 Program Are Orientata Obiect in C++

    75/137

    C++ POO

    09.01.12 74

    // F un c t ie mem b ru frien d \\# include # include # include # include # include # define Cale "c:\\BorlandC\\Bgi"float Sqr (int x) { return float(x)*x; }int Sqrt (float x) { return ceil (sqrt(x)+0.5); } class Grafic { int Gd, Gm;

    public: Grafic(int gd) { Gd=gd; initgraph(&Gd,&Gm,Cale);setbkcolor(BLUE); }

    ~Grafic( ) { getche(); closegraph(); }};

    class Punct;class Segment{Punct * A , *B; // Capetele Segm.

    public:Segment ( ) : A(), B() { }Segment (Punct*,Punct*);Segment (Segment&);

    ~Segment ();Punct Mijloc ();

    };class Punct { int x, y;public: Punct (int x0=0,int y0=0) { x=x0; y=y0;

    putpixel(x,y,x+y);}Punct (Punct& P) { x=P.x; y=P.y; }

    void Muta () { moveto(x,y); }void Trag () { lineto(x,y); }

    ~Punct () { }friend Punct Segment::Mijloc();

    };Segment:: Segment (Punct *P, Punct *Q) { A=P; B=Q; A->Muta(); B->Trag(); }Segment:: Segment (Segment& AB) { A=AB.A; B=AB.B; }Segment::~Segment ( ) { A->Muta(); B->Trag(); }Punct Segment::Mijloc() { Punct M ( int(( A ->x+B->x)/2),

    int(( A ->y+B->y)/2));return M; }

    void main (void){ Grafic Mod(DETECT); setwritemode(XOR_PUT); int Lung=400;

    Punct* O = new Punct; // OrigineaPunct* X = new Punct(Lung);Punct* Y = new Punct(0,Lung);Segment* OX = new Segment(O,X); // Axa Ox;Segment* OY = new Segment(O,Y); // Axa Ox;for (int x=1; xMijloc(); delay(9); delete PQ; delete P; delete Q;

    } getche();delete OX; delete OY; delete O; delete X; delete Y;

    }

  • 8/3/2019 Program Are Orientata Obiect in C++

    76/137

    C++ POO

    09.01.12 75

    // C la sa frien d \\# include # include # include # include # include # define Cale "c:\\BorlandC\\Bgi"struct palettetype pal; float Pi=3.1416, Alfa;class Grafic { int Gd, Gm;

    public: Grafic(int gd) { Gd=gd; initgraph(&Gd,&Gm,Cale); getpalette(&pal); }

    ~Grafic( ) { getche(); closegraph(); }};

    class Punct { int x, y;public: Punct (float x0=0,float y0=0) { x=int(x0);y=int(y0); }Punct (float x0,float y0,int c){x=int(x0+0.5);y=int(y0+0.5);putpixel(x,y,c);}Punct (Punct& P) { x=P.x; y=P.y; }

    void Muta () { moveto(x,y); }void Trag () { lineto(x,y); }

    ~Punct () { }friend Segment;friend Cerc;friend Triunghi;

    };class Segment {Punct A, B; int Cul; // Capetele Segm.

    public: Segment ( ) : A(), B() { }Segment (Punct P, Punct Q){ Cul=getcolor();setcolor (Cul);

    A=P; B=Q; A.Muta();B.Trag(); }Segment (Segment& AB) { A=AB.A; B=AB.B; }

    ~Segment () { setcolor(Cul);A.Muta();B.Trag(); }

    Punct Mijloc ();friend Triunghi;};

    Punct Segment::Mijloc () { Punct M(int(( A .x+B.x )/2),int(( A .y+B.y )/2)); return M;}class Cerc { int x, y, r;

    public: Cerc (int x0=0,int y0=0,int r0){ x=x0;y=y0;r=r0; circle(x,y,r);}Cerc (Punct P, int r0) { x=P.x; y=P.y; r=r0; circle(x,y,r);}Cerc (Cerc& C) { x=C.x; y=C.y; r=C.r; }

    Punct PeCerc(float a){ Punct M(x+r*cos(a),y-r*sin(a)); return M;}~Cerc () { /*circle(x,y,r);*/ }

    };class Triunghi { Punct A, B, C; // Varfuri

    public:Triunghi ( ) : A(), B(), C() { }Triunghi (Punct,Punct,Punct);Triunghi (Triunghi& ABC) { A=ABC.A; B=ABC.B; C=ABC.C;}

    Punct Centru Gr(){ Punct G(( A .x+B.x+C.x )/3,( A .y+B.y+C.y )/3,15);return G; }

    ~Triunghi (){}};

    Triunghi::Triunghi(Punct P,Punct Q,Punct R) { A=P; B=Q; C=R;setcolor(YELLOW); Segment AB(A,B); Segment BC(B,C); Segment CA(C,A);setcolor(LIGHTBLUE); Segment AAP(A,BC.Mijloc());Segment BBP(B,CA.Mijloc());Segment CCP(C,AB.Mijloc());int Cf=int((Pi-fabs(Alfa-Pi))/Pi*63); // r g bsetrgbpalette(pal.colors[BLUE], 0, 0, Cf);setrgbpalette(pal.colors[YELLOW], 63 ,63-Cf,0);setrgbpalette(pal.colors[LIGHTBLUE], 0, Cf, 63);setrgbpalette(pal.colors[WHITE], Cf, Cf, Cf);delay(int(pow((fabs(Alfa-Pi)+0.3)*Pi,2))); }

    void main (void){ Grafic Mod(DETECT); setwritemode(XOR_PUT); setbkcolor(BLUE);

    Punct O(300,250); Cerc c(O,200); // centru, cercfloat uA=Pi/2, uB=Pi+Pi/6, uC=-Pi/4;

    for (Alfa=0; Alfa

  • 8/3/2019 Program Are Orientata Obiect in C++

    77/137

    C++ POO

    09.01.12 76

    2 0 . M e m b r i s t a t i c i ( S t a t i c ) // $ : Fiecare obiect dintr-o clas de ine toate datele membru (atributele) acesteia. Exist

    ns posibilitatea ca toate instan ele unei clase s de in anumiteatribute comunetuturor obiectelor clasei respective. Ace ti membri (date, func ii)statici au acela i regim de

    protec ie ca i ceilal i membrii.

    20 .1. A t ri b u t e ( D a t e mem b ru ) S t a t i c e // $ : D a t ele mem b ru st a t i c e, care urmeaz s fie utilizate de c tre toate obiectele clasei,

    se d efine sc prin specificatorul st a t i c astfel:c la ss Nume_clas {

    st a t i c List _Declara ii_date_membru ; // $ :

    };

    D a t ele mem b ru st a t i c e, se d ec lar ( se ini iali zea z ) ex plicit n afara clasei:T ip_dat _membru Nume_clas : : Dat _membru [ = Valaore ];

    Referirea (utili zarea ) d a t elor mem b ru st a t i c e se poate face astfel:

    a) Nume_ c la s :: D a t _mem b ru // Referire natural (global ) la clas b) Obiect y Dat _membru // Referire particular la un obiect c) Pointer_Obiect > Dat _membru // Referire particular prin pointer

    n urm torul exemplu, se num r cte Puncte sunt utlizate la un moment dat n

    program, utiliznd ca dat comun pentru toate punctele (ntreaga clas ) Nr_Ob :// Membru S t a t i c

    # include # include

    class Punct { float x, y;public:

    Punct () { x=0; y=0; Nr_Ob++; }Punct (float x,float y) { this->x=x;

    this->y=y; Nr_Ob++; }Punct (Punct& P) { x=P.x; y=P.y; Nr_Ob++; }

    ~Punct () { Nr_Ob--; }

    static int Nr_Ob; //$: };

    int Punct:: Nr_Ob=0; // se ini iali zea z

  • 8/3/2019 Program Are Orientata Obiect in C++

    78/137

    C++ POO

    09.01.12 77

    void main (void){ Punct A,B;

    clrscr(); cout

  • 8/3/2019 Program Are Orientata Obiect in C++

    79/137

    C++ POO

    09.01.12 78

    20 .2. M et od e ( F un c ii mem b ru ) S t a t i c e // $ :

    M et od ele ( F un c iile memb ru ) st at i c e, ac ioneaz doar asupra atributelor st a t i c e (ale claselor ), deci nu pot ac iona asupra atributelor obiectului curent (deoarece nu li setransmite poinetrulthis ). D e asemenea ele pot apela doar metodele statice. Pot ns ac ionaasupra atributelor unui anumit obiect prin operatoriiy sau >. M

    et o

    d ele

    st a

    t i ce, s

    ed

    efine sc

    prin specificatorul st a t i c astfel:c la ss Nume_clas {

    st a t i c Ti p _ fun c ie Nume_ fun c ie ( List _par_formali ) // $ :

    }; Referirea (utili zarea ) me t od elor st a t i c e se face astfel:

    a) N ume_ c la s :: F un c ie_mem b ru ( List_par_actuali ) // Referire nat ural la c la s b) Obiect y F un c ie_mem b ru ( List _par_actuali ) // Referire la un obiect c) P ointer _Obiect > F un c ie_mem b ru ( List_par_actuali ) // Referire prin pointer

    n urm torul exemplu, se determin fereastra real (definit prin cele dou punctediagonal opuseSt_Sus, Dr_Jos ) utiliznd func iile statice MinX, MaxX, MinY, MaxY pentru adetermina domeniul minimal care include punctele din grafic.

    / / F u n c i i S t a t i c e # include # include # include # define Cale "c:\\BorlandC\\Bgi"class Grafic { int Gd, Gm;

    public: Grafic(int gd) { Gd=gd; initgraph(&Gd,&Gm,Cale); setbkcolor(BLUE);}~Grafic( ) { getche(); closegraph();} };

    int u (float); int v (float);class Punct { float x, y;

    public: Punct () { x=0; y=0; }void Atrib ( float x,float y ){ this->x=x; if (xMaxX()) Dr_Jos.x=x;this->y=y; if (yMaxY()) St_Sus.y=y; }Punct (Punct& P) { x=P.x; y=P.y; }void Muta () { moveto(u(x),v(y)); }void Trag () { lineto(u(x),v(y)); }

    ~Punct () { }static Punct St_Sus, Dr_Jos; // Fereastra Realastatic float MinX() { return St_Sus.x; } // Metod Staticstatic float MaxX() { return Dr_Jos.x; } // Metod Staticstatic float MinY() { return Dr_Jos.y; } // Metod Staticstatic float MaxY() { return St_Sus.y; } // Metod Static

    };Punct Punct::St_Sus, Punct::Dr_Jos; // Fereastra Realaint u1=110, v1=20, u2=500, v2=430; // Fereastra Ecranint u (float x) { return ((x- Punct::MinX())/(Punct::MaxX()-Punct::MinX() )*(u2-u1)+u1); }int v (float y) { return ((y- Punct::MaxY())/(Punct::MinY()-Punct::MaxY())*( v2-v1)+v1); }float x (float t) { return cos(2*t)*cos(t); } // x(t)float y (float t) { return cos(4*t)*sin(t); } // y(t)void main (void){ int i,n=1000; float Pi=3.14153; Grafic Mod(DETECT);

    Punct P[1001]; P[0].Atrib(x(0),y(0));Punct::St_Sus=Punct::Dr_Jos=P[0];for (i=1; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    80/137

    C++ POO

    09.01.12 79

    j D efinirea unui poin t er la o me t od se poate face astfel:

    Ti p _fun c ie ( Nume_ c la s :: * Nume_ P oin t er ) ( List _par_formali ) // sau cu typedef

    j I ni ializarea unui poin t er la o me t od se poate realiza astfel:

    Nume_ P oin t er = & Nume_ c la s :: Nume_ M et od ; // se pot reali za i la definire

    j Referirea unui poin t er la o me t od (apelarea metodei ) :

    ( Nume_ Ob iec t . * Nume_ P oin t er ) ( List _par_actuali )

    D e exemplu, pentru programul anterior, modific rile necesare pentru a putea apelacele dou metode Muta i Trag ale clase P un c t pot fi urm toarele:

    / / P o i n t e r i l a m e t o d e class Punct { float x, y;

    public: Punct () { }void Atrib Punct (Punct& P) { }

    void Muta () { moveto(u(x),v(y)); }void Trag () { lineto(u(x),v(y)); }

    ~Punct () { }static Punct St_Sus, Dr_Jos;static float MinX() { return St_Sus.x; } // Metod Static

    };

    void main (void){

    typedef void (Punct :: *P_Met)(); // Definire

    P_Met Pm[2] = {&Punct::Muta,

    &Punct::Trag};

    //

    I ni ializare

    // sau:// void (Punct :: *Pm[2] )() = { &Punct::Muta, &Punct::Trag}; // Def+ I ni

    (P[0]. *Pm[0] )(); setcolor(WHITE); // Apel Muta for (i=1; i

  • 8/3/2019 Program Are Orientata Obiect in C++

    81/137

    C++ POO

    09.01.12 80

    Un alt exemplu, care utilizeaz pointeri la metode (Triun , D re pt i Rom b ) esteurm torul:

    / / P o i n t e r i l a * M e t o d e # include # include # include # define Cale "c:\\BorlandC\\Bgi"class Grafic { int Gd, Gm;

    public: Grafic(int gd) { Gd=gd; initgraph(&Gd,&Gm,Cale); setbkcolor(BLUE);}~Grafic( ) { getche(); closegraph();} };

    int u (float);int v (float);class Punct { floa