Sunteți pe pagina 1din 11

Valeriu Iorga

Programare n C / C++

1. C i C++ un tur de orizont.


1.1. Structura unui program C foarte simplu Un limbaj de programare reprezint o interfa ntre problema de rezolvat i programul de rezolvare. Limbajul de programare, prin specificarea unor aciuni care trebuie executate eficient este apropiat de main. Pe de alt parte, el trebuie s fie apropiat de problema de rezolvat, astfel nct soluia problemei s fie exprimat direct i concis. Trecerea de la specificarea problemei la program nu este direct, ci presupune parcurgerea mai multor etape: analiza i abstractizarea problemei. In aceast etap se identific obiectele implicate n rezolvare i aciunile de transformare corespunztoare. Ca rezultat al acestei etape se creaz un univers abstract al problemei (UP), care evideniaz o mulime de tipuri de obiecte, relaiile dintre acestea i restriciile de prelucrare necesare rezolvrii problemei. gsirea metodei de rezolvare acceptabile, preciznd operatorii de prelucrare ai obiectelor din UP. elaborarea algoritmului de rezolvare codificarea algoritmului Limbajul C s-a impus n elaborarea programelor datorit: uurinei de reprezentare a obiectelor cu caracter nenumeric capacitii de reprezentare a obiectelor dinamice capacitii de exploatare a caracteristicilor mainii de calcul pentru controlul strict al performanelor programului asigurrii unei interfee transparente cu sistemul de operare al mainii utilizate.

Limbajul C a fost creat de Dennis Ritchie i Brian Kernighan i implementat pe o maina DEC PDP 11, cu intenia nlocuirii limbajului de asamblare.. Limbajul are precursori direci limbajele BCPL (Richards) i B (Thompson). Limbajul este folosit ca mediu de programare pentru sistemul de operare UNIX. Limbajul a fost standardizat n 1983 i 1989. Limbajul C++ a fost dezvoltat de Bjarne Stroustrup pornind de la limbajul C, ncepnd din anul 1980. C++ mprumut din Simula 67 conceptul de clas i din limbajul Algol 68 - suprancrcarea operatorilor. Dintre noutile introduse de C++ menionm: motenirea multipl, funciile membre statice i funciile membre constante, abloanele, tratarea excepiilor, identificarea tipurilor la execuie, spaiile de nume, etc. Dei C++ este considerat o extensie a limbajului C, cele dou limbaje se bazeaz pe paradigme de programare diferite. Limbajul C folosete paradigma programrii procedurale i structurate. Conform acesteia, un program este privit ca o mulime ierarhic de blocuri i proceduri (funcii). Limbajul C++ folosete paradigma programrii orientate pe obiecte, potrivit creia un program este constituit dintr-o mulime de obiecte care interacioneaz. Elementul constructiv al unui program C este funcia. Un program este constituit dintr-o mulime de funcii, declarate pe un singur nivel (fr a se imbrica unele n altele), grupate n module program. O funcie este o seciune de program, identificat printr-un nume i parametrizat, construit folosind declaraii, definiii i instruciuni de prelucrare. Atunci cnd este apelat, funcia calculeaz un anumit rezultat sau realizeaz un anumit efect. Funcia main() este prezent n orice program C. Execuia programului ncepe cu main(). Funcia main() poate ntoarce un rezultat ntreg (int) sau nici un rezultat (void). Numai n C este posibil s nu specificm tipul rezultatului ntors de funcie, acesta fiind considerat n mod implicit int. /* program C pentru afisarea unui mesaj */ #include <stdio.h> main(){ printf(Acesta este primul program in C /n); }

Valeriu Iorga

Programare n C / C++

