Sunteți pe pagina 1din 12

Lucrarea de laborator nr.

1 MEDIUL VISUAL C++, ELEMENTELE DE BAZ ALE LIMBAJULUI


Obiective: n aceast lucrare de laborator ne propunem: familiarizarea studenilor cu mediul de lucru Visual Studio, prezentarea elementelor de baz ale unui proiect n Visual C++, crearea de fiiere surs n C++, cunoaterea elementelor de baz ale limbajului: variabile, funcii, domeniu de definiie, domeniu de vizibilitate, constante simbolice.

Programarea orientat pe obiecte este o metod de programare n care programele sunt organizate ca i colecii de obiecte cooperante, fiecare dintre ele reprezentnd o instan a unei clase, iar clasele sunt membre ale unei ierarhii de clase, corelate ntre ele prin relaii de motenire. n cadrul laboratorului de POO se va folosi Microsoft Visual C++ 9.0 rulnd sub sistemul de operare Windows XP. n aceast lucrare de laborator, vei ncepe s nvai cteva dintre conceptele de baz ale limbajului Visual C++ i vei crea un program simplu n mod consol. Programele scrise folosind Visual C++ sunt compilate ceea ce nseamn c un fiier text denumit fiier surs este convertit ntr-un program de sine stttor care poate fi rulat n afara mediului Visual C++. Programele scrise folosind Visual C++, pot fi scrise i compilate ntr-un program executabil, si poate fi apoi executat pe orice calculator care dispune de un sistem de operare Windows. Mediul Visual C++ permite editarea, compilarea, executarea i depanarea unui program n interiorul aceluiai mediu, ceea ce permite utilizatorului s se concentreze asupra scrierii programului, n loc de a da atenie unei mulimi de detalii. 282

1.1. Microsoft Visual C++ 9.0


Lansarea mediului Visual C++ se poate face accesnd Shortcut-ul de pe Desktop care este nsoit de icon-ul corespunztor. La lansarea mediului Visual C++ este afiat fereastra Visual Studio i va reprezenta suprafaa de lucru. Cnd se folosete Visual C++ pentru dezvoltarea unui program, majoritatea activitii este privit drept un proiect. Fiecare proiect stocheaz informaia necesar crerii unui program n C++. n funcie de tipul i de complexitatea programului, proiectul se poate reduce la cteva fiiere sau poate include sute de fiiere. Exemplu: Creai un proiect astfel: Selectai comanda New a meniului File pentru a crea un nou proiect; caseta de dialog New va fi afiat. Specificai tipul proiectului pe care l creai din pagina Projects a casetei de dialog New (din lista proiectelor posibile alegei Win32 Console Application). n caseta Project Name specificai numele proiectului. Folosii caseta Location pentru a preciza directorul n care vor fi plasate fiierele proiectului. Apsarea butonului OK iniiaz generarea proiectului. n cazul unei aplicaii de tip Win32 Console Application, procesul de generare a proiectului conine un singur pas n care trebuie s alegei ce tip de aplicaie n mod consol vei crea. Alegei An empty project. La apsarea butonului Finish este afiat o caset de dialog care v informeaz despre crearea unui schelet de proiect vid, adic nu vor fi create sau/i adugate fiiere suplimentare la proiect. Este precizat de asemenea calea ctre directorul proiectului. n acest moment, putei vizualiza urmnd aceast cale fiierele create.

1.2. Mediul Developer Studio


