PROGRAME ÎN LIMBAJUL 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 .

 

structura_program

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 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 {}.

O expresie este o structură corectă sintactic, formată din operanzi şi operatori

functie_expresie

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++\n”; // 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.

Î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ă. Pe ecran va fi afişat fiecare caracter din acest şir, cu excepţia grupului \n. Deşi grupul este format din două caractere, acesta va fi interpretat ca un singur caracter - numit caracter escape - care determină poziţionarea cursorului la începutul următoarei linii. O secvenţă escape (cum este \n) furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut. La sfârşitul instrucţiunii care implementează operaţia de scriere, apare ;

PREPROCESORUL

 In faza de compilare a fişierului sursă este invocat întâi preprocesorul. Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte în fişierul sursă. Directivele preprocesor sunt identificate prin simbolul #, care trebuie să fie primul caracter, diferit de spaţiu, dintr-o linie. Directivele preprocesor sunt utilizate la includerea fişierelor header, la definirea numelor constantelor simbolice, la definirea macro-urilor, sau la realizarea altor funcţii (de exemplu, compilarea condiţionată), aşa cum ilustrează exemplele următoare: 

-  Includerea fişierelor header în codul sursă:

Exemplul1: #include <stdio.h>

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

.Exemplul 2:   #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.

Exemplul 3:   #include "c:\\bc\\head\\headerul_meu.h"

În acest exemplu, pentru interpretarea corectă a caracterului backslash \, a fost necesară "dublarea"  acestuia 

-  Asignarea de nume simbolice constantelor:

            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. 

-  Macrodefiniţii:

Directiva #define este folosită şi în macrodefiniţii. Macrodefiniţiile permit folosirea unor nume simbolice pentru expresiile indicate în directivă.

            Exemplu:

#define NEGATIV (x)-(x)

Între numele macrodefiniţiei şi paranteza stângă (  NEGATIV(…) ) nu sunt permise spaţii albe. La întalnirea în programul sursă a macrodefiniţiei NEGATIV, preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului). Macrodefiniţia din exemplu poate fi folosită în programul sursă astfel: NEGATIV(a+b). Când preprocesorul întâlneşte numele expresiei, subtituie literalii din paranteză, a+b, cu argumentul din macrodefiniţie, x, obţinându-se   -(a+b).

Dacă macrodefiniţia ar fi fost de forma:

                       #define NEGATIV(x)-x                    

NEGATIV(a+b) ar fi fost tratată ca -a+b.