Elemente de baza ale limbajului C++


    La inceputul anulor 70 a aparut limbajul C, creatia lui Dennis Ritchie si Brian Kernighan. Limbajul C++ -creatia lui Bjarne Stroustrup- e o extensie a limbajului C care permite programarea pe obiecte.

Limbajul C a apărut în anii 1970 şi a fost creat de Dennis Ritchie în laboratoarele AT&T Bell. Limbajul C face parte din familia de limbaje concepute pe principiile programării structurate, la care ideea centrală este ”structurează pentru a stăpâni o aplicaţie”. Popularitatea limbajului a crescut rapid datorită eleganţei şi a multiplelor posibilităţi oferite programatorului (puterea şi flexibilitatea unui limbaj de asamblare); ca urmare, au apărut numeroase alte implementări. De aceea, în anii ’80 se impune necesitatea standardizării acestui limbaj. În perioada 1983-1990, un comitet desemnat de ANSI (American National Standards Institute) a elaborat un compilator ANSI C, care permite scrierea unor programe care pot fi portate fără modificări, pe orice sistem.

           

Limbajul C++ apare la începutul anilor ’80 şi îl are ca autor pe Bjarne Stroustrup. El este o variantă de limbaj C îmbunătăţit, mai riguroasă şi mai puternică, completată cu construcţiile necesare aplicării principiilor programării orientate pe obiecte (POO). Limbajul C++  păstrează toate elementele limbajului C,  beneficiind de eficienţa şi flexibilitatea acestuia. Limbajul C++ este un superset al limbajului C. Incompatibilităţile sunt minore, de aceea, modulele C pot fi încorporate în proiecte C++ cu un efort minim.

        Structura programelor C/ C++
 

Un program scris în limbajul C (sau C++) este compus din unul sau mai multe fişiere sursă. Un fişier sursă este un fişier text care conţine codul sursă (în limbajul C) al unui program. Fiecare fişier sursă conţine una sau mai multe funcţii şi eventual, referinţe către unul sau mai multe fişiere header .

 

Funcţia principală a unui program este numită main. Execuţia programului începe cu execuţia acestei funcţii, care poate apela, la rândul ei, alte funcţii. Toate funcţiile folosite în program trebuie descrise în fişierele sursă (cele scrise de către programator), în fişiere header (funcţiile predefinite, existente în limbaj), sau în biblioteci de funcţii.

 

Un fişier header este un fişier aflat în sistem sau creat de către programator, care conţine declaraţii şi definiţii de funcţii şi variabile.

 

Acţiunile din fiecare funcţie sunt codificate prin instrucţiuni . Există mai multe tipuri de instrucţiuni, care vor fi discutate în capitolul următor.

 