Programul folosete un comentariu, delimitat prin /* i */ care, prin explicaii n limbaj natural, crete claritatea programului. Comentariul este constituit dintr-o linie sau mai multe linii, sau poate apare n interiorul unei linii. Nu se pot include comentarii n interiorul altor comentarii. n C++ se utilizeaz comentarii care ncep cu // i se termin prin sfritul de linie. Linia #include <stdio.h> anun compilatorul c trebuie s insereze fiierul antet stdio.h. Acest fiier conine prototipurile unei serii de funcii de intrare i ieire folosite de majoritatea programelor C. Fiierele antet au prin convenie extensia .h. Fiierul de inclus este cutat ntr-o zon standard de includere, n care sunt memorate fiierele antet ale compilatorului C, dac numele este ncadrat ntre paranteze unghiulare (< i >), sau cutarea se face n zona curent de lucru, dac fiierul este ncadrat ntre ghilimele(). Fiierele antet sunt foarte utile n cazul funciilor standard de bibliotec; fiecare categorie de funcie standard are propriul fiier antet. /* program C pentru afisarea unui mesaj */ #include <stdio.h> int main(){ printf(Acesta este primul program in C /n); return 0; } Valoarea ntoars de funcia main() este n mod obinuit 0, avnd semnificaia c nu au fost ntlnite erori, i se asigur prin instruciunea return 0. Instruciunea printf() servete pentru afiarea la terminal (pe ecran) a unor valori formatate. Fa de limbajul C, care este considerat un subset, limbajul C++ permite: abstractizarea datelor, programarea orientat pe obiecte i programarea generic. // program C++ pentru afisarea unui mesaj #include <iostream.h> void main(void){ cout << Primul program C++ \n; } 1.2. Cteva elemente necesare scrierii unor programe C/C++ foarte simple. 1.2.1. Directiva define. Directiva #define nume text este o macrodefiniie. Prelucrarea acesteia, numit macroexpandare, nlocuiete fiecare apariie a numelui prin textul asociat. O aplicaie o reprezint creerea de constante simbolice. De exemplu: #define #define #define PI mesaj MAX 3.14159 Bonjour madame 100 1.2.2. Tipuri. Fiecrui nume i se asociaz un tip, care determin ce operaii se pot aplica acelui nume i cum sunt interpretate acestea. De exemplu: char c=a; // c este o variabil caracter initializata cu a int f(double); //f este o functie de argument real cu rezultat intreg 1.2.3. Definiii i declaraii de variabile, O valoare constant se reprezint textual (este un literal) sau printr-un nume - constant simbolic. O variabil este un nume (identificator) care desemneaz o locaie de memorie n care se pstreaz o valoare. O variabil se caracterizeaz aadar prin: nume (adres), tip i valoare, atributul valoare putnd fi modificat. De exemplu:

O constant simbolic astfel definit nu poate fi redefinit prin atribuire.

Valeriu Iorga int n, p; char c; float eps; O variabil poate fi iniializat la declararea ei. De exemplu: float eps=1.0e-6;

Programare n C / C++

Iniializarea se face numai o dat, naintea execuiei programului. Variabilele externe i statice sunt iniializate implicit la 0. Pentru o variabil automatic (declarat n interiorul unui bloc), pentru care exist iniializare explicit, aceasta este realizat la fiecare intrare n blocul care o conine. n C++ calificatorul const aplicat unui nume simbolic arat c acesta nu mai poate fi modificat pe parcursul programului i reprezint o constant. Definirea unei constante presupune i iniializarea acesteia. const float pi=3.1415926; O definiie este o construcie textual care asociaz unui nume o zon de memorie (un obiect) i eventual iniializeaz coninutul zonei cu o valoare corespunztoare tipului asociat numelui. 1.2.4. Atribuirea. Atribuirea simpl este de forma:variabil = expresie i are ca efect modificarea valorii unei variabile. Atribuirea compus a op= b reprezint ntr-o form compact operaia a = a op b Atribuirea multipl este de forma variabil1 = variabil2 = = expresie i iniializeaz variabilele, pornind de la dreapta spre stnga cu valoarea expresiei. Operatorii de incrementare folosii n atribuiri au efecte diferite. Astfel: a = ++b este echivalent cu b=b+1; a=b; n timp ce: a = b++ are ca efect a=b; b=b+1; 1.2.5. Decizia. Permite alegerea ntre dou alternative, n funcie de valoarea (diferit de 0 sau 0) a unei expresii:

