Programare Orientata Pe Obiecte (C++)

download Programare Orientata Pe Obiecte (C++)

of 138

Transcript of Programare Orientata Pe Obiecte (C++)

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    1/138

    CPOO++Prejmerean Vasile

    Cluj-Napoca

    2004

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    2/138

    C++

    POO

    1. Redactarea programelor C

    1.1. Generaliti

    Mediul Borland C a fost extins la Visual C i C++ Builder, adaptate programrii

    orientate obiect i interfeei grafice Windows 95. Limbajul C a fost extins la C++ permindaplicarea conceptelor programrii prin abstractizarea datelor i programrii orientate spreobiecte.

    Fiierele surs pot avea extensia C, CP, sau CPP.

    1.2. Structura unui program

    Un program C este conine o funcie principal (main) i eventual alte funciisecundare, apelate de ctre funcia principal, situate la acelai nivel (far imbricare).

    Structura unui program este urmtoarea:

    Directive de procesare,

    Declaraii de date globale,

    Declaraii de funcii, sau doar [Antete de funcii (prototipuri) ]

    Funcia principal; [Descrierea funciilor(implementri) ]

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

    Comentariile se scriu ntre caracterele /* i */ ( ... /* comentariu */ ... ), sau la

    nivelul unui rnd dup caracterele // ( ... // comentariu ).

    nainte de compilare, un program este precompilat, de ctre un preprocesor, carepermite includerea unor fiier surs, definirea i apelul unror macrouri, precum i ocompilare condiionat.

    Includerea unui fiier surs (*.h sau *.c) se realizeaz prin directiva include astfel:

    # include specificator_fiier // pentru fiiere utilizator sau

    # include // pentru fiiere standard

    Exemplu: #include ; // Standard Input Output Header#include ; // Console Input, Console Output

    10.04.13 2

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    3/138

    C++

    POO

    Constantele simbolice se definesc cu ajutorul directivei define astfel:

    #define Nume_constant ir_caractereExemplu:

    #define Pi 3.141592 // nlocuiete Pi cu 3.141592

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

    1.3. Funcii

    O funcie este format dintr-un antet i un bloc (corp). Ea poate fi apelat dac afost definit n ntregime sau doar antetul su.

    Antetul unei funcii are urmtorul format:

    Tip Nume (List_parametri_formali)

    unde:

    Tip este tipul valorilor funciei (codomeniul); Nume este un identificator (liter urmat eventual de alte litere sau cifre); List_parametri_formali conine parametrii formali separai prin ,.

    Exemplu: int Min (int a, int b){ if (a

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    4/138

    C++

    POO

    1.4. Elementele limbajului

    Alfabetul limbajului C este format din litere mari i mici, cifre i caractere speciale(\n=CrLf, \t=Tab).

    Identificatorii sunt formai din liter_ urmat eventual de litere_ sau cifre(caracterul _ poate fi utilizat pe post de liter).

    Exist cuvinte cheie care pot fi utilizate doar n contextul definit (de exemplu case,float, int, long, return, short, static, structure, switch, union, unsigned, void).

    Tipurile predefinite sunt urmtoarele:

    int(Z [-215,215-1]),

    short(Z [-215,215-1]),

    long(Z [-231,231-1]),

    unsigned(N

    [0,2

    16

    -1]), float(Q* [-3.410-38, 3.41038]),

    double (Q* [-1.710-308, 1.710308]),

    char(cod ASCII).

    Constantele numerice pot fi zecimale (123, 123Long, 111long), octale (077), hexa(0xabba, 0Xfac), sau flotante (2.71828, 6.023e23, 6.023E23).

    Constantele de tip caracter pot fi afiabile ('A', '0', '"') sau funcionale('\b'=Backspace, '\r'=Return, '\n'=Newline, '\''=Apostrof, '\\'=Backslash, '\v'=Verticaltab,

    '\f'=Salt de pagin, '\0'=Null.Constantele de tip ir de caractere se scriu ntre ghilimele ("Mesaj").

    Declararea variabilelor simple se face astfel:

    Tip List_identificatori_de_variabile;

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

    Declararea unui tablou se realizeaz astfel:

    Tip Nume_Tablou [d1] [d2] ... [di] ... [dn]; // indicele ki: 0ki

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    5/138

    C++

    POO

    2. Variabile

    Variabilele pot fi statice sau dinamice, locale sau globale.

    2.1. Variabile globale

    Declararea unei variabile globale se face la nceputul unui fiier surs (n afaratuturor funciilor) i poate fi referit pn la sfritul programului (n orice funcie).Utilizarea lor n alte fiiere surs se poate face doar dac acestea sunt declarate ca variabileexterne:

    extern declaraie_variabil

    Exemplu:

    VExterne.Cpp:#include ;#include "Fs.h";

    float Pi=3.14; // variabil globalvoid main (void){ float r;

    printf(" Dati raza cercului : "); scanf("%f",&r);printf(" Lungimea cercului = %f \n",LungC(r));scanf ("\n");

    }

    Fs.h:float LungC (float r){

    extern float Pi; // variabil externreturn 2*Pi*r;

    }

    2.2. Variabile locale

    O variabil local este utilizabil (vizibil) doar n modulul sau n funcia n care afost 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, declaraia ei trebuie s fie precedatde cuvntul cheie static:

    static declaraie_variabil

    Funciile au implicit atributul extern, deci pot fi apelate din alte fiiere surs, dardac dorim ca acest apel s nu fie permis, atunci se vor declara statice prin scriereacuvntului cheie static naintea antetului acesteia ( static antet_funcie ) ?!.

    10.04.13 5

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    6/138

    C++

    POO

    Exemplu:

    VLocale.Cpp:#include ;#include "Sursa.h";

    void main (void){ int n;printf(" Dati 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    7/138

    C++

    POO

    2.4. Iniializarea variabilelor

    Variabilele simple se iniializeaz printr-o declaraie de forma:

    Tip Identificator_de_variabil = Expresie

    Exemple:

    float f ( int n );{ int i=1;

    int m=n/2;...

    }

    Tablourile se iniializeaz printr-o declaraie de forma:

    Tip Ident_tablou [n] = {Expresie1,Expresie2,..., Expresiem}

    unde mn, iar dac n este omis, atunci n=m.

    Exemple:

    int X [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};int Y [ ] = {1,2,3,4,5,6,7};int A[3][] = { {1,2,3},{4,5},{6} }; // {{1,2,3},{4,5,?},{6,?,?}}

    irurile de caractere se iniializeaz astfel:

    char Ident_string[n] = "ir_caractere"

    iarnpoate fi este omis.

    Exemple:

    char Mesaj [100] = "Zarurile vor fi aruncate ...";char Alt_Mesaj [] = {"Zarurile au fost aruncate !"};

    10.04.13 7

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    8/138

    C++

    POO

    3. Expresii

    O expresie este format din operanzi, operatori i parantezepentru prioritate, iare o valoare i un tip. Asocierea operatorilor se face de la stnga la dreapta, cu excepiaoperatorilor unari i de atribuire, care se asociaz de la dreapta la stnga.

    Operanziipot fi: constante, constante simbolice, variabile simple sau structurate(tablouri, structuri, sau elemente ale acestora), funcii sau apeluri de funcii.

    3.1. Operatori

    Operatorii, n ordinea descresctoare a prioritii sunt urmtorii:

    ( ) [ ] (unar) + (unar) * (unar) & (unar) ! ~ ++ (tip) sizeof

    * / % + > < = > == != & ^ | && || ?: (ternar) = *= /= %= += = = &= ^= |= ,

    Operatorii aritmetici sunt urmtorii:

    + , , * , / , % (mod), pentru adunare, scdere, nmulire, ct (mprire), rest.

    Exemple:

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

    10.04.13 8

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    9/138

    C++

    POO

    Operatorii relaionali sunt urmtorii:

    < , , >= , == , != , pentru < , , > , , = , , rezultatul (valoarea

    expresiei relaionale) fiind 1pentru adevrat, iar 0pentrufals.

    Exemple: int i=1; int j=2 ;... i (deplasare la dreapta), & (Andbit cu bit), ^ (Xorbit cu bit), | (Orbit cu bit).

    Exemplu:

    // ASCII

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

    if (c>4),Cifra(c&0xF)); }while (c!=0x1B);

    }

    10.04.13 9

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    10/138

    C++

    POO

    Operaia de atribuire se realizeaz astfel:

    Var=Expresie; // expresie de atribuire cu tipul Var

    Exist posibilitatea realizrii de atribuiri multiple prin expresii de forma:

    Varn= ... = Var2= Var1=Expresie;

    Mai exist o facilitate utiliznd o operaie de atribuire de forma:

    Var=Expresie; // unde {+, , *, /,%, &, ^, |, }

    avnd semnificaia:Var= VarExpresie;

    Exemple:

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

    n

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    11/138

    C++

    POO

    Conversiile implicite (realizate automat) se fac astfel:

    a) charint,

    b) floatdouble,

    c) (double,*)(double,double)=double,d) (long,*)(long,long)=long,

    e) (unsigned,*)(unsigned,unsigned)=unsigned.

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

    sizeof (Data) ;

    Exemplu: int a;printf(" SizeOf int = %d \n", sizeof(a)); // SizeOf int = 2printf(" SizeOf short = %d \n", sizeof(short)); // SizeOf short=2

    Operatorii condiionali ? :sunt utilizai n construcii de forma:

    Expresie1? Expresie2 : Expresie3 ;

    Valoarea expresiei rezultat esteExpresie2 dacExpresie1 este nenul, altfel esteExpresie3 .Exemplu:

    Max = a>b ? a : b; // Dac a>b Atunci Max=a Altfel Max=b;

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

    Expresie1, Expresie2, ... , Expresien;Exemplu:

    float x0,y0,r, x, y;printf(" Dati C(x0,y0,r) = "); scanf("%f%f%f",&x0,&y0,&r); // Cercul Cprintf(" Dati P(x,y) = "); scanf("%f%f", &x, &y ); // Punctul Pprintf(" %s",((x-=x0, y-=y0, x*=x, y*=y, x+y)==r*r) ? "P e pe C" : "P nu e pe C");

    10.04.13 11

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    12/138

    C++

    POO

    4. Operaii de intrare/ie ire

    n limbajul C nu exist instruciuni de intrare/ieire, aceste operaii ralizndu-se prinfuncii aflate n bibliotecile standard. Implicit, unui program i se ataeaz fiierele stdin

    (intrare standard), stdout (ieire standard), stderr (ieire standard pentru erori), stprn (ieirepentru imprimant), stdoux(intrare/ieire serial).

    4.1. Funcia Printf

    Aceast funcie realizeaz afiarea dup un ablon, avnd urmtorul format:

    int printf(Control[,List_Expresii]);

    unde Control este ablonul (formatul) scris sub forma unui ir de caractere care coninemesaje i specificatori de format corespunztori valorile expresiilor din list. Un

    specificator de format se descrie astfel:

    %[] [m[.n]] [l] [f]unde:

    [] - determin alinierea la stnga, implicit fiind la dreapta, [m] -precizeaz lungimea cmpului, [.n] -precizeaz lungimea prii zecimale, respectiv numrul de caractere, [ l ] - conversia se va efectua din format intern long, [f] - determin tipul conversiei precizat prin unul din urmtoarele caractere:

    d - int

    zecimal extern, o - int octal extern,

    x - int hexa extern (0...9,a...f), X - int Hexa extern (0...9,A...F), u - unsigned zecimal extern (fr semn), c - binar intern caracter (char), s -string(ir de coduri ASCII terminat cu \0=NUL) ir de caractere, f -floatsau double zecimal extern [m[.n] ], implicit n=6, e -floatsau double zecimal extern forma exponenial (b*10e), E -floatsau double zecimal extern forma exponenial (b*10E),

    g - se alege dintre variantelefsau e reprezentarea minim, G - se alege dintre variantelefsauEreprezentarea minim.

    Funcia printf returneaz numrul de octei afiai dac operaia a decurs corect, iarn caz contrar -1 (EOF):

    if (EOF ==printf(Control,List_Expresii)) ... eroare... ;

    10.04.13 12

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    13/138

    C++

    POO

    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:2003printf(" Inaltime(m):%4.2f \n",Ina); // Inaltime(m):1.80

    4.2. Funcia Scanf

    Aceast funcie realizeaz citirea datelor dup un ablon, avnd urmtorul format:

    int scanf (Control,List_Adrese_de_Variabile);

    unde Control este ablonul (formatul) scris sub forma unui ir de caractere care conineeventual texte (obligatorii la intrare) i specificatori de format corespunztori tipurilor

    variabilelor din list. Specificatorii de format sunt asemntori celor prezentai la funciaprintf, realiznd ns conversiile inverse: %[*] [m] [l] [f] , unde:

    [*] - un caracter opional, [m] -precizeaz lungimea maxim a cmpului, [ l ] - conversia se va efectua din format intern long, [f] - determin tipul conversiei precizat prin unul din urmtoarele caractere:

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

    Adresele variabilelor de intrare sunt date prin operatorul de adrese & plasat nainteaidentificatorului fiecrei 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.80Funcia scanf returneaz numrul de cmpuri citite corect. Sfritul de fiier

    (Ctrl/Z) poate fi verificat prin valoarea returnat EOF:

    if (EOF == scanf(Control,List_Expresii)) ... Sfrit... ;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); }

    10.04.13 13

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    14/138

    C++

    POO

    4.3. Funcia PutChar

    Aceast funcie realizeaz tiprirea unui caracter al crui cod ASCII este precizatprintr-o expresie:

    putchar (Expresie);

    4.4. Funcia GetChar

    Aceasta, returneaz codul ASCII al caracterului citit (pentru Ctrl/ZEOF=-1):

    getchar ( );

    Exemplu:

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

    Litere mici in Litere MARI ! getcharLITERE MICI IN LITERE MARI ! putcharSe termina la . (Punct) getcharSE TERMINA LA . putchar

    4.5. Funcia GetChe

    Funcia returneaz codul caracterului citit directi l afieaz (n ecou):

    int getche ( );Exemplu:

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

    LLiItTeErReE mMiIcCiI iInN LLiItTeErReE MMAARRII . .

    4.6. Funcia GetChAceast funcie returneaz codul caracterului citit (direct) fr ca acesta s mai fie

    afiat:int getch ( );

    Exemplu:

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

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

    10.04.13 14

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    15/138

    C++

    POO

    5. Instruciuni

    n limbajul C instruciunile se termin cu ; mai puin cele care se termin cu }.

    5.1. Instruciunea Vid

    Aceast instruciune se utilizeaz n situaia n care este nescerar prezena uneiinstruciuni i care nu trebuie s execute nimic:

    ;

    5.2. Instruciunea Expresie

    Instruciunea are formatul general:

    Expresie ;Exemple:

    y = (x+1)*(x-1); // Atribuire: v=Expresie;f(x,y); // Apel de funcie: f(p1,p2,..., pn);c++; --c; // Incrementri/Decrementri (Pre/Postfixate)

    5.3. Instruciunea Compus

    Aceasta este format dintr-o succesiune de declaraii (proprii) i instruciuni, inclusentre acolade:

    {DeclaraiiInstruciuni

    }Exemplu:

    {int i; // Variabil local instruciunii;

    f (i); // ise poate utiliza doar n aceast instruciune compus;

    } ; // Dup } nu se pune ;

    10.04.13 15

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    16/138

    C++

    POO

    5.4. Instruciunea If

    Structura alternativ cu una sau dou ramuri poate fi scris astfel:

    if (expresie) instructiune1;[ else instructiune2; ]

    Exemplu:

    { P(x,y) I-ul Cadran (Dacx sauy este negativ se schimb semnul)float x, y;

    printf(" Dati P(x,y) = "); scanf("%f%f", &x,&y); // Punctul Pif (x>0) if (y

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    17/138

    C++

    POO

    Exemplu:

    // Nr.Zile / lun \\#include #include void main (void)

    { int l,a;cout > a;cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    18/138

    C++

    POO

    5.8. Instruciunea For

    Structura repetitivPentru (!) poate fi descris astfel:for (expresie1;expresie2;expresie3) instructiune

    ;Instruciunea are acelai efect ca i:

    expresie1; while (expresie2) { instructiune; expresie3; }

    i invers (vezi while):for (;expresie;) instructiune;

    Exemplu:

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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    19/138

    C++

    POO

    while (expr1) { ...if (expr2) goto et;

    ... }...

    et: ... // instruciune

    5.12. Apelul unei funcii

    Instruciunea de apel a unei funcii este un caz particular al instruciunii expresie:

    Nume_funcie (List_parametri_actuali);

    O funcie poate fi apelat i n cadrul unei expresii dintr-o instruciune:

    ... Nume_funcie (List_parametri_ actuali) ... ;

    O funcie poate fi utilizat doar dac a fost definit sau cel puin a fost declaratprototipulei ntr-una din urmtoarele moduri:

    a) Tip_ funcie Nume_ funcie(Lista_parametrilor_formali);b) Tip_ funcie Nume_ funcie(Lista_tipurilor_parametrilor_formali);c) Tip_ funcie Nume_ funcie(Void); // nu sunt parametri formalid) Tip_ funcie Nume_ funcie( ); // nu se fac verificrile de tip

    Apelul implicit pentru variabile simple (de baz) este prin valoare, iar pentrutablouri prin referin. Apelulprin referin se obine prin intermediul variabilelor de tip

    pointeri a operatorului de adres &.

    Revenirea dintr-o funcie se poate realiza fie prin instruciunea return, fie automatdup ultima instruciune a funciei (situaie n care nu se returneaz nici o valoare):

    return[expresie] ;

    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 = DETECT, 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){ int p=0;

    10.04.13 19

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    20/138

    C++

    POO

    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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    21/138

    C++

    POO

    6. Pointeri

    O variabil p de tip pointerconine adresa unei variabile a crei valoare se obineutiliznd operatorul * (*p = valoarea variabilei de la adresa coninut np).

    Adresa unei variabile v se poate obine prin operatorul & (&v = adresa variabilei v),deci putem atribui unui pointerp adresa unei variabile v astfel:

    p = &v;

    6.1. Declararea unuiPointer

    Definirea unei variabile de referin (legat de un Tip) se face astfel:

    Tip *Var_Referin ;Deci, tipul referin se obine prin urmtoarea construcie:

    Tip *

    Declararea unui pointer (care conine o adres nefiind ns legat de un anumit tip) seface astfel:

    void *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(" Dati 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: Dati x : 43962 Date: Dati x : -1Rezultate: x =43962 Rezultate: x = 65535

    |x| =2 |x| =2|&x|=2 |&x|=2

    *(&x)=ABBA *(&x)=FFFF

    6.2. Operaii cuPointeri

    Aceste operaii sunt operaii cu adresele coninute n variabilele de tippointer.

    10.04.13 21

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    22/138

    C++

    POO

    6.2.1. Incrementare / DecrementareAceste operaii mresc/miocoreaz valoarea de adres spre urmtorul 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(" Dati 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 / Scdere a unui numr ntregAceste operaii mresc/miocoreaz valoarea de adres spre alt element (cu o

    valoare egal cu n 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=Zile+Luna; printf(" Nr.Zile=%d \n",*Pointer_Int);Pointer_Int=Zile; printf(" Nr.Zile=%d \n",*(Pointer_Int+Luna));

    6.2.3. ComparareDoi pointeri ale elementului aceluiai tablou pot fi comparai utiliznd operatorii

    relaionali. Valoarea NULL marcheaz faptul c un pointer nu refer nici un element.

    ...p1 Zile[Luna]) || (Luna>12)) luna=NULL; else luna=Zile;if (luna!=NULL) { NrZile=Zi; do NrZile+=*(luna++); while (luna*luna; luna++) Ziua=*luna;

    printf(" Zi:%d, Luna:%d, An:%d \n",Ziua,lunaZile,An);

    10.04.13 22

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    23/138

    C++

    POO

    Exemplu:

    // Operaii cu pointeri \\#include #include void Tip (int *x, int n){ int *p=x;

    while ( p-x < n ) cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    24/138

    C++

    POO

    Numele unei funcii fiind un pointer la acea funcie, 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 "Graf.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 >> n; clrscr();cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    25/138

    C++

    POO

    6.5. Utilizarea parametrilor din linia de comand

    Apelul unui program poate fi nsoit de o list de parametri:

    >Nume_Program List_Parametri

    care se poate accesa scriind antetul funciei principale astfel:

    main ( intArgC, char*ArgV[ ] )unde:

    ArgC este o variabil ntreag care conine numrul de parametri plus unu (!),ArgV este un tablou care conine adresele parametrilor din list:

    ArgV[0] - pointer la Nume_Program (!), ArgV[1] - pointer la primul parametru, ... ArgV[ArgC-1] - pointer la ultimul parametru

    Exemplu: #include ; #include ; // Calendar 2003void main (int ArgC, char *ArgV[]){ char *Sapt[]={"Luni","Marti","Miercuri","Joi","Vineri","Sambata","Duminica"};

    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 36.6. Declararea co ns t antelor

    O alt modalitate de a defini o constant este modificatorulConstastfel:

    [ Tip ] constNume [ = Valoare ]; sau const [ Tip ] Nume [ = Valoare ];

    Unui parametru formal declarat cu modificatorul Const nu i se mai poate schimbavaloarea n subprogramul respectiv.

    Exemplu:#include ; #include ;int Cifra(const int c)

    { const charZero='0'; int const C40H=0x40;if (c>4),Cifra(c&C0F)); }while (c!=Esc);

    }

    6.7. St iva

    10.04.13 25

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    26/138

    C++

    POO

    Prin stiv nelegem o list cu disciplinaLastIn FirstOutpentru care vom definiurmtoarele trei funcii:

    Push - adaug un element n stiv, Pop - extrage un element din stiv,

    Clear - iniializarea stivei (stiv vid), Vida - verific dac stiva este vid:

    // Fact.Cpp \\

    #include #include

    #include "Stiva.h"

    void main(void){

    int n; unsigned long f;printf(" Dati n : "); scanf("%d",&n);

    Clear(); while (n)Push(n--);f=1; while (!Vida()) f*=Pop();printf(" n! = %15lu \n",f);getch();

    }

    // Stiva.h \\

    #define DimMax 13static int Stiva[DimMax]; static Next=0;

    voidPush(int x){

    if (Next0) return Stiva[--Next];

    else { printf(" Stiva vida \n"); return 0; }}

    void Clear() {Next=0; }int Vida() { return (Next==0); }

    7. Recursiviate

    Exist posibilitatea de a defini o funcie prin ea nsi (recursiv).

    Exemplu:#include #include #define Max (x,y) (x>y ? x : y)int a[100];intMaxim(int n){

    if (n==1) return a[1];else return Max (Maxim(n-1),a[n]);

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

    cout > n;cout a[i];cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    27/138

    C++

    POO

    8. Tipuri de date

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

    8.1. Definirea unui tip de dat (typedef)

    Asignarea unei denumiri unui tip de dat se realizeaz astfel:

    typedef tip Denumire_Tip ;Exemplu:

    typedef int Integer; typedef float Real;Integer i,j; Real X[10];

    8.2. Tipul enumerare (enum)

    Definirea acestui tip se face astfel:

    enum [Denumire] {Id0 [=Expr0], Id1[=Expr1],..., Idn[=Exprn]} [List_Var];

    Implicit Expr0=0, iarExpri=Expri-1+1, iar dac se declar o list de variabile avndacest tip atunci denumirea tipului enumerare definit poate lipsi.

    Exemplu:

    #include ; // 2003 \\#include ;

    enum {False, True } Zi_Lucratoare;

    enum ZileSapt {Luni,Marti,Miercuri,Joi, Vineri, Sambata,Duminica };enum ZileSapt Zi_Sapt; // sau ZileSapt 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    28/138

    C++

    POO

    8.3. Definirea unei structuri(struct)

    Definirea unei structuri(nregistrri) se face astfel:

    struct [Denumire] {List_Declaraii_Cmpuri} [List_Var];

    Dac se declar o list de variabile avnd acest tip atunci denumirea structurii poatelipsi.

    Referirea componentelor unei structurise face astfel:

    Denumire. Component;

    Exemplu:

    #include ;#include ;typedef float Real;structPunct { Real x, y; };structCerc { Punct Centru;

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

    PunctO = { 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)Component;Exemplu:

    ...

    struct Cerc { float x, y; float Raza; };

    void TipCerc( Cerc*C){ printf(" \n C(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); }

    10.04.13 28

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    29/138

    C++

    POO

    8.4. Redefinirea unei date (union)

    Redefinirea unei zone de memorie se poate face n cadrul unei uniuniastfel:

    union [Denumire] {List_Declaraii} [List_Var];

    Toate componentele aflate n List_Declaraii ocum aceeai zon de memorie (sesuprapun), lungimea uniunii fiind dat de maximul lungimilor declaraiilor .

    Referirea componentelor unei uniunise face astfel:

    Denumire. Component;

    sau pentru o variabil de tip referin:

    ( *Var_Ref). Component; sau Var_Ref>Component;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(" Dati un numar : "); scanf("%f",&x.Real); printf(" ... Hexa = ");

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

    }

    8.5. Cmpuride biti

    Exist posibilitatea definirii unei structuri ale crei cmpuri s fie formate dintr-osecven de bii consecutivi (ai unui cuvnt). Aceste cmpuri au tipul unsigned avndfiecare o lungimeprecizat (n numr de bii):

    struct [Denumire] { Cmp0; Cmp1; ... ; Cmpn;} [List_Var];

    unde cmpurile Cmpi sunt de forma:

    unsigned [Nume_Cmpi ] :LungimeiExemplu:

    #include ;

    struct Camp_Biti{ unsignedB__0__3 : 4; unsignedB__4__7 : 4;unsignedB__8_11 : 4; unsignedB_12_15 : 4; };

    union { int Intreg; Camp_Biti Cifre_Hexa; } x ;void Cifra(int c) { if (c

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    30/138

    C++

    POO

    9. Structuri de date dinamice

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

    9.1. List simplu nlnuit ordonatConsiderm o list nevid fiind format din primul element i sublista aflat la adresa

    de legtur memorat n fiecare element pe lng informaia propriuzs.

    n exemplul urmtor vom crea o list care va conine monoamele unui polinom nordinea descresctoare a gradelor. Un element din list va conine pe lng informaia

    propriuzis (coeficientul i gradul monomului) i adresa urmtorului monom (adresasublistei). De exemplu, pentru polinomul P(x)=120x12+77x7+130x3+22x2 lista va conine

    patru elemente avnd informaiile (20,12); (77,7); (130,3); (22,2), indiferent de ordineaintroducerii monoamelor. Deoarece coeficienii sunt nenuli, introducerea datelor se terminla primul coeficient nul.

    #include #include #include #define Nil (NULL)

    struct Monom{ int Coef, Grad ; };struct Elem {MonomInf; Elem* Leg; };typedef Elem* Polinom; // List de monoame ordonate decresctor 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    31/138

    C++

    POO

    Exemplu:// List simpl ordonat cresctor \\

    #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){ ArbA; ClrScr();

    cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    32/138

    C++

    POO

    n exemplul urmtor se citeste un arbore genealogic ascendent (dnd pentru fiecarepersoan nume prinilor), apoi se va reprezenta grafic arborele construit ntr-o fereastrecran precizat (u1,v1,u2,v2). Distana dintre dou nivele se calculeaz innd cont deadncimea arborelui.

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

    typedef char TInf [13] ;

    struct Nod { TInf Inf; // 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){ArbA;cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    33/138

    C++

    POO

    10. Utilizarea fiierelor

    Prelucrarea fiierelor se poate efectua la dou nivele:

    Nivelul inferior- face apel direct la sistemul de operare;

    Nivelul superior- utilizeaz proceduri speciale pentru operaii de intrare/ieire.

    10.1. Nivelul inferior

    Prelucrrile la acest nivel permit urmtoarele cinci operaii:

    10.1.1. Deschiderea unui fiier (Open/Creat)

    int open ( const char* ca le , int acces ) ;unde:

    ca le - este specificatorul de fiier, acces - poate fi o combinaie (utiliznd operatorul |) a urmtoarelor valori:

    O_RDONLY (fiier deschis numai pentru citire), O_WRONLY sau O_CREAT (numaipentru scriere - creare), O_RDWR (citire/scriere), O_APPEND (deschis pentruadugare la sfrit), O_BINARY (pentru prelucrare binar), O_TEXT (pentru fiier detip text).

    Dac deschiderea fiierului s-a realizat corect, atunci funcia returneaz o valoarentreag reprezentnd descriptorul de fiier(LUN, care va fi utilizat n continuare la celelelte

    operaii efectuate asupra acestui fiier), iar n caz de nereuit se va returna valoarea -1.Pentru a putea utiliza funcia Open trebuie incluse fiierele headerio.h ifcntl.h.

    Exemplu:

    ...int Lun;

    Lun = open (Fisier.Dat,ORDONLY);...

    Pentru crearea unui fiier se va apela funcia Creat:

    int creat ( const char* ca le , int mod ) ;

    unde: mod - poate lua una dintre valorile: S_IREAD (fiierul se poate citi), S_IWRITE

    (scriere n fiier), S_IEXEC (execuia programului din fiierul specificat).

    Pentru a putea utiliza funcia Creattrebuie incluse fiierele io.h istat.h.Fiierele text sunt implicite.

    10.04.13 33

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    34/138

    C++

    POO

    10.1.2. Citirea dintr-un fiier (Read)

    int read ( intL un , void *buf fer, unsigned lung ) ;unde:

    L un - este descriptorul definit la deschidere (0=STDIN, 1=STDOUT, 2=STDERR,3=STDPRN, 4=STDAUX),

    buffer - este zona de memorie n care se citete, l u n g - este lungimea (n octei) a nregistrrii citite.

    Funcia returneaz numrul de octei citii (cel mult l ung ), 0 la sfrit, sau -1 n cazde eroare. Automat, dup o citire (a articolului curent) se trece la urmtorul articol, implicit

    prima poziionare fiind la nceput de fiier (acces secvenial).Pentru a utiliza funciileRead, Write,LSeeksau Close trebuie inclus fiierul io.h.

    10.1.3. Scrierea ntr-un fiier (Write)

    int write ( intL u n , void *buffer, unsigned lung ) ;

    Funcia returneaz numrul de octei scrii n fiier, reprezentnd lungimeaarticolului = l ung , sau -1 n caz de eroare.

    10.1.4. Poziionarea ntr-un fiier (LSeek)

    Aceast funcie permite accesul aleator printr-un apel de forma:

    long lseek ( intL u n , long *deplasament, int origine ) ;unde:

    deplasament - reprezint numrul de octei peste care se deplaseaz capul decitire/scriere,

    origine - reprezint punctul din care se msoar deplasament-ul (0=nceputulfiierului, 1=poziia curent, 2=sfritul fiierului).

    Funcia returneaz poziia curent fa de nceputul fiierului, sau -1 la eroare.

    10.1.5. nchiderea unui fiier (Close)

    int close ( intL u n ) ;

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

    10.1.6. Stergerea unui fiier (UnLink)

    int unlink (const char* cal e) ;

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

    10.04.13 34

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    35/138

    C++

    POO

    Exemple:// Creare \\

    #include #include

    #include #include #include

    void main (void){int Lun;clrscr();

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

    {cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    36/138

    C++

    POO

    10.2. Nivelul superior

    La acest nivel sunt posibile urmtoarele operaii:

    10.2.1. Deschiderea unui fiier (FOpen)

    FILE *fopen ( const char* ca le , const char* mod ) ;unde:

    mod - poate fi r pentru deschidere n citire, w pentru scriere, a pentruadugare, r+ pentru modificare (citire/scriere), rb pentru citire binar, wb

    pentru scriere binar, sau r+b pentru citire/scriere binar.

    Dac la deschiderea fiierului s-a ales modul w sau a, fiierul va fi creat (recreat).Funcia returneaz un pointer spre tipulFILEdefinit n fiierulstdio.h, iar n caz de

    nereuit se va returna valoarea NULL (stdin, stdout, stderr, stdaux istdprn sunt pointeri

    spre tipulFILEpermind transferuri fr a fi necesar deschiderea sau nchiderea lor).Exemplu:

    ...

    FILE * Pf;Pf = fopen (Fisier.Dat,w);

    ...

    10.2.2. Prelucrarea pe caractere a unui fiier (PutC, GetC)

    int putc ( int c , FILE * Pf ) ;

    unde: c - este codul caracterului scris, Pf - este valoarea returnat la deschidere saustdin,stdout,stderr,stdaux,stdprn.

    Funcia returneaz valoarea lui c sau -1 la eroare.

    int getc (FILE * Pf ) ;

    Funcia returneaz codul caracterului citit, sau valoarea EOF la sfritul fiierului,sau -1 la eroare.

    Exemplu:

    #include void main (void){ int c;

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

    10.04.13 36

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    37/138

    C++

    POO

    10.2.3. nchiderea unui fiier (FClose)

    int fclose ( FILE * Pf ) ;

    Funcia returneaz 0 la nchiderea corect a fiierului sau 1 la eroare.

    10.2.4. Citirea/Scrierea cu format (FScanF, FPrintF)

    int fscanf ( FILE * Pf , control, list_variabile) ;

    Parametrii control i list_variabile au aceeai semnificaie ca i pentru funciascanf.Funcia returneaz numrul de cmpuri citite sau EOF.

    int fprintf ( FILE * Pf , control, list_expresii) ;

    Funcia returneaz numrul de caractere scrise n fiier sau -1 la eroare.Ex.1:

    // Creare fiier 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){ charNume[25], Prenume[15]; clrscr(); FILE *Pf=fopen("Fis_Text.Dat","w");while (Citit(Nume,Prenume)) fprintf(Pf,"%s %s\n",Nume,Prenume);

    fclose (Pf); getche();}

    Ex.2:

    // Creare fiier text cu format (articole : (Den, Cant, Pre)) \\#include #include

    void main (void){ FILE *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 fiier text \\

    10.04.13 37

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    38/138

    C++

    POO

    #include #include void main (void){ FILE *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. Intrri/Ieiri de iruri de caractere (FGetS, FPutS)

    char *fgets ( char*s, intn, FILE * Pf ) ;unde:

    s - zona receptoare (tablou de tip char de dimensiune n, terminat cuNUL=\0),

    n-1 - numr maxim de caractere (n-1),

    Funcia returneaz adresa irului s, sau la EOF returneaz NULL.

    int fputs ( char*s, FILE * Pf ) ;

    Funcia returneaz codul ultimului caracter scris sau -1 la eroare.

    Urmtorul program nlocuiete cuvintele din fiierul F_Niv_S.Cpp aflate n parteastng a dicionaruluiDicio.Txtcu cele corespunztoare din partea dreapt, rezultatul fiinddepus n fiierulF_Niv_S.Pas, aa cum se poate vedea n schema de mai jos.

    10.04.13

    Fin_Niv_S.Cpp Dictio.Txt

    Fin_Niv_S.Pas

    Traduce

    38

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    39/138

    C++

    POO

    // Traduce Fiier 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    40/138

    C++

    POO

    unde d ep las amne t i origine au aceeai semnificaie ca i la funcia lseek.

    Funciafseekreturneaz 0 la poziionare corect sau o valoare 0 la eroare.

    long ftell ( FILE * Pf );

    Funciaftellreturneaz poziia curent (fa de nceputul fiierului, n octei).

    10.2.7. Prelucrarea fiierelor binare (FRead, FWrite)

    Acest tip de prelucrare permite transferul mai multor articole aflate ntr-o zontampon astfel:

    unsigned fread (void*Pzt, unsigneddim, unsignednrart, FILE * Pf) ;unde:

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

    unsignedfwrite (const void*Pzt, unsigneddim, unsignednrart, FILE * Pf) ;

    Ambele funcii returneaz numrul 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    41/138

    C++

    POO

    11. Funcii standard

    11.1. Macrouri de clasificare

    Macrourile din aceast categorie (aflate n fiierulctype

    .h

    ) verific dac un caractereste de un anumit tip:

    int isascii (intcar); car [0,127] ?int isalpha (intcar ); car este codul unui caracter alfanumeric ?int isalnum (intcar ); car este codul unei litere ?int isupper (intcar ); car este codul unei litere mari ?int islower (intcar ); car este codul unei litere mici ?int isdigit (intcar ); car este codul unei cifre zecimale ?int isxdigit (intcar ); car este codul unei cifre hexa ?int isgraph (intcar ); car este codul unui caracter afiabil ?

    int isprint (intcar ); car este codul unui caracter imprimabil ?int isspace (intcar ); car este spaiu, tab, Cr, Lf, Vt sau Np ?

    11.2. Macrouri de transformare a simbolurilor

    Macrourile din aceast clas (aflate n fiierul ctype.h) transform un caracter astfel:

    int toascii (intcar); car [0,127] (returneaz ultimii 7 bii)int toupper (intcar); car liter mare (transform din l n L)int tolower (intcar); car liter mic (transform din L n l)

    11.3. Conversii

    Funciile care urmeaz (aflate n fiierul stdlib.h) realizeaz conversii far format.

    Format intern Format (zecimal) externint atoi (const char*p t r ); binar (int) zecimal extern long atol (const char*p t r ); binar (l ong) zecimal externdoubleatof (const char*p t r ); virgul flotant (dubl precizie) zecimal extern

    Format extern Format internchar*itoa (intv,char*s , intb); svb (valoarea v de tip int, scris n baza b)char*ltoa (longv,char *s , intb); svb (valoarea v de tip longscris n baza b)

    10.04.13 41

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    42/138

    C++

    POO

    11.4. Funcii de prelucrare a irurilor de caractere

    Funciile din aceast categorie se afl n fiierul string.h.

    11.4.1. Copiere (Str[n]Cpy)

    char *str[n]cpy (char*destinaie, const char*sursa [, unsignedn]) ;unde su rsa este copiat n des tina ie, eventual doar primii n octei (cel mult n).

    11.4.2. Concatenare (Str[n]Cat)

    char *str[n]cat (char*destinaie, const char*sursa [, unsignedn]) ;

    unde sur sa este copiat la sfritul dest ina ie i, eventual doar primii n octei ai sursei.

    11.4.3. Comparare (Str[n][i]Cmp)

    int str[n][i]cmp (char*ir1, const char*ir2[, unsignedn]) ;

    unde ir1 este comparat cu ir2(eventual doar primii n octei, i eventual ignornd diferenadintre literele mari i cele mici), iar rezultatul comparrii este un numr negativ dacir1ir2 sau zero dac ir1=ir2.

    11.4.4. Lungimea unui ir (StrLen)

    unsigned strlen (char*ir) ;

    returneaz lungimea irului (de caractere, fr caracterul NUL care l termin).

    11.5. Funcii de calcul

    Aceste funcii se afl n fiierul math.h (abs i labs i n stdlib.h *):

    Prototip Semnificaie doublelog(doublex); ln(x)

    doublesin (doublex); sin(x) doublelog10(doublex); lg(x)

    doublecos (doublex); cos(x) doubleceil(doublex); [x]doubleasin (doublex); arcsin(x) doublefloor(doublex); trunc(x)doubleacos (doublex); arccos(x) doublefabs (doublex); |x|doubleatan (doublex); arctg(x) int abs (intx); * |x|doublesinh (doublex); sh(x) long labs (longx); * |x|double cosh (doublex); ch(x) doubleatan2(doubley ,doublex); arctg(y/x)doubletanh (doublex); th(x) doublepow (doublex,doubley); x y

    doublesqrt(doublex); x doublecabs (struct complexz); |z|

    doubleexp (doublex); ex doublepoly (doublex , intn,double a[]); P(x)

    11.6. Funcii pentru controlul proceselor

    Urmtoarele funcii se afl n fiierele stdlib.h i process.h .

    Prototip Semnificaievoid abort(void); termin un program la eroare

    void exit(intcod_retur); termin un program returnnd un cod de retur

    10.04.13 42

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    43/138

    C++

    POO

    int system (const char *comand); execut o comand i returneaz cod_retur(0=Ok).

    11.7. Funcii pentru timp

    Aceste funcii se refer la dat i or, i sunt definite n fiierul dos.h mpreun cuurmtoarele dou tipuri:

    struct date {

    int da_year;

    int da_day;

    int da_mon;

    }

    struct time {unsigned charti_min;unsigned charti_hour;unsigned charti_hund;unsigned charti_sec;

    }

    Semnificaie Prototip

    Citete Data curent : voidgetdate (struct date *Data);

    Modific Data curent : void setdate (conststructdate *Data); Citete Ora Exact : voidgettime (struct time *OraExact); Modific Ora Exact : void settime (conststructtime *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. Funcii diverse

    Aceste funcii sunt definite n fiierul conio.h:

    Prototip Semnificaie 3. voidsleep (unsignedsec); Wait (sec)

    1. voidclrscr(doublex); Clear Screen 4. voidsound(unsignedHz); Sound (Fr)

    2. voiddelay (unsignedms ); Wait (ms) 5. voidnosound(void); NoSound

    10.04.13 43

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    44/138

    C++

    POO

    12. Ecranul n mod text

    Exist posibilitatea de a defini urmtoarele moduri de lucru:

    void textmode ( int mod ) ;

    unde mod poate fi C40 (=1 pentru 40 coloane), C80 (=3 pentru 80 coloane), C4350(=64 pentru 43/50 linii), i altele.

    Definirea uneiferestre ecran (implicit este tot ecranul) se realizeaz astfel:

    void window ( intu1, intv1, intu2, intv2) ;

    tergerea uneiferestre ecran:

    void clrscr (void) ;

    Poziionarea cursorului:

    voidgotoxy ( intx, inty) ; // col, lin

    Poziia cursorului:

    int wherex( void ) ; // col

    int wherey ( void) ; // lin

    Un caracter poate fi afiat pe ecran clipitor (BLINK=1), pe o culoare defond(0-7)i ntr-o anumit culoare descriere (0-15), culorile posibile fiind urmtoarele:

    Colori nchise Colori deschise0 = BLACK 8 = DARKGRAY1 = BLUE 9 = LIGHTBLUE2 = GREEN 10 = LIGHTGREEN3 = CYAN 11 = LIGHTCYAN4 = RED 12 = LIGHTRED5 = MAGENTA 13 = LIGHTMAGENTA6 = BROWN 14 = YELLOW7 = LIGHTGRAY 15 = WHITE

    Culoarea defondse poate stabili prin funcia:

    void textbackground ( intculf ) ; // cul f {0,. . . ,7}

    Culoarea descriere se poate schimba printr-un apel de forma:

    void textcolor ( intcul s ) ; // culs {0,. . . ,15}

    13. Ecranul n mod grafic

    Trecerea n modul grafic:

    void farinitgraph ( int far *graphdriver, int far *graphmode, char far *path) ;

    10.04.13 44

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    45/138

    C++

    POO

    Ieirea din modul grafic:

    voidclosegraph (void) ;

    Setarea /Citirea culorii defond:

    void farsetbkcolor (intcul f) ; / int fargetbkcolor (void) ;

    Setarea /Citirea culorii descriere:

    void farsetcolor (intculs ) ; / int fargetcolor (void) ;

    Alte funcii:

    Semnificaie Funcii

    Numr de pixeli ( Oriz./Vert.) getmaxx (); getmaxy (); Coordonatele LPR (Ultimul Punct Referit) getx (); gety (); Mut LPR (Abs./Rel.) moveto (x,y); moverel(dx,dy); Traseaz segment din LPR lineto (x,y); linerel(dx,dy);

    Traseaz segment line (x1,y1, x2,y2); Deseneaz dreptunghi rectangle (x1,y1, x2,y2); Deseneaz cerc circle (x,y,r); Scrie mesaj [ din LPR ] outtext[xy] ([x,y,]mesaj); Pagin activ / Pagin vizual setactivepage (pag); setvisualpage (pag);

    Exemple:

    #include // Graficul unei suprafee \\#include "graf.h"#include # inc lude # inc lude # inc lude

    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; InitGraf(); ViewPort(10,10,getmaxx()-10,getmaxy()-10);

    float l=3; float x1=-l; float x2=l; float y1=-l; float y2=l; // Dom (x,y) DefPr(1./2,1); // DefPr (r,a)

    a=PrX(x1,z(x1,y1)); b=a; c=PrY(y1,z(x1,y1)); d=c;for (i=0; i

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    46/138

    C++

    POO

    Window(a,d,b,c); setbkcolor(BLUE);for (i=0; i

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    47/138

    C++

    POO

    float a, b, c, d ; // Windowfloat Raza, Alfa; // Pr (r,)

    int u (float x) { return ((x-a)/(b-a)*(u2-u1)+u1); }int v (float y) { return ((y-d)/(c-d)*(v2-v1)+v1); }

    voidInitGraf(void)

    { int Gd = DETECT, 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; }

    voidMuta(float x,float y){ moveto(u(x),v(y)); }

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

    voidDefPr(float r, float a){ Raza=r; Alfa=a; }

    floatPrX(float x, float z){ return x+Raza*z*cos(Alfa); }

    floatPrY(float y, float z){ return y+Raza*z*sin(Alfa); }

    10.04.13 47

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    48/138

    C++

    POO

    14. Faciliti C++

    Limbajul C++ ofer n plus fa de limbajul C unele faciliti noi. Un avantajimportant l constituie noiunea de clas (prin care se definete un TAD), iar acestea pot

    forma o ierarhie, deci putem vorbi de o programare orientat obiect.

    14.1. Extensii ale limbajului C

    n C++ exist un nou tip de comentariu (deja utilizat n exemplele anterioare):

    . . . // Comentariu

    Dac n limbajul C declaraiile erau scrise nainte de instruciuni, n C++ ele pot fiscrise oriunde.

    Dispozitivelor standard de intrare-ieire li s-au ataat streamurile standard cin(pentrustdin) i respectiv cout(pentru stdout), care permit efectuarea operaiilor de intrare-ieire aplicnd operatorul >> streamului cin, respectiv i; cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    49/138

    C++

    POO

    14.2. Operatori

    14.2.1. Operatorul de rezoluie (::)

    Acest operator (::) se utilizeaz cnd dorim s referim o variabil global redefinit

    ntr-o funcie, astfel:::Variabil

    Exemplu:#include ;#include ;

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

    unsigned x; // Variabile Locale

    int y;cout > ::x >> x;cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    50/138

    C++

    POO

    Exemple:

    #include ; / / Redefinirea une i variabile#include ;

    void main (void)

    { int a[1]; int * b = a; int &c = a[0];

    cout > a[0];cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    51/138

    C++

    POO

    {int *i = new int;

    cout > *i;cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    52/138

    C++

    POO

    14.3. Structur, uniune i enumerare

    Referirea acestor tipuri se poate face n C++ fr a mai fi nevoie de cuvntulcorespunztor struct, union, respectiv enum. De asemenea, parametrii i valoarea uneifuncii pot fi structuri, pointeri la structuri sau referine la structuri. Sunt permise i

    atribuiri de structuri.Referirea componentelor unei uniuni anonime din interiorul unei structuri se face la

    fel ca i referirea componentelor structurii, iar prima component se poate iniializa.

    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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    53/138

    C++

    POO

    // 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    54/138

    C++

    POO

    15. Funcii C++

    15.1. FunciiInline

    Aceste macrouri se pot defini astfel:

    # define numem(List_parametri_formali) ir_caractere

    Apelurile macrourilor se vor nlocui cu irul de caractere precizat, fr a faceverificri de tipuri, ceea ce poate conduce la erori.

    Aceste erori pot fi eliminate dac utilizm funciile inline, caz n care se vor faceconversiile de tip necesare. Aceste funcii se declar prin scrierea cuvntului inline lanceputul antetului, aa cum se pate vedea n exemplele urmtoare:

    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 corectinlinelongAbs (long x) // Functie Inline{

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

    cout > x; long y=-x;cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    55/138

    C++

    POO

    15.2. Funcii de tip referin

    Antetul unei funcii cu valoare de tip referin este:

    tip & numef(List_parametri_formali)Exemplu:

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

    int & Alba_Neagra ( int & Albe, int & Negre ) // Ref. la int{ if (random(2)) returnAlbe; // Ref. la Albe

    else returnNegre; // Ref. la Negre

    }

    void main (void)

    { int Albe=0; int Negre=0; int i,n; randomize();

    cout > n;

    for(i=1;i

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    56/138

    C++

    POO

    / / E x . R e f e r in \ \#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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    57/138

    C++

    POO

    15.3. Suprancrcarea funciilor

    Aceast proprietate d posibilitatea utilizrii unor funcii avnd acelai nume, dardiferite (nrudite, cu antete diferite).

    Exemple:#include ; #include ; #include ; #include ;

    doubleArcTg (double x) { return atan (x); }doubleArcTg (double y, double x) { return atan2(y,x); }doubleArcTg (complex z) { return real (atan(z)); }

    void main (void){ complex w(1,0);

    cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    58/138

    C++

    POO

    15.4. Iniializarea parametrilor formali

    Parametrii formali pot avea o valoare implicit, dac acetia lipsesc din listaparametrilor actuali, valoare dat de o expresie. n lista parametrilor formali, cei cu valoareimplicit (iniializai) se vor scrie ultimii astfel:

    tip nume = expresie

    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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    59/138

    C++

    POO

    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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    60/138

    C++

    POO

    #include #include "crt.h"

    struct Punct { float x, y; Punct () { cin >> x >> y; }

    void TipP() { cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    61/138

    C++

    POO

    n exemplul urmtor, pentru Tad Mulime, fiierele vor fi PMult.Cpp, Mult.h iMult.Cpp:

    // PMult.Cpp \\#include #include

    #include "Mult.h"void main (void){ clrscr();Multime A, B, C, D;Init(A); Init(B); Init(C); Init (D);cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    62/138

    C++

    POO

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

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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    63/138

    C++

    POO

    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;

    }

    // ElMult.h \\#define Cm 255typedef int TEl; // Tipul elementelor mulimii

    Un tip abstract de dat realizeaz o unificare (printr-o grupare de tip struct) ntredate (date membru) i operaiile (funcii membru) lor caracteristice. Funciile membru suntconsiderate de tip inline iar definirea lor n afara structurii se face prin operatorul derezoluie (::). n acest mod ns nu se realizeaz o protecie a datelor (accesul la date se

    poate face i prin alte funcii, nu numai prin cele membru), aceast protecie putnd firealizat (aa cum vom vedea n cele ce urmeaz) cu ajutorul claselor.

    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::Aria () { return Pi*r*r; }

    void main (void){ Cerc C; C.Init(1,2,3);

    cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    64/138

    C++

    POO

    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 unei clase,c) Clasele sunt legate (asociate) unele cu altele prin motenire.

    Un limbaj este orientat obiect dac:a) Utilizeaz obiecte,b) Oblig obiectele s aparin unei clase,c) Permite motenirea.

    Limbajul C++ ofer noiunea de clas, prin care se pot forma ierarhii, deci putem

    vorbi de oprogramare orientat obiect(OOP).OOP nseamn realizarea unor programe alctuite dintr-o mulime de obiecte care

    interacioneaz pentru a rezolva problema propus, i permite reutilizarea elementelordescrise (a interfeei i a codului).

    Un obiect are o stare i un comportament (operaii descrise n interfaa obiectului)aceste dou componente fiind definite prin datele membru (variabile de instan) irespectiv prinfunciile membru (metode).

    OOP utilizeaz ormtoarele concepte:

    c l a s a - implementarea unui TAD, o b i e c t u l - instana unei clase,

    m e t o d a - mesajulprin care se asigur interfaa (operaiile).

    OOP are urmtoarele caracteristici (proprieti) de baz:

    ncapsularea - gruparea datelor i a operaiilor definite pentru acestea, precum i proteciaacestor date (ele neputnd fi accesate dect prin funciile membru).

    motenirea -pstrarea elementelor (date i funcii ale) unei clase (de baz), cu definireade noi elemente construind o nou clas (derivat), formnd n felul acestaierarhii de clase. Motenirea poate fi i multipl dac o clas motenetemai multe clase.

    polimorfism - redefinirea (suprancrcarea) operaiilor (funciilor). ntr-o ierarhie pot fimai multe funcii cu acelai nume, deci va fi efectuat operaia

    corespunztoare obiectului care o apeleaz. Determinarea operaiei sepoate face la compilare (legare static) sau la execuie (legare dinamic,prinfuncii vituale).

    10.04.13 64

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    65/138

    C++

    POO

    17.1. Definirea Claselor

    O clas se declar ca i o structur, nlocuind cuvntul struct cu class. Proteciadatelor se definete scriind modificatorul dorit (private,protectedsaupublic) urmat de :.

    Descrierea unei clase conine att datele membru (variabilele de instan) ct i

    funciile membru (metodele), preciznd pentru acestea gradul de protecie, astfel:

    classNume_clas {{ [Modificator_de_protecie: ]List_membrii}

    };

    unde:

    Modificator_de_protecie { private,protected,public} , private fiind implicit,

    private nu permite accesul din afara clasei,

    protectedpermite accesul din clasele derivate, #

    publicpermite accesul din afara clasei; +

    List_membrii {List_declaraii_date_membru, List_ declaraii _funcii_membru }

    Datele de tip private () pot fi accesate doar de funciile membru sau funciiprietene (friend). O funcie membru a unei clase poate fi funcie prieten a altei clase, iar

    dac toate suntprietene, atunci se poate declara clasprieten(friend). // Vezi C8Fiecare obiect al unei clase deine un set de date membru (variabile de instan).Funciile membrupublice pot fi utilizate din orice funcie din program, pe cnd cele

    private doar din funciile membru ale clasei.

    Definirea funciilor membru (metodelor) se poate realiza:a) imediat (complet, antetplus corp) n definiia clasei (ca funcie inline) dac funcia nu

    conine multe instruciuni i nu conine structuri repetitive (apelul nu se face prin salt curevenire), astfel:

    class Nume_clas { Tip_funcieNume_metod ( ... ) { . . . }; //antet+corp

    };

    b) ulterior (dac a fost declarat n definiia clasei doar prototipul funciei), utilizndoperatorul de rezoluie (de scop) astfel:

    Tip_funcieNume_clas:: Nume_metod ( ... )// :: operatorul derezoluie

    { . . . }; // corpul funciei

    10.04.13 65

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    66/138

    C++

    POO

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

    # include # include

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

    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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    67/138

    C++

    POO

    Alocarea (i iniializarea) obiectelor se face cu o funcie membru specific numitconstructor(cu numele Clas) iar dealocarea cu o funcie destructor(cu numele ~Clas).

    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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    68/138

    C++

    POO

    Componentele claselor (datele i funciile membru) se refer prin operatorul sau

    >, ca i n cazul unei structuri. Funciile membru refer direct componentele clasei (fraceti operatori, utiliznd poinetrul this declarat automat ca pointer la obiectul curent).

    Exemplu:

    // Operatorii 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=Px; y=Py; }

    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; // MCfor (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();}

    10.04.13 68

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    69/138

    C++

    POO

    17.2. Constructori i Destructori

    Un obiect este creat de un constructor al clasei i este ters (distrus) de ctredestructor.

    Constructoriipermit iniializarea obiectelor cu (mai multe) funcii membru omonime(avnd acelai nume cu clasa i care difer prin lista parametrilor formali), fr a returna ovaloare. Constructorul este apelat automat la crearea unui obiect. O clas trebuie sconin cel puin doi constructori:

    un constructor implicit (fr parametri, care iniializeaz obiectele cu o valoareimplicit),

    un constructor de copiere(care iniializeaz cu valoarea unui obiect existent, de acelaitip).

    Exemplu:// Constructori String \\

    # include # include # include

    class String { char* s;public:

    String (); // Constructor implicitString (const String&); // Constructor de copiereString (const char*); // Constructor de conversieString& operator=(const String&); // Operator de atribuire~String (); // Destructor

    int Length (); // Lungimea siruluivoid 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    70/138

    C++

    POO

    Antetulunui constructoral unei clase ce conine ca date membru obiecte alte altorclase este de forma:

    Clas (List_par_formali) : Obiect1(List_par_formali1),...,Obiectn(List_par_formalin)

    Exemplu:#include ; #include ; #include ;class P3D { float x,y,z;

    public:P3D () {x=0;y=0;z=0;}P3D (float x0, float y0, float z0) {x=x0;y=y0;z=z0;}void Tip(){ cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    71/138

    C++

    POO

    n exemplul urmtor se poate urmrii momentul n care acioneaz constructorul idestrucorul:

    / / Obiecte alocate dinamic ( operatorul d e l e t e )

    #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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    72/138

    C++

    POO

    18. Specificareaclaselor Limbajul UML(Unified Modeling Language)

    UML specific entitile (clasele) dintr-un program i relaiile dintre ele astfel: Specificarea entitilor:

    numele clasei, date membru -protecie nume_dat : tip funcii membru -protecie nume_funcie (tip par.formali) : tip_funcie

    (protecie poate fi(private), # (protected) sau + (public) ).

    Specificarea relaiilor dintre clase :

    relaia de asociere : // prietenie

    relaia de derivare : // motenire

    10.04.13 72

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

    numele claseidate

    membrufuncii membruExemplu:

    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 ( )

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    73/138

    C++

    POO

    1 9 . Fu n c i i i C l a se Pr i e t en e (Fr i e n d )

    O funcie este prieten cu o clas dac are acces la datele membru private aleacelei clase. O funcie prieten poate fi o funcie global sau chiar o funcie membru aaltei clase.

    O clas este prieten cu o alt clas dac ea are acces la datele membru aleacesteia.

    O funcie, respectiv o clasprieten se declar utiliznd cuvntul friend astfel:

    a) friend Tip_funcie Nume_funcie(List_parametri_formali); // Funciefriendglobal

    b) friend Tip_funcie Nume_clas::Nume_funcie(List_par._formali); // Funciefriendmembruc) friend Nume_clas; // Clas friend

    Urmtorul exemplu, nu este corect, deoarece elementul C.y nu este accesibil:

    // Funciefriendmembru

    # 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)

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    74/138

    C++

    POO

    Exemple:

    // Functie globala friend \\# 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 PunctMijloc(Punct,Punct); // Functii globale

    friend PunctAfin (Punct,Punct,float); // f r i e n d};

    PunctMijloc (Punct A, Punct B) { Punct M (int((A.x+B.x)/2),int((A.y+B.y)/2));

    return M; }PunctAfin (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 Mijlocs () { returnMijloc(A,B);} //::MijlocPunct Afins (float t) { returnAfin(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); // BC

    Segment* CA = new Segment (*C,*A); // CAfor (float Alfa=0; AlfaAfins(Alfa));Punct* Q=new Punct(CA->Afins(Alfa));Segment*PQ = new Segment (*P,*Q);PQ->Mijlocs(); delay(22); // [Punct M=]delete PQ; delete P; delete Q;

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

    }

    10.04.13 74

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    75/138

    C++

    POO

    // Functie membru friend \\# 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;

    }

    10.04.13 75

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    76/138

    C++

    POO

    // Clasa friend \\# 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 CentruGr(){ 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    77/138

    C++

    POO

    20. M e m b r i s t a t i c i (St a t i c) // $ :

    Fiecare obiect dintr-o clas deine toate datele membru (atributele) acesteia. Existns posibilitatea ca toate instanele unei clase s dein anumite atribute comune tuturorobiectelor clasei respective. Aceti membri (date, funcii) statici au acelai regim de

    protecie ca i ceilali membrii.

    20.1. Atribute (Date membru)Statice // $ :

    Datele membru statice, care urmeaz s fie utilizate de ctre toate obiectele clasei,se definescprin specificatorul static astfel:

    classNume_clas { static List_Declaraii_date_membru ; // $ :

    };

    Datele membru statice, se declar (se iniializeaz) explicit n afara clasei:Tip_dat_membru Nume_clas::Dat_membru [ = Valaore ];

    Referirea (utilizarea)datelor membru statice se poate face astfel:

    a) Nume_clas ::Dat_membru // Referire natural (global) la clasb) ObiectDat_membru // Referire particular la un obiect

    c) Pointer_Obiect>Dat_membru // Referire particular prin pointern urmtorul exemplu, se numr cte Puncte sunt utlizate la un moment dat n

    program, utiliznd ca dat comun pentru toate punctele (ntreaga clas)Nr_Ob:

    // Membru Static# 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 iniializeaz

    10.04.13 77

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    78/138

    C++

    POO

    void main (void){ Punct A,B; clrscr();

    cout

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    79/138

    C++

    POO

    20.2. Metode (Funcii membru) Statice // $ :

    Metodele (Funciile membru) statice, acioneaz doar asupra atributelor statice(ale claselor), deci nu pot aciona asupra atributelor obiectului curent (deoarece nu li setransmite poinetrul this). De asemenea ele pot apela doar metodele statice. Pot ns aciona

    asupra atributelor unui anumit obiect prin operatorii sau >. Metodele statice, sedefinescprin specificatorul static astfel:

    classNume_clas { static Tip_funcie Nume_funcie(List_par_formali) // $ :

    };

    Referirea (utilizarea)metodelor statice se face astfel:a) Nume_clas ::Funcie_membru(List_par_actuali) // Referire naturalla clasb) Obiect Funcie_membru (List_par_actuali) // Referire la un obiect

    c) Pointer_Obiect> Funcie_membru(List_par_actuali) // Referire prin pointern urmtorul exemplu, se determin fereastra real (definit prin cele dou puncte

    diagonal opuse St_Sus, Dr_Jos) utiliznd funciile staticeMinX, 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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    80/138

    C++

    POO

    Definirea unuipointer la o metod se poate face astfel:

    Tip_funcie (Nume_clas :: *Nume_Pointer)(List_par_formali) // sau cu typedef

    Iniializarea unuipointer la o metod se poate realiza astfel:

    Nume_Pointer=& Nume_clas ::Nume_Metod; // se pot realiza i la definire

    Referireaunuipointer la o metod(apelarea metodei) :

    (Nume_Obiect.*Nume_Pointer)(List_par_actuali)

    De exemplu, pentru programul anterior, modificrile necesare pentru a putea apelacele dou metodeMuta i Trag ale clasePunctpot fi urmtoarele:

    / / P o i n t e r i l a m e t o d eclass 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)(); // DefinireP_Met Pm[2] = {&Punct::Muta,&Punct::Trag}; // Iniializare

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

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

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    81/138

    C++

    POO

    Un alt exemplu, care utilizeaz pointeri la metode (Triun, Drept i Romb) esteurmtorul:

    / / 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 { 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 Triun () { setcolor(WHITE); Muta();

    moverel(0,-3); linerel(-2,5);linerel(4,0); linerel(-2,-5);}

    void Drept () { setcolor(LIGHTRED); Muta();moverel(-2,-2); linerel(0,4);linerel(4,0); linerel(0,-4);linerel(-4,0);}

    void Romb () { setcolor(YELLOW); Muta();moverel(0,-3); linerel(-2,3);linerel(2,3); linerel(2,-3);linerel(-2,-3);}

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

    };

    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 x0 (float t) { return cos(4*t)*cos(t); } // x(t)float y0 (float t) { return cos(2*t)*sin(t); } // y(t)float x1 (float t) { return cos(2*t)*cos(t); } // x(t)float y1 (float t) { return cos(4*t)*sin(t); } // y(t)float x2 (float t) { return cos(t); } // x(t)float y2 (float t) { return sin(t); } // y(t)

    void main (void){ int i,j, n=300; float Pi=3.14153; Grafic Mod(DETECT);

    Punct P[3][301];typedef float (*Functie)(float);

    Functie x[3]={&x0,&x1,&x2} ,y[3]={&y0,&y1,&y2};for (j=0; j

  • 7/28/2019 Programare Orientata Pe Obiecte (C++)

    82/138

    C++

    POO

    22. Suprancrcarea operatorilor

    Anumite operaii se pot exprima mult mai bine prin operatori. Nu se pot defini

    operatori noi, dar se pot suprancrca cei existeni ( +, , [ ], ( ), new,