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.
Î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