if (expresie) instructiune1; else instructiune2;

Valeriu Iorga De exemplu: if (a > b) max=a; else max=b; 1.2.6. Ciclul. Execut n mod repetat instruciunea, ct timp condiia este ndeplinit. while (expresie) instructiune;

Programare n C / C++

De exemplu calculul celui mai mare divizor comun se realizeaz cu: while (a!=b) if (a > b) a -=b; else b -=a; 1.2.7. Afiarea valorii unei expresii (descriptori), Pentru afiarea unei valori la terminal, sub controlul unui format se folosete funcia: printf(lista_descriptori, lista_expresii); De exemplu: printf(pi=%.5f\n, M_PI); 1.2.8. Citirea valorilor de la terminal. Pentru citirea unor valori introduse de la terminal, sub controlul unui format se folosete funcia: scanf(lista_descriptori, lista_adrese); De exemplu: scanf(%d%d/n, &a, &b);

Valeriu Iorga

Programare n C / C++

1.3. Structura unui program. n C nu exist noiunea de program ci aceea de subprogram funcie. Compilatorul recunoate noiunea de modul - un ansamblu de variabile i de funcii. Un program n C este o funcie cu numele main() care se execut ntotdeauna prima. Cea mai simpl structur de program este un modul compus dintr-o singur funcie main(): void main (){ <declaratii locale> <instructiuni> }

Valeriu Iorga

Programare n C / C++

2. Elementele fundamentale ale limbajului (C / C++).


2.1. Alfabetul limbajului. Conine setul de caractere ASCII (setul extins 256 caractere). 2.2. Atomi lexicali. Exist urmtoarele entiti lexicale: identificatori, cuvinte cheie, constante, iruri de caractere, operatori i separatori. Spaiile albe n C sunt reprezentate de: spaiu liber (blanc), tabulare orizontal, tabulare vertical, linie nou, pagin nou, comentarii. Spaiile albe separ atomii lexicali vecini. 2.2.1. Identificatori. Identificatorii servesc pentru numirea constantelor simbolice, variabilelor, tipurilor i funciilor. Sunt formai dintr-o liter, urmat eventual de litere sau cifre. Caracterul de subliniere _ este considerat liter. Intr-un identificator literele mari si cele mici sunt distincte. Astfel Abc si abc sunt identificatori diferii. Identificatorii pot avea orice lungime, dar numai primele 32 caractere sunt semnificative. 2.2.2. Cuvinte cheie. Cuvintele cheie sau cuvintele rezervate nu pot fi folosite ca identificatori. Acestea sunt: auto default float return switch while break do for short typedef case double if signed union char else int sizeof unsigned 2.2.3. Literali. Un literal este o reprezentare explicit a unei valori. Literalii pot fi de mai multe tipuri tipuri: ntregi, caractere, reali, enumerri sau iruri de caractere.. 2.2.4 iruri de caractere. Conin caractere ncadrate ntre ghilimele. n interiorul unui ir ghilimelele pot fi reprezentate prin \ .Un ir de caractere se poate ntinde pe mai multe linii, cu condiia ca fiecare sfrit de linie s fie precedat de \. irurile de caractere n C se termin cu caracterul nul \0. n cazul literalelor iruri de caractere, compilatorul adaug n mod automat la sfritul irului caracterul nul. 2.2.5. Comentarii. Un comentariu ncepe prin /* , se termin prin */ i se poate ntinde pe mai multe linii. Comentariile nu pot fi incluse unele n altele (imbricate). n C++ au fost introduse comentariile pe o singur linie, care ncep prin // i au terminator sfritul liniei. 2.2.6. Terminatorul de instruciune. Caracterul ; este folosit ca terminator pentru instruciuni i declaraii, cu o singur excepie dup o instruciune compus, terminat prin acolad, nu mai este necesar terminatorul ; . 2.2.7. Constante. Constantele identificatori se obin folosind directiva #define a preprocesorului: #define constant-identificator #define constant-identificator literal sau constant-identificator (expresie-constant) 6 const enum long static void continue extern register struct volatile

