C++ Initiere

  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View C++ Initiere as PDF for free.

More details

  • Words: 4,465
  • Pages: 13
initiere in c++ haideti sa incepem cu un program c++ simplu, care afiseaza un mesaj. acest program utilizeaza facilitatea cout a lui c++ pentru a produce o iesire de tip caracter. codul sursa contine mai multe comentarii adresate cititorului; aceste linii incep cu //, iar compilatorul le ignora. c++ este sensibil la tipul literelor; adica face deosebire intre majuscule si litere mici. aceasta inseamna ca trebuie sa fiti atenti si sa utilizati acelasi tip de litere. // primul.cpp - afiseaza un mesaj #include // o directiva de preprocesor using namespace std; // face definitiile vizibile int main() // antetul functiei { // inceputul corpului functiei cout << "salut, c++ mai faci?"; // mesaj cout << "\n"; // salt la linie noua return 0; // incheie main() } //sfarsitul corpului functiei nota de compatibilitate daca utilizati un compilator mai vechi, este posibil sa fiti nevoit sa folositi #include in loc de #include ; in acest caz va trebui sa eliminati si linia using namespace std; unele medii bazate pe ferestre ruleaza programul intr-o fereastra separata pe care o inchid automat la terminarea programului. puteti face ca fereastra sa ramana deschisa pana la actionarea unei taste, prin introducerea inaintea instructiunii de returnare a urmatoarei linii de cod: cin.get(); intrati si iesiri in c daca ati mai programat in c, veti avea un mic soc cand veti vedea cout in loc de printf(). de fapt c++ poate utiliza printf(), scanf() si toate celelalte functii de intrare si iesire c standard in cazut in care ati inclus fisierul c uzual stdio.h. programele c++ se construiesc din componente numite functii. in mod obisnuit, un program il organizati in operatii majore si apoi proiectati functii separate pentru a gestiona acele operatii. exemplul de program prezentat contine: - comentarii indicate de prefixul // - o directiva de preprocesor #include - o directiva using namespace - un antet de functie: int main() - un corp de functie, delimitat de { si }

- o instructiune care pentru a afisa un mesaj utilizeaza facilitatea cout a c++ - o instrctiune de returnare care incheie functia main() haideti sa privim mai detaliat aceste elemente. functia main() este un loc bun de pornire, deoarece unele dintre caracteristicile care preceda functia main(),*censored*ar fi directiva de preprocesor, sunt mai usor de inteles dupa ce vedeti ce face main(). functia main() dupa ce am inlaturat toate dichisurile, programul exemplu are urmatoarea structura fundamentala: int main() { instructiuni return 0; } aceste linii indica faptul ca aveti o functie numita main() si descriu comportamentul acestei functii. impreuna, ele constituie o definitie de functie. aceasta definitie are doua parti: prima linie, int main(), care este numita antetul functiei si o portiune inchisa dintre acolade { si }, care este corpul functiei. antetul functiei este o capsula care contine rezumatul interfetei dintre functie si restul programului, iar corpul functiei reprezinta instructiunileadresate calculatorului cu privire la comportamentul functiei. in c++ fiecare actiune completa se numeste instructiune. fiecare instructiune trebuie sa se incheie cu caracterul punct si virgula (;), deci nu omiteti aceste caractere. ultima instructiune in main(), numite instructiune de returnare, incheie functia. preprocesorul c++ si fisierul iostream iata, pe scurt, ce trebuie sa stiti. daca doriti ca programul dumneavoastra sa utilizeze facilitatile tipice de intrare/iesire are c++, scrieti aceste doua linii: #include using namespace std; in cazul in care compilatorul dumneavoastra nu este multumit de aceste doua linii (de exemplu se plange ca nu poate gasi fisierul iostream), incercati in locul lor urmatoarea linie: #include iostream.h // compatibile cu compilatoarele mai vechi comentariile in c++ slash-ul dublu (//) introduce un comentariu in c++. un comentariu este o remarca a programatorului adresata cititorului, care de obicei identifica o sectiune a programului sau explica un aspect al codului. compilatorul ignora comentariile. comentariile c++ se