Mediul de dezvoltare Developer Studio utilizat de Visual C++ pare destul de complex la prima vedere (peste 100 de 283

opiuni de meniu i aproximativ tot attea butoane de pe bara de instrumente care pot fi selectate). Multe dintre acestea conduc la casete de dialog complexe i la pagini de proprieti care conin numeroase opiuni. Funcionalitatea att de bogat oferit de Developer Studio este justificat de faptul c acest mediu este utilizat pe scar larg pentru a produce aplicaii complexe, profesionale. Exemplu: Lansai din nou Visual C++. Deschidei proiectul creat anterior astfel: din meniul File, selectai proiectul din cadrul listei Recent Workspaces. Pentru a deschide un proiect care nu figureaz n lista Recent Workspaces, selectai Open Workspace din meniul File. Pe ecran este afiat fereastra Open Workspace n care accesai directorul folosit pentru proiectul creat. Selectai din list fiierul care poart numele proiectului i extensia .dsw i alegei Open. Indiferent de metoda utilizat, proiectul ar trebui s fie acum deschis, cu titlul su afiat n bara de titlu a ferestrei Developer Studio. Mediul de lucru a reinut unde ai rmas i afiarea este identic cu cea de la nchiderea mediului de dezvoltare. Afiarea cuprinde trei ferestre: cea a spaiului de lucru al proiectului, cea pentru editare i cea de ieire. Fereastra spaiului de lucru al proiectului n partea stng, este o fereastr andocabil. Exist mai multe astfel de ferestre (fereastra Output n partea de jos este una dintre ele), unele aprnd n modul depanare. Pentru a comuta ntre modul liber i modul andocabil pentru o fereastr, efectuai un dublu click pe bara de titlu a ferestrei respective. Fereastra spaiului de lucru al proiectului poate fi nchis prin efectuarea unui click pe butonul de nchidere, aflat n colul dreapta sus, iar redeschiderea se realizeaz prin selectarea comenzii Workspace din meniul View. Toate ferestrele andocabile au comportamente similare. Fereastra spaiului de lucru al proiectului permite vizualizarea acestuia din mai multe perspective. Dup ce ai deschis proiectul, n partea inferioar a spaiului de lucru, sunt disponibile dou pagini: ClassView i FileView. Paginile din partea inferioar a ferestrei mpart proiectul n componente logice. Efectuai click 284

pe o pagin pentru a vizualiza reprezentarea corespunztoare. Fiecare reprezentare afieaz o structur arborescent de elemente care reprezint componente ale proiectului. Putei s expandai sau s condensai elementele arborelui efectund click pe simbolul plus (+) sau minus (-) alturat n partea stng a acestora. Pentru c ai creat o aplicaie n mod consol ca un proiect gol nici un fiier nu exist n acest moment n proiect i nu poate fi vizualizat. Fiierele sunt organizate pe cataloage n funcie de tipul acestora (cataloagele nu reprezint locaia fiierelor pe hard disk). Efectuarea unui dublu click pe numele unui fiier deschide fiierul n fereastra din dreapta, fereastra de editare. Facei o comparaie ntre aceast list i coninutul directorului proiectului n care vei vedea alte cteva tipuri de fiiere. Unele dintre acestea sunt fiiere temporare folosite de ctre Developer Studio; altele depind de tipul proiectului i de coninutul su. n pagina File View se pot aduga fiiere proiectului sau se pot nltura fiiere din proiect prin selectarea numelui fiierului i apsarea tastei Delete. Aceasta duce doar la nlturarea fiierului din proiectul Visual Studio fr a terge efectiv fiierul de pe disc. Exerciii propuse: 1. Creai alte tipuri de proiecte pentru aplicaii n mod consol i vizualizai fiierele create de ctre mediul de dezvoltare. 2. Pentru tipurile de proiecte create analizai coninutul paginii FileView. Este afiat o list cu o parte din fiierele incluse n proiect.

1.3. Crearea unui fiier surs n C++


Cea mai important component a oricrui program n C++ o reprezint fiierele surs. Pentru simplitate, vei lucra la nceput cu programe care conin un singur fiier surs. 285

Exemplu: Dei programul model prezentat n listingul urmtor este foarte scurt, conine o bun parte dintre elementele existente n toate programele C++:
# include <iostream.h> int main() { cout<<Hello, World!<<endl; return 0; }