Valeriu Iorga

Programare n C / C++

2.3. Ciclul de dezvoltare al unui program Conine urmtoarele etape: 1. Definirea problemei de rezolvat. Analiza problemei cuprinde n afara formulrii problemei n limbaj natural, o precizare riguroas a intrrilor (datelor problemei) i a ieirilor (rezultatelor). De exemplu ne propunem s rezolvm ecuaia de gradul 2: ax2+bx+c=0 Datele de intrare sunt cei 3 coeficieni a, b, c ai ecuaiei, care precizeaz o anumit ecuaie de grad 2. Rezultatele sunt cele dou rdcini (reale sau complexe) sau celelalte situaii particulare care pot apare. 2. Identificarea pailor necesari pentru rezolvarea problemei ncepe cu formularea modelului matematic. Ca model matematic vom folosi formula:
b b2 4ac 2a

x1,2 =

Formula nu este ntotdeauna aplicabil. Vom distinge urmtoarele situaii: 1. a=0, caz n care nu avem de a face cu o ecuaie de gradul 2, ci 1.1. este posibil s avem ecuaia de gradul 1: bx+c=0, cu soluia x= - c/b , dac b 0. 1.2. dac i b=0, atunci 1.2.1. dac c0, atunci nu avem nici o soluie, n timp ce 1.2.2. dac i c=0, atunci avem o infinitate de soluii. 2. a0 corespunde ecuaiei de gradul 2. In acest caz avem alte dou situaii: 2.1. Formula este aplicabil pentru rdcini reale (discriminant pozitiv) 2.2. Pentru discriminant negativ, ntruct nu dispunem de aritmetic complex, va trebui s efectum separat calculele pentru partea real i cea imaginar. 3. Proiectarea algoritmului folosind ca instrument pseudocodul. Pseudocodul folosit cuprinde:

operaii de intrare / ieire:

citete var1, var2, scrie expresie1, expresie2, structuri de control:

decizia:

dac expresie atunci instruciune1; altfel instruciune2;

ciclul:

ct timp expresie repet instruciune; secvena: { instruciune1; ... instruciunen; } Algoritmul dezvoltat pe baza acestui pseudocod este:

Valeriu Iorga

Programare n C / C++

reali a,b,c,delta,x1,x2,xr,xi; citete a,b,c; dac a=0 atunci dac b0 atunci scrie c/b; altfel dac c0 atunci scrie nu avem nici o solutie; altfel scrie o infinitate de solutii; altfel { delta=b*b-4*a*c; dac delta >= 0 atunci { x1=(-b-sqrt(delta))/(2*a); x2=(-b+sqrt(delta))/(2*a); scrie x1,x2; } altfel { xr=-b/(2*a); xi=sqrt(-delta)/(2*a); scrie xr,xi; } } 4. Scrierea programului folosind un limbaj de programare. Vom codifica algoritmul descris mai sus folosind limbajul C: #include <stdio.h> #include <math.h> void main(void) { double a,b,c,delta,x1,x2,xr,xi; scanf(%f %f %f,&a,&b,&c); if (a==0) if (b!=0) printf(o singura radacina x=%6.2f\n,-c/b); else if (c!=0) printf(nici o solutie\n); else printf(o infinitate de solutii\n); else { delta=b*b-4*a*c; if(delta >= 0) { x1=(-b-sqrt(delta))/2/a; x2=(-b+sqrt(delta))/2/a; printf(x1=%5.2f\tx2=%5.2f\n,x1,x2); } else { xr=-b/2/a; xi=sqrt(-delta)/2/a; printf(x1=%5.2f+i*%5.2f\nx2=%5.2f-i*%5.2f\n, xr,xi,xr,xi); } } }

Valeriu Iorga

Programare n C / C++

Fig.2.1. Etapele rezolvrii unei probleme folosind calculatorul 5. Implementarea programului: editare, compilare, editare de legturi, execuie. Un mediu de programare C conine:

Valeriu Iorga

Programare n C / C++

Un editor de text folosit pentru creearea i modificarea codului surs C