intind de la // pana la sfarsitul liniei. un comentariu poate fi o linie prorie sau pe aeasi linie cu codul. // primul.cpp - afiseaza un mesaj ar trebuie sa folositi comentarii pentru a documenta programele dumneavoastra. cu cat programul este mai complex, cu atat comentariile sunt mai valoroase. nu ii vor ajuta doar pe ceilalti sa inteleaga ce ati facut, ci si pe dumneavoastra, mai ales daca nu ati studiat recent programul. zona de nume daca folositi iostream in loc de iostream.h, atunci trebuie sa folositi urmatoarea directiva de zona de nume, pentru ca definitiile din iostream sa fie disponibile in programul dumneavoastra: using namespace std; aceasta este directiva using. facilitatea zona de nume este o caracteristica noua in c++ care are ca scop simplificarea scrierii programelor in care se combina cod existent de la mai multi furnizor. o problema potentiala este ca puteti folosi doua pachete de cod care au amandoua o functie cu acelasi nume, sa zicem leet(). daca folositi functia leet(), compilatorul nu va sti care versiune trebuie sa fie apelata. facilitatea zona de nume permite unui furnizor sa isi impacheteze software-ul intr-o unitate numita zona de nume, asa incat pot folosi numele acestei unitati pentru a indica exact produsul pe care doriti sa il folositi precum si producatorul acestuia. deci agressor poate sa isi plasese definitiile intr-o zona de nume numita agressor. atunci numele complet al functiei proprii agressor::leet(). in acest spirit, clasele, functiile si variabilele care sunt componente standard ale compilatoarelor c++ sunt plasate acum intr-o zona de nume numita std. aceasta se aplica doar pentru fisierele antet fara .h. de exemplu, variabila cout folosita pentru iesiri si definita in iostream are de fapt numele std::cout. cout si printf() daca v-ati obisnuit cu c si cu printf(), poate ca veti considera ca cout arata ciudat. poate veti prefera chiar sa nu renuntati la greu castigata maiestrie obtinuta de dumneavoastra in utilizarea lui printf(). dar cout nu este cu nimic mai ciudat in aspect decat printf(), cu toate specificatiile sale de conversie. iar un lucru important este acela ca cout are avantaje semnificative. aptitudinea sa de a recunoaste tipurile de date demonstreaza o proiectare inteligenta, care nu permite aparitia greselilor. de asemene, este si extensibil. adica, puteti redefini operatorul << astfel incat cout sa poata recunoaste si afisa tipurile de date noi, definite de dumneavoastra. si daca va place controlul fin furnizat de printf(), puteti obtine aceleasi efecte prin utilizarile mai avansate ale lui cout.

utilizarea cin dupa*censored*demonstreaza si iesirea, valoarea introdusa de la tastatura este atribuita in cele din urma unei variabile. iata instructiunea care realizeaza aceasta minune: cin >> variabila; privind aceasta instructiune puteti vedea de fapt fluxul de informatie de la cin spre variabila. evident exista o descriere putin mai formala a acestui proces. la fel*censored*iesirea este considerata de catre c++ un flux de caractere care iese din program, si intrarea este considerata un flux de caractere care intra in program. fisierul iostream defineste obiectul cin ca fiind cel care reprezinta acest flux. pentru iesire, operatorul << insereaza caractere in fluxul de iesire. pentru intrare cin foloseste operatorul >> pentru a extrage caractere din fluxul de intrare. in mod obisnuit, la dreapta operatorului specificati o variabila care va primi informatia extrasa. (simbolurile << si >> au fost alese pentru a sugera in mod vizual directia in care se deplaseaza informatia.). putina clasa ati aflat deja destule despre cin si cout pentru a se justifica o scurta prelegere despre obiecte. si anume, veti invata ceva mai multe despre notiunea e clasa. clasa este unul dintre conceptele de baza pentru programarea orientata spre obiecte in c++. o clasa este un tip de data definit de catre utilizator. pentru a defini o clasa, descrieti ce gen de informatii poate reprezenta si ce gen de actiuni puteti realiza cu acea data. o clasa se afla in aceasi relatie fata de un obiect, in care se alfa un tip de data fata de o variabila. adica, definitia unei clase descrie un formular de date si modul in care acestea pot fi utilizate, in timp ce un obiect este o entitate creata astfel incat sa corespunda specificatiilor formularului. sau, in termeni non-informatici, daca o clasa este analoga unei categorii*censored*ar fi actori celebri, atunci un obiect ar fi analogul unui anumit exemplu din acea categorie,*censored*ar fi broscoiul vasile. pentru a extinde aceasta analogie, reprezentarea unei clase de actori ar include definitiile actiunilor posibile relativ la aceasta clasa,*censored*ar fi citirea unui rol, exprimarea durerii, simularea maniei, primirea unui premiu si altele. daca ati mai avut contact cu diferite terminologii ale oop, poate ca va va fi de ajutor sa aflati ca clasele din c++ corespund termenului tip de obiect sau unei instante de variabila. acum haideti sa discutam mai concret. reamintiti-va de aceasta declaratie a unei variabile: int agressor; aceasta creeaza o variabila particulara (agressor) care are proprietatile tipului int. adica, agressor poate stoca un intreg si poate fi utilizat in anumite moduri – de exemplu, pentru adunare sau pentru scadere. acum, ganditi-va la cout. el este un obiect creat pentru a avea proprietatile clasei ostream, definitia clasei ostream (o alta componenta a fisierului iostream) descrie genul de date reprezentat de un obiect ostream si operatiile pe care le puteti efectua cu ele,*censored*ar

