Documente Academic
Documente Profesional
Documente Cultură
Silviu GNCU
Metodologia rezolvrii
problemelor de informatic n
stilul orientat pe obiecte
ISBN 978-9975-76-085-0.
Prefa
Autorul
3
Sugestii metodologice
1. Modelul orientat pe obiecte
Conform Grady Booch tehnologia orientat pe obiecte a fost conceput n
baza principiilor de abstractizare, incapsulare, modularitate, ierarhizare, tipizare,
paralelilism i persisten. Ceea ce este important const n faptul c aceste principii
se regsesc n modelul orientat pe obiecte.[4, p.25].
1. Abstractizare - procesul care capteaz caracteristicile eseniale ale unui
obiect, caracteristici ce difereniaz acest obiect de toate celelalte tipuri de obiecte.
Prin abstractizare se rezolv problemele cu un grad sporit de complexitate.
Abstractizarea se manifest prin determinarea similaritii dintre anumite obiecte,
situaii sau procese din lumea real i n luarea deciziilor, ignornd pentru moment
deosebirile dintre obiecte;
2. Incapsulare - procesul mental executat pe o abstractizare n care elementele
structurale ale abstractizrii sunt izolate de cele ce constituie comportamentul su.
Servete la separarea interfeei vizibile a unei abstractizri de implementarea sa;
3. Modularitate - procesul de divizare a unui sistem complex n pri (module)
manevrabile. Modularitatea este caracteristica de divizare a programului n mai multe
uniti care sunt compilate separat, dar simultan i comunic ntre ele;
4. Ierarhizare - procesul de clasificare pe nivele de abstractizare;
5. Tipizare reprezint un mod de protejare a obiectelor. Prin intermediul
tipizrii se face distincie dintre obiectele diferitor clase, astfel obiectele nu pot fi
schimbate sau, n unele cazuri, aceast schimbare este limitat;
6. Concurena (paralelism) este o proprietate, prin intermediul creia se
permite ca mai multe obiecte diferite s fie n execuie n acelai timp. Sistemele care
implic concurena sunt sisteme cu procesoare multiple, n care mai multe procese
sau thread-uri (fire de execuie) pot fi executate concurent pe procesoare diferite.
7. Persistena este proprietatea obiectelor care implic existena acestora i
dup ncetarea procesului care le-a creat. Starea obiectului i codul corespunztor
metodelor sunt memorate n baza de date. Tipurile obiectelor pot fi declarate
persistente prin folosirea cuvntului cheie persistent la momentul declarrii, variabila
fiind i ea constrns la un tip persistent.
Eseniale pentru limbajele de programare orientate pe obiect sunt primele patru
caracteristici. Un limbaj de programare este orientat pe obiecte dac susine primele
patru caracteristici.
2. Caracteristici ale programrii orientate pe obiecte
Din perspectiva programrii, rezolvarea unei probleme se poate face pe 3
direcii:
4
if(a.perimetru()<b.perimetru())a.afisare();
else b.afisare();
}
mai mic sau egal dect 8 ani i 25%, dac stagiu este mai mare dect 8 ani), Salariu
primit (se va determina conform formulei: salariu calculat+spor).
De la tastatur se citesc datele despre n angajai. S se afieze:
a) Lista tuturor angajailor;
b) Lista angajailor cu un stagiu mai mare dect 10 ani;
c) Lista angajailor cu un salariu mai mare dect 1000;
2. Constructori
Clas-pereche este numit o clas cu dou date, care de obicei sunt dou
numere n1 i n2. Este necesar de a elabora un program, prin intermediul cruia se va
crea tipul de date clas-pereche. n toate sarcinile trebuie s fie prezente:
a) Trei tipuri de constructori: fr parametri, cu parametri, de copiere;
b) Destructorul;
c) Metoda de citire;
d) Metoda de afisare;
Toate aceste condiii necesit a fi respectate pentru urmtoarele cazuri.
Problem exemplu Cmpul n1 - numr real, Cmpul n2 numr real. Creai
metoda suma() va returna suma numerelor.
Rezolvare :
#include<iostream.h>
class numar{
double n1,n2;
public:
numar(){n1=n2=0;}
numar(double a,double b){n1=a;n2=b;}
numar(numar&);
void citire();
void afisare();
double suma();
~numar(){cout<<"Obiectul a fost distrus !!!"<<endl;}
};
numar::numar(numar &c){// constructor de copiere
n1=c.n1;n2=c.n2;
}
void numar::citire(){
cout<<"Dati doua numere"<<endl;
cin>>n1>>n2;
}
void numar::afisare(){
cout<<"Valorile "<<n1<<" "<<n2<<" Suma="<<suma()<<endl;
}
double numar::suma(){return n1+n2;}
main(){
12
4. Creai clasa prism (baza este dreptunghi), derivata clasei triad. Pentru clasa
prism vor fi implementate metodele de determinare a suprafeei totale, laterale i de
determinare a volumului.
De la tastatur se citesc datele despre n prisme. Elaborai un program prin
intermediul cruia, la ecran se vor afia datele despre toate prismele, prisma cu
suprafa maxim, prisma cu volumul maxim.
5. Creai clasa piramid (baza este dreptunghi), derivata clasei triad. Pentru
clasa piramid vor fi implementate metodele de determinare a suprafeei totale,
laterale i de determinare a volumului.
De la tastatur se citesc datele despre n piramide. Elaborai un program prin
intermediul cruia, la ecran se vor afia datele despre toate piramidele, piramida cu
suprafa maxim, piramida cu volumul maxim.
B. n calitate de clas de baz se va crea clasa persoana.
date: nume, prenume, anul, cnp (codul personal de 13 cifre);
metode : citire, afiare, virsta.
6. Creai clasa Salariat, derivata clasei persoana. Pentru clasa salariat vor fi
adugate:
date: numrul de ore lucrate, plata pentru o or, anul angajrii;
metode: vor fi redefinite metodele de citire i afiare, salariu. Salariul va fi
determinat conform formulei : nr_ore*plata.
De la tastatur se citesc datele despre n salariai. Elaborai un program prin
intermediul cruia la ecran se vor afia datele despre toi salariaii, salariatul cel mai
tnr i salariatul cu salariu maxim.
7. Creai clasa Student, derivata clasei persoana. Pentru clasa student vor fi
adugate:
date: media notelor curente, grupa;
metode: vor fi redefinite metodele de citire i afiare, bursa. Bursa va fi
determinat conform fomulei: media*75 lei, dac media este mai mare dect 7.5, n
caz contrar va fi 0.
De la tastatur se citesc datele despre n studeni. Elaborai un program prin
intermediul cruia la ecran se vor afia datele despre toi studenii, studentul cel mai
tnr, studentul cu bursa maxim.
8. Creai clasa Sofer, derivata clasei persoana. Pentru clasa ofer vor fi
adugate:
16
c)
d)
e)
f)
g)
h)
i)
2. Se consider drept baz clasa doi (va avea n calitate de date dou numere
reale). n baza acestei clase se deriv clasele dreptunghi i triunghi_dreptunghic. S
se implementeze polimorfismul pentru metodele: citire, afiare, suprafaa i
perimetru. De la tastatur se citete numrul de figuri. Elaborai un program care va
permite :
a) citirea figurilor de la tastatur;
b) afiarea acestora;
c) afiarea figurilor sub form de dreptunghi;
d) afiarea figurilor sub form de triunghi;
e) afiarea figurii cu suprafa maxim;
f) afiarea figurii cu perimetru maxim;
g) afiarea perimetrului total al figurilor;
h) afiarea suprafeei totale a figurilor;
i) sortarea figurilor n ordine descresctoare suprafeei.
3. Se consider drept baz clasa tread (va avea n calitate de date dou numere
reale i un numr ntreg). n baza acestei clase se deriv clasele paralelogram i
triunghi. S se implementeze polimorfismul pentru metodele: citire, afiare,
suprafaa i perimetru. De la tastatur se citete numrul de figuri. Elaborai un
program care va permite :
a) citirea figurilor de la tastatur;
b) afiarea acestora;
c) afiarea figurilor sub form de paralelogram;
d) afiarea figurilor sub form de triunghi;
e) afiarea figurii cu suprafa maxim;
f) afiarea figurii cu perimetru maxim;
g) afiarea perimetrului total al figurilor;
h) afiarea suprafeei totale a figurilor;
i) sortarea figurilor n ordine descresctoare suprafeei.
18
d)
e)
f)
g)
h)
i)
25
6. Suprancrcarea operatorilor
Problem exemplu. [2, p. 164-168].
1. Se consider clasa timp, cu urmtoarea structur:
class timp{
int ora,min, sec;//14:24:35
public:
timp();
timp(int,int,int);
//
};
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
class TStudent{
char *nume,*grupa;
int anul,id;
double media;
TStudent *next;//adresa umatorului element
TStudent();
friend istream & operator>>(istream &, TStudent *&);
friend ostream & operator<<(ostream &, TStudent*);
friend class lista;
friend int schimb(TStudent *,TStudent *);
};
TStudent::TStudent(){
nume=new char[20];grupa=new char[10];
anul=0;id=0;media=0; next=NULL;
}
istream & operator>>(istream &is, TStudent *&t){
cout<<"Dati datele despre student"<<endl;
cout<<"Id: ";is>>t->id;
cout<<"Nume: ";is>>t->nume;
cout<<"Grupa ";is>>t->grupa;
cout<<"Anul: ";is>>t->anul;
cout<<"Media: ";is>>t->media;
return is;
}
30
Student Angajat despre care se cunosc datele: numele, prenumele, codul fiscal,
grupa, media, numrul de ore lucrate, plata pentru o or.
n calitate de metode vor fi: citirea datelor de la tastatur, afiarea datelor la
ecran, determinarea bursei i a salariului. Metodele bursa i salariu vor efectua
calculele conform formulelor din clasele precedente.
Asupra personalului vor fi efectuate operaii de adugare a unei persoane,
excludere, afiare a tuturor persoanelor din instituie, ct i determinarea bugetului
lunar de salarizare a personalului instituiei.
34
Realizare:
Pe suprafaa formei plasm componentele:
Label1 modificm proprietatea Caption n Suma (lei);
Label2 eliminm textul de la proprietatea Caption i setm dimensiunile
corespunztor;
Edit1 - eliminm textul de la proprietatea Text;
35
Problema2 Termopan
Elaborai o aplicaie, prin intermediul creia va fi posibil de determinat costul
unui geam termopan. Preurile sunt: 1m2 cost 179 lei, pervazul ferestrei cost 39
lei/m. Aplicaia va arta astfel :
Realizare:
Pe suprafaa formei plasm componentele:
Label1 modificm proprietatea Caption n Lungimea (cm);
Label2 modificm proprietatea Caption n Latimea (cm);
Label3 eliminm textul de la proprietatea Caption i setm dimensiunile
corespunztor;
Edit1 - eliminm textul de la proprietatea Text;
Edit2 - eliminm textul de la proprietatea Text;
Button1 modificm proprietatea Caption n Determinare cost;
CheckBox1 - modificm proprietatea Caption n Pervaz;
RadioGroup1 - modificm proprietatea Caption n Geam, iar prin intermediul
proprietii Items introducem simplu i dublu;
36
Problema3 Navigator
Elaborai o aplicaie prin intermediul creia va fi efectuat navigarea n
sistemul de fiiere al calculatorului. Efectund operaia double-click pe numele
fiierului, acesta va fi deschis. Prin intermediul unui buton cu titlul Cauta se va
efectua cutarea fiierelor dup nume, iar datele despre acestea vor fi adugate ntr-o
component de tip TMemo. Componentei de tip TMemo i va fi ataat un meniu
contextual cu titlul Salveaza, efectuarea unui click pe suprafaa acestuia va salva
cutarea n fiierul date.txt aflat n directoriul curent.
Realizare:
Pe suprafaa formei plasm corespunztor componentele:
FileListBox1 pentru afiarea fiierelor;
FilterComboBox1 modificm proprietatea FileList n FileListBox1, prin
intermediul proprietii filter crem urmtorul filtru:
iar
DEPOZITE N MDL
Tipul
Termenul Rata dobnzii Retrageri
depozitului de plasare
anuala
din cont
3 luni
8%
6 luni
9%
Flexibil
12 luni
10%
DA
24 luni
11%
36 luni
12%
3 luni
9%
6 luni
10%
Rentier
12 luni
11%
NU
24 luni
12%
36 luni
13%
DEPOZITE N USD I EUR
3 luni
2%
6 luni
2,5%
Exclusiv
12 luni
3%
DA
24 luni
3,5%
36 luni
4%
3 luni
3%
6 luni
3,5%
Major
12 luni
4%
NU
24 luni
4,5%
36 luni
5%
Forma aplicaiei va arta astfel :
Realizare:
Pe suprafaa formei plasm componentele corespunztor:
ComboBox1 pentru selectarea valutei, prin intermediul proprietii Items
introducem valutele existente: MDL, USD, EUR;
ComboBox2 pentru selectarea termenului de depozit, prin intermediul proprietii
39
Realizare:
Pe suprafaa formei plasm componenta Timer1:
Declaraii:
#include <vcl.h>
#pragma hdrstop
#define R 100
#define rad 0.0174533//unghiul de rotire in radiani
#include "Unit1.h"
#include "DateUtils.hpp"
#include "math.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x0,y0,ahr,amin,asec;
Elaborm funcia:
41
Elaborm funcia:
void desen(){
TDateTime t;
Form1->Canvas->Pen->Color=clBtnFace;
Form1->Canvas->Pen->Width=3;
vector(x0,y0,ahr,R-20);
vector(x0,y0,amin,R-15);
vector(x0,y0,asec,R-7);
t=Now();
ahr=90-HourOf(t)*30-(MinuteOf(t)%12)*6;
amin=90-MinuteOf(t)*6;
asec=90-SecondOf(t)*6;
Form1->Canvas->Pen->Width=3;
Form1->Canvas->Pen->Color=clGreen;
vector(x0,y0,ahr,R-20);
Form1->Canvas->Pen->Width=2;
Form1->Canvas->Pen->Color=clBlack;
vector(x0,y0,amin,R-15);
Form1->Canvas->Pen->Width=1;
Form1->Canvas->Pen->Color=clRed;
vector(x0,y0,asec,R-7);
}
}
Canvas->Brush->Style=bs;
Canvas->Pen->Color=pc;
Canvas->Pen->Width=pw;
desen();
Realizare:
Pe suprafaa formei plasm corespunztor componentele:
Edit1, Edit2 pentru scrierea numerelor complexe, vom seta proprietatea Text cu ir
vid;
Button1, Button2, Button3, Button4 butoane pentru efectuarea calculelor cu numere
complexe, setm proprietatea Caption a fiecrui buton, n mod corespunztor: Suma,
Diferenta, Produsul, Citul;
Label1, Label2 conform figurii;
Label3 pentru afiarea rezultatului, vom seta proprietatea Caption cu ir vid;
Crem tipul de date complex:
class complex{
public:
double x,y;//complex=x+yi
complex(){x=y=0.0;}
complex(double a,double b){x=a;y=b;}
complex(AnsiString s);
friend complex operator+(complex,complex);
friend complex operator-(complex,complex);
friend complex operator*(complex,complex);
friend complex operator/(complex,complex);
complex operator=(complex b){x=b.x;y=b.y;return *this;}
AnsiString ToStr();
friend complex ToComplex(AnsiString);
};
43
complex::complex(AnsiString s){
AnsiString sx,sy,sc;
int a=s.Pos("+");
if(a==0)a=s.Pos("-");
if(a==1){
sc=s.SubString(2,s.Length()-1);
a=sc.Pos("-")+1;
}
sx=s.SubString(1,a-1);
sy=s.SubString(a,s.Length()-a);
x=sx.ToDouble();
y=sy.ToDouble();
}
AnsiString complex::ToStr(){
AnsiString s="";
s=s+AnsiString(x);
if(y>=0)s=s+"+";
s=s+AnsiString(y)+"i";
return s;
}
complex ToComplex(AnsiString s){
complex z(s);
return z;
}
complex operator+(complex a,complex b){
complex c;
c.x=a.x+b.x;
c.y=a.y+b.y;
return c;
}
complex operator-(complex a,complex b){
complex c;
c.x=a.x-b.x;
c.y=a.y-b.y;
return c;
}
complex operator*(complex a,complex b){
complex c;
c.x=a.x*b.x-a.y*b.y;
c.y=a.x*b.y+a.y*b.x;
return c;
}
complex operator/(complex a,complex b){
complex c;
c.x=(a.x*b.x+a.y*b.y)/(b.x*b.x+b.y*b.y);
c.y=(-a.x*b.y+a.y*b.x)/(b.x*b.x+b.y*b.y);
return c;
}
rez="("+a.ToStr()+")"+"+"+"("+b.ToStr()+")"+"="+c.ToStr();
Label3->Caption=rez;
Student Angajat despre care se cunosc datele: nume, prenume, codul fiscal, grupa,
media, numrul de ore lucrate, plata pentru o or.
n calitate de metode vor fi: citirea datelor de la tastatur, afiarea datelor,
determinarea bursei i a salariului. Metodele bursa i salariu vor efectua calculele
45
pl_ora=Form1->plata->Text.ToDouble();}
AnsiString Angajat::afisare(){
AnsiString s=Persoana::afisare();
s=s+functia+" "+FormatFloat("0.00",salariu());
return s;}
double Angajat::salariu(){return ore*pl_ora;}
void Student::citire(){
Persoana::citire();
grupa=Form1->grupa->Text;
media=Form1->media->Text.ToDouble();}
AnsiString Student::afisare(){
AnsiString s=Persoana::afisare();
s=s+grupa+" "+FormatFloat("0.00",bursa());
return s;}
double Student::bursa(){
if(media<7.5) return 0;
else if(media<8.5) return 300;
else if(media<9.5) return 400;
else return 500;}
void Stud_Ang::citire(){
Persoana::citire();
grupa=Form1->grupa->Text;
media=Form1->media->Text.ToDouble();
functia=Form1->functia->Text;
ore=Form1->ore->Text.ToInt();
pl_ora=Form1->plata->Text.ToDouble();}
AnsiString Stud_Ang::afisare(){
AnsiString s=Persoana::afisare();
s=s+grupa+" "+functia+" "+FormatFloat("0.00",bursa()+salariu());
return s;}
class celula{
public:
Persoana *p;
celula *next;
celula(){next=NULL;}
void cit(int);
AnsiString afis(){return p->afisare();}
double consum();
};
double celula::consum(){return p->bursa()+p->salariu();}
void celula::cit(int i){
switch(i){
case 0 : p=new Student;break;
case 1 : p=new Angajat;break;
case 2 : p=new Stud_Ang;break;
}p->citire();}
class lista{
celula *prim;
public:
lista(){prim=NULL;}
void afisare();
void inserare(int);
void exclude(AnsiString);
double bani();
48
~lista();
};
void lista::afisare(){
Form1->Memo1->Clear();
if(prim==NULL) Form1->Memo1->Lines->Add("Lista este vida");
else{
Form1->Memo1->Lines->Add("Lista Personalului");
celula *p;p=prim;
while(p!=NULL){
Form1->Memo1->Lines->Add(p->afis());p=p->next;
}}}
void lista::inserare(int i){
celula *q;q=new celula;
q->cit(i);q->next=prim;prim=q;}
void lista::exclude(AnsiString c){
celula *w,*q;w=prim;
if(w->p->cod()==c){prim=w->next;delete w;}
else{while(w->next->p->cod()!=c && w!=NULL)w=w->next;
if(w!=NULL){q=w->next;w->next=q->next;delete q;}}}
lista::~lista(){
celula *p,*q;
if(prim!=NULL)
do{p=prim;prim=prim->next;delete p;}while(prim!=NULL);}
double lista::bani(){double d=0;celula *p;p=prim;
while(p!=NULL){d=d+p->consum();p=p->next;}
return d;}
Declaraii:
lista p;
51
52
citit.
19. Creai aplicaia Combinri. Prin intermediul a dou componente Edit se
vor citi 2 numere ntregi n i r. ntr-o component Label se va afia valoarea:
Cnr ,
Cnr
n!
r!*(n r )!
interiorul acesteia este afiat un cod aleator format din 4 cifre), o component Edit (n
cadrul acestei componente utilizatorul va scrie codul afiat n Label), un buton de
comand. La efectuarea unui click pe butonul de comand se va verifica
corectitudinea codului, dac codul este scris corect, atunci fereastra modal este
nchis. La elaborarea aplicaiei vor fi excluse alte posibiliti de nchidere a ferestrei
modale.
10. Elaborai o aplicaie care la lansare va afia o form, prin intermediul creia
se va cere utilizatorului s introduc numele i parola. Validarea acestora se va
efectua prin efectuare unui click pe butonul Validare sau apsnd tasta Enter. Dac
numele i parola sunt corecte se va deschide o nou form, iar precedenta va fi
ascuns. Scrierea greit a numelui sau a parolei de trei ori consecutiv va nchide
forma proiectului.
6. Aplicaii cu butoane
1. Creai aplicaia CONTOR. Pe suprafaa ferestrei principale sunt plasate
componentele: Edit, un buton UpDown asociat componentei Edit, un grup de 4
butoane radio, cu titlurile respectiv uniti, zeci, sute, mii. La efectuarea unui click pe
unul dintre butoanele radio valoarea din cutia de editare va fi incrementat sau
decrementat corespunztor butonului radio.
2. Creai aplicaia GRUPURI. Pe suprafaa ferestrei principale sunt plasate
dou grupuri de butoane radio, o cutie de editare i un buton de comand. Primul
grup conine 3 opiuni (forma, cutia, ambele). Al doilea grup conine 6 opiuni
(diferite culori). La efectuarea unui click pe butonul de comand pentru form i
pentru cutia de editare vor fi efectuate modificrile setate corespunztor seleciei
efectuate. De ex. dac n primul grup este bifat opiunea ambele, iar al n al doilea
opiunea galben, atunci att forma ct i cutia vor avea culoarea galben.
3. Elaborai o aplicaie care s modeleze jocul Rspuns corect. Utilizatorului i
se adreseaz un set de 5 ntrebri cu 4 variante de rspuns. Utilizatorul va bifa
rspunsul, pe care l consider corect, dup care va efectua un click pe butonul cu
titlul Raspuns. Efectuarea operaiei click va afia un mesaj prin care se va indica
numrul de rspunsuri corecte.
4. Creai aplicaia POZIIE. Pe suprafaa ferestrei principale sunt plasate 3
grupuri de butoane radio:
59
a) Grupul Pozitie va conine urmtoarele opiuni: Centru, Stinga sus, Stinga jos,
Dreapta sus, Dreapta jos.
b) Grupul Culoare va conine o list cu 5 opiuni cu diferite culori.
c) Grupul Dimensiune va conine urmtoarele opiuni: 200200, 200300,
300200, 400500, 500400.
Efectuarea unui click pe fiecare grup va afia forma cu setrile selectate.
5. Creai aplicaia CONVERTOR. Aceast aplicaie va permite efectuarea
urmtoarelor transformri:
a) milimetri, centimetri, decimetri, kilometri, dac valoarea iniial se consider
dat n metri;
b) miligrame, kilograme, tone, centigrame, dac valoarea iniial se consider
dat n grame;
c) sptmni, zile, minute, secunde, dac valoarea iniial se consider dat n ore.
La elaborarea aplicaiei vor fi utilizate componente RadioGroup (cte un grup
pentru fiecare caz). Pentru fiecare caz va fi afiat rezultatul n componente Label.
6. Creai aplicaia Arie & Perimetru. Forma aplicaiei va arta astfel:
62
ASCII
Caractere
Deschide
Deschide
Transforma Transforma
Salvare
Salvare
Efectuarea unui click pe opiunea Deschide va scrie caracterele din fiier
(ascii.txt/caractere.txt) n componenta Memo;
Efectuarea unui click pe opiunea Transforma va transforma textul n cod
ASCII (va transforma codul n text) , apoi acesta va fi scris n componenta Memo;
Efectuarea unui click pe opiunea Salvare va scrie caracterele din Memo n
unul din fiierele (ascii.txt, dac textul a fost transformat n cod i respectiv
caractere.txt);
8. Creai aplicaia Cifre. La elaborarea aplicaiei va fi utilizat componenta
Memo i va fi creat un meniu contextual cu opiunile:
Cifra
Caractere
Deschide
Deschide
Transforma Transforma
Salvare
Salvare
Efectuarea unui click pe opiunea Deschide va scrie textul din fiier
(cifra.txt/caractere.txt) n componenta Memo;
Efectuarea unui click pe opiunea Transforma va scrie cifrele cu caractere (va
transforma textul n cifre) n componenta Memo;
Efectuarea unui click pe opiunea Salvare va scrie caracterele din Memo n
unul din fiierele (caractere.txt, dac cifrele sunt scrise cu caractere i respectiv
cifra.txt);
9. Creai aplicaia Fiiere. Prin intermediul aplicaiei Fiiere se va crea fiierul
Unit.txt (salvat n directorul curent), care va conine informaia din fiierele Unit.h i
Unit1.cpp. Coninutul acestui fiier va fi afiat prin intermediul unei componente
Memo.
10. Creai aplicaia Triunghiul lui Pascal. Prin intermediul unei componente
de tip TEdit se va citi nlimea triunghiului. Triunghiul va fi afiat prin intermediul
unei componentei Memo. De exemplu triunghiul cu nlimea 4 va arta astfel:
Triunghiul lui Pascal :
63
Cnr
n!
r!*(n r)!
64
11. Creai aplicaia Parabola. Prin intermediul a trei cutii de editare se vor
introduce coeficienii pentru o ecuaie de gradul doi (parabol). La efectuarea unui
click pe butonul cu titlul Desen va fi desenat pe o component de tip TImage graficul
ecuaiei introduse.
12. Creai aplicaia Hiperbola. Prin intermediul a patru cutii de editare se vor
introduce coeficienii pentru o ecuaie de gradul trei (hiperbol). La efectuarea unui
click pe butonul cu titlul Desen va fi desenat graficul ecuaiei introduse pe o
component de tip TImage.
13. Creai aplicaia Parabole. Pe suprafaa formei se plaseaz 4 butoane de
comand cu titlurile respectiv sus, jos, dreapta, stinga. La efectuarea unui click pe
unul dintre butoane va fi desenat o parabol cu ramurile orientate respectiv n sus, n
jos, la dreapta, la stnga.
14. Elaborai o aplicaie prin intermediul creia va fi desenat sistemul cartezian
de coordonate Oxy cu marcajele i numerotrile corespunztoare. n acest sistem
reprezentai punctul A i proieciile acestuia pe axele de coordonate. Coordonatele
punctului vor fi citite prin intermediul a dou cutii de editare.
15. Creai aplicaia Grafic. Prin intermediul acestei aplicaii se vor desena
graficele urmtoarelor funcii:
f ( x) x 3 x 2
1 1
f ( x) 2
x x
x
f ( x) 2
x 1
f ( x) x2 ln x
1
f ( x) sin x sin 2x
2
8
f ( x) x 2
x
2
f ( x) e x
e x e x
f ( x)
2
e x e x
f ( x) x x
e e
tgx
f ( x)
x
68
70
71
72
75
76
77
78
11. Elaborai un proiect prin intermediul cruia se vor efectua operaii asupra
tipului de date arbori binari de cutare. n calitate de noduri ale arborelui binar de
cutare vor fi numere ntregi. Prin intermediul unui meniu se vor efectua operaiile:
a) crearea arborelui binar de cutare (ncrcarea datelor din fiier);
b) desenarea arborelui pe suprafaa formei;
c) parcurgerea arborelui prin metodele: inordine, preordine i postordine;
d) cutarea unui nod;
e) inserarea unui nod n arbore;
f) excluderea unui nod din arbore.
12. Elaborai un proiect pentru gestiunea medicamentelor unei farmacii.
Informaiile pentru medicamentele din farmacii sunt: numele medicamentului, pre,
cantitate, data primirii, data expirrii. Evidena medicamentelor se va efectua printr-o
structur de date de tip arbore de cutare. Aplicaia va conine un meniu prin
intermediul cruia se vor efectua urmtoarele operaii:
a) ncrcarea datelor despre medicamente din fiier i prin intermediul unui
formular destinat introducerii datelor;
b) cutarea unui medicament dup nume;
c) afiarea medicamentelor n ordine lexicografic a numelui (va fi utilizat o
component Memo);
d) eliminarea unui medicament prin indicarea numelui acestuia;
e) afiarea medicamentelor care au data de expirare mai mic dect o dat
specificat.
13. Elaborai o aplicaie prin intermediul creia va fi rezolvat jocul SUDOKU.
Prin intermediul componentei StringGrid utilizatorul va introduce numerele n cutie.
Efectuarea unui click pe suprafaa butonului cu titlul Rezolvare, va rezolva jocul.
14. Elaborai aplicaia Operaii cu mulimi. Cu ajutorul a dou componente
StringGrid se citesc elementele a dou mulimi A i B. Prin intermediul unui meniu
utilizatorului i se va oferi posibilitatea de a efectua operaii cu mulimi. Meniul va
conine opiunile:
a) reuniune va afia elementele mulimii A B;
b) intersecie va afia elementele mulimii A B;
c) diferena va afia elementele mulimii A\B;
d) incluziune element va verifica dac un element (va fi introdus prin
intermediul unei cutii de editare) se include n mulimea A;
e) incluziune mulimi va verifica dac mulimea A se include n mulimea B;
79
80
Realizare:
Pentru pstrarea datelor despre produsele din magazin vom crea tabelul
produse.db, pe care l vom salva n dosarul curent. Tabelul va avea urmtoarea
structur:
81
while(!Table1->Eof){
s= AnsiString(Table1->FieldValues["Nume produs"]);
ComboBox1->Items->Add(s);
Table1->Next();}
83
Realizare:
Creem prin intermediul utilitarului Database Desktop tabelele de mai sus. n cadrul
acestei aplicaii vom utiliza mai multe forme. Pe forma principal plasm
componentele:
ADOConnection1 facem conexiunea cu baza de date i setm proprietatea
Connected cu valoarea true;
ADOTable1 setm urmtoarele proprieti:
Connection= ADOConnection1;
TableName=Carti;
Active=true;
Name=Carti;
Procedm similar i n cazul componentelor ADOTable2, ADOTable3, ADOTable4
modificnd proprietile Name i TableName corespunztor n Autori, Edituri, Limbi;
DataSource1 setm urmtoarele proprieti:
DataSet=Carti, modificm valoarea proprietii Name cu Carte, procedm
similar i n cazul urmtoarelor componente DataSource2, DataSource3,
DataSource4 cu valorile proprietii Name corespunztor Autor, Editura, Limba;
Image1 setm urmtoarele proprieti:
Picture ncrcm o imagine;
84
Stretch=true;
Align=alClient;
ADOQuery1 setm urmtoarele proprieti:
Connection= ADOConnection1;
Name=Query;
Pentru forma principal setm urmtoarele proprieti:
Name=Main;
Align=alClient;
mai adugm n proiect nc 7 forme, modificnd proprietile Name corespunztor:
Ad_autor, Ad_carte, Ad_limba, Ad_editura, Admin, Raport;
Setm Position=poScreenCenter pentru toate formele;
Includem n antetul fiecrui fiier *.cpp fiierele header (unit1.h unit8.h),
dup necesitate;
n fiierul Unit1.h la seciunea public: declarm variabila
AnsiString sql;
Prelucrm evenimentul OnCreate al formei:
sql="SELECT Carti.titlu, Carti.pret, Carti.pagini,Carti.data, Editura.nume,
Autori.nume, Autori.prenume, Limba.limba FROM Autori,Carti,Editura,Limba
WHERE (Carti.id_autor = Autori.id_autor) AND (Editura.id_editura =
Carti.id_editura) AND (Limba.id_limba = Carti.id_limba)";
MainMenu1 meniul va conine urmtoarele opiuni:
Adauga
Cauta
Tipar
Administrare
Carte
Dupa titlu
Toate cartile
Autor
Dupa limba Liste cu autori
Editura
Dupa pret
Limba
Dupa data
Se va plasa componenta PopupMenu1 cu opiunea Adauga autor,
DBLookupComboBox1:
DataSource=Main->Carte; DataField=id_autor; ListSource=Main->Autor;
ListField=nume; KeyField=id_autor;PopupMenu=PopupMenu1;
Se va plasa componenta PopupMenu2 cu opiunea Adauga limba;
DBLookupComboBox2:
DataSource=Main->Carte; DataField=id_limba; ListSource=Main->limba;
ListField=limba; KeyField=id_limba;PopupMenu=PopupMenu2;
Se va plasa componenta PopupMenu3 cu opiunea Adauga editura;
DBLookupComboBox3: DataSource=Main->Carte; DataField=id_editura;
ListSource=Main->editura;ListField=nume;
KeyField=id_editura;PopupMenu=PopupMenu3;
85
86
FORMULARUL Ad_carte
FORMULARUL Ad_autor
87
FORMULARUL Ad_limba
88
Quickrep1: Dataset=Main->Query;Bands->HasTitle=true;
Bands->HasColumnHeader=true;
Bands->HasDetail=true;
Pe banda Title plasm componenta QRLabel1 i atribuim proprietii Caption textul
Lista carti;
Procedm similar i n cazul benzii Column Header;Pe banda Detail plasm
componentele:
QRDBText1: Dataset=Main->Query;DataField=titlu;
QRDBText2: Dataset=Main->Query; DataField=limba;
QRDBText3: Dataset=Main->Query; DataField=pagini;
QRDBText4: Dataset=Main->Query; DataField=pret;
QRDBText5: Dataset=Main->Query; DataField=nume;
QRDBText6: Dataset=Main->Query; DataField=editura;
QRDBText7: Dataset=Main->Query; DataField=data.
n cadrul acestei forme urmeaz a fi create mai multe rapoarte, plasm
componenta Quickrep2 pe form, iar pe suprafaa acesteia:
89
"Unit1.h"
"Unit2.h"
"Unit3.h"
"Unit4.h"
"Unit5.h"
92
#include "Unit6.h"
#include "Unit8.h"
TCauta *Cauta;
TDateTime d;int nr;
void __fastcall TCauta::Button2Click(TObject *Sender){
AnsiString s[10];double q;
s[0]=Main->sql+"AND (Carti.pret <:a)";
s[1]=Main->sql+"AND (Carti.pret >:a)";
s[2]=Main->sql+"AND (Carti.pret = :a)";
Main->Query1->Close();
Main->Query1->SQL->Text=s[nr];
q=Edit2->Text.ToDouble();
Main->Query1->ParamByName("a")->AsFloat=q;
Main->Query1->Open();
}
void __fastcall TCauta::RadioGroup1Click(TObject *Sender){
nr=RadioGroup1->ItemIndex;
}
void __fastcall TCauta::FormShow(TObject *Sender){
AnsiString s;
ComboBox1->Clear();
Main->Limba->First();
while(!Main->Limba->Eof){
s= AnsiString(Main->Limba->FieldValues["Limba"]);
ComboBox1->Items->Add(s);
Main->Limba->Next();
}
}
void __fastcall TCauta::Button1Click(TObject *Sender){
Main->Query1->Close();
Main->Query1->SQL->Text=Main->sql+"AND (Carti.titlu like :a)";
Main->Query1->ParamByName("a")->AsString="%"+Edit1->Text+"%";
Main->Query1->Open();
}
void __fastcall TCauta::Edit1Change(TObject *Sender){
Button1Click(Sender);}
void __fastcall TCauta::ComboBox1Change(TObject *Sender){
Main->Query1->Close();
Main->Query1->SQL->Text=Main->sql+"AND (Limba.limba like :a)";
Main->Query1->ParamByName("a")->AsString="%"+
ComboBox1->Items->Strings[ComboBox1->ItemIndex]+"%";
Main->Query1->Open();
}
void __fastcall TCauta::BitBtn1Click(TObject *Sender){
AnsiString s[10];
s[0]=Main->sql+"AND (Carti.data <=:a)";
s[1]=Main->sql+"AND (Carti.pret >=:a)";
s[2]=Main->sql+"AND (Carti.pret = :a)";
Main->Query1->Close();
Main->Query1->SQL->Text=s[nr];
Main->Query1->ParamByName("a")->AsDateTime=d;
Main->Query1->Open();
}
void __fastcall TCauta::DateTimePicker1Change(TObject *Sender){
93
d=DateTimePicker1->DateTime;}
void __fastcall TCauta::RadioGroup2Click(TObject *Sender){
nr=RadioGroup2->ItemIndex;
}
void __fastcall TCauta::Tipar1Click(TObject *Sender){
Raport->Lista_carti->Preview();
}
94
95
alta circular). Diagramele vor fi create n baza datelor din cmpurile Suprafata i
Populatie.
16. Elaborai o aplicaie ar-Capital. ntr-o component de tip TComboBox
se vor scrie numele rilor din tabelul tari.db. Pe suprafaa formei va fi plasat o
component de tip TRadioGroup. n cadrul acestei componente vor fi scrise 4 nume
de orae (dintre care unul este capitala rii selectate). La efectuarea unui click pe una
dintre opiuni va fi afiat un mesaj cu indicarea corectitudinii rspunsului. Verificarea
rspunsului se va efectua n baza datelor din tabelul tari.db.
17. Elaborai o aplicaie care va permite nregistrarea participanilor la
concursul de Informatic. La concurs particip concureni din Republica Moldova,
Romnia i Ucraina. Din Republica Moldova vin participani din oraele: Chiinu,
Bli, Orhei, Soroca, Cahul, Edine. Din Romnia vin participani din oraele: Iai,
Vaslui, Suceava, Botoani, Galai. Din Ucraina vin participani din oraele: Odesa,
Donek, Herson, Hotin. Datele despre participani se vor salva n tabelul
concurenti.db. Tabelul va conine urmtoarele cmpuri:
Nume cimp
nume
prenume
data nasterii
tara
orasul
tipul
String
String
Data
String
String
99
afia, n caz contrar nu se vor afia. Datele vor fi afiate prin intermediul unei
componente de tip DBGrid i sortate dup ultimul cmp selectat.
5. Elaborai o aplicaie n baza tabelului angajati.db, prin intermediul creia se
vor afia:
a) nregistrrile unde Cmpul Salariu [a,b];
b) Salariul maxim pentru nregistrrile cu cmpul Salariu [a,b];
c) Salariul minim pentru nregistrrile cu cmpul Salariu [a,b];
d) Salariul mediu pentru nregistrrile cu cmpul Salariu [a,b];
e) Numrul de nregistrri cu cmpul Salariu [a,b].
Valorile a i b vor fi introduse de la tastatur prin intermediul a dou cutii de editare.
6. Elaborai o aplicaie n baza tabelului angajati.db, prin intermediul creia se
vor afia:
a) nregistrrile pentru care cmpul Salariu are valoare maxim;
b) nregistrrile pentru care cmpul Salariu are valoare minim;
c) nregistrrile pentru care cmpul Salariu [salariu mediu-a, salariu mediu+a];
d) Numrul de nregistrri, pentru care cmpul Salariu [salariu mediu-a, salariu
mediu+a], iar cmpul Nume conine un caracter selectat prin intermediul unei
componente de tip TComboBox (itemii creia sunt toate caracterele alfabetului
englez);
Parametrul a va fi citit de la tastatur prin intermediul unei cutii de editare.
7. Creai o copie a tabelului angajati.db. Redenumii tabelul n salariati.db. n
baza acestui tabel elaborai o aplicaie prin intermediul creia:
a) vor fi majorate valorile cmpului salariu cu 10%, 25%, 35%, procentul va fi
ales prin intermediul unei componente de tip TRadioGroup;
b) vor fi majorate valorile cmpului salariu cu 30% pentru nregistrrile unde
cmpul salariu are o valoare mai mic dect valoarea medie;
c) vor fi reduse valorile cmpului salariu cu 15% pentru nregistrrile unde
cmpul salariu are o valoare mai mare ca valoare medie;
d) se va dubla valoarea cmpului salariu de valoare minim;
e) se va reduce valoarea cmpului salariu de valoare maxim cu 50%;
f) se va exclude nregistrarea unde Cmpul salariu are valoare maxim;
g) se va exclude nregistrarea unde Cmpul salariu are valoare minim.
nainte i dup fiecare operaie vor fi afiate toate nregistrrile tabelului salariati.db.
103
min max
* count ([ avg a, avg a ])
avg
K2 =
sum
* count ([max a, max]) , dac
avg * min
formula:
max
2
avg
min
Salariu=Salariu+
1. Depozit de automobile
2. Magazin de calculatoare
108
4. Depozit de produse
5. Rezervri la hotel
109
6. Angajai
Cerine fa de proiect:
a) Formularul ferestrei principale;
b) Formulare de adugare (pentru fiecare tabel cte un formular);
c) Formulare pentru cutarea datelor (6 cutri);
d) Vizualizarea tuturor nregistrrilor i vizualizarea datelor pentru fiecare tabel;
e) Crearea rapoartelor (minim 5 rapoarte);
f) Oferirea unei interfee simple i comode pentru utilizatorii BD;
g) Introducerea a minim 30 de nregistrri cu date corecte;
h) * Selectarea bazei de date n timpul execuiei.
110
Bibliografie
1. Braicov Andrei Borland Delphi Ghid de Iniiere. Tipografia central
2009
2. Braicov Andrei, Gncu Silviu C++ Builder Ghid de Iniiere. Tipografia
central 2009
3. Culea, George. Gbureanu, Ctlin. (2007) Programarea orientat pe
obiecte - Note de curs ndrumar de laborator, Bacu, Editura: Alma Mater
4. Grady
Booch.
Object-Oriented
Design
with
Applications.
Benjamin/Cummings, Redwood City, California, 2nd edition, 1994
5. Mihai Oltean, Crina Groan, Programare n C++ Builder. Editura
albastr, Cluj-Napoca 2008
6. Mulea Ionu Iniiere n C++ Programarea orientat pe obiecte. ClujNapoca 1993
7. Somnea, D., Turturea, D., Iniiere n C++ - Programarea orientat pe
obiecte, Editura Tehnic, Bucureti, 1993
8. Stroustrup Bjarne The C++ Programming Language 3rd. ed.,
Copyright 1997 by AT&T
9. Spircu, C., Loptan, I., POO-Analiza, proiectarea i programarea orientate
spre obiecte, Editura Teora, Bucureti, 1996
10. Vsevolod Arnaut, Vasile Putin, Ion Andrie Programarea orientat pe
obiecte n baza limbajului C++. CEP USM 2009
11. Zmaranda, Rodica Doina, Elemente de programare orientat pe obiecte n
limbajul C++, Oradea Editura Universitii din Oradea, 2001
12. . . C++ Builder 6.
2003
13. . . C++ Builder.
. . .: , 2007
14. . . C++ Builder . , 2005
111
Cuprins
Prefa............................................................................................................. 3
4
Sugestii metodologice.....................................................................................
Capitolul I. Limbajul C++
1. Crearea de obiecte...................................................................................... 9
2. Constructori.................................................................... 12
3. Motenire simpl........................................................................................ 14
4. Funcii virtuale i polimorfism................................................................... 17
5. Motenire multipl...................................................................................... 21
6. Suprancrcarea operatorilor....................................................................... 26
7. Agregare..................................................................................................... 29
Capitolul II. Mediul de programare vizual C++ Builder
Probleme rezolvate......................................................................................... 35
1. Forme (ferestre)................................................................... 50
2. Componenta Button.................................................................................... 51
3. Componenta Edit........................................................................................ 52
4. iruri de caractere i componenta Label.................................................... 54
5. Aplicaii multiforme................................................................................... 57
6. Aplicaii cu butoane................................................................................... 59
7. Aplicaii cu meniuri.................................................................................... 61
8. Aplicaii cu elemente de grafic................................................................. 64
9. Componenta Timer..................................................................................... 67
10. Aplicaii cu liste de opiuni i casete combinate...................................... 68
11. Componenta StringGrid........................................................................... 71
12. Aplicaii cu Data Calendaristic............................................................... 73
13. Aplicaii cu directoare i fiiere................................................................ 75
14. Aplicaii diverse........................................................................................ 76
Capitolul III. Baze de date
Probleme rezolvate......................................................................................... 81
1. Utilitarul Database Desktop....................................................................... 95
2. Aplicaii cu Tabele..................................................................................... 96
3. Aplicaii cu Interogri................................................................................. 102
4. Rapoarte.............................................................................................. 105
5. Tehnologia ADO........................................................................................ 106
6. Proiecte pentru gestiunea bazelor de date................................................... 107
Bibliografie..................................................................................................... 111
112