Manual virtual de programare în limbajul C++

“There are only two kinds of languages: the ones people complain about and the ones nobody uses.” - Bjarne Stroustrup

Scurt istoric
Limbajul C a fost dezvoltat la începutul anilor ‘70 de Ken Thompson și Dennis Ritchie pentru scrierea nucleului sistemului de operare UNIX. C este un limbaj de programare relativ minimalist ce operează în strânsă legătură cu hardware-ul, fiind foarte apropiat de limbajul de asamblare, fapt ce îl face și astăzi popular în rândul programatorilor la nivel scăzut. O data cu dezvoltarea hardware a apărut, însă, necesitatea unor limbaje mai puternice, care să ofere suport pentru programarea orientată pe obiecte. Astfel, limbajul C++ a fost creat la începutul anilor ’80 (initial având denumirea de C cu clase) de către programatorul danez Bjarne Stroustrup, din dorința de a crea un limbaj flexibil, solid și rapid, care să combine facilitățile limbajelor Simula și BCPL. Prima utilizare oficială a fost în anul 1983. Ulterior, limbajul a evoluat, adăugându-i-se mai multe biblioteci şi facilităţi, fiind standardizat, de-a lungul timpului, de mai multe ori de către ISO(International Standard Organization), standardul curent fiind C++14. Astăzi, C++ este un limbaj de programare compilat(programele scrise în C++ sunt traduse, înainte de execuție, în cod mașină), general-purpose(destinat scrierii de cod pentru o mare varietate de proiecte și platforme) și multi-paradigm(are facilităţi pentru programare funcţională, procedurală şi orientată pe obiecte). De-a lungul existenței sale, dezvoltarea limbajului C++ a fost guvernată de câteva principii: Datorită popularităţii şi facilităţilor pe care le oferă programatorilor, C++ a influenţat, în timp, mai multe limbaje, care au preluat diferite elemente: Perl, Ada 95, Java, PHP, C99, C# sunt câteva exemple.
 * 1) Trebuie să fie influențat de probleme actuale și să aibă utilitate imediată în rezolvarea unor probleme din realitate
 * 2) Programatorii să își poată alege propriul stil de programare, iar acesta trebuie să fie suportat de C++
 * 3) Adăugarea unor facilități necesare trebuie să fie mai importantă decât posibilitatea utilizării defectuoase
 * 4) Trebuie să ofere facilități pentru organizarea programelor în module și pentru combinarea ulterioară a acestora
 * 5) Tipurile de date create de utilizatori trebuie să aibă același suport ca și tipurile implicite
 * 6) Limbajul C++ nu se bazează pe alt limbaj de programare, fiind imediat deasupra limbajului de asamblare
 * 7) Limbajul trebuie să ofere posibilitatea integrării cu alte limbaje de programare
 * 8) Facilitățile neutilizate nu trebuie să influențeze negativ programele create

Dificultăți și avantaje în studiul limbajului C++
Cum avantajele vin, de cele mai multe ori, la pachet cu dezavantaje, și în cazul C++ se poate face o discuție de acest fel. C++ oferă flexibilitate, o cantitate enormă de cod, precum și ușurință în trecerea la alte limbaje. Pe de altă parte, poate fi dificil de înțeles de către începători, cu toatele conceptele și facilitățile sale. Type castingul sau conversiile implicite, spre exemplu, pot fi năucitoare pentru un elev care abia învață tipurile de date. Este dificil să înțelegi, fără o pregătire teoretică prealabilă, că în urma executării unei linii de cod de felul: cout<<’a’+2;  vom obține valoarea 99.

O altă dificultate este că, deși creatorii și-au propus constant să creeze un limbaj independent, C++ derivă din C, iar o bună înțelegere a sa necesită înțelegerea limbajului C. De altfel, în acest punct putem sesiza o altă vulnerabilitate, anume că C++ permite sintaxă specifică, dar admite și sintaxa specifică C. Spre exemplu, putem scrie în C++, pentru alocarea spațiului de memorie pentru un pointer int *x = malloc( sizeof(int) ); în maniera C, dar putem, de asemenea, scrie, în maniera C++,  int *x=new int;

Un alt punct în care înțelegerea C++ pentru elevi devine dificilă este alocarea dinamică a memoriei. Din fericire, abordarea curriculară face ca acest capitol să se studieze corelat cu cel de structuri abstracte de date, astfel că, o dată cu implementarea operațiilor pentru gestionarea structurilor de listă, stivă și coadă, elevii capătă și abilitățile practice și cunoștințele necesare lucrului cu pointeri. Conceptul, deși nu în mod specific, este exploatat și în cadrul capitolelor tablouri, șiruri de caractere, respectiv transmiterea parametrilor, în funcțiile definite de utilizator. Este, credem, necesar ca intervenția profesorului să fie, în aceste cazuri edificatoare, acestuia revenindu-i rolul de a “pregăti terenul” în vederea studierii acestei teme.

Fiind printre primele limbaje orientate pe obiecte, C++ oferă o manieră greoaie de lucru cu clasele și obiectele, spre deosebire de alte limbaje, proiectate special pentru lucrul cu acestea, precum Java. În acest punct, C++ are mai multe lipsuri, neavând facilități pentru lucrul cu obiectele, prezente în limbajele moderne. Ne referim la colectarea reziduurilor, la inițializarea implicită a intanțelor, ori la gestionarea erorilor, facilități care în C++, din păcate, lipsesc.

Avantajele pe care le aduce studierea C++ sunt, însă, multe și importante, fapt ce face acest limbaj o alegere foarte bună mai ales pentru elevii de la clasele cu profil matematică-informatică, intensiv informatică. Deși au apărut și continuă să apară limbaje de nivel înalt, specializate pentru anumite proiecte, precum Java, Php, C##, D ș.a.m.d., C++ are, prin posibilitatea de a lucra atât la nivel înalt, cât și la nivel scăzut, un viitor asigurat.

Un alt punct tare al acestui limbaj este portabilitatea. Există, în mod natural, compilatoare pentru cea mai mare majoritate a arhitecturilor din ziua de astăzi. Putem, fără niciun efort, să programăm în C++ sub Window, Linux, Unix, sau Mac OS.

Un avantaj pentru orice programator este, desigur, cunoașterea “intimă” a proceselor, iar acest lucru vine cu studierea limbajului C++. Discutând de perspectivă, poatecel mai important argument în favoarea acestui limbaj este ușurința cu care programatorii C++ deprind alte limbaje, de nivel înalt.

C++ în programa de informatică
Dintre competențele generale asumate de disciplina Informatică, pentru ciclul liceal, una vizează în mod expres predarea unui limbaj de programare și anume:  Implementarea algoritmilor într-un limbaj de programare. În mod tradițional, au fost predate, la alegere, două limbaje: Pascal și C/C++. Evoluția limbajelor de programare, pentru care C++, așa cum am arătat, s-a dovedit un puternic motor, a făcut desuetă predarea  Pascal, C++ rămânând singura opțiune viabilă, fiind astăzi limbajul cel mai utilizat în cadrul orelor de informatică pentru ciclul liceal. Predarea limbajului de programare în cadrul disciplinei Informatică, la clasele de liceu, nu se face independent, în cadrul unei curricule dedicate, ci cumulat cu elemente  de algoritmică și structuri de date. Această abordare holistică ușurează, prin corelarea noțiunilor, înțelegerea și însușirea unor concepte, dar nu oferă imaginea de ansamblu necesară cunoașterii sistematice a unui limbaj de programare.