fi inserarea unui numar sau a unui sir intr-un flux de iesire. in mod asemanator, cin este un obiect cu proprietatile clasei istream, definita de asemenea in iostream. ati invatat ca aceste clase sunt tipuri definite de utilizator, dar dumneavoastra, ca utilizator, in mod sigur ca nu ati proiectat clasele ostream si istream. asa*censored*functiile pot intra in biblioteci de functii, la fel si clasele pot intra in biblioteci de clase. aceasta este situatia claselor ostream si istream. din punct de vedere tehnic, ele nu sunt incorporate in limbajul c++, dar sunt exemple de clase care vin impreuna cu limbajul. definitiile clasei sunt trecute in fisierul iostream si nu sunt incorporate in compilator. daca doriti, puteti chiar sa modificati aceste definitii ale clasei, cu toate ca aceasta nu este o idee buna. (mai precis, este o idee cu adevarat groaznica.) familia de clase iostream si familia inrudita fstream (sau i/o cu fisiere) sunt singurele seturi de definitii de lcase furnizate odata cu primele implementari c++. totusi, comitetul ansi/iso c++ a mai adaugat la standard cateva biblioteci de clase. de asemenea majoritatea implementarilor furnizeaza, ca parte a pachetului, definitii de clase aditionale. intr-adevar, c++ isi datoreaza atractia in mare parte datorita existentei unor biblioteci de clase extinse si utile, suportand programare unix, windows si macintosh. descrierea clasei specifica toate operatiile care pot fi realizate asupra obiectelor acelei clase. pentru a realiza o astfel de operatie permisa asupra unui anumit obiect, trimiteti obiectului un mesaj. de exemplu, daca doriti ca obiectul cout sa afiseze un sir, atunci ii trimiteti un mesaj prin care ii spuneti de fapt „obiectule !! afiseaza asta !”. c++ furnizeaza doua moduri de a trmite mesaje. primul, numit utilizare a metodei de clasa, este in mod esential un apel de functie, ca si cele pe care le-ati vazut deja. al doilea mod, utilizat cu cin si cout, presupune redefinirea unui operator. astfel instructiunea cout << ”ma numesc vlad.” pentru a trimite „mesajul pentru afisare” lui cout, utilizeaza operatorul << redefinit. in aceasta situatie, mesajul contine si un argument, sirul care trebuie afisat. functii deoarece functiile sunt modulele din care sunt alcatuite programele c++, si deoarece sunt esentiale pentru definitiile oop ale c++, ar trebuie sa va familiarizati pe deplin cu acestea. deoarece unele aspecte ale functiilor sunt subiecte avansate, discutia principala despre functii va fi intr-un tutorial ulterior. totusi, daca faceti cunostinta acum cu unele caracteristici elementare ale functiilor, mai tarziu veti lucra mai usor si veti avea deja experienta. functiile c++ sunt de doua tipuri: cele care returneaza o valoare si cele care nu returneaza nimic. in bibliotecile de functii standard din c++ puteti gasi exemple din ambele tipuri si puteti crea propriile dumneavoastra functii de orice tip. haideti sa studiem o functie din biblioteca, functie care returneaza o valoare, si apoi vom examina propriile dumneavoastra functii simple.