Exemplu: 1. Revenii la primul proiect creat. O modalitate de a deschide un fiier surs nou n vederea editrii este urmtoarea: selectai File, apoi New din meniul principal, alegei opiunea C++ Source File, dai un nume noului fiier (poate fi acelai ca al proiectului). Observai c, implicit este setat opiunea de adugare a noului fiier proiectului curent. n fereastra de editare se deschide noul fiier. Adugai codul de mai sus. 2. Compilai fiierul surs (Build Compile nume_fiier.cpp). Legai proiectul (Build Build nume_proiect.exe). Proiectul poate fi alctuit i prin selectarea direct a comenzii Build nume_proiect.exe, compilarea realizndu-se implicit. n fereastra de jos vor apare informaii privind compilarea fiierelor i legarea proiectului. Dac ai introdus corect coninutul listingului proiectul va fi creat fr erori i fr avertizri. Exerciii propuse: 1. Intenionat tergei din codul programului ghilimelele, sau punctul i virgula, sau parantezele. Compilai de fiecare dat i urmrii erorile i mesajele de avertizare. Un dublu click pe prima linie a unui mesaj de eroare poziioneaz cursorul n fereastra de editare n dreptul liniei unde compilatorul consider c se afl eroarea. Pot apare erori ca urmare a altor erori aa nct se corecteaz prima eroare i apoi se recompileaz s.a.m.d. 286

2. Dup compilarea i legarea fr erori a proiectului, putei rula programul selectnd Build Execute nume_proiect.exe din meniu.

1.4. Elementele de baz ale unui proiect n C++


Programul creat are multe n comun cu programe C++ de dimensiuni mult mai mari: Prima linie din program este un mesaj ctre compilator de a include i un alt fiier la compilarea fiierului creat. Instruciunea #include cere compilatorului s caute fiierul iostream.h i s-l introduc n fiierul surs. Urmtoarea linie reprezint nceputul funciei principale (main). Funcia main este locul n care ncepe execuia programului, motiv pentru care toate programele n C++ trebuie s aib o astfel de funcie ce returneaz (return) o valoare ntreag (int) sistemului de operare la ncheierea executrii. Funcia nu accept parametrii. Sistemul de operare folosete valoarea returnat de funcia main pentru a afla dac programul a fost executat cu succes. Exemplu: Pentru celelalte tipuri de proiecte pe care le-ai creat identificai funcia main deja creat de ctre mediul de dezvoltare. Urmtoarele 4 linii de dup int main() reprezint corpul funciei main, cunoscut i sub numele de bloc instruciune, ncadrat ntotdeauna ntre o pereche de acolade. n interiorul funciei main se afl o singur instruciune (care se ncheie cu ; ca toate instruciunile din C++) care afieaz la consol o linie de caractere folosind obiectul cout din iostream. Folosind biblioteca iostream, se simplific operaiile de intrare/ieire pentru programul n mod consol. Biblioteca iostream folosete simbolul << pentru ieiri i >> pentru intrri din, respectiv n fluxul de date (secven de octei, fiier pe disc, datele de ieire pentru imprimant sau pentru ecrane mod caracter etc.). O regul simpl este aceea c atunci cnd ntlnii simbolul <<, valoarea de la dreapta 287

simbolului va fi ieirea pentru obiectul IO din stnga iar cnd ntlnii simbolul >>, datele din obiectul IO din stnga sunt stocate ntr-o variabil din dreapta. Cout nseamn console output (ieire la consol) iar << poate fi tradus prin pune la. Observaie - cnd utilizai C++, nu uitai c deosebirea dintre literele mari i mici este important, dar spaiile libere, cum ar fi numrul de spaii dinaintea cuvn tului cout, nu sunt importante din punctul de vedere al compilatorului. Editorul ordoneaz automat codul surs i ofer faciliti de highlight pentru o deosebire uoar a cuvintelor cheie ale limbajului de restul codului. Endl (end line) indic sfrit de linie, astfel c, dup afiarea mesajului, cursorul trece la linie nou. Exerciiu: Afiai la consol mai multe mesaje pe aceeai linie, apoi pe linii diferite.

1.5. Elemente de baz ale limbajului


Variabile n afar de cuvintele-cheie ale limbajului (char, const, double, else, for etc., rezervate pentru anumite utilizri) ntrun program se declar i se definesc entiti care servesc algoritmului particular implementat prin program. Fiecare entitate poat un nume, care este introdus n program printr-o declaraie. Tipurile fundamentale n C++ sunt tipuri de ntreg, pentru definirea numerelor ntregi de diferite dimensiuni, tipuri de numere flotante, pentru definirea numerelor reale. Aceste tipuri sunt denumite mpreun tipuri aritmetice. Pentru tipu rile ntreg, exist variante de declaraie cu semn (signed) i fr semn (unsigned). Datele manipulate n cadrul unui program sunt stocate n variabile, care sunt identificate printr-un nume i un tip. Numele pentru variabile pot fi secvene de lungime oar ecare 288

