În cursul anterior am creat primul proiect CodeBlocks și primul program C++, care arată astfel:
#include <iostream> using namesapce std; int main() { cout << "Hello world!" << endl; return 0; }
Acesta un program foarte simplu care, atunci când este rulat, afișează pe consolă mesajul ”Hello world!”. Pentru a rula un program apăsați F9 sau iconița din stânga.
Vom începe să analizăm programul, linie cu linie.
Pe prima linie este instructiunea #include <iostream> care se numește directivă pentru proprocesor și explică programului care vor fi instrucțiunile de citire și de afișare pe consolă, anume intrucțiunea cin (console input) și cout (console output). Funcția cout apare în cod pe linia 7.
Pe linia a treia se găsește instructiunea using namespace std;, care trebuie tratată ca atare, utilitatea ei nefiind de interes pentru noi.
Pentru cei interesați, însă, pot spune că următoarele două programe fac exact același lucru:
#include <iostream> int main() { std::cout << "Hello World"; return 0; }
#include <iostream> using namespace std; int main() { cout << "Hello World"; return 0; }
De fapt, namespace-ul unei funcții funcționează exact ca extensiile fișierelor: putem avea 5 fișiere numite ”poza” daca au extensii diferite: ”poza.png”, ”poza.gif”, ”poza.html”, ”poza.rar” etc. fără a face confuzie între fișiere; în mod similar, putem avea mai multe funcții denumite la fel, dar care să aibă namespace diferit, doar că oricând folosim o funcție cu un namespace diferit de cel declarat la începutul codului trebuie precizat înaintea funcției.
Pe linia a 5-a se găsește funcția int main(), funcție care stă la baza oricărui program C++. Atunci când programul este rulat, instrucțiunile din funcția main sunt executate pe rând. Instrucțiunile care se găsesc în funcția main sunt delimitate de acoladele de pe liniile 6, respectiv 9.
Pe linia 7 apare instrucțiunea de afișare a mesajului ”Hello world!” în consolă, cout<<„Hello world!”<<endl;. Funcția cout este funcția de afișare și este mereu însoțită de <<; similar, funcția de citire cin este mereu însoțită de >>. O metodă de a reține ce sens au săgețelele este următoarea: instrucțiunea cin citește de pe consolă într-o dată, deci fluxul de informație este de la consolă către la data respectivă, săgețelele fiind orientate astfel: cin>>x; similar, în cazul funcției de afișare, informația vine de la date către consolă, săgețelele fiind orientate astfel: cout<<x. În cazul nostru, această instrucțiune afișează două lucruri: mesajul ”Hello world!” și trecerea pe rândul următor, semnalată de endl (end line). Când avem de afișat sau citit mai multe lucruri, fiecare are în fața lui operatorul << sau >>, astfel încât ceea ce este de afișat să fie despărțit de ele; spre exemplu, pentru a afișa de 2 ori mesajul „Hello World!” folosind o singură instrucțiune scriem: cout<<„Hello World!”<<„Hello World!”.
Pe linia 8 este instrucțiunea return 0, care termina programul; atunci când calculatorul ajunge la ea, știe că a executat tot ce avea de făcut, și va ignora instrucțiunela care ar urma. Spre exemplu, programul următor va afișa ”Hello world!” doar o dată:
[code language=”cpp”]
[/code]
Înainte de a trece mai departe vreau să fac o observație foarte importantă: după orice instrucțiune, în afară de directivele pentru preprocesor și denumirea funcțiilor (în programele de mai sus main) se pune ;. De asemenea, structurile prezentate mai sus nu pot lipsi din niciun program, altfel el nu va funcționa. De reținut este și că limbajul C++ este case sensitive, făcând diferență între literele mici și mari; cu alte cuvinte, funcția cout există, dar funcția Cout, nu.
Acum aș vrea să analizăm un program puțin mai complex.
#include <iostream>; using namespace std; int main() { cout<<"*****"<<'\n'; cout<<"*"<<'\n'; cout<<"*****"<<'\n'; cout<<"*"<<'\n'; cout<<"*****"<<'\n'; return 0; }
Acest program va afișa pe consolă un E format din steluțe. Așa cum probabil ați ghicit, ‘\n’ este de asemenea o instrucțiune de trecere pe rândul următor.
Puteți încerca să desenați și alte litere sau scurte cuvinte pe consolă, pentru a vă familiariza cu ea.
Acum voi face o analiză mai în detaliu a directivelor pentru preprocesor. Există două directive foarte importante:
- include, care, așa cum îi sugerează numele, include o librărie în program. Are structura #include . O librărie C++ este o colecție de funcții și constante pe care le poți folosi atunci când incluzi librăria respectivă.
Pentru a înțelege mai bine despre ce este vorba, propun un mic joc de imaginație.
Sunteți un matematician renumit și foarte talentat care a făcut niște descoperir uluitoare în domeniu. Ați observat că un anumit set de operații apare foarte des în lucrare, și decideți să dați alt nume acestui șir de transformări: adunarea urmată de înmulțire devine multi, scăderea urmată de o ridicare la putere se va numi duplo și așa mai departe. Acum trebuie să vă publicați lucrarea și decideți să folosiți aceste operații pe care le-ați inventat. Dar, după ce publicați lucrarea, editură vă trimite plângeri că lectorii nu știu ce înseamnă operațiile inventate și că trebuie să explicați și semnificația acestora. Pentru rezolva problema, faceți o carte separată căreia îi spuneți Librărie de operații și apoi puneți, la începutul lucrării inițiale, unde să se uite cititorii pentru a afla ce înseamnă transformările utilizate.
La fel este cu un calculator, doar că majoritatea operațiilor (funcțiilor) sunt deja definite și nu mai trebuie să spuneți calculatorului decât unde găsește semnificația lor.
Câteva librării importante și funcțiile din ele găsiți în următorul tabel:
Libraria | Functiile | Explicatii |
---|---|---|
iostream input-output stream flux de intrare-iesire | cin | Functia de citire de la tastatura |
cout | Functia de afisare pe ecran | |
fstream file stream flux (de date) fisier | ifstream | Functia care defineste obiectul (functia) cu care se vor citi date din fisier si fisierul din care se va face citirea |
ofstream | Functia care defineste obiectul (functia) cu care se vor scrie date in fisier si fisierul in care se va face scrierea |
|
cmath/math.h | sqrt(x) | √x |
abs(x) | |x| | |
pow(a,n) | an | |
floor | Functia parte intreaga [x] | |
Alte functii: sin(x), cos(x), tan(x), asin(x) (arcsin(x)), acos(x), atan(x) | ||
iomanip | fixed | Afiseaza numarul care este scris cu precizie de x zecimale Exemplu de utilizare: cout va afisa √2 cu primele 2 zecimale, cu aproximarea ultimei zecimale |
climits/limits.h | Contine constante cu valorile maxime ale tipurilor de date: INT_MAX, INT_MIN etc. Exemplu de utilizare: cout va afisa valoarea maxima pe care o poate lua un tip de data int |
|
stdlib | system("comanda") | Permite utilizarea comenzilor din command prompt-ul windows: cls (clear screen), color. Exemplu: system("cls") va goli consola |
graphics.h | Contine o interfata grafica (alta decat consola); puteti gasi instructiuni de instalare aici. |
- define, care înlocuiește un șir de caractere cu un alt șir de caractere. Are tructura #define text1 text2 și va înlocui în cod toate aparițiile lui text1 cu text2. Funcționarea acestei directive este foarte simplă: imaginați-vă că inventați un limbaj codat împreună cu un prieten. Înainte de a folosi sintagmele inventate, trebuie să le definiți. Spre exemplu, următorul program va afișa ”Hello world!”, deoarece textul mesaj din program este inlocuit cu ”Hello world!”:
#include <iostream> #define mesaj "Hello world!" using namespace std; int main() { cout<<mesaj<<endl; return 0; }
Această directivă este utilă pentru a înlocui constante repede în program sau chiar pentru a le defini. Spre exemplu, dacă nu vreți să folosiți constanta \(\pi\)(pi) inclusă în librăria math.h sau cmath, o puteți defini cu ajutorul acestei directive.
În următorul curs vom discuta despre variabile.