utilizarea unei functii care returneaza o valoare o functie care returneaza o valoare furnizeaza o valoare pe care o puteti atribui unei variabile. de exemplu, biblioteca standard c/c++ contine o functie numita sqrt(), care returneaza radacina patrata a unui numar. sa presupunem ca doriti sa calculati radacina patrata a lui 6,25 si sa o atribuiti variabilei x. in programul dumneavoastra puteti introduce urmatoarea instructiune: x = sqrt(6.25); // returneaza valoarea 2,5 si o atribuie lui x expresia sqrt(6.25) invoca, sau apeleaza functia sqrt(). expresia sqrt(6.25) se numeste apel de functie, functia invocata se numeste functie apelata, iar functia care contine apelul de functie se numeste functie apelanta. valoarea dintre paranteze este informatia trimisa functiei; se spune ca este transferata functiei. o valoare trimisa unei functii in acest mod se numeste argument sau parametru. functia sqrt() calculeaza raspunsul, care va fi 2,5 si trimite aceasta valoare inapoi functiei apelante; valoarea trimisa inapoi se numeste valoarea returnata a functiei. considerati valoarea returnata ca fiind ceea ce inlocuieste in instructiune apelul functiei dupa ce functia isi termina lucrul. astfel, acest exemplu atribuie valoarea returnata, variabilei x. pe scurt, un argument este informatia trimisa functiei, iar valoarea returnata este valoarea trimisa inapoi de catre functie. practic, asta-i tot, exceptie facand faptul ca inainte de a utiliza o functie, compilatorul c++ trebuie sa stie ce tip de argumente foloseste functia si care este tipul valorii returnate. adica, functia returneaza un intreg ? un caracter ? un numar cu parte zecimala ? sau altceva ? daca aceasta informatie lipseste, compilatorul nu va sti*censored*sa interpreteze valoarea returnata. modul c++ pentru comunicarea acestei informatii este utilizarea unei instructiuni prototip de functie. prototipul unei functii este pentru functia ceeea ce este pentru variabile declararea variabilei – spune ce tipuri sunt folosite. de exemplu, biblioteca c++ defineste functia sqrt() astfel incat sa ia ca argument un numar (eventual) cu o parte fractionara (cum ar fi 6,25) si sa returneze un numar de acelasi tip. unele limbaje considera astfel de numere ca fiind numere reale, dar numerele utilizate de c++ pentru acest tip este double. prototipul functiei sqrt(0 arata astfel: double sqrt(double); // prototipul functiei primul double specifica faptul ca sqrt() returneaza o valoare de tip double. double intre paranteze specifica faptul ca sqrt() necesita un argument double. deci, acest prototip descrie sqrt() chiar asa*censored*este utilizat in urmatoarea expresie: x = sqrt(6.25); apropo, caracterul „;” terminal identifica prototipul ca instructiune si astfel in loc de a fi un antet de functie, il transforma in prototip. daca omiteti caracterul „;”, compilatorul va considera acea linie ca fiind un antet de functie si va astepta ca in continuare sa aveti trecut corpul care defineste functia. cand intr-un program utilizati sqrt(), va trebui de asemenea sa furnizati si prototipul. puteti realiza acest lucru in doua moduri:

- puteti intoduce personal prototipul functiei in fisierul sursa; - puteti include fisierul cmath (in sistemele mai vechi cmath.h), care contine acest prototip cel de al doilea mod este mai bun deoarece spre deosebire de dumneavoastra fisierul antet va obtine mai mult ca sigur prototipul corect. fiecare functie din biblioteca c++ are un prototip in unul sau mai multe fisiere antet. trebuie doar sa verificati descrierea functiilor din manual dumneavoastra sau din asistenta online, daca o aveti, iar descrierea va va spune care fisier antet sa il utilizati. de exemplu, descrierea functiei sqrt() ar trebui sa spuna sa utilizati fisierul antet cmath. (din nou, poate ca va fi nevoie sa utilizati un antet mai vechi, math.h, care functioneaza atat in programele c cat si in cele c++.) nu confundati prototipul functiei cu definitia functiei. dupa*censored*ati vazut, prototipul functiei doar descrie interfata acesteia. adica, descrie informatia transmisa functiei si informatia returnata. in schimb, definitia include codul pentru ceea ce efectueaza functia. fisierele bibliotecii contin codul compilat pentru functii, in timp ce fisierele antet contin prototipurile. prototipul functiei trebuie sa il plasati chiar inainte de prima utilizare a functiei. practica uzuala consta in plasarea prototipurilor chiar inaintea definitiei functiei main(). // sqrt.cpp – utilizeaza o functie radacina patrata #include using namespace std; #include // sau math.h int main() { double acoperire; // pentru numere reale utilizati double cout << ”cati metri patrati de placi aveti?\n”; cin >> acoperire; double latura; // creaza o alta variabila latura = sqrt(acoperire); // apel de functie, atribuirea cout << ”cu placile dumneavoastra puteti acoperi”; cout << ” un patrat\n cu latura de ” << latura; cout << ” metri.\n”; return 0; } utilizarea functiilor de biblioteca functiile de biblioteca sunt stocate in fisiere biblioteca. cand compilatorul compileaza un program, el trebuie sa caute in fisiere biblioteca functiile pe care le-ati utilizat. compilatoarele difera prin fisiere biblioteca pe care le cerceteaza automat. includerea fisierului antet math furnizeaza numai prototipul, dar nu va pune, neaparat, compilatorul sa cerceteze fisierul biblioteca adecvat. deoarece sqrt() lucreaza cu valori de tip double, exemplul creaza variabile de acest tip.

observati ca declarati o variabila de tip double, utilizand aceasi forma, sau sintaxa, ca si cand declarati o variabila de tip int; numetip numevariabila; tipul double permite variabilelor acoperire si latura sa accepte valori cu parte zecimala,*censored*sunt 123,11 si 11,1. c++ va permite sa declarati variabile noi oriunde intr-un program, asa ca sqrt.cpp nu declara variabila latura decat chiar inainte de utilizarea ei. de asemenea, c++ va permite sa atribuiti o valoare unei variabile chiar in momentul in care o creati, deci ati fi putut face astfel: double latura = sqrt(acoperire); observati ca cin stie sa converteasca la tipul double informatia din fluxul de intrare, iar cout stie*censored*sa insereze tipul double in fluxul de iesire. dupa*censored*am mai spus, aceste obiecte sunt inteligente. variante de functii unele functii necesita mai mult de un singur element de informatie. aceste functii utilizeaza mai multe argumente separate prin virgula. de exemple, functia matematica pow() preia doua argumente si returneaza o valoare egala cu primul argument ridicat la puterea data de cel de al doilea argument. ea are prototipul: double pow(double, double); // prototipul unei functii cu doua argumente daca, de exemplu, doriti sa obtineti 5 la puterea a 8-a, veti utiliza functia astfel: raspuns = pow(5.0, 8.0); // apel de functie cu o lista de argumente alte functii nu necesita argumente. de exemplu, una dintre bibliotecile c (cea asociata fisierului antet cstdlib sau stdlib.h) contine functia rand(), care nu are argumente si returneaza un numar intreg aleator. prototipul ei arata astfel: int rand(void); // prototipul unei functii care nu preia argumente cuvantul cheie void indica explicit ca functia nu preia argumente. daca nu treceti void si lasati parantezele goale c++ va interpreta acest lucru ca pe o declaratie implicita ca nu exista argumente. aceasta functie o puteti utiliza astfel: parereamea = rand(); // apel de functie fara argumente; observati ca, spre deosebire de unele limbaje de programare, in apelul functiei trebuie sa utilizati parantezele chiar daca nu exista argumente. de asemenea, exista functii care nu retruneaza nici o valoare. de exemplu, sa presupunem ca ati scris o functie care afiseaza un numar in formatul monetar. puteti sa trimiteti ca argument, de exemplu 23,5, iar ea va