de litere i cifre, cu condiia ca primul caracter s fie liter sau caracterul de subliniere (underscore) i cu condiia s nu fie cuvinte cheie. Literele mici sunt diferite de literele mari corespunztoare. n plus, cu cteva excepii pe care le vom indica ulterior o declaraie este i o definiie. Exemple de declaraii i definiii de variabile:
int a; // declararea i definirea de variabile sunt instruciuni, deci se ncheie cu punct i virgul (;) int a; // eroare, redefinire; trebuie s existe o singur definiie a unei entiti n program float real=5.7; // ntr-o declaraie a unui nume se poate introduce opional o expresie de iniializare pentru acel nume float Real=5.7; char caracter=x; // caracterul care iniializeaz o variabil de tip char este cuprins ntreghilimele simple.

Funcii Programarea procedural este prima modalitate de programare care a fost i este nc frecvent folosit. n programarea procedural accentul se pune pe descompunerea programului n proceduri (funcii) care sunt apelate n ordinea de desfurare a algoritmului. Limbajele care suport aceast tehnic de programare prevd posibiliti de transfer a argumentelor ctre funcii i de returnare a valorilor rezultate. Un program C++ este format din funcii. n afara funciilor nu pot exista n program dect directive de preprocesor, de exemplu, pentru includere de fiiere header sau declaraii i definiii de variabile globale. ntr-un program C++ instruciunile sunt grupate n blocuri de instruciuni cuprinse ntre acolade ({}). Mai mult, blocurile de instruciuni pot fi doar blocuri de definire a corpului unei funcii sau parte component a altor blocuri de instruciuni (blocuri imbricate). Funciile reprezint un tip derivat din tipurile fundamentale. Exemple de declaraii de funcii: 289

void f1(); //funcia cu numele f1 nu are de returnat nici o valoare void este un tip fundamental //care specific o mulime vid de valori i nu are nici un parametru // se poate scrie i void f1(void); float funcie(int a); //funcia returneaz o valoare de tip float i primete la apel //un argument formal (parametru) de tip ntreg double g(int, float); //declaraiile de funcii se mai numesc i prototipuri // n prototipuri, numele argumentelor formale sunt opionale

Definiia unei funcii include dup tipul returnat, numele funciei i lista de argumente formale, blocul de definiie al funciei. Exemplu de definiie a unei funcii:
int f (int x) { return x+1; }

Funciile sunt apelate n cadrul altor funcii. La apelul unei funcii, argumentele de apel iniializeaz argumentele formale din declaraia funciei, n ordinea din declaraie. Argumentele unei funcii se pot transfera n dou moduri: apelul prin valoare i apelul prin referin. n apelul prin valoare, se copiaz valoarea argumentului real n argumentul formal corespunztor al funciei iar modificrile efectuate asupra argumentului funciei (asupra copiei) nu modific argumentul real. Un exemplu de apel al unei funcii n cadrul altei funcii i transferul parametrilor:
#include <iostream.h> int f(int); // prototipul este un model limitat al unei entiti care urmeaz a fi definit mai // trziu (dup apelul ei n funcia main) // prototipul permite compilatorului s verifice numrul i tipurile argumentelor de apel void g(int x){cout << Rezultatul este << x;} //funcia g afieaz valoarea primit

290