Un compilator pentru a converti programul C n cod neles de calculator. Procesul de compilare cuprinde: o faz de precompilare (macroprocesare) n care are loc expandarea macrodefiniiilor si compilarea condiional si includerea fisierelor compilarea propriu-zis n urma careia se genereaz cod obiect Compilarea din linia de comand n GCC se face cu:

gcc c prog.c

prog.cprog.o

Editor de legturi leag la codul obiect anumite funcii de bibliotec (de exemplu intrri/ieiri) extrase dintr-o bibliotec de funcii, creindu-se un program executabil. gcc -o prog prog.o prog.oprog.exe prog.cprog.exe

Compilarea i editarea de legturi se poate face printr-o singur comand: gcc o prog prog.c

Opiunea o permite specificarea fiierului de ieire. Dac acesta lipsete, se consider n mod implicit ca nume al fiierului executabil a.out, Aadar:

gcc prog.c

prog.ca.out

Fiiere biblioteci de funcii sunt fiiere de funcii gata compilatecare se adaug (se leag) la program. Exist biblioteci pentru: funcii matematice, iruri de caractere, intrri/ieiri. Biblioteca standard C la execuie (run-time) este adugat n mod automat la fiecare program; celelalte biblioteci trebuiesc legate n mod explicit. De exemplu, n GNU C++ pentru a include biblioteca matematic libm.so se folosete opiunea lm: gcc o prog prog.c lm Bibliotecile pot fi: - statice (.lib n BorlandC, .a n GCC) codul ntregii biblioteci este ataat programului - dinamice (.dll n BorlandC, .so n GCC) programului I se ataeaz numai funciile pe care acesta le solicit din bibliotec. n GCC se leag n mod implicit versiunea dinamic a bibliotecii; pentru a lega versiunea staticse folosete opiunea static. Fiiere antet (header files)datele i funciile coninute n biblioteci sunt declarate n fiiere antet asociate bibliotecilor. Prin includerea unui fiier antet compilatorul poate verifica corectitudinea apelurilor de funcii din biblioteca de funcii asociat (fr ca aceste funcii s fie disponibile n momemtul compilrii). Bibliotec Fiier antet math.h matematic string.h Siruri de caractere stdio.h Intrri/ieiri Un fiier antet este inclus printr-o directiv cu sintaxa: #include <nume.h> Aceasta caut fiierul antet ntr-un director special de fiiere incluse (include). #include nume.h Caut fiierul antet n directorul current. ncrcarea i execuia programului (fiierului executabil .exe) se vface n GCC prin: ./ prog 6. Depanarea programului (debugging).

10

Valeriu Iorga

Programare n C / C++

Depanarea unui program reprezint localizarea i nlturarea erorilor acestuia. Cele mai frecvente erori de sintax se refer la: lipsa terminatorului de instruciune ;, neechilibrarea parantezelor, nenchiderea irurilor de caractere, etc. Erorile detectate de ctre editorul de legturi sunt referinele nerezolvate (apelarea unor funcii care nu au fost definite, sau care se afl n biblioteci care nu au fost incluse). Cele mai des ntlnite erori la execuie provin din: confuzia ntre = i == depirea limitelor memoriei allocate tablourilor variabile neiniializate erori matematice: mprire prin 0, depire, radical dintr-un numr negative, etc.

Dac s-a depit faza erorilor la execuie, vom testa programul, furnizndu-i date de intrare pentru care cunoatem ieirile. Apariia unor neconcordane indic prezena unor erori logice. Dac ns, rezultatele sunt corecte, nu avem certitudinea c programul funcioneaz corect n toate situaiile. Prin testare putem constata prezena erorilor, nu ns i absena lor. Desfurarea calculelor poate fi controlat prin execuie pas cu pas,sau prin asigurarea unor puncte de ntrerupere n care s inspectm starea programului, folosind n acest scop un depanator (debugger). 2.4. ntrebri i probleme. 1. 2. 3. Ce deosebire exist ntre A i A ? Ce caractere pot fi reprezentate prin secvenele escape: /101, /012. Reprezentai irurile de caractere i .

11