Documente Academic
Documente Profesional
Documente Cultură
Borland C++ Builder. Ghid de Initiere PDF
Borland C++ Builder. Ghid de Initiere PDF
Prefa
Sistemul Borland C++ Builder (BCB) este unul dintre cele mai
moderne i mai rspndite sisteme de programare vizual. El conine
instrumente eficiente de elaborare a aplicaiilor de tip Windows, client-server
etc. Avnd drept limbaj de programare C++ (derivat din limbajul C), este n
acelai timp unul dintre cele mai potrivite pachete pentru nvarea programrii
orientate spre obiecte i a celei vizuale.
Prezenta lucrare este un ghid de iniiere n programarea vizual i
programarea orientat spre obiecte cu ajutorul sistemului BCB. Este structurat
n trei capitole, care ofer informaii de baz i exemple demonstrative, menite
s ilustreze aspectele teoretice.
n capitolul I (denumit Platforma BCB) snt descrise modalitile de
utilizare a componentelor specifice majoritii aplicaiilor tip Windows,
precum i algoritmii de elaborare a astfel de aplicaii (inclusiv a celor de
prelucrare a informaiei grafice).
Crearea i gestionarea bazelor de date este una dintre cele mai prioritare
domenii ale programrii. Sistemul Borland C++ Builder conine un set de
utilitare, care permit crearea i/sau ntreinerea bazelor de date, inclusiv de tip
FoxPro, MySQL, Access, Oracle, etc. Algoritmii de lucru cu bazele de date
snt descrii n capitolul II Prelucrarea bazelor de date.
n capitolul III (denumit Programarea Orientat spre Obiecte cu
C++) snt explicate caracteristicile limbajului C++ i mecanismele POO:
incapsularea, motenirea, suprancrcarea operatorilor, polimorfismul etc.
Contieni de complexitatea POO, am inclus o serie de coduri de program, care
(sperm) vor ajuta la nelegerea acestor mecanisme.
Am presupus c cititorul este iniiat cu un limbaj de programare
(preferabil cu C). Chiar dac nu are o astfel de iniiere, urmnd consecvent i
consecutiv paragrafele ghidului, el va reui s obine cunotine i competene
de elaborare a produselor program de tip Windows.
n variant de manuscris, lucrarea a fost experimentat pe studenii
Universitii de Stat din Tiraspol i ai Colegiului Financiar-Bancar A.
Diordia din Chiinu, care au i solicitat apariia ei.
Ea va fi util nu doar studenilor specialitilor de Informatic, dar i
tuturor celorlali interesai de programarea modern.
Autorii
-3-
Copie autorizata pentru studenii CFBC
Capitolul I
Platforma BCB
1. Mediul de dezvoltare integrat BCB
Mediul de dezvoltare BCB include urmtoarele elemente:
Bara de titlu
Bara meniului principal
Bara de instrumente
Paleta cu componente
Fereastra formei
Bara cu instrumente
Object TreeView
Object Inspector
-4-
Copie autorizata pentru studenii CFBC
1. Bara de titlu
-5-
Copie autorizata pentru studenii CFBC
-6-
Copie autorizata pentru studenii CFBC
-7-
Copie autorizata pentru studenii CFBC
-8-
Copie autorizata pentru studenii CFBC
3. Bara de instrumente
4. Paleta de componente
5. Fereastra formei
-9-
Copie autorizata pentru studenii CFBC
- 10 -
Copie autorizata pentru studenii CFBC
- 11 -
Copie autorizata pentru studenii CFBC
Un proiect BCB este format din cteva fiiere (de regul, ele snt salvate
n acelai director).
#include <vcl.h>
#pragma hdrstop
USEFORM("Unit1.cpp", Form1);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application-
>ShowException(&exception);
}
}
return 0;
}
- 12 -
Copie autorizata pentru studenii CFBC
#ifndef Unit1H
#define Unit1H
//-------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//-------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//-------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//-------------------------------------------------------------
#endif
- 13 -
Copie autorizata pentru studenii CFBC
- 14 -
Copie autorizata pentru studenii CFBC
3. Aplicaii de consol
Sistemul BCB ofer posibilitatea elaborrii aplicaiilor de consol.
Pentru a crea o astfel de aplicaie:
1) Executm File\New\Other. Apare fereastra New Items:
- 15 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
1) Executm File\New\Other.
- 16 -
Copie autorizata pentru studenii CFBC
- 17 -
Copie autorizata pentru studenii CFBC
4. Generaliti
- 18 -
Copie autorizata pentru studenii CFBC
- 19 -
Copie autorizata pentru studenii CFBC
5. Clasa TForm
O aplicaie Windows este format din ferestre, dintre care una este
considerat fereastr principal (implicit prima fereastr este principal). n
C++ Builder ferestrele snt descrise n clasa TForm, din care cauz ele mai snt
numite forme (sau machete).
Pa bara de titlu a formei se afl titlul ei, butoanele de minimizare, de
maximizare, de nchidere i meniul principal (dac acesta exist).
Pe suprafaa zonei client a formei programatorul poate plasa
componente. Pentru a prelucra o form trebuie s cunoatem proprietile,
metodele i evenimentele clasei TForm. Menionm c multe dintre aceste
proprieti i evenimente exist i pentru clasele corespunztoare altor
componente.
- 20 -
Copie autorizata pentru studenii CFBC
ntrebare);
BorderStyle specific stilul chenarului formei. Valorile posibile:
- bsDialog (forma nu poate fi redimensionat, chenarul ei fiind
standard);
- bsSingle (forma nu poate fi redimensionat, marginile chenarului snt
linii);
- bsNone (forma nu poate fi redimensionat, nu are chenar);
- bsSizeable (forma poate fi redimensionat);
- bsToolWindow (la fel ca bsSingle, doar cu un titlu mai mic);
- bsSizeToolWin (la fel ca bsSizeable, doar cu un titlu mai mic).
BorderWitdh indic distana n pixeli dintre zona client i marginile formei.
Caption specific titlul ferestrei (textul care apare pe bara de titlu).
Color stabilete culoarea formei.
Constrains este o proprietate compus format din subproprietile
MaxWidth, MaxHeight, MinWidth, MinHeight. Indic restricii asupra
dimensiunilor formei. Dac toate cele 4 proprieti au valoarea 0, atunci
restricii nu snt.
Cursor specific forma mouse-lui.
Font este o proprietate compus pentru stabilirea mrimii, fontului,
efectelor de stil pentru textele de pe form i a textelor aferente componentelor
de pe form.
FormStyle stabilete stilul formei. Valori posibile:
- fsNormal (form obinuit);
- fsMDIChild (form de tip MDI copil);
- fsMDIForm (form de tip MDI printe);
- fsStayOnTop (form afiat pe Desktop, deasupra celorlalte forme).
Heitch specific nlimea n pixeli a formei.
Hint specific textul care va aprea la plasarea cursorului de mouse pe
form. Acest text apare numai n cazul n care proprietatea ShowHint are
valoarea true.
ModalResult este utilizat pentru o form modal. Aplicaia principal nu
reacioneaz la evenimente att timp ct este deschis o fereastr modal. Prin
aceast proprietate se poate gestiona modul n care a fost nchis fereastra
modal. Din aceast cauz ea nu apare n lista de proprieti din fereastra
Object Inspector.
Name stabilete numele formei (utilizat pe post de identificator al formei).
Position specific dimensiunile i poziia pe care o va avea o form pe
ecran. Valorile posibile:
- poDesigned (forma apare pe ecran n aceeai poziie i aceleai
dimensiuni ca i cele setate la proiectarea ei);
- poDefault (sistemul Windows alege poziia i dimensiunea formei);
- 21 -
Copie autorizata pentru studenii CFBC
- 22 -
Copie autorizata pentru studenii CFBC
OnDockDrop apare cnd un obiect este depus pe form prin operaia drag-
and-dock.
OnDockOver apare cnd un obiect este tras peste form pentru o operaie
drag-and-dock.
OnDragOver apare cnd un obiect este tras peste form pentru o operaie
drag-and-drop.
- 23 -
Copie autorizata pentru studenii CFBC
OnHide apare atunci cnd forma este ascuns (de exemplu dac proprietatea
Visible obine valoarea false).
- 24 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
1) Executm File\New\Application.
Form1->Color = clRed;
- 25 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}
void __fastcall TForm1::FormKeyPress(TObject *Sender, char
&Key){
if(Key=='h') Form1->Caption="Salut! Prima aplicatie BCB";
}
void __fastcall TForm1::FormClick(TObject *Sender){
Form1->Color= clRed;
}
- 26 -
Copie autorizata pentru studenii CFBC
6. Clasa TButton
Butoanele snt, probabil, cele mai des utilizate controalele n BCB. Ele
snt destinate lansrii la execuie a diferitor aciuni.
Default (de tip logic) stabilete dac butonul de comand este (pentru
valoarea true) sau nu este buton implicit al formei. Dac butonul este implicit,
atunci acionarea tastei Enter va fi considerat eveniment al butonului, n caz
contrar al formei. Forma poate avea un singur buton implicit.
Cancel (de tip logic) stabilete dac butonul de comand este (pentru
valoarea true) sau nu este buton de anulare al formei. Dac butonul este de
anulare, atunci acionarea tastei Esc va fi considerat eveniment al butonului,
n caz contrar al formei. Forma poate avea un singur buton de anulare.
Observaie. Butonul de anulare nu nchide forma. Aceasta poate vi
nchis cu o instruciune de forma Form1->Close();
Name specific numele butonului.
Caption stabilete textul care va fi afiat pe suprafaa butonului.
Font este o proprietate compus pentru stabilirea mrimii literelor, fontului,
efectelor de stil pentru textul de pe suprafaa butonului.
Visible (de tip logic) stabilete dac butonul este (pentru valoarea true) sau
nu este vizibil pe suprafaa formei.
ModalResult se folosete n cazul ferestrelor modale. Valori posibile:
mrNone (valoare implicit), mrOk, mrCancel, mrAbort, mrRetry, mrIgnore,
mrYes, mrNo.
7. Clasa TEdit
Un exemplar al clasei TEdit afieaz o caset de editare n care
utilizatorul poate scrie un text sau poate afia un mesaj.
AutoSize (de tip logic) permite (pentru valoarea false) sau interzice
redimensionarea automat a casetei (n cazul n care un eveniment ar modifica
- 27 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
1) Executm File\New\Application.
- 28 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender) {
Edit2->Text = Edit1->Text;
}
void __fastcall TForm1::Button2Click(TObject *Sender){
Edit2->PasswordChar = '#';
}
8. Clasa AnsiString
n limbajul C++ nu exist un tip de date ir de caractere, cum ar fi tipul
string n Pascal. Prelucrarea irurilor de caractere n C++ se face prin
intermediul tablourilor de tip char, care snt numite i iruri de caractere.
Mediul C++ Builder motenete toate facilitile oferite de limbajele C i C++
referitoare la lucrul cu iruri de caractere.
- 29 -
Copie autorizata pentru studenii CFBC
- 30 -
Copie autorizata pentru studenii CFBC
9. Clasa TLabel
- 31 -
Copie autorizata pentru studenii CFBC
Exemple rezolvate
Realizare:
1) Executm File\New\Application.
- 32 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender) {
double a,b,arie,perimetru;
Form1->Caption="DREPTUNGHIUL"; Label3->Caption="";
a=Edit1->Text.ToDouble(); //convertirea din sir in numar
b=Edit2->Text.ToDouble();
arie=a*b; perimetru=(a + b)*2;
Label3->Font->Color=clRed;
Label3->Caption="Aria : "+AnsiString(arie)+" Perimetrul : "
+ AnsiString(perimetru);
}
2. Calculatorul
S crem o aplicaie care va efectua operaii aritmetice cu numere reale, a crei
- 33 -
Copie autorizata pentru studenii CFBC
Realizare:
1) Executm File\New\Application.
- 34 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString s="";
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
double eval(AnsiString exp){
AnsiString op="",c="";
double a;
int i;
for(i=1;i<=exp.Length();i++)
{
if( exp[i]>='0' && exp[i]<='9' || exp[i]=='.') c=c+exp[i];
else
{
if(op=='+' || op=='-' || op=='*' || op=='/')
{
if(op=='+') a=a+c.ToDouble();
if(op=='-') a=a-c.ToDouble();
if(op=='*') a=a*c.ToDouble();
if(op=='/') a=a/c.ToDouble();
op=s[i];
}
else
{
a=c.ToDouble();
op=exp[i];
}
c="";
}
}
if(op=='+') a=a+c.ToDouble();
if(op=='-') a=a-c.ToDouble();
if(op=='*') a=a*c.ToDouble();
if(op=='/') a=a/c.ToDouble();
return a;
}
void __fastcall TForm1::FormCreate(TObject *Sender){
- 35 -
Copie autorizata pentru studenii CFBC
Edit1->Clear();
Edit1->SetFocus();
}
void __fastcall TForm1::Button12Click(TObject *Sender){
Edit1->Clear();
Edit1->Text=AnsiString(eval(s));
s="";
Edit1->SetFocus();
}
void __fastcall TForm1::Button13Click(TObject *Sender){
Edit1->Clear();
s=s+"+";
Edit1->SetFocus();
}
void __fastcall TForm1::Button14Click(TObject *Sender){
Edit1->Clear();
s=s+"-";
Edit1->SetFocus();
}
void __fastcall TForm1::Button15Click(TObject *Sender){
Edit1->Clear();
s=s+"*";
Edit1->SetFocus();
}
void __fastcall TForm1::Button16Click(TObject *Sender){
Edit1->Clear();
s=s+"/";
Edit1->SetFocus();
}
void __fastcall TForm1::Button9Click(TObject *Sender){
Edit1->Text=Edit1->Text+"1";
s=s+"1";
Edit1->SetFocus();
}
void __fastcall TForm1::Button10Click(TObject *Sender){
Edit1->Text=Edit1->Text+"0";
s=s+"0";
Edit1->SetFocus();
}
void __fastcall TForm1::Button11Click(TObject *Sender){
Edit1->Text=Edit1->Text+".";
s=s+".";
}
void __fastcall TForm1::Button5Click(TObject *Sender){
Edit1->Text=Edit1->Text+"5";
s=s+"5";
Edit1->SetFocus();
}
void __fastcall TForm1::Button6Click(TObject *Sender){
Edit1->Text=Edit1->Text+"4";
- 36 -
Copie autorizata pentru studenii CFBC
s=s+"4";
Edit1->SetFocus();
}
void __fastcall TForm1::Button7Click(TObject *Sender){
Edit1->Text=Edit1->Text+"3";
s=s+"3";
Edit1->SetFocus();
}
void __fastcall TForm1::Button8Click(TObject *Sender){
Edit1->Text=Edit1->Text+"2";
s=s+"2";
Edit1->SetFocus();
}
void __fastcall TForm1::Button1Click(TObject *Sender){
Edit1->Text=Edit1->Text+"9";
s=s+"9";
Edit1->SetFocus();
}
void __fastcall TForm1::Button2Click(TObject *Sender){
Edit1->Text=Edit1->Text+"8";
s=s+"8";
Edit1->SetFocus();
}
void __fastcall TForm1::Button3Click(TObject *Sender){
Edit1->Text=Edit1->Text+"7";
s=s+"7";
Edit1->SetFocus();
}
void __fastcall TForm1::Button4Click(TObject *Sender){
Edit1->Text=Edit1->Text+"6";
s=s+"6";
Edit1->SetFocus();
}
void __fastcall TForm1::Button17Click(TObject *Sender){
Edit1->Clear();
Edit1->SetFocus();
}
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char
&Key)
{
switch(Key){
case '.' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
- 37 -
Copie autorizata pentru studenii CFBC
case '9' :
case '0' : Edit1->Text=Edit1->Text+Key;s=s+Key; break;
case '+' : Button13Click(Sender);break;
case '-' : Button14Click(Sender);break;
case '*' : Button15Click(Sender);break;
case '/' : Button16Click(Sender);break;
case '=' : Button12Click(Sender);break;
}
}
- 38 -
Copie autorizata pentru studenii CFBC
- 39 -
Copie autorizata pentru studenii CFBC
- 40 -
Copie autorizata pentru studenii CFBC
Dac aceast fereastr va fi nchis prin tastarea tastei Retry, atunci se va afia
fereastra
Funcia InputBox (S1, S2, S3) afieaz o fereastr cu titlul S1, S2 este textul
ce comenteaz introducerea, iar S3 textul care se afl iniial n fereastr. Dac
utilizatorul va nchide fereastra prin apsarea tastei Ok, atunci rezultatul
funciei va fi coninutul casetei de editare din cadrul ferestrei, altfel valoarea
S3. De exemplu, n urma executrii instruciunii
Edit1->Text=InputBox("Date personale", "Scrie virsta", "20");
se va afia urmtoarea fereastr:
- 41 -
Copie autorizata pentru studenii CFBC
Funcia InputQuery (S1, S2, S3) are efect similar funciei InputBox cu
deosebirea c textul din linia de editare se returneaz prin parametrul S3.
Valoarea returnat de funcie este de tip logic i este true doar n cazul cnd
fereastra a fost nchis prin apsarea tastei Ok. n caz contrar S3 primete
valoare vid. De exemplu, n urma executrii instruciunii
if (InputQuery("Date personale", "Numele", S))
Label1->Caption = S;
se va afia urmtoarea fereastr:
Eticheta Label1 va afia textul din caseta de editare a ferestrei doar dac
utilizatorul va apsa butonul Ok.
- 42 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#pragma package(smart_init)
- 43 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm2::FormClick(TObject *Sender){
Form1->Cascade();}
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
__fastcall TForm3::TForm3(TComponent* Owner): TForm(Owner){}
void __fastcall TForm3::FormClick(TObject *Sender){
Form1->Cascade();}
- 44 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare
1) Executm File\New\Application.
2) Executm File\New\Form.
- 45 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender){
Form2->Edit2->Text=""; Form2->ShowModal();
Form2->Edit1->Text="";
if(Form2->Edit2->Text=="123" && Form2->ModalResult==mrOk)
{ShowMessage("Corect"); Color=clLime;}
else ShowMessage("Scrie parola corecta si confirma");}
- 46 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponent* Owner): TForm(Owner){ }
- 47 -
Copie autorizata pentru studenii CFBC
- 48 -
Copie autorizata pentru studenii CFBC
- 49 -
Copie autorizata pentru studenii CFBC
La selectarea unui buton radio n caseta Edit1 va aprea numele lui. Un click
pe una din tastele butonului de incrementare/decrementare va mri sau va
micora valoarea din caseta Edit3. Caseta Edit2 va afia starea butonului de
opiune.
Realizare
1) Executm File\New\Other.
- 50 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
- 51 -
Copie autorizata pentru studenii CFBC
Align stabilete poziia zonei pe form i poate lua una din urmtoarele
valori:
- alNone componenta nu-i va schimba poziia;
- alRight componenta se va alinia n partea dreapt a formei;
- alLeft componenta se va alinia n partea stng a formei;
- alBottom componenta va fi plasat n partea de jos a formei;
- alClient componenta va ocupa tot spaiul formei.
Aligment stabilete tipul de aliniere a textului n zon.
Lines conine textul din zon, sub form de iruri de caractere.
Scoolbars indic dac zona are sau nu are bare de defilare. Valori posibile:
ssNone, ssHorizontal, ssVertical, ssBoth.
WantReturns (de tip bool) stabilete dac utilizatorul poate (pentru valoarea
true, valoare implicit) s insereze n zon sfrituri de linii cu ajutorul tastei
Enter. n cazul valorii false evenimentul de acionare a tastei Enter va fi
prelucrat de ctre form. n acest caz trecerea la linie nou se realizeaz prin
combinaia Ctrl + Enter.
WantTabs (de tip bool) stabilete dac utilizatorul poate (pentru valoarea
true) s insereze n zon spaieri cu ajutorul tastei Tab. n cazul valorii false
(valoare implicit) la acionarea tastei Tab se va trece la urmtoarea
component de pe form. n acest caz spaierile se vor insera prin combinaia
Ctrl + Tab.
WordWrap (de tip bool) stabilete (pentru valoarea true, valoare implicit)
regimul de trecere automat la linie nou atunci cnd se ajunge la muchia din
dreapta a zonei (fr inserarea automat a caracterelor de trecere la linie nou).
Evident, n acest caz bara de defilare orizontal n-are sens.
- 52 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
- 53 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int num;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender){
num=Edit1->Text.ToInt();
Memo1->Lines->Add("Divizorii numarului "+AnsiString(num));
AnsiString s="";
for(int i=1;i<=num;i++) if(num%i==0) s=s+AnsiString(i)+" ";
Memo1->Lines->Add(s);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
AnsiString cale;
cale=InputBox("Salvare rezultate","Dati calea fisierului","");
Memo1->Lines->SaveToFile(cale);
}
- 54 -
Copie autorizata pentru studenii CFBC
- 55 -
Copie autorizata pentru studenii CFBC
- 56 -
Copie autorizata pentru studenii CFBC
Exemple rezolvate
- 57 -
Copie autorizata pentru studenii CFBC
Realizare:
1) Executm File\New\Application.
# include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
- 58 -
Copie autorizata pentru studenii CFBC
}
void __fastcall TForm1::Inchide1Click(TObject *Sender){
Form1->Close();
}
void __fastcall TForm1::Mica1Click(TObject *Sender){
Form1->Width=50; Form1->Height=50;
}
void __fastcall TForm1::mijlocie1Click(TObject *Sender){
Form1->Width=200; Form1->Height=200;
}
void __fastcall TForm1::Mare1Click(TObject *Sender){
Form1->Width=400; Form1->Height=400;
}
void __fastcall TForm1::Verde1Click(TObject *Sender){
Form1->Color=clGreen;
}
void __fastcall TForm1::Galben1Click(TObject *Sender){
Form1->Color=clRed;
}
void __fastcall TForm1::Albastru1Click(TObject *Sender){
Form1->Color=clBlue;
}
void __fastcall TForm1::N1001Click(TObject *Sender){
Form1->Height=100;
}
void __fastcall TForm1::N2001Click(TObject *Sender){
Form1->Height=200;
}
void __fastcall TForm1::N3001Click(TObject *Sender){
Form1->Height=300;
}
void __fastcall TForm1::N1002Click(TObject *Sender){
Form1->Width=100;
}
void __fastcall TForm1::N2002Click(TObject *Sender){
Form1->Width=200;
}
void __fastcall TForm1::N3002Click(TObject *Sender){
Form1->Width=300;
}
- 59 -
Copie autorizata pentru studenii CFBC
Realizare:
1) Executm File\New\Application.
Afisare Iesire
Eminentii
Restantierii
Toti studentii
- 60 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "fstream.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){ }
fstream f("student.txt");
class student{
public:
char nume[20], prenume[20], grupa[10];
double media;
student *next;
student(){next=NULL;}
void citire();
AnsiString linie();
};
class lista{
public:
student *l,*prim;
lista(){prim=NULL;}
void creare();
void afisare();
void lenesi();
void eminenti();
~lista();
};
void student::citire(){f>>nume>>prenume>>grupa>>media;}
AnsiString student::linie(){
- 61 -
Copie autorizata pentru studenii CFBC
AnsiString s1,s2,s3,s4,sir;
int i;
s1=AnsiString(nume); for(i=s1.Length();i<21;i++) s1=s1+"
";
s2=AnsiString(prenume); for(i=s2.Length();i<21;i++) s2=s2+"
";
s3=AnsiString(grupa); for(i=s3.Length();i<16;i++) s3=s3+"
";
s4=AnsiString(media); for(i=s4.Length();i<11;i++) s4=s4+"
";
sir=s1+s2+s3+s4;
return sir;
}
void lista::creare(){
student *p;
while(!f.eof()){
p=new student;
p->citire();
if(prim==NULL){prim=l=p;}
else{l->next=p;l=p;}
}
}
void lista::afisare(){
l=prim;
while(l->next!=NULL){
Form1->Memo1->Lines->Add(l->linie());
l=l->next;
}
}
void lista::lenesi(){
l=prim;
while(l->next!=NULL){
if(l->media<=6) Form1->Memo1->Lines->Add(l->linie());
l=l->next;
}
}
void lista::eminenti(){
l=prim;
while(l->next!=NULL){
if(l->media>=8.88) Form1->Memo1->Lines->Add(l->linie());
l=l->next;
}
}
lista::~lista(){
while(prim!=NULL){
l=prim;
prim=prim->next;
delete l;
}
}
- 62 -
Copie autorizata pentru studenii CFBC
lista p;
void __fastcall TForm1::Iesire1Click(TObject *Sender){
Application->Terminate();
}
void __fastcall TForm1::FormCreate(TObject *Sender){
p.creare();
}
void __fastcall TForm1::Totistudentii1Click(TObject *Sender){
Memo1->Clear(); p.afisare();
}
void __fastcall TForm1::Studentilenesi1Click(TObject *Sender){
Memo1->Clear(); p.lenesi();
}
void __fastcall TForm1::Studentieminenti1Click(TObject
*Sender){
Memo1->Clear(); p.eminenti();
}
void __fastcall TForm1::Button1Click(TObject *Sender){
Memo1->Clear();
}
- 63 -
Copie autorizata pentru studenii CFBC
struct TRect {
TRect() {}
TRect(const TPoint& TL, const TPoint& BR) {
left=TL.x; top=TL.y; right=BR.x; bottom=BR.y;
}
- 64 -
Copie autorizata pentru studenii CFBC
Chord (X1, Y1, X2, Y2, X3, Y3, X4, Y4) construiete o elips nscris n
dreptunghiul determinat de coordonatele ntregi X1, Y1, X2, Y2, domeniul
- 65 -
Copie autorizata pentru studenii CFBC
Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4) construiete un sector de elips
nscris n dreptunghiul determinat de coordonatele X1, Y1, X2, Y2 i
mrginit de semidreptele cu originea n centrul dreptunghiului i care trec
prin punctele (X3, Y3), (X4, Y4). Se deseneaz mpotriva acelor de ceas.
- 66 -
Copie autorizata pentru studenii CFBC
RoundRect (X1, Y1, X2, Y2, X3, Y3: Integer) construiete i coloreaz
un dreptunghi cu colurile rotunjite, a crui diagonal este mrginit de
punctele (X1, Y1), (X2, Y2).
- 67 -
Copie autorizata pentru studenii CFBC
TryLock (de tip bool) returneaz valoarea true dac pnza de desenare nu
este blocat de alte comenzi, apoi o blocheaz.
Center (de tip bool) stabilete dac centrul imaginii afiate de component
va coincide (pentru valoarea true) sau nu cu centrul ei. n cazul valorii
false, colul stnga-sus al imaginii va fi poziionat n colul-stnga sus al
componentei. Proprietatea Center nu are nici un efect atunci, cnd
proprietatea AutoSize are valoarea true, sau atunci cnd proprietatea Stretch
este true i proprietatea Picture nu specific un simbol grafic de extensie
*.ICO.
- 68 -
Copie autorizata pentru studenii CFBC
Exemple rezolvate
Realizare
- 69 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int X=10;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void desen(int a,int b){
Form1->Canvas->Brush->Color = clRed;
Form1->Canvas->Ellipse(a-X, b-X, a+X, b+X);
}
void __fastcall TForm1::FormClick(TObject *Sender) {
int x,y;
x=Mouse->CursorPos.x-Form1->Left;
y=Mouse->CursorPos.y-X*2.5-Form1->Top;
desen(x,y);
}
void __fastcall TForm1::FormKeyPress(TObject *Sender, char
&Key){
if(Key=='c'){ Form1->Hide(); Form1->Show();}
if(Key=='x') Form1->Close();
}
void __fastcall TForm1::curata1Click(TObject *Sender){
Form1->Hide();
Form1->Show();
}
void __fastcall TForm1::Inchide1Click(TObject *Sender){ Form1-
>Close();}
Realizare:
1) Executm File / New Application.
- 70 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::FormPaint(TObject *Sender) {
double x,y;
int x1, y1;
Form1->Canvas->Pen->Width=1;
Color=clWhite;
Canvas->MoveTo(ClientWidth /2,0);
Canvas->LineTo(ClientWidth / 2, ClientHeight);
Canvas->MoveTo(0, ClientHeight / 2);
Canvas->LineTo(ClientWidth, ClientHeight / 2);
Canvas->TextOut(ClientWidth-10, ClientHeight / 2 + 2, "X");
Canvas->TextOut(ClientWidth / 2 + 20, ClientHeight / 2, "1");
Canvas->TextOut(ClientWidth / 2 + 2, 5, "Y");
Canvas->TextOut(ClientWidth / 2 + 2, ClientHeight / 2 - 20,
"1");
Form1->Canvas->Pen->Width=3;
x=-5;
while (x<=5) {
y=x*x*x;
x1=20*x+ (ClientWidth / 2);
y1=(ClientHeight / 2)-20*y;
Canvas->Pixels[x1][y1]=clRed;
- 71 -
Copie autorizata pentru studenii CFBC
x=x+0.001;
}}
- 72 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
1) Executm File / New /Application.
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "fstream.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
int X=10;
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
- 73 -
Copie autorizata pentru studenii CFBC
Realizare:
- 74 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "math.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double a,b,i,x,y;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void figura(int x, int y);
void __fastcall TForm1::Button1Click(TObject *Sender){
x=10;
y=Form1->Height/2; a=x;
b=Form1->Width ; i=a;
Timer1->Enabled=true;
}
void figura(int x, int y){
int l=25;
Form1->Canvas->Rectangle(x-l/2,y-l/2,x+l/2,y+l/2);
}
void __fastcall TForm1::FormPaint(TObject *Sender){
Form1->Canvas->Pen->Color=clRed;
Form1->Color=clWhite;
Form1->Canvas->Brush->Color=clBlue;
Form1->Canvas->Pen->Mode=pmNotXor;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender){
if(i>b) i=a;
figura(x+i,y-sin(i/25)*50);
i+=5;
figura(x+i,y-sin(i/25)*50);
}
void __fastcall TForm1::Button2Click(TObject *Sender){Timer1-
>Enabled=false;}
- 75 -
Copie autorizata pentru studenii CFBC
- 76 -
Copie autorizata pentru studenii CFBC
if(ColorDialog1->Execute();
Canvas->Pen->Color=ColorDialog1->Color;
- 77 -
Copie autorizata pentru studenii CFBC
Exemple rezolvate
Realizare:
- 78 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button1Click(TObject *Sender){
OpenDialog1->Execute();
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
SaveDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
- 79 -
Copie autorizata pentru studenii CFBC
Realizare:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::FormShow(TObject *Sender){
Memo1->Top=0; Memo1->Left=0;
Memo1->Height=Form1->Height-55;
Memo1->Width=Form1->Width-10;
- 80 -
Copie autorizata pentru studenii CFBC
}
void __fastcall TForm1::FormResize(TObject *Sender){
Memo1->Top=0;
Memo1->Left=0;
Memo1->Height=Form1->Height-55;
Memo1->Width=Form1->Width-10;
}
void __fastcall TForm1::SaveAs1Click(TObject *Sender){
SaveDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
void __fastcall TForm1::Open1Click(TObject *Sender){
OpenDialog1->Execute();
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
}
void __fastcall TForm1::New1Click(TObject *Sender){
int i=Application->MessageBoxA("Doriti sa salvati
fisierul","Save", MB_YESNO);
if(i==IDYES){
OpenDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
Memo1->Clear();
}
void __fastcall TForm1::Close1Click(TObject *Sender){
Form1->Close();}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction
&Action){
int i=Application->MessageBoxA("Doriti sa salvati
fisierul","Save", MB_YESNO);
if(i==IDYES){
OpenDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
}
void __fastcall TForm1::Copy1Click(TObject *Sender){
Memo1->CopyToClipboard();
}
void __fastcall TForm1::Paste1Click(TObject *Sender){
Memo1->PasteFromClipboard();
}
void __fastcall TForm1::SelectAll1Click(TObject *Sender){
Memo1->SelectAll();}
void __fastcall TForm1::Font1Click(TObject *Sender) {
FontDialog1->Execute();
Memo1->Font=FontDialog1->Font;
}
- 81 -
Copie autorizata pentru studenii CFBC
- 82 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
- 83 -
Copie autorizata pentru studenii CFBC
Realizare:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button2Click(TObject *Sender){
- 84 -
Copie autorizata pentru studenii CFBC
if (!(ListBox1->ItemIndex == -1))
ListBox1->Items->Delete(ListBox1->ItemIndex);
}
void __fastcall TForm1::Button1Click(TObject *Sender){
ListBox1->Items->Add(Edit1->Text);
Edit1->Clear();
}
void __fastcall TForm1::Button3Click(TObject *Sender){ Close();
}
void __fastcall TForm1::Button4Click(TObject *Sender){
ShowMessage(ListBox1->Items->Strings[ListBox1->ItemIndex]);
}
- 85 -
Copie autorizata pentru studenii CFBC
OnChange apare n momentul n care un alt articol este selectat sau un text
este introdus n caseta de editare.
OnDropDown se declaneaz n momentul n care urmeaz s fie deschis
lista derulant a listei combinate.
Exemplu rezolvat
Realizare:
- 86 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "math.h"
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::ComboBox1Click(TObject *Sender){
double r;
r=sqrt((ComboBox1->Items->Strings[ComboBox1-
>ItemIndex]).ToInt()); Label1->Caption=AnsiString(r);
}
void __fastcall TForm1::FormCreate(TObject *Sender){
for(int i=1;i<=40;i++)
ComboBox1->Items->Add(IntToStr(i));
}
- 87 -
Copie autorizata pentru studenii CFBC
- 88 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
- 89 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include<stdlib.h>
#include "Unit1.h"
#define dim 4
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int i,j,a,b;
char c;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
randomize();
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
StringGrid1->Cells[i][j]=random(100);
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
StringGrid2->Cells[i][j]=random(100);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
{
a=StringGrid1->Cells[i][j].ToInt();
b=StringGrid2->Cells[i][j].ToInt();
StringGrid3->Cells[i][j]=a+b;
}
}
- 90 -
Copie autorizata pentru studenii CFBC
de zile care preced data menionat. Partea fracionar semnific fraciuni din
ziua corespunztoare valorii.
De exemplu, numrul 2.75 reprezint data 1 ianuarie 1900 ora 18:00, iar
numrul 3.25 data 27 decembrie 1899 ora 6:00.
Formatul de reprezentare a datei printr-un string depinde de opiunile
regionale stabilite n Windows. De exemplu, noi folosim formatul dd.MM.yy.
H:mm:ss, unde dd este numrul zilei n lun, MM numrul lunii, yy anul,
H ora, mm numrul minute, ss numrul de secunde.
Dac utilizatorul nu specific ora, minutele sau secundele, atunci acestea
se consider nule.
- 91 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
- 92 -
Copie autorizata pentru studenii CFBC
Realizare:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TDateTime p1,p2,d,w;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::FormCreate(TObject *Sender){p1=Time();}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction
&Action){
p2=Time();
d=p2-p1;
- 93 -
Copie autorizata pentru studenii CFBC
- 94 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
- 95 -
Copie autorizata pentru studenii CFBC
Realizare:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Timer1Timer(TObject *Sender){
- 96 -
Copie autorizata pentru studenii CFBC
TDateTime d;
d=Time();
Label1->Caption=AnsiString(d);
}
void __fastcall TForm1::FormCreate(TObject *Sender){
Timer1->Enabled=true;
Timer1->Interval=100;
}
void __fastcall TForm1::MonthCalendar1Click(TObject *Sender){
DateTimePicker1->Date=MonthCalendar1->Date;
}
void __fastcall TForm1::DateTimePicker1Change(TObject *Sender){
MonthCalendar1->Date=DateTimePicker1->Date;
}
- 97 -
Copie autorizata pentru studenii CFBC
de cutie.
FileEdit (de tip TEdit) stabilete cutia de editare care va afia numele
fiierului selectat de utilizator n cutie.
FileName (de tip AnsiString) pstreaz numele (mpreun cu calea)
fiierului selectat de utilizator n cutie.
FileType (de tip mulime) determin ce tip de fiiere va afia cutia. Valori
posibile: ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive,
ftNormal.
Mask specific care fiiere pot fi afiate, asemeni proprietii Filter a
componentei OpenDialog.
ShowGlyphs (de tip bool) stabilete dac n faa fiecrui fiier va aprea
(pentru valoarea true) sau nu va aprea pictograma.
21.2. DirectoryListBox
- 98 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
- 99 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
- 100 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
- 101 -
Copie autorizata pentru studenii CFBC
Realizare:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
- 102 -
Copie autorizata pentru studenii CFBC
- 103 -
Copie autorizata pentru studenii CFBC
- 104 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare
1) File/New/Application
- 105 -
Copie autorizata pentru studenii CFBC
Fiierul Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n;
TEdit **Edit;
TLabel **Label;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button1Click(TObject *Sender){
int s=0;
for(int i=0;i<n;i++) s+=Edit[i]->Text.ToInt();
Label1->Caption="Suma este: "+AnsiString(s);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
n=Edit1->Text.ToInt();
Edit = new TEdit *[n];
Label=new TLabel *[n];
for(int i=0;i<n;i++) {
Edit[i] = new TEdit(this);
Label[i]=new TLabel(this);
Edit[i]->Parent = Form1;
Label[i]->Parent = Form1;
Label[i]->Caption="Introdu valoarea "+AnsiString(i+1);
Edit[i]->Top = i*25+70;
Edit[i]->Left = 120;
Edit[i]->Width = 50;
Edit[i]->Height = 23;
Label[i]->Top = i*25+70;
Label[i]->Left = 20;
- 106 -
Copie autorizata pentru studenii CFBC
Label[i]->Height = 23;
}
}
void __fastcall TForm1::Button3Click(TObject *Sender){
for(int i=0;i<n;i++) {
delete Edit[i] ;
delete Label[i];
}
delete Edit;
delete Label;
}
Realizare
1) File/New/Application
- 107 -
Copie autorizata pentru studenii CFBC
Fiierul Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n;
TEdit **Edit;
TForm *Forma;
TButton *Buton;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button2Click(TObject *Sender){
Forma= new TForm(this);
Forma->Caption="Vector";
n=Edit1->Text.ToInt();
Edit = new TEdit *[n];
for(int i=0;i<n;i++){
Edit[i] = new TEdit(this);
Edit[i]->Parent = Forma;
Edit[i]->Top = 50;
Edit[i]->Left = 50+i*50;
Edit[i]->Width = 50;
Edit[i]->Height = 50;
Edit[i]->Text=AnsiString(random(100));
}
int max,min,p1,p2,y;
max=min=Edit[0]->Text.ToInt();
for(int i=1;i<n;i++){
y=Edit[i]->Text.ToInt();
if(max<y) {max=y;p1=i;}
if(min>y) {min=y;p2=i;}
}
Edit[p1]->Color=clMoneyGreen;
Edit[p2]->Color=clSkyBlue;
- 108 -
Copie autorizata pentru studenii CFBC
Forma->Show();
}
void __fastcall TForm1::Button1Click(TObject *Sender){
for(int i=0;i<n;i++) delete Edit[i];
delete Edit;
delete Forma;
}
- 109 -
Copie autorizata pentru studenii CFBC
Capitolul II
Prelucrarea bazelor de date
1. Noiuni generale
O baza de date (BD) reprezint o modalitate de stocare a unor
informaii (date) pe un suport extern, cu posibilitatea regsirii acestora. n BCB
baza de date este un spaiu n memorie organizat ntr-un anumit mod pentru
pstrarea grupurilor de date. Sistemul de gestiune a bazelor de date (SGBD)
realizeaz ntreinerea BD i accesul la datele bazei.
Grupurile de date n Borland C++ Builder snt prezentate prin tabele i
funcii de pstrare. Prin nregistrri se are n vedere liniile tabelelor.
Calculatoarele pe care se plaseaz bazele de date se numesc servere, iar
cele de pe care snt accesate datele se numesc clieni. Bazele de date pot fi de
diferite tipuri:
bazele de date locale pot fi de tipul Paradox, dBase, Access, etc.
prin reea: InterBase, Informix, SyBase, Oracle, etc.
- 110 -
Copie autorizata pentru studenii CFBC
3. Din meniul Object alegem comanda New. Apare fereastra New Database
Alias n care alegem tipul aliasului. Alegem STANDARD i apsm OK.
- 111 -
Copie autorizata pentru studenii CFBC
- 112 -
Copie autorizata pentru studenii CFBC
- 113 -
Copie autorizata pentru studenii CFBC
- 114 -
Copie autorizata pentru studenii CFBC
Validity Checks asigur o completare mai bun a datelor prin verificarea lor
dup urmtorii parametri:
Minimul value valoarea minim;
Maximum value valoarea maxim;
Default value valoarea implicit;
Picture specific tipul informaiei care urmeaz a fi plasat (creaz o
masc pentru introducerea datelor; de exemplu, masca [-]#*# permite
utilizatorului s scrie doar numere ntregi negative sau pozitive, iar
masca #*# doar a celor pozitive);
Butonul Assist... afieaz o fereastr prin care utilizatorul poate alege o
masc pentru caseta Picture.
Secondary Indexes este un index care permite sortarea datelor nu doar dup
cmpul cheie-primar. Cu ajutorul acestui index se poate indica:
o nou sortare a datelor;
cmpul, care poate lega tabelul cu alt tabel;
o metod de cutare.
- 115 -
Copie autorizata pentru studenii CFBC
Active (de tip bool) permite (pentru valoarea true) sau interzice accesul
ctre tabel.
Bof (de tip bool) determin dac cursorul se afl (pentru valoarea true) sau
nu la nceputul tabelului.
Eof (de tip bool) determin dac cursorul se afl (pentru valoarea true) sau
nu la sfritul tabelului.
Database Name indic numele sau pseudonimul bazei date.
TableName specific numele tabelului.
TableType indic tipul tabelului. Valori posibile: ttDefault, ttParadox,
ttDBase, ttFoxPro, ttASCII.
- 116 -
Copie autorizata pentru studenii CFBC
- 117 -
Copie autorizata pentru studenii CFBC
AutoEdit (de tip bool) permite (pentru valoarea true) sau interzice editarea
datelor.
DataSet specific setul de date. Valoarea acestei proprieti poate fi numele
unei componente de tip TTable.
- 118 -
Copie autorizata pentru studenii CFBC
Table1.
3. Atribuim proprietii DataSource a componentei DBGrid1 valoarea
DataSource1.
4. Stablim valoarea true pentru proprietatea Active a controlului Table1.
- 119 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
- 120 -
Copie autorizata pentru studenii CFBC
Realizare
- 121 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#define anul_curent 2009
#pragma resource "*.dfm"
- 122 -
Copie autorizata pentru studenii CFBC
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button1Click(TObject *Sender){
double sc,imp,iv,fs,am;
int cat,anul,ore,zile;
ore=8; zile=24;
Table1->First();
while(!Table1->Eof)// cit timp nu sntem la ultima
inregistrare
{
cat=Table1->FieldValues["Categoria"];
anul=Table1->FieldValues["Anul_Ang"];
switch(cat) {
case 1: sc=1.2*ore*zile; break;
case 2: sc=1.5*ore*zile; break;
case 3: sc=1.8*ore*zile; break;
}
if(anul_curent-anul>=15) sc+=sc*0.2;
else if(anul_curent-anul>=5) sc+=sc*0.1;
iv=sc*0.08;
fs=sc*0.05;
am=sc*0.04;
Table1->Edit();//Pregateste tabelul pentru a inscrie date
Table1->FieldValues["Sal_Calculat"]=sc;
Table1->FieldValues["Impozite"]=fs+am+iv;
Table1->FieldValues["Sal_Primit"]=sc-fs-am-iv;
Table1->Post();//Salveaza modificarele efectuate in tabel
Table1->Next();//trece la urmatoarea inregistrare
}
}
- 123 -
Copie autorizata pentru studenii CFBC
- 124 -
Copie autorizata pentru studenii CFBC
Exemple rezolvate
Realizare:
- 125 -
Copie autorizata pentru studenii CFBC
- 126 -
Copie autorizata pentru studenii CFBC
Realizare:
Realizare:
- 127 -
Copie autorizata pentru studenii CFBC
6. ndicm sursa (tabelul din care vor fi extrase datele): din paleta Series
alegem pagina DataSource, iar de aici DataSet. Efectum modificrile
necesare.
- 128 -
Copie autorizata pentru studenii CFBC
- 129 -
Copie autorizata pentru studenii CFBC
4. Interogri
Interogarea este un obiect, prin intermediul cruia din baza de date se
extrag nregistrri, care corespund condiiilor indicate. Cu ajutorul interogrilor
se pot vizualiza, analiza i modifica datele din tabele. Pentru crearea
interogrilor, BCB ofer componenta Query, care se afl pe paleta DBE.
Interogrile se scriu n limbajul SQL.
- 130 -
Copie autorizata pentru studenii CFBC
- 131 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
- 132 -
Copie autorizata pentru studenii CFBC
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString s[6];
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){
s[1]="select nume, prenume, sal_primit from muncitori where
- 133 -
Copie autorizata pentru studenii CFBC
5. Rapoarte
Un raport reprezint o modalitate de extragere a unei informaii din BD
cu scopul ca ulterior aceasta s fie tiprit.
Prin sursa unui raport vom nelege un tabel sau o interogare.
Pentru crearea rapoartelor BCB ofer paleta de componente QReport.
Vom examina unele componente ale acestei palete.
Bands (de tip logic) permite afiarea benzilor. O pagin QuickRep poate
conine urmtoarele tipuri de benzi:
HasColumnHeader afieaz antetul fiecrei coloane.
- 134 -
Copie autorizata pentru studenii CFBC
- 135 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
- 136 -
Copie autorizata pentru studenii CFBC
- 137 -
Copie autorizata pentru studenii CFBC
6. Tehnologia ADO
- 138 -
Copie autorizata pentru studenii CFBC
Parametri posibili:
Provider specific numele unui ADO provider utilizat cu conexiunea
respectiv.
File name reprezint numele unui fiier, care conine informaiile despre
conexiune.
Remote Provider este numele unui ADO provider care exist pe o alt
staie.
Remote Server este numele serverului, n cazul n care se folosete o alt
staie.
- 139 -
Copie autorizata pentru studenii CFBC
- 140 -
Copie autorizata pentru studenii CFBC
- 141 -
Copie autorizata pentru studenii CFBC
- 142 -
Copie autorizata pentru studenii CFBC
- 143 -
Copie autorizata pentru studenii CFBC
10. Apare fereastra ODBC Microsoft Access Setup. Apsm butonul Select.
12. Alegem baza de date i efectum un click pe butonul OK. Din acest
moment conexiunea cu baza de date este creat.
Dup stabilirea conexiunii pot fi utilizate componentele pentru
prelucrarea informaiei din baza de date.
- 144 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
- 145 -
Copie autorizata pentru studenii CFBC
6. Apare freastra Create New Data Source n care alegem opiunea MySQL
ODBC 5.1 Driver (driverele recent instalate sau poati fi i alt versiune), apoi
executm un click pe butonul Next.
- 146 -
Copie autorizata pentru studenii CFBC
10. Indroducem datele despre adresa bazei de date. n caseta Server scriem
numele serverului pe care se afl baza de date (localhost serverul local).
11. n caseta User indicm numele user-ului pe care lucrm (nu este un account
al bazei de date).
12. n cazul n care user-ul este protejat cu parol, aceasta se indic n caseta
Password.
13. Dac datele au fost introduse corect, atunci n lista derulant Database apar
numele bazelor de date existente (n imagine, information_schema, mysql).
Dup selecrarea numelui bazei de date se efectueaz un click pe butonul Ok.
14. Se confirm numele conexiunii n fereastra Select Data Source. Din acest
moment conexiunea este efectuat.
- 147 -
Copie autorizata pentru studenii CFBC
Capitolul III
Programarea Orientat
pe Obiecte cu C++
1. Preliminarii
Orice limbaj de programare se bazeaz pe o anumit ideee dominant,
care determin structura programelor create cu acest limbaj.
Din punct de vedere istoric iniial a dominat idea structurrii
procedurale a programelor. Programatorul decidea ce proceduri va utiliza n
program, apoi alegea cel mai potrivit algoritm pentru realizarea acestor
proceduri. De exemplu, limbajul Fortran este un limbaj de programare
procedural. Acest tip de programare a dus la crearea bibliotecilor mari de
proceduri.
Pe parcursul dezvoltrii informaticii accentul s-a deplasat de la
proceduri spre organizarea datelor. S-a ajuns la concluzia c pentru elaborarea
programelor eficace era nevoie de utilizarea corect a datelor. Ca o consecin
logic a noii tendine, a aprut ideea structurrii programelor cu ajutorul
modulelelor (adic a unitilor de program). n ele erau stocate nu doar
subprograme, dar i date. De exemplu, limbajul Pascal este un limbaj de
programare modular.
Ideea dominant a programrii moderne, numit Programare
Orientat pe Obiecte (POO), presupune unirea datelor cu subprogramele care
prelucreaz aceste date ntr-un tot ntreg, numit obiect. Aceast aciune (de
unire) se numete incapsulare, iar subprogramele unui obiect metode. La
incapsulare se ia n considerare legtura logic dintre date i metode.
De fapt, concepia de obiect a intervenit pentru crearea unor noi tipuri
de date, care nu snt predefinite (de exemplu, tipurile de date numr complex i
graf nu snt definite n majoritatea limbajelor dfe programare). Aa cum un tip
de date este definit nu doar de mulimea valorilor tipului (adic de datele
propriu zis), dar i de operatorii aplicabili asupra acestor valori, a aprut ideea
incapsulrii datelor i metodelor. Pe parcursul timpului, sensul atribuit
- 148 -
Copie autorizata pentru studenii CFBC
2. Clase
Aa cum clasa este un tip abstract de date, rezult c ea este format din
dou pri:
a) partea care definete datele, componentele ei fiind numite date
membru;
b) partea care definete operaiile asupra datelor, format din
subprograme, numite funcii membru.
- 149 -
Copie autorizata pentru studenii CFBC
Exemple:
- 150 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Coninutul programului:
#include<iostream.h>
#include<iomanip.h>
#define N 100
class vector{
public:
int vect[N];
void citire();
void afis();
int suma();
int max();
};
void vector::citire(){for(int i=0;i<N;i++) cin>>vect[i];}
void vector::afis(){for(int i=0;i<N;i++)
cout<<setw(5)<<vect[i];cout<<endl;}
int vector::suma(){
int i,s=0;
for(i=0;i<N;s+=vect[i],i++);
return s;
}
int vector::max(){int m,i;m=vect[0];
for(i=1;i<N;i++) if(m<vect[i]) m=vect[i];
return m;
}
main(){
vector v;
cout<<"Introdu elementele vectorului"<<endl; v.citire();
cout<<"Elementele vectorului :"<<endl; v.afis();
cout<<"suma elementelor : "<<v.suma()<<endl;
cout<<"elemental maxim : "<<v.max()<<endl;
}
- 151 -
Copie autorizata pentru studenii CFBC
3. Pointerul *this
Orice metod apelat a unui obiect are definit implicit pointerul
this, a crui valoare este adresa obiectului. El nu poate fi declarat explicit, nu
poate fi modificat, dar poate fi utilizat explicit.
Exemplu:
class complex {
public:
double re,im;
void init(double x,double y);
};
void complex::init(double x,double y)
{
this->re = x;
this->im = y;
}
4. Funcii inline
La compilare operaiile suplimentare de apel a unei funcii inline i de
revenire din ea snt eliminate. O metod definit (nu doar declarat) n
interiorul clasei este implicit metod inline.
O metod definit n fara clasei se consider metod inline doar dac n
locul unde ea este definit antetul metodei este prefixat de cuvntul cheie inline.
De exemplu, metoda citire() a clasei vector poate fi definit metod
inline astfel:
Observaii
1. Este interzis folosirea n cadrul funciilor inline a structurilor repetitive (for,
while, do while),
i a funciilor recursive.
2. De regul, o metod inline conine n definirea ei pn la 45 instruciuni.
3. De regul, metodele inline nu conin n definirea lor operaii aritmetice.
- 152 -
Copie autorizata pentru studenii CFBC
5. Constructor
Constructorul este o funcie-membru special care are ca scop principal
iniializarea obiectelor. Se pot defini civa constructori pentru aceeai clas. Ei
vor fi funcii suprancrcate (vom examina suprancrcarea mai trziu) i se
vor deosebi prin numrul i/sau tipurile parametrilor. Constructorii respect
urmtoarele reguli:
Exemplu:
class complex {
public:
double re,im;
complex(double a, double b){re=a;im=b;} // def. constructorului
};
main(){
complex X(2.4,5.8); // instantierea obiectului X
}
- 153 -
Copie autorizata pentru studenii CFBC
class complex {
public:
double re,im;
complex(){re=im=0;}
};
main(){
complex x;
}
Nume_clasa(Nume_clasa &ob_sursa){
membru_1=ob_sursa.membru_1;
membru_2=ob_sursa.membru_2;
// ...
membru_n=ob_sursa.membru_n;
}
Exemplu:
class complex {
public:
double re,im;
complex(complex &a){a.re=re; a.im=im;}
};
main(){
complex x(2.4,5.8), a(x);
}
- 154 -
Copie autorizata pentru studenii CFBC
6. Destructor
Destructorul este o funcie-membru special care are ca scop principal
distrugerea obiectului (deci eliberarea memoriei ocupat de acest obiect). Un
obiect se distruge n una din urmtoarele trei situaii:
cnd este prsit blocul n care a fost creat (cazul obiectelor locale);
la terminarea programului (cazul obiectelor globale);
cnd se aplic operatorul delete (obiecte create dinamic cu new).
n cazul n care nu este definit explicit un destructor, compilatorul genereaz
automat unul cu corpul de instruciuni vid. Destructorul nu are parametri i nu
returneaz nimic. O clas are un unic destructor, care nu poate fi suprancrcat
(deoarece nu are parametri). Numele destructorului se formeaz din numele
clasei precedat de simbolul "~" (tilda). Destructorul se apeleaz automat la
distrugerea unui obiect al clasei.
Exemplu rezolvat
Realizare:
#include <conio.h>
#include <string.h>
#include <iostream.h>
class student{
public:
char * nume,* nr_de_identificare;
int anul, cursul;
double media;
/******* Constructori *****/
student(); //Constructor implicit
student(char * , int , char * ,double ); //Constr. de init1
student(char * , char * ,double );//Constr. de init2
student(student& ); //Constructor de copiere
~student(){}; // Destructor
/****** Metode *******/
void tipareste_student();
void bursa();
}; //sfirsitul declararii clasei
student::student(){
nume = "Nedefinit";
- 155 -
Copie autorizata pentru studenii CFBC
cursul = 0; media = 0;
nr_de_identificare = "Nedefinit";
cout<<endl<<"Constructor implicit "<<endl;
}
student::student(char * a, int c, char * n, double med){
nume=a; cursul=c;
nr_de_identificare=n;
media=med;
cout<<endl<<"Constructor de initializare1 "<<endl;
}
student::student(char * a1, char * n1, double med){
nume=a1; cursul=0;
nr_de_identificare=n1;
media=med;
cout<<endl<<"Constructor de initializare2 "<<endl;
}
student::student(student&C){
nume= C.nume; cursul= C.cursul;
nr_de_identificare= C.nr_de_identificare;
media= C.media;
cout<<endl<<"Constructor de copiere "<<endl;
}
void student::tipareste_student(){
cout<<"Metoda de afisare "<<endl;
cout<<"Nume: "<<nume<<endl<<"Cursul: "<<cursul<<endl;
cout<<"Numarul de identificare: "<<nr_de_identificare<<endl;
cout<<"Media: "<<media<<endl;
}
void student::bursa(){
cout<<"Metoda BURSA "<<endl;
if(media>7) cout<<"Studentul are bursa!"<<endl;
else if(media>5)cout<<"Studentul nu are bursa!"<<endl;
else cout<<"Studentul este restantier"<<endl;
}
void main(){
student st1("Lupei Rodica",2,"AR985I",9.81);
// apelarea constr. de init.1
st1.tipareste_student(); st1.bursa();
student st2("Popa Ion","RD726K",6.89);
// apelarea constr. de init.2
st2.tipareste_student(); st2.bursa();
student st3("Chistruga Alexandru",2,"AD564L",4.99);
st3.tipareste_student();
st3.bursa();
student st4(st1);
st4.tipareste_student();
student st; // apelarea constructorului implicit
st.tipareste_student();
}
- 156 -
Copie autorizata pentru studenii CFBC
Realizare:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
class vector{
public:
int * vect,N;
vector(); // Constructorul implicit al clasei vector
vector(int a); // Constructor definit, a numarul de elemente
void citire();
void afis();
~vector(); // Declaram destructorul clasei vector
}; // sfirsitul declararii clasei vector
vector::vector(){ // definim constructorul implicit
cout<<Introdu nr. de elemente ale vectorului<<endl;
cin>>N;
vect=new int[N];
}
vector::vector(int a){ N=a; vect=new int[N];}
vector::~vector(){ delete []vect;}//Definim destructorul
- 157 -
Copie autorizata pentru studenii CFBC
7. Funcii prietene
Datele i metodele unei clase nu pot fi prelucrate n exteriorul clasei,
dac ele snt protejate cu modificatorii de protecie private sau protected.
Totui, uneori apare necesitatea prelucrrii acestor date n afara clasei lor.
Acest fapt este posibil prin intermediul aa numitor funcii prietene (friend
functions). Declararea unei funcii prietene f() clasei X se realizeaz astfel:
class X{
//
friend tip_returnat
f(parametru_de_tip_clas,lista_de_parametri);
};
tip_returnat f(parametru_de_tip_clas, lista_de_parametri){
// corpul functiei
}
Accesul la datele clasei se face prin intermediul parametrului de tip
clas (nu prin numele obiectului clasei ca n cazul metodelor clasei). Deci
parametru_de_tip_clas este obligatoriu (spre deosebire de funciile membru,
in cazul funciilor prietene nu mai este definit pointerul implicit this), iar
lista_de_parametri poate i s lipseasc.
Exemplu rezolvat
Realizare:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<conio.h>
class vector{
int vect[10];
void citire();
void afis();
friend void prieten(vector c);
};
void vector::citire(){
for(int i=0;i<10;i++) vect[i]=random(100);
}
void vector::afis(){
for(int i=0;i<10;i++) cout<<setw(5)<<vect[i];
cout<<endl;
- 158 -
Copie autorizata pentru studenii CFBC
}
void prieten(vector c){
c.citire(); c.afis();
}
main(){
randomize();
vector Q;
prieten(Q);
getch();
}
- 159 -
Copie autorizata pentru studenii CFBC
tip_data *p;
p= new tip_data [(initializare)];
unde tip_data reprezint tipul definit, adic numele clasei, p este numele
pointerului de tip obiect, iar initializare (care poate s lipseasc) este o
expresie care depinde de tipul datei i permite iniializarea zonei de memorie
alocate. Dac alocarea nu este posibil, pointerul returnat este NULL.
Operatorul new poate produce apelul unui constructor.
- 160 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
class student{
char *nume,*prenume;
int anul;
double media;
public:
student();
student(char *p1,char *p2);
student(char *p1,char *p2,int p3,double p4);
void afis();
~student();
};
student::student(){
char s[20];
cout<<"Constructor implicit"<<endl;
cout<<"Dati numele studentului";cin>>s;
nume=new char[strlen(s)+1];strcpy(nume,s);
cout<<"Dati prenumele studentului";cin>>s;
prenume=new char[strlen(s)+1];strcpy(prenume,s);
cout<<"Dati anul nasterii";cin>>anul;
cout<<"Dati media :";cin>>media;
}
student::student(char *p1,char*p2){
nume= p1;prenume= p2;
anul=0; media=0;
}
student::student(char *p1,char *p2,int p3,double p4){
nume= p1;prenume= p2;anul=p3;media=p4;
}
- 161 -
Copie autorizata pentru studenii CFBC
void student::afis(){
cout<<nume<<" "<<prenume<<" "<<anul<<" "<<media<<endl;
}
student::~student(){delete nume;delete prenume;}
void main(){
student *s[3];
int i;
s[0]=new student;
s[1]=new student("Moraru","Ion");
s[2]=new student("Ciobanu","Vasile",1990,8.75);
cout<<endl<<"Lista studentilor"<<endl<<endl;
for(i=0;i<3;i++) s[i]->afis();
getch();
for(i=0;i<3;i++) delete s[i];
}
9. Suprancrcarea operatorilor
- 162 -
Copie autorizata pentru studenii CFBC
class nume_clasa
{
// datele i metodele clasei
tip operator S(lista_de_parametri);
};// sfirsitul declaratiei clasei
tip nume_clasa::operator(lista_de_parametri){
// descrierea procesului de suprancrcare
}
unde S este operatorul suprancrcat, tip tipul rezultatului operaiei S, iar
lista_de_parametri reprezint operanzii care particip la operaia S.
Observaie
1. n cazul suprancrcrii prin funcii membru lista_de_parametri va
conine cu un parametru mai puin (din cauza c prin intermediul funciilor
membru este acces la obiectul curent).
2. Dac suprancrcarea este realizat printr-o funcie prieten, atunci primul
operant va reprezenta obiectului curent.
- 163 -
Copie autorizata pentru studenii CFBC
Observaii:
1. Dac operatorul = nu este suprancrcat, el are o semnificaie implicit.
2. Funcia operator trebuie s aib cel puin un argument (implicit sau
explicit) de tipul clasei pentru care s-a suprancrcat operatorul.
3. Unui operator i se poate atribui orice semnificaie, ns se recomand ca
aceasta s fie ct mai apropiat de semnificaia natural.
Exemple rezolvate
1. Suprancrcarea operatorului +
S crem un exemplu n care vom suprancrca operatorul + pentru
clasa complex. Deoarece adunarea numerelor complexe este comutativ, vom
examina cazurile:
1. complex + complex
2. double + complex
3. complex + double
n primul i al treilea caz suprancrcarea poate fi efectuat prin
intermediul funciilor membru, ns n cazul doi suprancrcarea este posibil
numai prin intermediul unei funciei prieten, deoarece primul parametru al unei
funcii membru operator este implicit de tipul clasei i nu poate fi de alt tip.
Rezolvare:
#include<iostream.h>
class complex{
public:
double x,y;//complex=x+yi
void citire();
void afisare();
complex operator +(complex);
friend complex operator +(double, complex);
complex operator+(double);
};
void complex::citire(){
cout<<partea reala;cin>>x;
cout<<partea imaginara;cin>>y;
}
void complex::afisare(){cout<<x<<+<<y<<i<<endl;}
- 164 -
Copie autorizata pentru studenii CFBC
2. Suprancrcarea operatorului =
- 165 -
Copie autorizata pentru studenii CFBC
obiectele clasei au date membri de tip pointer, sau n situaiile n care memoria
este alocat n mod dinamic.
S crem dou exemple n care vom suprancrca explicit operatorul =
pentru clasa complex prin intermediul unei funcii membru i respectiv cu
ajutorul unei funcii friend.
Realizare:
class complex{
public:
double x,y;
complex operator = (complex );
};
complex complex::operator = (complex z){
x=z.x; y=z.y; return *this;
//this este pointer ctre obiectul curent, a n main
}
void main(){
complex a, b;
a = b;
}
- 166 -
Copie autorizata pentru studenii CFBC
class nume_clasa{
//Date i metode;
friend int operator@( nume_clasa, nume_clasa);
};
//unde @ este un operator de comparaie
//descrierea suprancrcrii :
int operator@( nume_clasa ob1, nume_clasa ob2){
if(condiia de comparare) return 1;
else return 0;
}
n urmtoarea secven de program vom suprancrca (cu ajutorul unei
funcii prieten) operatorul = = pentru clasa complex:
class complex{
double x,y;
public:
friend int operator== (complex,complex);
};
int operator == (complex ob1, complex ob2){
if(ob1.x==ob2.x && ob1.y==ob2.y) return 1;
else return 0;}
void main(){
complex a, b;
if(a==b) cout<<Numere egale;
else cout<<Numere diferite;
}
- 167 -
Copie autorizata pentru studenii CFBC
S crem un exemplu n care vom suprancrca operatorii <<, >> pentru clasa
complex.
Realizare:
#include<iostream.h>
class complex {
public:
double x, y;
friend ostrem& operator << (ostrem& os, complex z);
friend istream& operator >>(istream& is,complex& z);
};
ostream& operator<<(ostream& os, complex z){
os <<z.x;
if(z.y==0) os<<endl;
if(z.y<0) os<<-<<z.y<<i<<endl;
if(z.y>0) os<<+<<z.y<<i<<endl;
return os;
}
istream& operator>>(istream& is, complex& z){
cout<<Dati partea reala ; is >> z.x;
cout<<Dati parteaimaginara; >> z.y;
return is;
}
- 168 -
Copie autorizata pentru studenii CFBC
main(){
complex x,y;
cout<<Introdu primul nr complex; cin>>x;
cout<<Introdu a-l doilea nr complex; cin>>y;
cout<<x<<y;
}
- 169 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
#include<iostream.h>
#include<string.h>
class Angajat{
protected:
- 170 -
Copie autorizata pentru studenii CFBC
char *nume;
double salariu;
public:
void set_ang(char *n, double sal);
void afis_ang();
};
void Angajat::set_ang(char *n, double sal){
int size = strlen(n); nume = new char[size+1];
strcpy(nume, n); salariu = sal;
}
void Angajat::afis_ang(){
cout << "Nume: " << nume<< " Salariu: " << salariu << endl ;
}
class Administrator : public Angajat {
int sectie;
public:
void set_admin(char *n, double sal, int sec);
void afis_admin();
};
void Administrator::set_admin(char *n,double sal, int sec){
int size = strlen(n); nume = new char[size+1];
strcpy(nume, n); salariu = sal; sectie=sec;
}
void Administrator::afis_admin(){
afis_ang();
cout << "Sectia : " << sectie << endl;
}
void main(){
Angajat a1;
cout<<"Datele despre Angajat ";
a1.set_ang("Manole", 2000);
a1.afis_ang();
Administrator m1;
m1.set_admin("Frunza", 3000, 1);
cout<<"Datele despre Administrator ";
m1.afis_admin();
}
- 171 -
Copie autorizata pentru studenii CFBC
11.1. Generaliti
Constructorii i destructorii snt funcii membre care nu se motenesc.
La crearea unui obiect a unei clase derivate se apeleaz implicit mai nti
constructorii claselor de baz, apoi constructorul clasei derivate. Ordinea n
care snt apelai constructorii claselor de baz corespunde ordinii claselor de
baz din declaraia clasei derivate.
Dac clasa de baz (adic clasa printe) nu are constructor implicit sau
se dorete ca un constructor suprancrcat s fie apelat atunci cnd un nou
obiect al unei clase derivate este creat, atunci se poate specifica acest lucru n
definiia constructorului clasei derivate:
Numele_clasei_derivate (lista_de_parametri):
Numele_clasei_de_baz (lista_de_parametri) {}
#include<iostream.h>
class baza{
public:
int i;
baza(int x){i=x;cout<<"construeste baza"<<endl;}
};
class derivat:public baza {
- 172 -
Copie autorizata pentru studenii CFBC
public:
int j;
derivat(int x,int y){j=x;i=y;cout<<"construeste
derivat"<<endl;}
void arata(){cout<<i<<" "<<j<<endl;}
};
main(){
derivat ob(3,4);
ob.arata();
}
class Baza{
Baza(tip_1 par_1,,tip_k par_k); // construct. clasei de baza
};
class Derivat:public Baza {
Derivat(tip_1 par_1, ,tip_k par_k,,tip_n par_n); // constr.
clasei derivate
};
Derivat::Derivat(tip_1 par_1, ,tip_k par_k, .,tip_n par_n):
Baza(par_1, par_2, ,par_k){
/* iniializare date membre clasa derivata */
}
Exemplu rezolvat
- 173 -
Copie autorizata pentru studenii CFBC
derivat(){};
derivat(int x,int y): baza(y){
j=x; cout<<"construeste derivat";
}
void arata(){cout<<i<<" "<<j<<endl;}
};
main(){
derivat ob(3,4);
ob.arata();
}
Exemplu rezolvat
- 174 -
Copie autorizata pentru studenii CFBC
Realizare:
#include <string.h>
#include <iostream.h>
#include<conio.h>
void main(){
student *s1,*s2;
- 175 -
Copie autorizata pentru studenii CFBC
int i;
bugetar *a,*b;
cout<<"lucru cu pointeri de tip student"<<endl;
s1=new student("Ciobanu","Vasile",1990,7.75);
s2=new bugetar("Ciubotaru","Vlad",1989,8.75);
cout<<endl<<"studentii din lista"<<endl<<endl;
s1->afis();
s2->afis();
cout<<endl<<"lucru cu pointeri de tip bugetar"<<endl;
b=new bugetar("Moraru","Ion",1989, 9.2);
b->student::afis();
b->afis();
delete s1;
delete s2;
delete b;
getch();
}
Observaii.
1. Dac o metod este declarat ca funcie virtual n clasa de baz, ea va
fi virtual pentru toate clasele derivate.
2. O metod virtual este declarat cu scopul de a o utiliza i n alte clase
(nu numai n clasa de baz).
3. Redefinirea unei funcii virtuale ntr-o clas derivat domin definiia
funciei n clasa de baz.
Exemple rezolvate
- 176 -
Copie autorizata pentru studenii CFBC
#include <iostream.h>
class Baza{
public:
void afisare(){cout<<"afisare Baza"<<endl;}
virtual void citire(){cout<<"citire Baza"<<endl;}
};
class Derivat: public Baza{
public:
void afisare(){cout<<"afisare Derivat"<<endl;}
void citire(){cout<<"citire Derivat"<<endl;}
};
main(){
clrscr();
Derivat a;
a.citire();
a.afisare();
Baza *b;
b=new Derivat;
b->citire();
b->afisare();
}
citire Derivat
afisare Derivat
citire Derivat
afisare Baza
Realizare:
#include <stdlib.h>
#include <iostream.h>
class patrat{
protected:
double l;
public:
- 177 -
Copie autorizata pentru studenii CFBC
patrat(double a){l=a;}
void afisare(){cout<<"patrat l= "<<l<<endl;}
virtual double arie(){return l*l;}
};
class cub : public patrat{
public:
cub(double w):patrat(w){};
void afisare(){cout<<"cub l="<<l<<endl;}
double arie(){return patrat::arie()*l;}
};
void main(){
patrat *s[10];
s[0]=new patrat(5);
s[1]=new cub(12);
cout<<"metodele nevirtuale"<<endl;
s[0]->afisare();
s[1]->afisare();
cout<<"metodele virtuale"<<endl;
cout<<"patrat "<<s[0]->arie()<<endl;
cout<<"cub "<<s[1]->arie()<<endl;
delete s[0];
delete s[1];
}
La consol se va afia:
metodele nevirtuale
patrat l= 5
patrat l= 12
metodele virtuale
patrat 25
cub 1728
class nume_baza{
//...
virtual tip_returnat nume_metoda() {};
...
};
- 178 -
Copie autorizata pentru studenii CFBC
12.2. Polimorfism
n preliminariile acestui capitol am menionat c polimorfismul d
posibilitatea ca att clasa derivat, ct i clasa de baz s poat utiliza metode cu
acelai nume, dar cu diferite funcionaliti.
De cele mai dese ori polimorfismul se realizeaz prin intermediul
funciilor virtuale. Declarate n clasa de baz, se presupune c acestea vor fi
implementate n clasele derivate.
n cazul funciilor normale (pentru care snt cunoscute adresele de apel) se
spune c legarea dintre obiect i funcie este timpurie, n sensul c aceast legare are
loc n timpul compilrii programului. Apelurile soluionate n timpul compilrii au o
vitez ridicat.
Legarea trzie se refera la evenimente din timpul execuiei programului,
adic la cazul cnd adresa funciei care urmeaz sa fie apelata nu este cunoscut
n timpul compilrii, doar n momentul execuiei programului.
Adresa de apel a funciilor virtuale nu este cunoscut n timpul
compilrii. Accesul la ele se face prin pointerii la clasa de baz. Chiar dac
legarea trzie conduce la un timp de execuie mai mare al programelor, aceasta
simplific programele, conferindu-le elegan i flexibilitate.
Exemplu rezolvat
- 179 -
Copie autorizata pentru studenii CFBC
Realizare:
Metodele afis i volum snt metode abstracte, adic pentru clasa triunghi ele nu
efectueaz nimic, dar vom avea nevoie de aceste metode n clasele derivate.
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream.h>
class triunghi{
protected:
double lat; //
public:
virtual void citire();
virtual double arie();
virtual void afis(){};
virtual double volum(){return 0;}
};
void triunghi::citire(){
cout<<"Introdu lungimea laturii (bazei): ";cin>>lat;
}
double triunghi::arie(){return lat*lat*sqrt(3)/4;}
- 180 -
Copie autorizata pentru studenii CFBC
main(){
triunghi *fig[10];
int n,i,k,arie,volum;
double amax,vmax;
cout<<"Introdu numarul figurilor ";cin>>n;
amax=vmax=0.0;
for(i=0;i<n;i++){
clrscr();
cout<<" Tastati"<<endl<<"1 Piramida"<<endl<<
"2 prisma "<<endl; cin>>k;
if(k==1) fig[i]=new piramida;
else fig[i]=new prisma ;
fig[i]->citire();
if(amax<fig[i]->arie()) {amax=fig[i]->arie(); arie=i;}
if(vmax<fig[i]->volum()) {vmax=fig[i]->volum();volum=i;}
}
cout<<"In depozit snt urmatoarele figuri"<<endl;
for(i=0;i<n;i++) fig[i]->afis();
cout<<"Figura cu aria maxima"<<endl;
fig[arie]->afis();
- 181 -
Copie autorizata pentru studenii CFBC
13.1. Generaliti
Conceptul de motenire multipl permite crearea de clase noi care
motenesc datele i metodele mai multor clase de baz. Motenirea multipl
aduce mai mult flexibilitate n construirea claselor, rezultatul fiind obinerea
unor structuri de clase complexe.
Astfel, sintaxa general pentru declararea unei clase este:
Exemplu rezolvat
Realizare:
#include <iostream.h>
#include <conio.h>
class barbat{
public:
char *prenume;
int anul;
barbat(){};
- 182 -
Copie autorizata pentru studenii CFBC
- 183 -
Copie autorizata pentru studenii CFBC
b.afisare();
}
- 184 -
Copie autorizata pentru studenii CFBC
Exemplu rezolvat
Realizare:
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
class punct{
protected:
int x,y,cul;
public:
virtual void citire();
virtual void des();
};
class patrat:virtual public punct{
protected:
int l;
public:
void citire();
void des();
};
class cerc:virtual public punct{
protected:
int raza;
public:
void citire();
void des();
};
class figura:public patrat, public cerc {
public:
void citire();
void des();
- 185 -
Copie autorizata pentru studenii CFBC
};
void punct::citire(){
clrscr();
cout<<"introdu x:";cin>>x;
cout<<"introdu y:";cin>>y;
cout<<"introdu culoare:";cin>>cul;
}
void patrat::citire(){
punct::citire();
cout<<"introdu latura patrarului:";cin>>l;
}
void punct::des(){putpixel(x,y,cul);}
void patrat::des(){
setcolor(cul);
bar(x-int(l/2),y-int(l/2),x+int(l/2),y+int(l/2));
}
void cerc::citire(){
punct::citire();
cout<<"Introduceti raza cercului:"; cin>>raza;
}
void cerc::des(){
setcolor(cul);
circle(x,y,raza);
}
void figura::citire(){
punct::citire();
cout<<"Introduceti latura patratului:"; cin>>l;
cout<<"Introduceti raza cercului:"; cin>>raza;
}
void figura::des(){
if(l*l>M_PI*raza*raza)
{patrat::des(); cerc::des(); }
else{ cerc::des(); patrat::des();}
punct::des();
}
void main(){
punct *masiv[10];
int i,g,m,n; char c;
cout<<"Introdu numarul figurilor"; cin>>n;
for(i=0;i<n;i++){
cout<<"Tastati"<<endl<<"1-PUNCT"<<endl<<"2-PATRAT";
cout<<endl<<"3-CERC"<<endl<<"4-FIGURA"<<endl;
c=getch();
clrscr();
switch(c) {
case '1': masiv[i]=new punct;break;
case '2': masiv[i]=new patrat;break;
case '3': masiv[i]=new cerc;break;
case '4': masiv[i]=new figura; break;
}
- 186 -
Copie autorizata pentru studenii CFBC
masiv[i]->citire();
}
g=DETECT;
initgraph(&g,&m,"d:\\Tc\\bgi");
for(i=0;i<n;i++) {
cleardevice();
masiv[i]->des();
getch();
}
closegraph();
delete []masiv;
}
- 187 -
Copie autorizata pentru studenii CFBC
Exemple rezolvate
Realizare:
#include<iostream.h>
template <class T> T maxim(T a,T b){
if(a>b) return a; else return b;}
main(){
cout<<"int : "<<maxim<int>(4,7)<<endl;
cout<<"double : "<<maxim<double>(4.7,2.3)<<endl;
cout<<"char : "<<maxim<char>('c','h')<<endl;
}
int : 7
double : 4.7
char : h
- 188 -
Copie autorizata pentru studenii CFBC
#include<iostream.h>
template<class T>
void sort(T* vect, int n){
int i,j;
T x;
for(i=1; i<n; i++){
x = *(vect + i);
j = i - 1;
while((j >= 0) && (x < *(vect + j))){
*(vect + j + 1) = *(vect + j); j--;
}
*(vect + j + 1) = x; } }
main(){
int i;
double dv[] = {4.7, 0.66, 7.0, 1,8, 3.0, 12.9};
int iv[] = {10, 9, 5, 3, -2, 4};
char cv[] = {'f', '4', 'h', 'i', 'a', 'c'};
sort(dv,6);
sort(iv,6);
sort(cv,6);
cout<<"Tipul double"<<endl;
for (i=0; i<6; i++) cout << dv[i] << " ";
cout<<endl<<"Tipul int"<<endl;
for (i=0; i<6; i++) cout << iv[i] << " ";
cout<<endl<<"Tipul char"<<endl;
for (i=0; i<6; i++) cout << cv[i] << " ";
}
Tipul double
0.66 1 3 4.7 7 8
Tipul int
-2 3 4 5 9 10
Tipul char
4 a c f h i
- 189 -
Copie autorizata pentru studenii CFBC
individuale, diferite prin tipul sau tipurile de date asupra crore se opereaz.
Prefixul template <class T> specific declararea unui template cu un
argument T. Dup aceast introducere, T este folosit exact la fel ca orice tip de
date, n tot domeniul clasei template declarate.
Numele unei clase template urmat de numele tipurilor de date folosite
ca argumente, ncadrate ntre parantezele < i > este numele unei clase
(definite aa cum specific template-ul) i poate fi folosit la fel ca oricare alt
clas.
Utilizarea template-urilor implic generarea de ctre compilator a
fiecarei clase care corespunde tipului (sau tipurilor) de date folosit la declararea
unui obiect.
Exemplu rezolvat
S elaborm un program care va prelucra elementele unui vector de orice
tip ordinal.
#include<iostream.h>
template <class T> class vector{
public:
T *v,x;
int n;
vector(int c){n=c; v=new T[n];}
void citire();
void afisare();
void sortare();
~vector(){delete []v;}
};
template <class T> void vector<T>::citire(){
for(int i=0;i<n;i++) {
cout<<"Introdu elementul "<<i<< ;
cin>>v[i];
} }
template <class T> void vector<T>::afisare(){
for(int i=0;i<n;i++) cout<<v[i]<<" ";
cout<<endl;
}
template <class T> void vector<T>::sortare(){
int i,j;
for(i=1; i<n; i++) {
x = v[i]; j = i - 1;
while((j >= 0) && (x < v[j])) {
v[j+1] = v[j]; j--;
} v[j+1] = x;
}}
main(){
vector<int> v1(5);
- 190 -
Copie autorizata pentru studenii CFBC
vector<double> v2(5);
vector<char> v3(5);
cout<<" 5 valori int "<<endl;
v1.citire();
cout<<" 5 valori double "<<endl;
v2.citire();
cout<<" 5 valori char "<<endl;
v3.citire();
cout<<"valori citite"<<endl;
v1.afisare();
v2.afisare();
v3.afisare();
cout<<"vectorii sortati"<<endl;
v1.sortare();
v1.afisare();
v2.sortare();
v2.afisare();
v3.sortare();
v3.afisare();
}
- 191 -
Copie autorizata pentru studenii CFBC
Ierarhizarea abloanelor
Motenirea abloanelor
Clasele template ca i clasele obinuite susin mecanismul de motenire.
Toate principiile de baz ale motenire rmn neschimbate. Astfel se ofer
posibilitatea de a construi modele ierarhice de clase. Fie dat ierarhia:
Problema 3
Se consider drept baz clasa dreptunghi, iar n calitate de derivat
clasa prism. Pentru aceast ierarhie va fi realizat polimorfismul pentru
metodele citire, afisare, suprafata i volum. Se va descrie i constructorii
ambelor clase.
- 192 -
Copie autorizata pentru studenii CFBC
#include<iostream.h>
template <class T> class drept {
public:
T a,b;
drept(){};
drept(T,T);
virtual void citire();
virtual void afisare();
virtual T suprafata();
virtual T volum(){return 0;}//metod virtuala pura
};
template <class T> drept<T>::drept(T x, T y){a=x;b=y;}
template <class T> void drept<T>::citire(){
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
}
template <class T> void drept<T>::afisare(){
cout<<"Dreptunghi lungimile laturilor: "<<a<<" "<<b<<endl;
cout<<"Suprafata: "<<suprafata()<<endl;
}
template <class T> T drept<T>::suprafata(){return a*b;}
template <class T> class prisma : public drept< T> {
public:
T h;
prisma(){};
prisma(T,T,T);
void citire();
void afisare();
T suprafata();
T volum();
};
template <class T> prisma<T>::
prisma(T x,T y,T z):drept<T>(x,y){h=z;}
template <class T> void prisma<T>::citire(){
drept<T>::citire();
cout<<"h=";cin>>h;
}
template <class T> void prisma<T>::afisare(){
cout<<"Prisma lungimile laturilor bazei: ";
cout<<a<<" "<<b<<"Inaltimea: "<<h<<endl;
cout<<"Suprafata: "<<suprafata()<<" Volumul: "<<volum()<<endl;
}
template <class T> T prisma<T>::suprafata(){
return 2*(a*b+a*h+b*h);}
template <class T> T prisma<T>::volum(){
return drept<T>::suprafata()*h;}
int main(){
int i; double st,vt;
drept<int> *p[4];
p[0]=new drept<int>(2,3);
- 193 -
Copie autorizata pentru studenii CFBC
p[1]=new prisma<int>(4,2,7);
p[2]=new drept<int>; p[2]->citire();
p[3]=new prisma<int>;p[3]->citire();
cout<<"Datele introduse de tipul int"<<endl;
for(i=0;i<4;i++) p[i]->afisare();
drept<double> *t[4];
t[0]=new drept<double>(2.5,3);
t[1]=new prisma<double>(4.3,2,7.4);
t[2]=new drept<double>; t[2]->citire();
t[3]=new prisma<double>;t[3]->citire();
cout<<"Datele introduse de tipul double"<<endl;
for(i=0;i<4;i++) t[i]->afisare();
prisma<double> b[3];
cout<<"Dati datele a 3 prisme"<<endl;
for(i=0;i<3;i++)
b[i].citire();
vt=st=0.0;
cout<<"Datele introduse"<<endl;
for(i=0;i<3;i++){ b[i].afisare();
vt+=b[i].volum();
st+=b[i].suprafata();
}
cout<<"Volumul total:="<<vt<<endl;
cout<<"Suprafata totala:="<<st<<endl;
return 0;
}
- 194 -
Copie autorizata pentru studenii CFBC
- 195 -
Copie autorizata pentru studenii CFBC
cout<<"2-Inserare"<<endl;
cout<<"3-Exclude"<<endl;
cout<<"0-iesire"<<endl;
c=getch();clrscr();
switch(c){
case '1':a.parcurge();getch();break;
case '2':a.inserare();break;
case '3':a.exclude();break;
}clrscr();
}while(c!='0');
}
int main(){
clrscr();
cout<<"Stiva de numere intregi"<<endl;
stiva<int> sn;
meniu(sn);
cout<<"Stiva de caractere"<<endl;
stiva<char> sc;
meniu(sc);
return 0;
}
- 196 -
Copie autorizata pentru studenii CFBC
Cuprins
Prefa.................................................................................................. 3
- 197 -
Copie autorizata pentru studenii CFBC
- 198 -