void main() { int a=10; a= f(a); // se apeleaz funcia f creia i se transmite valoarea 10 // iar funcia returneaz valoarea 11 care este memorat n variabila a g(a); // se apeleaz funcia g creia i se transmite valoarea 11 } int f (int x) { return x+1; }

O funcie poate avea argumente implicite astfel nct ea poate fi apelat cu un numr de argumente mai mic:
int produs (int a, int b, int c=1, int d=1) { return a*b*c*d; } void main() { cout<<produs(2,7,4,5)<<endl; //a=2 b=7 c=4 d=5 cout<<produs(2,7,4)<<endl; // a=2 b=7 c=4 d=1 cout<<produs(2,7); // a=2 b=7 c=1 d=1 }

Numai argumentele de la sfritul listei pot fi argumente implicite, sau altfel spus, odat ce un parametru are o valoare implicit n lista parametrilor formali, toi cei ce urmeaz trebuie s aib valori implicite. Nu este posibil s lsm guri n mijlocul unei liste, dect dac restul valorilor vor fi implicite. Valorile implicite se dau n prototip sau n headerul din definiia funciei i nu n ambele, caz n care compilatorul ar trebui s verifice dac ambele valori sunt identice, lucru care ar complica i mai mult scrierea unui compilator pentru C++.
int produs (int a, int b, int c=1, int d); //eroare la compilare

n C++, mai multe funcii pot avea acelai nume, dac se pot diferenia prin numrul sau tipul argumentelor de apel. Mecanismul se numete suprancrcarea funciilor:
int f(int);

291

long f(int, int); void main(){ f(2); //apeleaz f(int) f(2,3); //apeleaz f(int, int)}

Tipul returnat nu este folosit pentru a determina care funcie va fi apelat. De asemenea, exemplul de mai sus face referire la acelai domeniu de definiie. Domeniu de definiie, domeniu de vizibilitate Domeniul de definiie al unui nume prin care se identific o entitate a unui program este zona din program n care numele este cunoscut i poate fi folosit. Dat fiind c un nume este fcut cunoscut printr-o declaraie, domeniile numelor se difereniaz n funcie de locul n care este introdus declaraia n program. Un nume declarat ntr-un bloc este local blocului i poate fi folosit numai n acel bloc, ncepnd din locul declaraiei i pn la sfritul blocului i n toate blocurile incluse dup punctul de declaraie. Argumentele formale ale unei funcii sunt tratate ca i cnd ar fi declarate n blocul cel mai exterior al funciei respective. Un nume declarat n afara oricrui bloc are ca domeniu fiierul n care a fost declarat i poate fi utilizat din punctul declaraiei pn la sfritul fiierului. Numele cu domeniu fiier se numesc nume globale. Un nume este vizibil n ntregul su domeniu de definiie dac nu este redefinit ntr un bloc inclus n domeniul respectiv. Dac ntr-un bloc interior domeniului unui nume se redefinete (sau se redeclar) acelai nume, atunci numele iniial (din blocul exterior) este parial ascuns, i anume n tot domeniul redeclarrii. Un nume cu domeniu fiier poate fi accesat ntr-un domeniu n care este ascuns prin redefinire, dac se folosete operatorul de rezoluie pentru nume globale (::). Redefinirea unui nume este admis numai n domenii diferite. Dac unul din domenii este inclus n cellalt domeniu, atunci redefinirea provoac ascunderea numelui din domeniul exterior n domeniul interior. Redefinirea n domenii identice produce eroare de compilare. Exemplu:
# include <iostream.h>

292

int index=13; // variabil global void main(){ float index=3.1415;//variabil local cout<<valoarea indexului local este << index << endl; cout<<valoarea indexului global este << ::index << endl;}

O entitate este creat atunci cnd se ntlnete definiia sa (care este unic) i este distrus (n mod automat) cnd se prsete domeniul ei de definiie. O entitate cu nume global se creeaz i se iniializeaz o singur dat i are durata de via pn la terminarea programului. Entitile locale se creeaz de fiecare dat cnd execuia programului ajunge n punctul de definire a acestora, cu excepia variabilelor locale declarate de tip static, care se iniializeaz o singur dat la prima execuie a instruciunii. O variabil global sau static neiniializat explicit, este iniializat automat cu 0. Exemplu:
static unsigned i; // iniializat automat cu valoarea 0

Constante simbolice O constant simbolic (sau constant cu nume) este un nume a crui valoare nu poate fi modificat n cursul programului:
# include <iostream.h> void afiare(const int data); //parametrul formal data este o constant pe parcursul // ntregii funcii i orice ncercare de a asigna o nou // valoare acestei variabile va produce eroare la compilare void main() { const int START=3; //compilatorul nu va permite ca accidental sau intenionat //s fie schimbat valoarea START pentru c a fost declarat constant afiare(START); } void afiare(const int data) { cout<<data<<endl; }

Orice nume de funcie este o constant simbolic. 293