afisa pe ecran 23,50 dolari. deoarece aceasta functie trimte o valoare pe ecran in loc sa trimita programului apelant, ea nu va returna o valoare. in prototip, acest lucru il indicati prin utilizarea cuvantului cheie void pentru tipul returnat: void dolari(double); // prototipul unei functii care nu returneaza nici o valoare deoarece nu returneaza nici o valoare, nu puteti utiliza functia ca parte a unei instructiuni de atribuire sau ca parte a altei expresii. in schimb, aveti o instructiune pura de apel de functie dolari(123.45); // apel de functie, fara valoare returnata unele limbaje rezerva termenul functie pentru functii care retruneaza valori, iar pentru cele care nu returneaza nici o valoare utilizeaza termenii de procedura sau subrutina, dar c++ asemenea lui c, utilizeaza termenul de functie pentru ambele variante. functii definite de utilizator biblioteca c standard furnizeaza peste 140 de functii predefinite. daca una dintre ele corespunde cerintelor dumneavoastra, atunci utilizati-o. dar, deseori, trebuie sa le scrieti personal, mai ales atunci cand proiectati clase. oricum, este mult mai distractiv sa proiectati propriile dumneavoastre functii, deci haideti sa examinam acest proces. ati utilizat deja mai multe functii definite de utilizator si toate erau numite main(). fiecare program c++ trebuie sa aiba o functie main() pe care utilizatorul trebuie sa o defineasca. sa presupunem ca doriti sa adaugati o a doua functie definita de utilizator. ca si in cazul unei functii de biblioteca, puteti apela o functie definita de utilizator utilizand numele ei. si, tot la fel ca in cazul functiilor de biblioteca, trebuie sa furnizati un prototip al functiei inainte de utilizarea acesteia, lucru pe care il realizati de obicei prin plasarea prototipului inainte de definitia lui main(). elementul de noutate este acela ca pentru functia noua trebuie sa furnizati codul sursa. cea mai usoara metoda o reprezinta plasarea codului in acelasi fisier, dupa codul lui main(). // fctiamea.cpp – definirea propriei dumneavoastre functii #include using namespace std; void agressor(int) // prototipul functiei agressor() int main() { agressor(1337); // apeleaza functia agressor() cout << ”alegeti un numar intreg: ”; int contor; cin >> contor; agressor(contor); // o apeleaza din nou cin.get() return 0; }

void agressor(int n) // defineste functia agressor() { cout << ”agressor zice sa intri pe site-ul 1337.ro de „ << n << „ ori pe zi.\n”; } sintaxa functiei definita functiei agressor() urmeaza aceeasi regula generala ca si definitia lui main(). in primul rand avem un antet de functie. apoi, intre acolade avem corpul functiei. regula de definire a unei functii o puteti generaliza astfel: tip numele_functiei(lista_argumente) { instructiuni } observati ca liniile de cod care definesc functia agressor() urmeaza dupa acolada inchisa a lui main(). c++, asemenea lui c si spre deosebire de pascal, nu va permite sa inglobati definitia unei functii in interiorul alteia. definitia fiecarei functii este independenta de toate celelalte; toate functiile sunt egale intre ele. anteturi de functii functia agressor() are antetul: void agressor(int n) cuvantul void specifica faptul ca agressor() nu returneaza nici o valoare. deci, apelul lui agressor() nu va produce un numar pe care in main() sa il puteti atribui unei variabile. primul apel de functie arata astfel: agressor(1337); // in regula pentru functii vide deoarece seful de agressor() ii lipseste o valoare pe care sa o returneze, nu il puteti utiliza astfel: simplu = agressor(1337); // nu este permis pentru functiile vide int n intre paranteze semnifica faptul ca se asteapta sa utilizati agressor() cu un singur argument de tip int. n este o variabila noua, careia i se atribuie valoarea transmisa prin apelul functiei. astfel, apelul functiei agressor(1337); atribuie valoarea 1337 variabilei n definite in antetul lui agressor(). cand instructiunea cout din corpul functiei utilizeaza pe n, ea utilizeaza valoarea transmisa in apelul de