O instrucţiune este orice expresie validă (de obicei, o asignare sau un apel de funcţie), urmată de simbolul ;. În figura 2.2.b. este dat un exemplu de instrucţiune simplă. Uneori, ca instrucţiune poate apare instrucţiunea nulă (doar ;), sau instrucţiunea compusă (privită ca o succesiune de instrucţiuni simple, încadrate între acoladele delimitatoare {}.


 

 

 

 

 


 

    Functiile trebuie descrise fie in fisierele sursa, fie in fisiere separate numite fisiere header, fie in biblioteci de functii
Functia main are urmatoarea forma:
            void main( )
                {instructiuni;
                 }

Pentru a înţelege mai bine noţiunile prezentate, să considerăm un exemplu foarte simplu. Programul următor afişează pe ecran un mesaj (mesajul Primul meu program). Informaţia de prelucrat (de intrare) este însuşi mesajul (o constantă şir), iar prelucrarea ei constă în afişarea pe ecran.

Exemplu:

#include <iostream.h> // linia 1

void main()                                    // linia 2 - antetul funcţiei main

{                    /* linia 3 - începutul corpului funcţiei, a unei intrucţiuni

compuse */

cout<<”Primul meu program in limbajul C++”;    // linia 5

}                                                   // linia6-sfârşitul corpului funcţiei

 

Prima linie este o directivă preprocesor (indicată de simbolul #) care determină includerea în fişierul sursă a fişierului header cu numele iostream.h. Acest header permite realizarea afişării pe monitor.

 

Programul conţine o singură funcţie, funcţia principală, numită main, al cărui antet (linia 2) indică:

- tipul valorii returnate de funcţie (void, ceea ce înseamnă că funcţia nu returnează nici o valoare)

- numele funcţiei (main)

- lista argumentelor primite de funcţie, încadrată de cele 2 paranteze rotunde.

Funcţiile comunică între ele prin argumente. Aceste argumente reprezintă datele de intrare ale funcţiei. În cazul nostru, nu avem nici un argument în acea listă, deci puteam să scriem antetul funcţiei şi astfel:

     void main(void)

 

Ceea ce urmează după simbolul //, până la sfărşitul liniei, este un comentariu, care va fi ignorat de către compilator. Comentariul poate conţine un text explicativ; informaţii lămuritoare la anumite aspecte ale problemei sau observaţii. Dacă vrem să folosim un comentariu care cuprinde mai multe linii, vom delimita începutul acestuia indicat prin simbolulurile /*, iar sfârşitul - prin */ (vezi liniile 3, 4). Introducerea comentariilor în programele sursă uşurează înţelegerea acestora. În general, se recomandă introducerea unor comentarii după antetul unei funcţiei, pentru a preciza prelucrările efectuate în funcţie, anumite limite impuse datelor de intrare, etc.

    Cele doua paranteze se ataseaza oricarei functii. Intre ele se scriu optional anumiti parametri ( in acest caz lipsesc)
    O functie poate intoarce un rezultat. Daca nu intoarce nici un rezultat spunem ca tipul rezultatului este void. Exista functii cu rezultat de tip real, intreg etc.

    De asemenea, programul poate contine si declaratii de variabile globale - adica variabile cu care pot lucra toate functiile care il alcatuiesc.
    Instructiunile care pot aparea sunt fie expresii fie implementari ale structurilor de control ca if, for, while etc.

Începutul şi sfârşitul corpului funcţiei main sunt indicate de cele două acoalade { (linia3) şi }(linia 6).

 

Corpul funcţiei (linia 5) este format dintr-o singură instrucţiune, care implementează o operaţie de scriere.

 

Cuvantul cout este un cuvânt predefinit al limbajului C++ - console output - care desemnează dispozitivul logic de iesire;

 

simbolul <<  este operatorul de transfer a informaţiei. Folosite astfel, se deschide un canal de comunicaţie a datelor către dispozitivul de ieşire, în cazul acesta, monitorul.

 

După operator se specifică informaţiile care vor fi afişate (în acest exemplu, un şir de caractere constant). Faptul că este un şir constant de caractere este indicat de ghilimelele care îl încadrează.

 

La sfârşitul instrucţiunii care implementează operaţia de scriere, apare ;

 

Etapele rezolvării unei probleme cu ajutorul calculatorului

 

Să detaliem în continuare etapa de implementare. După analiza problemei şi stabilirea algoritmului, acesta trebuie tradus (implementat) într-un limbaj de programare.

 

q       Scrierea (editarea) programului sursă.

Programele sursă sunt fişiere text care conţin instrucţiuni (cu sintactica şi semantica proprii limbajului utilizat). Programul (fişierul) sursă este creat cu ajutorul unui editor de texte  şi  va fi salvat pe disc (programele sursă C primesc, de obicei,  extensia .c, iar cele C++, extensia .cpp).

Pentru a putea fi executat, programul sursă trebuie compilat  şi linkeditat.

 

q       Compilarea

Procesul de compilare este realizat cu ajutorul compilatorului, care translatează codul sursă în cod obiect (cod maşină), pentru ca programul să poată fi înţeles de calculator. În cazul limbajului C, în prima fază a compilării este invocat preprocesorul. Acesta recunoaşte şi analizează mai întâi o serie de instrucţiuni speciale, numite directive procesor. Verifică apoi codul sursă pentru a constata dacă acesta respectă sintaxa şi semantica limbajului. Dacă există erori, acestea sunt semnalate utilizatorului. Utilizatorul trebuie să corecteze erorile (modificând programul sursă). Abia apoi codul sursă este translatat în cod de asamblare, iar în final, în cod maşină, binar, propriu calculatorului. Acest cod binar este numit cod obiect şi de obicei este memorat într-un alt fişier, numit fişier obiect. Fişierul obiect va avea, de obicei, acelaşi nume cu fişierul sursă şi extensia .obj.

 

q       Linkeditarea

Dupa ce programul sursă a fost translatat în program obiect, el este va fi supus operaţiei de  linkeditare. Scopul fazei de linkeditare este acela de a obţine o formă finală a programului, în vederea execuţiei acestuia. Linkeditorul “leagă” modulele obiect, rezolvă referinţele către funcţiile externe şi rutinele din biblioteci şi produce cod executabil, memorat într-un alt fisier, numit fişier executabil (acelaşi nume, extensia .exe)

 

q       Execuţia

Lansarea în execuţie constă în încărcarea programului executabil în memorie şi startarea execuţiei sale.

 

 

 

 

 

 

 

 

 


Observaţii:

1.       Mediile de programare integrate (BORLANDC, TURBOC) înglobează editorul, compilatorul, linkeditorul şi depanatorul (utilizat în situaţiile în care apar erori la execuţie);

2.       Dacă nu se utilizează un mediu integrat, programatorul va apela în mod explicit (în linie de comandă) un editor de texte, compilatorul, linkeditorul. Lansarea în execuţie se va face tot din linie de comandă.

3.      Extensiile specificate pentru fişierele sursă, obiect şi executabile sunt  CPP (sau C), OBJ respectiv EXE.

      Preprocesorul

    In prima faza a etapei de compilare este apelat preprocesorul C. Acesta va trata o serie de directive speciale numite directive preprocesor pe care le gaseste in fisierul sursa. O directiva preprocesor incepe cu simbolul #
    Directivele preprocesor se folosesc in urmatoarele situatii:

1.  Includerea fisierelor header in codul sursa. Exemplu: directiva include:

        # include<iostream.h>
             pentru citiri sau scrieri

parantezele unghiulare < > indică faptul că este vorba de un fişier header sistem (predefinit). Când procesorul întâlneşte această linie, datorită simbolului #, o recunoaşte ca fiind o directivă preprocesor, localizează fişierul header indicat.

      Programatorul isi poate crea propriile fisiere header caz in care acesta va fi incadrat intre " " . De exemplu:
#include "headerul_meu.h"

Numele fişierului header inclus între ghilimele, indică faptul că headerul_meu.h este un fişier header creat de utilizator. Preprocesorul va căuta să localizeze acest fişier în directorul curent de lucru al utilizatorului. În cazul în care fişierul header nu se află în directorul curent, se va indica şi calea către acesta.

Exemplu:  
#include "c:\\bc\\head\\headerul_meu.h"

În acest exemplu, pentru interpretarea corectă a caracterului backslash \, a fost necesară "dublarea"  acestuia, din motive pe care le vom prezenta în paragrafele urmatoare

2. Asignarea unor nume simbolice pentru constante. De exemplu:
            #define    PI   3.14
       PI este numele constantei simbolice iar 3.14 este valoarea constantei

       In locurile in care in codul sursa apar numele constantelor simbolice carora li s-a asignat o valoare printr-o directiva define in mod automat numele constantei este inlocuit prin valoarea acestora

Exemplu:

#define TRUE  1

         #define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii întregi 1 numelui   (constantei simbolice) TRUE, şi a valorii 0 numelui simbolic FALSE. Ca urmare, înaintea compilării propriu-zise, în programul sursă, apariţiile numelor TRUE şi FALSE vor fi înlocuite cu valorile 1, respectiv 0.

Un prim exemplu de program C++:

    #include <iostream.h>

    void main( )
     {
      int a;   // acesta este un comentariu de sfarsit de linie - am declarat o variabila de tip intreg

      cout << "Tastati un numar intreg ";
      cin >> a;
      cout << "Ati tastat numarul " << a ;
     }

 Obs.: << este operatorul de insertie
           >> este operatorul de extractie
           cin este "console in"  - pentru citire de date