Tematici Elementele comune ale unui program C++. Intrrile i ieirile standard dintr-un program C++. Preprocesorul C++. Elementele comune ale unui program C++: Programele sunt compuse din instruciuni i date. Instruciunile solicit calculatorului s execute anumite aciuni. Datele sunt cele cu care calculatorul opereaz. n cadrul programelor bine puse la punct, instruciunile nu se modiic pe msur ce programul se execut !cel puin se presupune c nu ar trebui". #atele, pe de alt parte, pot i, $n mod obinuit, se modiic sau %ariaz pe msur ce programul se execut. & variabil nu este altce%a dec't numele utilizat pentru a indica o parte din aceste date. Tipuri de date fundamentale C++ (imba)ul C++ oer mai multe tipuri de date fundamentale. n capitolele urmtoare putei utiliza aceste tipuri undamentale ca punct de pornire pentru propriile tipuri de date mai complexe. nainte ca o %ariabil s ie olosit $n C++ aceasta trebuie $nt'i declarat i deinit dup cum urmeaz* int m+,ge- ,ceast linie declar i deinete o %ariabil de tip $ntreg denumit m+,ge. & declaraie introduce numele m+,ge compilatorului i ataeaz un sens speciic acestuia. & definiie ca aceasta, de asemenea, instruiete compilatorul pentru ca s aloce memorie i s creeze %ariabila sau un alt obiect. ,tunci c'nd compilatorul .isual C++ citete deiniia lui m+,ge, acesta %a ace i urmtoarele* ,loc suicient memorie pentru stocarea unui $ntreg i utilizeaz numele m+,ge pentru a ace reerire la acesta. /ezer% numele m+,ge astel $nc't acesta s nu ie utilizat de ctre o alt %ariabil. ,sigur ca oric'nd m+,ge este utilizat, aceasta s ie olosit $ntr-o manier corespunztoare modului $n care un $ntreg ar trebui s ie utilizat. Economie de timp Este posibil s deinii mai multe %alori pe o singur linie, cu toate c din considerente de stil, muli programatori preer s declare o singur %ariabil pe linie. #ac dorii s acei iierul surs mai compact, putei separa %ariabilele printr-o %irgul, dup cum urmeaz* int m+,ge, +our,ge, maximum,ge- 0 ,ceast linie deinete trei %ariabile de tip $ntreg !int". #eclararea tuturor celor trei %ariabile pe o singur linie de cod nu determin codul s se execute mai rapid, dar c'teodat a)ut s acei codul surs mai lizibil. !nelegerea noiunii de siguran a tipului "T#pe Safet#$ 1ermen nou* 2nele limba)e de programare % permit s utilizai %ariabile r a le declara. ,ceasta conduce deseori la probleme care sunt diicil de urmrit i de rezol%at. ,tunci c'nd utilizai C++, trebuie s declarai toate %ariabilele $nainte de a le utiliza. ,ceasta % permite s depistai cele mai rec%ente erori din cadrul programului. ,ceast capacitate de a detecta erorile atunci c'nd un program este compilat este cunoscut ca siguran a tipului !type safety". #e exemplu, %alorile de tipul caracter sunt $n mod normal cuprinse $ntre 3 i 045 i sunt stocate $n %ariabile de tipul c6ar. n .isual C++, c6ar este o %ariabil pe un singur octet i este capabil s stoc6eze toate %alorile de tipul caracter. #ac compilatorul detecteaz aptul c $ncercai s stocai o %aloare numeric mai mare dec't 045 $ntr-o %ariabil de tipul c6ar, acesta o %a semnaliza i %a genera un mesa) de a%ertizare. (isting-ul 4.0 este un exemplu simplu de program care $ncearc s stoc6eze o %aloare care este prea mare $ntr-o %ariabil de tipul c6ar. %isting&ul 2'(' )n e*emplu de problem care poate fi depistat de ctre compilator' 7include 8iostream9 using namespace std- :: 16is program ;ill generate a compiler ;arning int main!" < c6ar distance = 5>?- cout 88 @16e distance is @ 88 distance 88 endl- return 3- A Pentru a %edea un exemplu de olosire necorespunztoare a tipului care este depistat de compilator, creai un proiect $n mod consol cu listing-ul 4.0 ca unic iier surs. Compilatorul indic linia > cu un a%ertisment- cu toate c acesta genereaz totui un program executabil. n scopul de a obine programul pentru compilare r a%ertismente i rularea acestuia aa cum este de ateptat, %a trebui s modiicai linia ? astel $nc't %ariabila distance s ie deinit ca i $ntreg* int distance = 5>?- Boua %ersiune a codului surs este prezentat $n listing-ul 4.4. %isting&ul 2'2' + versiune corect a e*emplului anterior' 7include 8iostream9 using namespace std- :: 16is program ;ill compile properl+. int main!" < int distance = 5>?- cout 88 @16e distance is @ 88 distance 88 endl- return 3- A 4 1ermen nou* 2n alt tip de dat rec%ent $nt'lnit este valoarea n virgul mobil !floating point value" sau un numr cu punct zecimal. .alorile $n %irgul mobil sunt pstrate $n %ariabile loat sau double $n programele C++. ,cestea dou sunt singurele tipuri de %ariabile $ncorporate !sau undamentale" care pot stoca numere reale $n ormat cu %irgul mobil. )tili,area diferitelor tipuri de variabile Bumele tipurilor de date $ncorporate, care sunt utilizate $n C++, includ urmtoarele* bool este o %ariabil boolean care poate a%ea %alorile true sau alse. c6ar este o %ariabil utilizat $n mod normal pentru stocarea caracterelor. n .isual C++, poate a%ea orice %aloare cuprins $ntre -04C i 045. #ac c6ar este declarat de tip unsigned, aceasta ia %alori de la 3 la 4?? i nu sunt permise %alori negati%e. & %ariabil s6ort int, uneori scris doar s6ort, este similar cu int, dar aceasta conine un domeniu mai mic de %alori. D'ndii-% la aceasta ca iind o %ersiune de categorie mai uoar a lui int, care poate i olosit dac stocarea datelor este o problem. & %ariabil s6ort poate stoca orice %aloare numeric !$ntreag" $ntre -E45>C i E45>5 !deci pe 0> biti din care primul este bitul de semn". #ac tipul s6ort este declarat ca unsigned, domeniul de %alori a acestuia este de la 3 la >??E? !deci pe 0> biti". int este o %aloare $ntreag utilizat pentru a stoca numere $ntregi. ,tunci c'nd utilizai .isual C++, int este o %aloare pe E4 de bii cu semn, astel $nc't poate stoca orice %aloare de la -4,0F5,FCE,>FC la 4,0F5,FCE,>F5. #ac tipul int este declarat ca unsigned, domeniul de %alori a acestuia este de la 3 la F,4GF,G>5,4G?. 2n long int, uneori scris doar long este o %ariabil scalar ca i int, doar %alorile pe care le utilizeaz compilatorul sunt mult mai mari. n .isual C++, o %ariabil de tip long int poate stoca aceleai %alori ca i o %ariabil de tipul int. & %ariabil loat pstreaz numere reale $n ormat cu %irgul mobil, $n simpl precizie. #eseori aceasta este o aproximare a %alorii care a ost stocat iniial. n .isual C++, o %ariabil de tipul loat poate pstra %alori cu precizie de p'n la ase cire zecimale. & %ariabil double stoc6eaz %alori $n %irgul mobil la el ca i loat. Cu toate acestea, compilatorul pstreaz %aloarea cu mai mare precizie, $n sensul c o %aloare poate i pstrat cu mai mare acuratee. & %ariabil de tip double poate stoca p'n la 0? cire zecimale. & %ariabil de tip long double are aceleai caracteristici ca i double. Cu toate acestea, din punctul de %edere al compilatorului, acestea sunt tipuri dierite. 1ipul long double este parte component a limba)ului C++ i pe unele compilatoare dierena dintre double i long double este aceea c long double are o mai mare precizie, permi'nd stocarea a mai mult de 0? cire zecimale. 1ermen nou* 2nele %ariabile din cadrul listei precedente pot i declarate ca i unsigned. ,tunci c'nd o %ariabil este declarat unsigned, aceasta poate stoca doar %alori nenegati%e. ,tunci c'nd o %ariabil este declarat ca i int, aceasta poate stoca at't numere negati%e, c't i poziti%e. ,adar, un unsigned int poate stoca o %aloare poziti% mult mai mare dec't int !mai exact de dou ori mai mare ca int". 2n unsigned int poate stoca o %aloare poziti% mai mare deoarece $n cazul %ariabilei int calculatorul trebuie s utilizeze un bit de date, care precizeaz semnul, $n locaia de memorie. Hemnul indic dac %ariabila este poziti% sau negati%. #eoarece utilizeaz bitul de semn, reduce numrul de bii care sunt disponibili pentru stocare, %aloarea maxim pentru %ariabil E este redus la )umtate. -igura 2'( este un exemplu de %ariabil care a ost declarat ca int i apoi o alt %ariabil care a ost declarat ca unsigned int. Figura 2.1. Majoritatea calculatoarelor pot utiliza un bit de semn pentru a determina dac o variabil este pozitiv sau negativ. 1ipurile de baz ale %ariabilelor necesit spaiu dierit pentru stocare. Ca i o regul dup care ne putem g6ida, tipul de data c6ar este suicient de mare pentru a conine toate caracterele, sau C bii. Compilatorul $n .isual C++ %a aloca pentru tipul int E4 de bii. Tabelul 2'( prezint o list cu numrul de octei necesar stocrii iecrui tip undamental. Tabelul 2'(' .locarea necesar pentru tipurile de ba, C++ Tip Dimensiune "/n octei$ bool 0 c6ar 0 s6ort 4 int F long F loat F double C long double 03 Denumirea variabilelor Pe msur ce de%enii utilizatori mai experimentai a lui .isual C++, %a i necesar s stabilii c'te%a modaliti de con%enii de denumire pentru identiicatori. ,tunci c'nd denumii %ariabilele utilizai nume at't de lungi c't e necesar pentru a indica modul $n care %ariabila este utilizat. 2n nume de %ariabil $n C++ este un exemplu de indentiicator. Identiicatorii $n C++ sunt utilizai, printre altele, pentru a denumi %ariabile i uncii. n .isual C++, identiicatorii pot i pur i simplu de lungimi de sute de caractere i pot include orice combinaii de litere, numere i caractere de subliniere at'ta timp c't primul caracter este o liter sau caracter de subliniere. %isting&ul 2'0 este un exemplu de mai multe declaraii dierite de %ariabile. F %isting&ul 2'0' C/teva e*emple de denumiri corecte 1i incorecte ale variabilelor' 7include 8iostream9 using namespace std- int main!" < :: Dood declarations int nEmplo+ees- :: Bumber o emplo+ees c6ar c6IiddleInitial- :: , middle initial :: #eclarations t6at could be impro%ed int i, n, J- :: K6at are t6ese %ars used or L loat temp- :: Ia+ not be enoug6 inormation c6ar c6- :: H6ould 6a%e more inormation return 3- A Ia)oritatea eantioanelor de programe i a exemplelor urnizate $n asistena online ca parte component a lui .isual C++ utilizeaz con%enia de denumire cunoscut ca notaie ungar !ungarian !otation". ,tunci c'nd aceast notaie ungar este olosit corect, este uor s recunoatei, dintr-o singur pri%ire, tipul logic al %ariabilei r a cuta declaraia acesteia. #e exemplu, ma)oritatea %ariabilelor scalare cum ar i int, long sau s6ort au preixul n. .ariabilele care sunt utilizate pentru a stoca caractere au preixul c6. .tribuirea de valori variabilelor Pentru atribuirea %alorilor %ariabilelor, operatorul de atribuire este semnul egal utilizat dup cum urmeaz* nMoo = F4- ,ceast linie atribuie %aloarea $ntreag F4 la nMoo. #ac este atribuit o %aloare $n ormat cu %irgul mobil, compilatorul $l presupune double dup cum urmeaz* dMoo = F4.F4F4- Putei atribui %alori unei %ariabile de tipul c6ar $n dou moduri* 0" #ac pur i simplu stocai o %aloare de tip ir de caractere putei atribui litera utiliz'nd apostro aa cum se prezint mai )os* c6Initial = NOP- Compilatorul con%ertete %aloarea literei $ntr-o %aloare ,HCII i o stoc6eaz $n %ariabila c6ar. 4" .alorile $ntregi mici pot i, de asemenea, stocate $ntr-un c6ar i atribuirea este cut identic ca i la %ariabila int. Economie de spatiu de memorare .ariabila de tipul c6ar este utilizat c'teodat pentru a stoca %alori $ntregi mici. ,cest lucru este util atunci c'nd stocai un numr mare de %alori, deoarece un int aloc de patru ori mai mult memorie dec't c6ar. )n program C++ simplu n cadrul acestui capitol %ei ace o modiicare simpl proiectului Qello R proiectul 2ello2 % %a solicita un nume i apoi %a utiliza numele $n componena salutului. ? ,samblarea acestui proiect a)ut la demonstrarea unor elemente comune regsite $n programele C++. Crearea proiectului 2ello2 Primul pas $n scrierea oricrui program .isual C++ este crearea unui proiect, aa cum ai procedat $n primul capitol. Pentru a re%izui, acetia sunt paii necesari creerii unui proiect $n mod consol* 0. ncepei prin selectarea Mile:Be; din meniul principal .isual C++. ,ceasta %a determina aiarea casetei de dialog Be;. 4. Helectai pagina Pro)ects din caseta de dialog Be;. .a i aiat o list care conine dierite tipuri de proiecte. E. Helectai icon-ul denumit KinE4 Console ,pplication, aa cum se prezint $n figura 2'2. 1rebuie, de asemenea, s urnizai un nume pentru proiect R o locaie implicit %a i urnizat automat. Figura 2.2. "aseta de dialog !e# $rojects. Crearea fi1ierului surs pentru program Miierul surs pentru proiectul Qello4 este prezentat $n listing&ul 2'3. Hpre deosebire de primul program Qello, aceast %ersiune primete intrarea de la utilizator i apoi aieaz ca ieire, un salut. %isting&ul 2'3' )n program /n mod consol care accept o intrare' 7include 8iostream9 7include 8string9 7include 8conio.69 using namespace std- :: Prompt t6e user to enter a name, collect t6e name, :: and displa+ a message to t6e user t6at contains :: t6e name. int main!" > < string userBame- cout 88 @K6at is +our nameL *@- cin 99 userBame- cout 88 @Qello @ 88 userBame 88 @S@ 88 endl- getc6!"- return 3- A #esc6idei un nou proiect C++ de tipul KinE4 Console ,pplication i editai codul prezentat $n listing-ul 4.F. Bu uitai aptul c C++ ace dierenierea $ntre litere mici i mari. Hal%ai proiectul sub numele Qello4 $n directorul cu proiecte. 4ularea programului 2ello2 Programul se asambleaza cu meniul Tuild:Tuild solution si se ruleaza cu butonul Htart #ebugging. Programul genereaz urmtoarea ieire* K6at is +our nameL *Ioana Qello IoanaS Programul Qello4 accept ca intrare orice nume i utilizeaz acel nume pentru propriul mesa) Qello Korld. .nali,area programului 2ello2 H aruncm o pri%ire la programul Qello4 pentru c acesta are multe $n comun cu programele C++ mult mai complexe. Cu toate c este relati% scurt, are multe elemente pe care le %ei %edea $n programele Kindo;s mult mai complicate $n capitolele care %or urma. Declaraia Include Prima linie a lui Qello4.cpp este un mesa) ctre compilator pentru a include un alt iier $n timpul compilrii programului Qello4.cpp* 7include 8iostream9 #eclaraia 7include comunic compilatorului s caute iierul numit iostream i s-l insereze $n cadrul iierului surs. #e apt, declaraia 7include este citit de ctre preprocesor, o parte a compilatorului care cerceteaz iierul surs $nainte ca iierul s ie compilat. 1ermeni noi* #eclaraiile citite de ctre preprocesor sunt cunoscute sub numele de directive preprocesor, deoarece ele nu sunt, de apt, olosite de ctre compilator. #irecti%ele preprocesor sunt precedate $ntotdeauna de un 7. Miierul iostream este un exemplu de iier antet. 2n iier antet conine declaraii sau un alt cod utilizat pentru compilarea programului. Pentru a executa operaiile obinuite de intrare i ieire trebuie s olosii directi%e 7include pentru iierul iostream. 5u uitai n mod obinuit, iierele antet C++ au extensia .6 sau .6pp pentru iier- biblioteca standard C++ include iiere cum ar i iostream care nu au extensie. Pentru compatibilitatea cu %ersiuni anterioare, compilatorul .isual C++ include %ersiuni mai %ec6i ale iierelor antet, care au extensia .6. #irecti%a preprocesor 7include se regsete $n dou forme de ba,* ,tunci c'nd includei iiere de bibliotec, iierul care trebuie inclus este $ncadrat de paranteze ascuite, aa cum s-a prezentat mai de%reme $n iierul Qello4.cpp. Preprocesorul caut o locaie predeinit pentru iier. 5 ,tunci c'nd includei iiere antet care sunt speciice unei anumite aplicaii, numele iierului este inclus $ntre g6ilimele, cum ar i 7include Ustdax.6V. Preprocesorul %a cuta iierul $n cadrul directorului curent care conine iierul surs curent. #ac iierul nu este gsit, cutarea %a continua $n directorul Include care este locaia predeinit. , doua linie din Qello4.cpp este, de asemenea, o directi% 7include* 7include 8string9 Miierul antet string este parte component a bibliotecii standard C++. Includerea unui iier antet string permite iierului surs C++ s utilizeze clasa de tip iruri, care simpliic utilizarea irurilor de caractere $ntr-o aplicaie C++. , treia linie din Qello4.cpp este 7include 8conio.69, pe care am utilizat-o pentru a putea ace uz de unctia getc6!" c6iar inainte de a inc6ide unctia main!", care returneaza 3. ,ceasta unctie getc6!" are rolul de a astepta tastarea oricarui c6aracter de catre utilizator de la tastatura, inainte ca ecranul de executie negru din #&H sa dispara si sa se re%ina in mediul integrat .isual Htudio. 6onele de nume std 1ermeni noi* & colecie de nume i de ali identiicatori $n C++ este cunoscut sub numele de zon de nume. Implicit, orice nume care este introdus $ntr-un program C++ este $n zona global de nume. 1oate numele regsite $n biblioteca standard C++ sunt localizate $n zona de nume std. Oonele de nume permit bibliotecilor s plaseze numele lor $ntr-un compartiment care el $nsui are un nume. ,a cum se %ede $n -igura 2'0, dou zone de nume pot s utilizeze un nume comun, $n acest caz string- deoarece iecare zon de nume urnizeaz o locaie pentru numele string, cele dou nume nu intr $n conlict. Figura 2.%. &onele de nume furnizeaz locaii separate pentru numele utilizate ntr'un program "((. ,tunci c'nd utilizai un nume dintr-o zon de nume, zona de nume trebuie s aib un preix, ca std**string sau code%**string. ,lternati%, o directi% de utilizare a zonei de nume poate i olosit pentru a comunica compilatorului aptul c un identiicator poate i gsit $n zona global de nume, ca i $n urmtoarea linie de program, care spune compilatorului ca numele gsite $n program pot i localizate $n zona de nume std* using namespace std- )tili,area comentariilor pentru documentarea /n cadrul codului 1ermen nou* 2n comentariu este o explicaie urnizat persoanei care citete codul surs. ,cesta nu are nici o semniicaie pentru compilator sau calculator. C (iniile care $ncep cu dou caractere slas6 !))" sunt linii considerate comentariu. #e asemenea textul cuprins intre caracterele :W si W: este considerat de asemenea comentariu, pe orisicate linii s-ar ala. Implicit, comentariile apar cu %erde $n cadrul editorului .isual Htudio. Hpre deosebire de acestea, int i return apar cu alta culoare !albastru" pentru a indica aptul c acestea sunt cu%inte c6eie $n C++. -uncia main 2rmtoarea linie $n Qello4.cpp este $nceputul unciei main. int main!" Prima linie din cadrul unciei main este declararea unei %ariabile. string userBame- #eocamdat, nu este necesar s % g'ndii prea mult la semniicaia acesteia, este suicient s tii c userBame este o %ariabil de tipul string. 2n string nu este una din tipurile de date undamentale- $n sc6imb, ace parte din biblioteca standard. 1ipul string % permite s utilizai iruri de caractere, dei exist tipuri undamentale $ncorporate. #up declararea lui userBame urmeaz o instruciune care aieaz un mesa) ctre utilizator, solicit'ndu-i acestuia numele* cout 88 @K6at is +our nameL *@- ,ceast instruciune speciic din Qello4.cpp aieaz o linie de caractere $n ereastra consolei prin utilizarea obiectului iostream* cout. Tiblioteca iostream utilizeaz simbolul 88 pentru ieiri, adic inormaii care rezult din program i 99 pentru intrri, adic inormaii urnizate programului. Considerai un lux de I:& ca o sec%en de octei, cum ar i un iier de pe disc, sau ca ieire pentru imprimant sau pe ecran. 5u uitai & regul simpl de indicare este aceea c atunci c'nd %edei simbolul 88, %aloarea din dreapta simbolului %a i ieire pentru obiectul I:& din st'nga. ,tunci c'nd %edei simbolul 99, datele de la obiectul I:& din st'nga %or i stocate $ntr-o %ariabil spre dreapta. 2rmtoarea linie a lui Qello4.cpp accept intrri de la utilizator i le stoc6eaz $n userBame* cin 99 userBame- .ariabila userBame conine acum orice %aloare care a ost introdus de ctre utilizator. 2rmtoarea linie aieaz salutul Qello i adaug coninutul %ariabilei userBame. ,tunci c'nd utilizai cout, mai multe componente dierite pot rezulta din program una dup alta prin separarea acestora cu simbolul 88* cout 88 @Qello @ 88 userBame 88 @S@ 88 endl- 2ltima linie din uncia main este o instruciune return. ,tunci c'nd este executat o instruciune return, uncia returneaz sau oprete execuia i apelul unciei este transmis %alorii urnizate dup cu%'ntul c6eie return. #eoarece instruciunea return este $n interiorul lui main, %aloarea 3 este transmis $napoi ctre sistemul de operare. Cu%'ntul c6eie return poate aprea aproape oriunde $ntr-o uncie. 1otui, ca i o c6estiune de stil, ma)oritatea oamenilor preer, dac este posibil, s aib o singur instruciune return $n cadrul unei uncii. Pe scurt7 n acest capitol ai $n%at mai multe detalii despre programele C++. ,i scris un program simplu /n mod consol i ai analizat prile acestuia. #e asemenea, ai $n%at despre preprocesorul C++, sigurana tipului i variabile. !ntrebri 1i rspunsuri !: .tunci c8nd compile, proiectul 2ello2 1i introduc numele 1i prenumele9 doar numele este afi1at' Cum pot s afi1e, numele 1i prenumele: G 4: ,tunci c'nd utilizai cin pentru a obine intrarea aa cum se prezint $n proiectul Qello4, spaiul alb cum ar i spaiul dintre nume i prenume %a determina ca acestea s ie analizate sintactic ca dou %ariabile separate. Putei utiliza cin cu %ariabile multiple $n aceeai manier $n care utilizai cout cu %ariabile multiple- doar separai %ariabilele cu operatorul 99. & nou %ersiune a lui Qello care aieaz numele i prenumele arat astel* 7include 8iostream9 7include 8string9 using namespace std- int main!" < string strMirstBame- string str(astBame- cout 88 @Please enter +our irst and last name*@- cin 99 strMirstBame 99 str(astBame- cout 88 @Qello @ 88 strMirstBame 88 str(astBame 88 endl- return 3- A !: .tunci c8nd declar o variabil9 obin c8teodat mesa;e de erori neobi1nuite de la compilator /n fereastra <uild' .ceasta este linia care cau,ea, eroarea: int m+ age- 4: n C++, toate %ariabilele trebuie s ie identiicatori unici. Compilatorul semnaleaz eroare deoarece dup utilizarea identiicatorului m+ ca nume de %ariabil, acesta nu poate s-i dea seama ce s ac cu identiicatorul age. & manier de codiicare este de a separa, printr-un caracter linie de subliniere, cu%intele care alctuiesc numele %ariabilei, astel* int m+Xage- 03