functie. din aceasta cauza, agressor(1337) afiseaza valoarea 1337 in iesirea sa. haideti sa reanalizam antetul functiei main(): int main() cuvantul int specifica faptul ca main() returneaza o valoare intreaga. parantezele goale (care optional pot contine void)specifica faptul ca main() nu are argumente. functiile care returneaza valori trebuie sa utilizeze cuvantul cheie return pentru a furniza valori de returnat si pentru a incheia functia. din aceasta cauza la sfarsitul lui main() utilizam urmatoarea instructiune: return 0; aceasta instructiune este logica; main() trebuie sa returneze o valoare de tip int, iar dumnavoastra o faceti sa returneze intregul 0. dar poate va intrebati cui returnati valoarea ? de fapt, in nici unul din programele dumneavoastra nu ati vazut nici un apel de functie main(): stoarce = main(); // lipseste din programele noastre raspunsul este ca puteti considera ca programul dumneavoastra este apelat de catre sistemul de operare al calculatorului (unix sau dos). deci, valoarea returnata de main() este returnata sistemului de operare si nu unei alte parti a programului. multe sisteme de operare pot utiliza valoarea returnata de programare. de exemplu, scripturile pentru shellul unix si fisierele batch ale lui dos pot fi proiectate sa ruleze programe si sa testeze valorile returnate de acestea, numite de obicei valori de iesire. conventia utilizata este aceea ca o valoare returnata egala cu zero semnifica faptul ca programul a fost rulat cu succes, in timp ce o valoare diferita de zero daca, de exemplu, nu a reusit sa deschida un fisier. apoi, puteti proiecta un script pentru shell sau fisier batch care sa ruleze acel program si sa efectueze anumite actiuni daca programul semnalizeaza o avarie. functii definite de utilizator care returneaza o valoare haideti sa mai facem un pas si sa scriem o functie care utilizeaza o instructiune de returnare. functia main() a descris deja structura unei functii care returneaza o valoare: in antetul functiei treceti tipul de data returnata si la sfarsitul corpului functiei utilizati return. aceasta forma o puteti folosi pentru a rezolva o problema cu greutate pentru cei care viziteaza regatul unit al marii britanii. in marea britanie, multe cantare de baie sunt calibrate in stone in locul livrelor din statele unite sau a kilogramelor internationale. in acest context, cuvantul stone este folosit atat la singular cat si la plural. un stone este echivalent cu 14 livre, iar programul urmator utilizeaza o functie pentru a realiza aceasta transformare. // conversie.cpp – transforma stone in livre #include using namespace std;

int stoneinlb(int); // prototipul functiei int main() { int stone; cout << ”introduceti greutatea in stone: ”; int livre = stoneinlb(stone); cout << „in „ << stone << ” stone sunt ”; cout << livre << ” livre.\n”; return 0; } int stoneinlb(int sts) { return 14 * sts; } in main(), programul utilizeaza cin pentru a furniza o valoare pentru variabila de tip intreg stone. aceasta valoare este transmisa ca argument functiei stoneinlb() si este atribuita in acea functie variabilei sts. apoi stoneinlb() utilizeaza return pentru a returna lui main() valoarea lui 14 * sts. aceasta ilustreaza faptul ca sunteti limitat doar la utilizarea unui simplu numar dupa return. aici, prin utilizarea unei expresii mai complexe evitati necazurile crearii unei variabile noi careia sa ii atribuiti valoarea inainte de a o returna. programul calculeaza valoarea acelei expesii si returneaza valoarea rezultata. daca returnarea valorii unei expresii va deranjeaza, puteti urma calea cea mai lunga: int stoneinlb(int sts) { int livre = 14 * sts; return livre; } fiecare versiune produce acelasi rezultat, dar a doua are nevoie de mai mult timp pentru aceasta. dupa*censored*se vede in aceste exemple, prototipul functiei descrie interfata functieiadica, modul in care functia interactioneaza cu restul programului. lista de argumente arata ce tip de informatii intra in functie, iar tipul functiei arata tipul valorii returnate. uneori, programatorii descriu functiile ca fiind cutii negre specificate prin fluxul de informatie care intra si iese din ele. acest punct de vedere este descris perfect de catre prototipul functiei. desi functia stoneinlb() este scurta si simpla, ea contine o gama larga de caracteristici functionale: - are un antet si un corp. - accepta un argument - returneaza o valoare - necesita un prototip ganditi-va la stoneinlb() ca la o forma standard pentru proiectarea functiilor.

Related Documents