Sunteți pe pagina 1din 69

nvmntul profesional i tehnic n domeniul TIC

Proiect cofinanat din Fondul Social European n cadrul POS DRU 2007-2013
Beneficiar Centrul Naional de Dezvoltare a nvmntului Profesional i Tehnic
str. Spiru Haret nr. 10-12, sector 1, Bucureti-010176, tel. 021-3111162, fax. 021-
3125498, vet@tvet.ro

PROGRAMAREA MODULAR
Material de predare

Domeniul: Informatic
Calificarea: Analist programator

Nivel 3 avansat

2009
AUTOR:
ANCA MANUELA BOTOANU profesor grad didactic II

COORDONATOR:

MARIANA VIOLETA CIOBANU profesor grad didactic I

CONSULTAN:

IOANA CRSTEA expert CNDIPT


ZOICA VLDU expert CNDIPT
ANGELA POPESCU expert CNDIPT
DANA STROIE expert CNDIPT

Acest material a fost elaborat n cadrul proiectului nvmntul profesional i tehnic n


domeniul TIC, proiect cofinanat din Fondul Social European n cadrul POS DRU 2007-
2013

2
Cuprins

I. INTRODUCERE.............................................................................................................5

II. DOCUMENTE NECESARE PENTRU ACTIVITATEA DE PREDARE.........................8

III. RESURSE....................................................................................................................9

TEMA 1: SUBPROGRAME..................................................................................................9
FIA SUPORT 1.1. SUBPROGRAME I TIPURI DE SUBPROGRAME ........................................9
TEMA 1: SUBPROGRAME...............................................................................................12
FIA SUPORT 1.2. STRUCTURA SUBPROGRAMELOR I TRANSMITEREA PARAMETRILOR......12
TEMA 1: SUBPROGRAME...............................................................................................18
FIA SUPORT 1.3. APELUL SUBPROGRAMELOR...............................................................18
TEMA 2: MODULARIZAREA PROGRAMELOR.....................................................................22
FIA SUPORT.1.4. TIPURI DE VARIABILE, DOMENIUL I PLASAREA SUBPROGRAMELOR ......22
TEMA 3: ALOCAREA MEMORIEI......................................................................................26

FIA SUPORT 1.5. SEGMENTUL DE DATE, SEGMENTUL DE STIV, HEAP, REGITRI.............26


TEMA 4: IMPLEMENTAREA STRUCTURILOR DINAMIICE DE DATE.......................................28

FIA SUPORT 1.6. LISTE, STIVE, COZI............................................................................28


TEMA 4: IMPLEMENTAREA STRUCTURILOR DE DATE DINAMICE ..........................................37
FIA SUPORT 1.7.GRAFURI...........................................................................................37
TEMA 4: IMPLEMENTAREA .STRUCTURILOR DE DATE DINAMICE .........................................58
FIA SUPORT 1.8. ARBORI............................................................................................ 58
TEMA 5: FUNCII / METODE PREDEFINITE.......................................................................71
FIA SUPORT 1.9. TIPURI DE FUNCII/METODE PREDEFINITE ............................................71
TEMA 6: MODALITI I TEHNICI DE UTILIZARE A FUNCIILOR / METODELOR PREDEFINITE. 78
FIA SUPORT 1.10. MODALITI I TEHNICI DE UTILIZARE A FUNCIILOR / METODELOR.....78

IV. FIA REZUMAT ..85

V. BIBLIOGRAFIE...........................................................................................................86
I. Introducere

Materialele de predare reprezint o resurs suport pentru activitatea de predare,


instrumente auxiliare care includ un mesaj sau o informaie didactic.

Prezentul material de predare, se adreseaz cadrelor didactice care predau n cadrul


colilor postliceale, domeniul Informatic, calificarea Analist programator, nivelul 3
avansat.

El a fost elaborat pentru modulul Programarea modular, ce se desfoar n 72 ore,


din care: laborator tehnologic 36 ore.

Competene /
Teme Fise suport
rezultatele ale
invrii

1. Lucreaz cu Tema 1 Subprograme Fisa 1.1 Subprograme i


subprograme tipuri de subprograme

Fisa 1.2 Structura


subprogramelor i
transmiterea parametrilor

Fia 1.3 Apelul


subprogramelor

Tema 2 Modularizarea Fisa 1.4 Tipuri de


programelor variabile, domeniul i
plasarea subprogramelor

2.Implementeaz Tema 3 Alocarea memoriei Fia 1.5 Segmentul de


structuri de date date, segmentul de stiv,
dinamice heap, regitri

Tema 4 Implementarea Fia 1.6 Liste, stive, cozi


structurilor dinamice de date
Fia 1.7 Grafuri

Fia 1.8 Arbori

3. Utilizeaz Tema 5 Funcii / metode Fia 1.9 Tipuri de funcii /


colecii de date i predefinite metode predefinte
elemente
predefinite din Tema 6 Modaliti i tehnici de Fia 1.10 Modaliti i
bibliotecile utilizare a funciilor / metodelor tehnici de utilizare a
limbajului predefinite funciilor / metodelor
predefinite

Absolvenii nivelului 3 avansat, coal postliceal, calificarea Analist programator,


vor fi capabili s utilizeze tehnologiile informatice i ale comunicrii pentru conceperea,
proiectarea, elaborarea, testarea, implementarea i dezvoltarea sistemelor informatice,
a programelor i a documentaiei tehnice aferente.

5
6
II. Documente necesare pentru activitatea de predare
Pentru predarea coninuturilor abordate n cadrul materialului de predare cadrul didactic
are obligaia de a studia urmtoarele documente:

Standardul de Pregtire Profesional pentru calificarea Analist programator,


nivelul 3 avansat www.tvet.ro, seciunea SPP sau www.edu.ro , seciunea
nvmnt preuniversitar

Curriculum pentru calificarea Analist programator, nivelul 3 avansat


www.tvet.ro, seciunea Curriculum sau www.edu.ro , seciunea nvmnt
preuniversitar

7
III. Resurse

Tema 1: Subprograme

Fia suport 1.1. Subprograme i tipuri de subprograme

Noiunea de subprogram

Definiie

Subprogramele sunt pri ale unui program, identificabile prin nume, care se pot
activa la cerere prin intermediul acestor nume.

n construirea unei aplicaii folosirea subprogramelor ofer urmtoarele avantaje:

Permite economisirea de memorie i de timp alocat


Permite lucrul n echip la rezolvarea unor sarcini complexe pentru aplicaiile mari
Detectarea i corectarea erorilor se face cu uurin
Depanarea i actualizarea aplicaiei se fac mai uor
Permite descompunerea unei probleme de mari dimensiuni
Elaborarea algoritmilor devine mai uoar deoarece problema este descompus
Permite reutilizarea cu uurin a programelor
Crete portabilitatea programelor

O parte din subprogram se contruiete ca subprogram dac un algoritm cuprinde n mai


multe locuri aceeai secven de operaii executabil pentru aceleai date sau pentru
date diferite. n loc ca subprogramul s cuprind n acelai loc, acelai grup de
instruciuni, concepnd grupul de intruciuni ca subprogram, el va aprea n program o
singur dat i se va activa de mai multe ori. Partea respectiv de program rezolv o
subproblem din cele n care se descompune problema complex.

De exemplu, considerm urmtoarea secven de program care memoreaz n


variabila max valoarea maxim dintre valorile variabilelor ntregi a, b, c:

max=a;
if (max<b)
max=b;
if (max<c)
max=c;
cout << "max= "<<max;
Cele dou instruciuni condiionale realizeaz, de fapt, acelai lucru: determin valoarea
maxim dintre valorile memorate n dou variabile. Procesul de calcul este acelai,
difer doar valorile concrete ale variabilelor pentru care acest proces se execut.
Deoarece determinarea maximului dintre dou valori poate fi modelat
matematic ca o funcie i descrierea subprogramului are o structur asemntoare cu
cea a funciei:
int Maxim (int p, int q)
{
if (p>q)
return p;
else
return q;
}

atunci, pentru exemplul considerat, seciunea de program care calculeaz


maximul dintre trei valori, poate fi rescris astfel:

max = Maxim (a,b);


max = Maxim (max,c);

Tipuri de subprograme

Clasificarea subprogramelor:

Subprograme standard (subprograme de sistem) utilizarea lor presupune


includerea fiierului ce conine prototipul dorit i apelarea subprogramului

Subprograme definite de utilizator sunt descrise de progamator pentru rezolvarea


unor cerine specifice. Utilizarea lor presupune precizarea prototipului, definirea i
apelul.

Subprograme apelate ca instruciuni procedurale returneaz sau nu o valoare prin


intermediul parametrilor. Apelul se face prin nume i parametri

Subprograme apelate ca operanzi returneaz un rezultat chiar prin numele su i


eventual alte rezultate prin parametri. Apelul se face n interiorul unei expresii.

Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

9
Ca materiale suport se pot folosi:
O prezentare multimedia care s cuprind definiii de concepte cu exemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n proiectarea de subprograme.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise

10
Tema 1: Subprograme

Fia suport 1.2. Structura subprogramelor i transmiterea parametrilor

Structura subprogramelor.

Definiie

Un subprogram (funcie) are o definiie i attea apeluri cte sunt necesare


Definiia unui subprogram reprezint de fapt descrierea unui proces de calcul cu
ajutorul variabilelor virtuale (parametri formali), iar apelul unui subprogram nseamn
execuia procesului de calcul pentru cazuri concrete (cu ajutorul parametrilor reali,
(efectivi, actuali) ).

Definiie

Parametri formali apar n antetul subprogramului i sunt utilizai de subprogram


pentru descrierea abstract a unui proces de calcul .
Parametri actuali apar n instruciunea de apelare a uni subprogram i sunt
folosii la execuia unui proces de calcul pentru valori concrete.
Parametrii formali nu sunt variabile. O variabil este caracterizat de nume, tip,
i adres. Legarea unui parametru formal la o adres se realizeaz n timpul execuiei
instruciunii de apelare a subprogramului.

Definiia unei funcii are forma general:

tip_returnat nume_funcie (lista parametrilor


formali)
{
instruciune;// corpul funciei
}

Reprezint tipul rezultatului calculat i returnat de funcie i


poate fi: int, char, char*, long, float, void, etc.
n cazul n care tipul rezultatului este diferit de void, corpul
Tip_returnat funciei trebuie s conin cel puin o instruciune return.
nstruciunea return va specifica valoarea calculat i
returnat de funcie care trebuie s fie de acelai tip ca i
tip_returnat.

11
Reprezint numele dat funciei de ctre cel ce o definete,
Nume_funcie
pentru a o putea apela.
Lista_parametrilor_form Reprezint o list de declaraii de variabile separate prin
ali virgul. Aceast list poate s fie i vid.
Este o instruciune vid sau o instruciune simpl sau o
Instruciune
instruciune compus.

Construirea subprogramelor se face prin :


Antet conine date despre : tipul rezultatului, nume i parametrii efectivi. Dac funcia
nu returneaz nimic, tipul este void()
Corp este un bloc de instruciuni declarative i imperative (de execuie) ce definesc
modul de aciune al subprogramului
Prototip pentru a putea fi apelat, funcia trebuie declarat. Conine date despre :
tipul rezultatului, nume i parametrii efectivi.
Apel este modul prin care subprogramul e pus n execuie. Apelul poate fi fcut ori
de cte ori este nevoie.
Parametrii datele care circul ntre modulul appelant i apelat se introduc ntre
paranteze, dup numele subprogramului.
Modul apelant blocul ce conine apelul subprogramului
Modul apelat blocul ce conine funcia (subprogramul apelat).
De exemplu, cum arat un subprogram :

# include <iostream.h>
# include <conio.h>

int max (int, int); PROTOTIPUL FUNIEI

void main (void)


{
clrscr();

cout << max(15, 30); APELUL FUNCIEI


getch();
}

int max (int a, int b=3) DEFINIIA FUNCIEI


{ antetul funciei
if (a>b) si
return a; - corpul functie
else
return b;
}

12
Transmiterea parametrilor; transmitere prin valoare, transmitere prin referin /
adres..

Definiie

Transmiterea datelor ntre apelant i apelat se poate face fie prin parametri, fie prin
variabile globale.Prin utilizarea variabilelor globale nu se face un transfer propriu-zis, ci
se folosesc n comun anumite zone de memorie.

Transferul se poate face prin valoare sau prin referin/adres.

Datele care se transfer ntre apelant i apelat se introduc ntre paranteze, dup
identificatorul subprogramului.

-n antetul subprogramului parametrii se nscriu prin tip i nume, separai prin virgul,
fr a fi grupai. Ei se numesc parametrii formali.

-n apelul subprogramului se nscriu separai prin virgul, n aceeai mordine ca n


antet, prin valori concrete.Ei se numesc parametrii efectivi (actuali).

-Regula de corsponden notific o anumit concordan ntre numrul, ordinea i tipul


parametrilor formali i a parametrilor efectivi.

Numrul parametrilor formali poate s difere de numrul parametrilor efectivi n


cazul funciilor cu numr de parametri variabil, respectiv n cazul suprancrcrii
funciilor.

Tipul parametrilor formali poate s difere de tipul parametrilor efectivin cazul


conversiei implicite a parametrilor efectivi n tipul parametrilor formali, ca o
operaie de atribuire, respectiv n cazul suprancrcrii funciei.

Numele parametrilor formali poate s difere de numele parametrilor efectivi.

Parametrii sunt memorai n segmentul de stiv n ordinea nscrierii lor.

Transmiterea prin referin/adres - se transmite adresa parametrului actual.

Este utilizat la prelucrarea unei variabile n interiorul unei funcii, astfel nct, la
revenirea din funcie, variabila s rein valoarea modificat, nu valoarea de intrare.

Parametrii transmii prin referin vor fi precedai de caracterul ampersand &, att la
declararea, ct i la definirea funciei.

n apel, parametrii efectivi corespunztori parametrilor formali transmii prin referin


trebuie s fie variabile de memorie.

Transmiterea prin referin nseamn c parametrii sunt transmii prin referin tunci
cnd ne intereseaz ca la revenirea din subprogram, variabila transmis s rein
valoarea stabilit n timpul execuiei subprogramului.

Pentru aceasta parametrii efectivi trebuie s fie referine la variabile.

Subprogramul reine n stiv adresa variabilei.

13
Transmiterea prin valoare se transmite o copie a parametrului actual.
Este utilizat la prelucrarea unei variabile n interiorul unei funcii. La revenirea din
funcie, variabila nu reine valoarea modificat, ci valoarea de intrare.

Parametrii transmii prin valoare se folosesc doar ca parametrii de intrare. Pentru


parametrii de ieire se va folosi instruciunea return().

n apel, parametrii efectivi corespunztori parametrilor formali transmii prin valoare pot
fi : valori, variabile, expresii sau alte funcii.

Transmiterea prin valoare se utilizeaz atunci cnd suntem interesai ca subprogramul


s lucreze cu acea valoare, dar n prelucrare, nu ne intereseaz ca parametrul efectiv,
cel din blocul apelant, s rein valoarea modificat n subprogram.

Se pot transmite prin valoare:

Valorile reinute de variabile : parametrii efectivi trebuie s fie numele variabilelor


care se trimit prin valoare.

Expresii, care pot conine i funcii : parametrii efectivi sunt expresii care mai nti
se evalueaz.

Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de principii cu exemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n proiectarea de subprograme cu transmiterea
parametrilor fie prin referin, fie prin valoare.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise

14
Tema 1: Subprograme.

Fia suport 1.3. Apelul subprogramelor.

Utilizarea apelului n cadrul expresiilor, apel de tip instruciune,


autoapelare(recursivitate).

Definiie

Apelul subprogramului este modul prin care subprogramul este pus n execuie.
Apelul subprogramului se poate realiza n dou moduri:

Printr-o instruciune de apel

Ca operand ntr-o expresie.

Instruciunea de apel a unui subprogram are urmtorul format general:

nume (lista_parametrilor_actuali);

unde nume : reprezint numele subprogramului. Lista parametrilor actuali este format
dintr-o succesiune de expresii, separate prin virgul.

Se utilizeaz instruciuni de apel atunci cnd subprogramul nu returneaz nici o valoare


sau cnd nu se dorete utilizarea valorii returnate de subprogram, ci doar efectuarea
prelucrrilor descrise de subprogram.

n cazul n care se dorete utilizarea valorii returnate de subprogram ca operand ntr-o


expresie, se va apela subprogramul n cadrul expresiei astfel:

nume (lista_parametrilor_actuali)

n aceast situaie lipsete caracterul ;, care marcheaz sfritul instruciunii de apel.

La apelul unui subprogram, valorile parametrilor actuali sunt atribuite, n ordine,


parametrilor formali corespunztori.

Construirea apelului subprogramului:

Dac subprogramul este definit de utilizator, el trebuie declarat prin prototip sau prin
definirea subprogramului nainte de blocul apelant.

Este modul prin care subprogramul este pus n execuie. Apelul poate fi fcut ori de
cte ori este nevoie.

Apelul poate fi fcut din funcia rdcin main(), dintr-o alt funcie sau din ea nsi
prin autoapelare (recursivitate)

Dac subprogramul este standard (de sistem), trebuie inclus fiierul ce conine
subprogramul utilizat.

Att procedurile,ct i funciile trebuie definite nainte de a fi apelate.

15
Apelarea unei funcii nu este o instruciune de sine stttoare , ea trebuie inclus ca
operant n cadrul unei expresii
Transmiterea parametrilor efectivi la apelul unei funcii se face prin copierea valorilor
parametrilor efectivi n parametrii formali, care sunt variabile locale ale funciei. n acest
fel, funcia apelat lucreaz cu duplicate ale variabilelor parametrilor efectivi i nu poate
modifica accidental variabile din funcia apelant. Compilatorul genereaz o secven
de atribuiri la parametrii formalinainte de efectuarea saltului la prima instruciune din
funcia apelat.

O funcie recursiv este o funcie care se apelaez pe ea nsi. Exist dou tipuri de
funcii recursive:

- Funcii cu un singur apel recursiv, ca ultim instruciune, care se pot rescrie sub form
nerecursiv (iterativ)

- Funcii cu unul sau mai multe apeluri recursive, a cror form trebuie s foloseasc o
stiv pentru memorarea unor rezultate intermediare.

Recursivitatea este posibil deoarece, la fiecare apel al funciei, adresa de revenire,


variabilele locle i parametrii formali sunt memorate ntr-o stiv, iar la ieire din funcie,
se scot din stiv toate datele puse la intrarea n funcie.

O funcie recursiv trebuie s conin cel puin o instruciune if, de obicei la nceput, prin
care se verific dac este necesar un apel recursiv sau se iese din funcie.

Apelul unei funcii care nu returneaz nici o valoare are forma general:

nume_funcie (lista parametrilor efectivi);

parametru efectiv = parametru actual = parametru real = parametru de apel


lista parametrilor efectivi = fie vid, fie o expresie sau mai multe desprite prin
virgul

Pentru a apela o funcie, aceasta trebui mai nti definit. Astfel apelul unei funcii
trebuie precedat de definiia funciei respective.
O a doua posibilitate de apelare a funciei const n scrierea prototipului funciei nainte
ca acesta s fie apelat.
Prototipul funciei conine informaii asemntoare cu cele din antetul funciei. Pot lipsi
numele parametrilor formali (conteaz doar tipul i ordinea acestora), n plus acesa este
urmat de ;.
De exemplu:

# include <iostream.h>
# include <conio.h>

int max (int, int); PROTOTIPUL FUNIEI

void main (void)


{
16
clrscr();

cout << max(20, 30); APELUL FUNCIEI


getch();
}

DEFINIIA FUNCIEI
int max (int a, int b=2) antetul funciei
{ si
if (a>b) - corpul functie
return a;
else
return b;
}

Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


Fie de lucru pentru descoperire
Studiu de caz pe anumite subiecte n proiectarea de apeluri de funcii .

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise

Tema 2: Modularizarea programelor

Fia suport 1.4. Tipuri de variabile, domeniul i plasarea subprogramelor

Variabile globale i locale.Domeniul de vizibilitate.

17
Definiie

Variabilele pot fi definite n C++ n orice poziie a programului.Locul unde a fost


definit o variabil determin domeniul de vizibilitate a acesteia. Acest domeniu ncepe
n locul unde variabila este definit i se sfrete n locul de ncheiere a blocului ce o
conine.

Definiie

Prin domeniul de vizibilitate (valabilitate) se intelege zona de program in care e valabila


declararea sau definirea unui identificator.

Definiie

Variabilele globale sunt declarate la nceputul programului, n afara funciilor, inclusv n


afara rdcinii. Acestea sunt vizibile i pot fi utilizate n orice punct al programului.
Sunt iniilizate n mod automat cu zero. Durata lor de via este pe tot parcursul
executrii programului.

Definiie

Variabilele declarate ntr-o funcie se numesc locale i pot fi referite numai din funcia
respectiv. Sunt vizibile doar n interiorul funciei. Nu sunt iniializate automat. Durata lor
de via este pe tot parcursul executrii funciei n care au fost definite. Domeniul de
valabilitate a unei variabile locale este funcia sau instruciunea compus n care a fost
definit.
De exemplu :
# include <stdio.h> Domeniile de valabilitate a referirilor
int a; variabilelor declarate sunt:
float z (char b) B poate fi referit doar n funcia z; c poate fi
{ int b; referit doar n funcia main; d poate fi referit
} doar n instruciuea compus r; a este global
main() i poate fi referit oriunde.
{int c;
.
{/* instructiunea compusa r*/
int d;
..}
}

n cazul n care exist o variabil local care are acelai nume cu o variabil global,
aceste dou variabile se numesc variabile omonime. Variabilele locale sunt prioritare
variabilelor globale omonime.
De exmplu :

Exemplul 2
Int N=10; Variabila N este definit att ca variabil global ct i

18
Void f1() ca variabil local n f1().
{ Se va afisa:
int N=2; 2 10
cout << N; Funcia f1() acioneaz asupra variabilei locale N.
} Funcia main() acioneaz supra variabilei globale N.
void main (void)
{
f1();
cout << N;
}

Plasarea subprogramelor n cadrul programului.

Definiie

A defini un subprogram nseamn al scrie efectiv, dup o anumit structur. A declara


un subprogram nseamn a-l anuna. Un subprogram nedeclarat nu poate fi folosit.
Definiia unui subprogram ine loc i de declaraie.

Orice program trebuie s conin :


Instruciuni imperative, prin care se comand executarea anumitor aciuni;
Declaraii de variabile, de funcii, etc. necesare compilatorului, dar fr efect la
execuie ;
Comentarii, ignorate de compilator, necesare utilizatorului.
Instruciunile executabile sunt grupate n subprograme. n C++ trebuie s existe cel
puin o funcie main cu care ncepe execuia unui program. Celelalte funcii sunt
apelate din funcia main sau din alte funcii activate direct sau indirect de main.

Acoladele sunt necesare pentru a delimita definiia unei funcii, care este un bloc de
instruciuni i declaraii. Un program descrie procedurile de obinere a unor rezultate pe
baza unor date iniiale i folosete rezultate intermediare. Toate aceste date sunt
memorate n variabile ale programului. Pot exista i date constante, ale cror valoari nu
se pot modifica n cursul execuiei. Toate variabilele folosite ntr-un program trebuie
definite sau declarate prin declaraii ale limbajului de programare.
Un program C este compus n general din mai multe functii, dintre care functia "main"
nu poate lipsi, deoarece cu ea ncepe executia programului.

Functiile pot face parte dintr-un singur fisier surs sau din mai multe fisiere surs. Un
fisier surs C este un fisier text care contine o succesiune de declaratii: definitii de
functii si, eventual, declaratii de variabile.

Antetul conine tipul i numele funciei i o list de argumente.


Practic nu exist program care s nu apeleze functii din bibliotecile existente si care s
nu contin definitii de functii specifice aplicatiei respective.
Motivele utilizrii de subprograme sunt multiple:
- Un program mare poate fi mai usor de scris, de nteles si de modificat dac este
modular, deci format din module functionale relativ mici.
- Un subprogram poate fi reutilizat n mai multe aplicatii, ceea ce reduce efortul de
programare al unei noi aplicatii.

19
- Un subprogram poate fi scris si verificat separat de restul aplicatiei, ceea ce reduce
timpul de punere la punct a unei aplicatii mari (deoarece erorile pot apare numai la
comunicarea ntre subprograme corecte).
- Intretinerea unei aplicatii este simplificat, deoarece modificrile se fac numai n
anumite subprograme si nu afecteaz alte subprograme (care nici nu mai trebuie
recompilate).

Utilizarea de functii permite dezvoltarea progresiv a unui program mare, fie de jos n
sus (bottom up), fie de sus n jos (top down), fie combinat.

Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de concepte cuexemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n determinarea domeniilor de valabilitate a
variabilelor, a diferenelor dintre variabile ntr-un sbprogram.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise.
Operaiile

20
Tema 3: Alocarea memoriei

Fia suport 1.5. Segmentul de date, segmentul de stiv, heap, regitri.

Definiie

Fiecrui program i se aloc trei zone distincte n memoria intern n care se


gsesc memorate variabilele programului:

Segment de date
Segment de stiv
Heap

Exist posibilitatea ca variabilele s fie memorate ntr-un anumit registru al


microprocesorului. n acest caz, timpul de acces la astfel de variabile este foarte mic,
deci se pot obine programe optimizate.
O variabil se caracterizeaz prin 4 atribute. Acestea sunt:
Clasa de memorare
Vizibilitate
Durata de via
Tipul variabilei.

Definiie

Clasa de memorare precizeaz locul unde este memorat variabila respectiv.


O variabil poate fi memorat n segmentul de date, n cel de stiv, n heap sau
ntr-un registru al microprocesorului.

Definiie

Vizibilitatea precizez liniile textului surs din care variabila respectiv poate fi
accesat. Exist:
Vizibilitate la nivel de bloc (instruciune compus).
Vizibilitate la nivel de fiier n cazul n care programul ocup un singur fiier
surs.
Vizibilitate la nivel de clas - n cazul programrii pe obiecte.

Definiie

Durata de via reprezint timpul n care variabila respectiv are alocat spaiu n
memoria intern. Exist:

21
Durata static variabila are alocat spaiu n tot timpul execuiei programului.
Durata local variabila are alocat spaiu n timpul n care se execut
instruciunile blocului respectiv.
Durata dinamic alocarea i dezalocarea spaiului necesar variabilei
respective se face de ctre programator prin operatori sau funcii speciale.

Atributele variabilelor globale sunt:


1. Clasa de memorare este segmentul de date
2. Vizibilitatea n cazul n care declaraiile acestora sunt naintea tuturor
funciilor, acestea sunt vizibile la nivelul ntrgului program sau fiier. Dac
anumite funcii se afl plasate naintea declaraiilor acestor variabile,
atunci ele sunt vizibile doar pentru funciile care sunt plasate dup aceste
declaraii.
3. Durata de via este static. Variabilele globale au spaiu rezervat n tot
timpul execuiei programului.

Atributele variabilelor locale sunt:


1. Clasa de memorare este implicit segmentul de stiv. Exist
posibilitatea ca acestea s fie alocate n registrele microprocesorului, caz
n care declaraia lor trebuie precedat de cuvntul cheie register.
2. Vizibilitatea este la nivelul blocului n care au fost declarate.
3. Durata de via este att timp ct dureaz execuia blocului respectiv.

Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de concepte cuexemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n determinarea claselor de memorare, a
duratei de via a unei variabile n funcie de situaie.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise.

22
Tema 4 : Implementarea structurilor dinamice de date

Fia suport 1.6. Liste, stive, cozi.

Definiie

Pointerii sunt variabile care conin adresa de memorie a unei alte variabile. Din aceste
considerente, pointerii se numesc i variabile de adres.

Un pointer este o variabila care pastreaza adresa unei date, nu valoarea datei.

Un pointer poate fi utilizat pentru referirea diferitelor date si structuri de date.


Schimband adresa memorata in pointer, pot fi manipulate informatii situate la diferite
locatii de memorie. Pointerii permit de asemenea crearea de noi variabile n timpul
execuiei programului, prin alocare dinamic.

Un pointer poate fi utilizat doar dup iniializare: prin atribuirea adresei unei variabile
sau prin alocare dinamic.

Definiie

Memoria intern poate fi privita ca o serie de octeti.Pentru a-i distinge acestia sunt
numerotati.Numarul de ordine al unui octet se numeste adresa. Adresa primului octet al
variabilei se numeste adresa variabilei. Variabilele de tip pointer se caracterizeaza prin
faptul ca valorile pe care le pot memora sunt adrese ale altor variabile.
Anumite variabile pot fi declarate dinamic. Asta inseamna ca :
- Spatiul necesar memorarii este rezervat intr-un segment special acestui scop, numit
HEAP.
-In memorie se rezerva spatiu in timpul executarii programului, atunci cand se utilizeaza
un anumit operator.
-Atunci cand variabila respectiva nu mai este utila, spatiul din memorie este eliberat,
pentru afi rezervat, daca este cazul, pentru alte variabile.
Mecanismul alocarii dinamice este urmatorul :
-Se declara o variabila de tip pointer , s-o numim P, care permite memorarea unei
adrese.
-Se aloca variabila dinamica prin operatorul NEW aplicat asupra unui tip,iar rezultatul
este atribuit variabilei P.In urma acestei operatii variabila P retine adresa variabilei
alocate dinamic.

Definiie

Prin structur de date se nelege un ansamblu de date caracterizat prin relaiile


existente ntre ele i prin operaiile care pot fi efectuate cu datele respective.
Structura de date este un concept abstract. Adic, conceptul n sine nu precizeaz locul
unde structura respectiv va fi memorat, adic clasa de memorare i nici detaliile de
implementare.
Structurile dinamice de date sunt date structurate ale cror componente se aloc n
mod dinamic.

23
Avantajele alocrii dinamice sunt:
- memorie suplimentar pentru programe
- posibilitatea de a utiliza aceast memorie

Definiie

Alocarea dinamica a componentelor structurii impune un mecanism prin care o nou


component aprut este legat n succesiune logic de corpul structurii deja format
pn atunci. Rezult c fiecare component, pe lng informaia propriu-zis pe care o
deine, trebuie s conin i o informaie de legatur cu componenta cu care se leag
logic n succesiune. Aceast informaie de legtur va fi adresa componentei spre care
se realizeaz succesiunea logic, iar mecanismul se mai numete i alocare nlnuit
dupa adrese.

n HEAP, structura respectiv va avea zone alocate componentelor sale n locurile


gsite disponibile, care nu se succed ntotdeauna n ordinea n care este realizat
nlnuirea logic.

n funcie de tipul nlnuirii realizate ntre componente, exist urmatoarele tipuri de


organizri:
structuri liniare
o liste simplu nlnuite (liniare i circulare)
o liste dublu nlnuite (liniare i circulare)
structuri arborescente
structuri reea

Liste liniare : lista simplu i dublu nlnuit. Operaii cu liste (crearea, adugare,
eliminare, parcurgere, prelucrare nod)

Definiie

O list este o colecie de elemente de informaie (noduri) aranjate ntr-o anumit


ordine. Lungimea unei liste este numrul de noduri din list. Structura corespunzatoare
de date trebuie s ne permit s determinm eficient care este primul/ultimul nod n
structur i care este predecesorul/succesorul (dac exist) unui nod dat. De exemplu,
aa arat cea mai simpla list, lista liniar:

24
Definiie

O list circular este o list n care, dup ultimul nod, urmeaz primul, deci fiecare nod
are succesor i predecesor.

Definiie

O list liniar este o colecie de n noduri, n0, aflate ntr-o relaie de ordine.

Operaiile permise sunt :


accesul la oricare nod al listei pentru citirea sau modificarea informaiei coninute
de acesta ;
adugarea unui nod, indiferent de poziia pe care o ocup n list ;
tergere a unui nod, indiferent de poziia pe care o ocup n list ;
schimbarea poziiei unui nod n cadrul listei.

Structur liniar nseamn faptul c fiecare nod, cu excepia ultimului, are un nod
succesor, adic care i urmeaz n list, i, cu excepia primului nod, are un singur
predecesor, adic care se afl imediat naintea lui n list.

Definiie

O list liniar simplu nlnuit este caracterizat prin faptul c relaia de ordine definit
pe mulimea elementelor este unic i total. Ordinea elementelor pentru o astfel de
list este specificat exclusiv printr-un cmp de informaie care este parte component
a fiecrui element i indic elementul urmtor, conform cu relaia de ordine definit pe
mulimea elementelor listei. Deci, fiecare element de list simplu nlnuit are
urmtoarea structur:

Informaie util Informaie de nlnuire

data leg

Pe baza informaiei de nlnuire(pstrat n cmpul leg) trebuie s poat fi identificat


urmtorul element din list.

Dac exist un ultim element n list, atunci lista se numete liniar. Dac nu, exist un
element care s conin n cmpul informaie valoarea null.

Listele pot fi organizate sub form static, de tablou, caz n care ordinea este
implicit dat de tipul tablou unidimensional, sau cel mai des, sub form de liste
dinamice, n care ordinea nodurilor este stabilit prin pointeri. Nodurile listelor dinamice
sunt alocate n memoria heap. Listele dinamice se numesc liste nlnuite, putnd fi
simplu sau dublu nlnuite.

25
Modelul listei simplu nlnuite este prezentat n fig.1:

Fig. 1Model de list simplu nlnuit

1.Crearea unei liste simplu nlnuite

Crearea unei liste simplu nlnuite se va face astfel:


a) Iniial lista este vid:

b) Se genereaz nodul de introdus:

c) Se fac legturile corespunztoare:

2.Accesul la un nod al unei liste simplu nlnuite

n funcie de cerine, nodurile listei pot fi accesate secvenial, extrgnd informaia


util din ele. O problem mai deosebit este gsirea unui nod de o cheie dat i apoi
extragerea informaiei din nodul respectiv. Cutarea nodului dup cheie se face liniar, el
putnd fi prezent sau nu n list.
O funcie de cutare a unui nod de cheie key returneaz adresa nodului
respectiv n caz de gsire sau pointerul NULL n caz contrar.

3.Inserarea unui nod ntr-o list simplu nlnuit

Nodul de inserat va fi generat ca la paragraful 1; se presupune c are pointerul p.


Dac lista este vid, acest nod va fi singur n list:

Dac lista nu este vid, inserarea se poate face astfel:


a) naintea primului nod
b) dup ultimul nod:

c) naintea unui nod precizat printr-o cheie key:


- se caut nodul de cheie key:
- se insereaz nodul de pointer p, fcnd legturile corespunztoare:

d) dup un nod precizat printr-o cheie key:


- se caut nodul avnd cheia key:

- se insereaz nodul de adres p, fcnd legturile corespunztoare.

4.tergerea unui nod dintr-o list simplu nlnuit

26
La tergerea unui nod se vor avea n vedere urmtoarele probleme: lista poate fi
vid, lista poate conine un singur nod sau lista poate conine mai multe noduri.
De asemenea se poate cere tergerea primului nod, a ultimului nod sau a unui
nod dat printr-o cheie key.
a) tergerea primului nod
b) tergerea ultimului nod
c) tergerea unui nod de cheie key

5. tergerea unei liste simplu nlnuite


n acest caz, se terge n mod secvenial fiecare nod.

Definiie

O list liniar dublu nlnuit este caracterizat prin faptul c pe mulimea


elementelor sunt definite dou relaii de ordine total, inverse una celeilalte, nainte i
napoi. Rezult dou secvenializri ale listei.
Ordinea elementelor pentru o astfel de
list este specificat exclusiv prin dou cmpuri de informaie care sunt parte
component precedent, conform cu relaiile de ordine definite pe mulimea elementelor
listei. Deci, fiecare element de list dublu nlnuit are urmtoarea structur:

Informaie util Informaii de nlnuire

data urm prec

Pe baza informaiilor de nlnuire pstrate n cmpurile urm i prec trebuie s poat fi


identificate urmtorul element din list, respectiv elementul precedent.

Lista dublu nlnuit este lista dinamic ntre nodurile creia s-a definit o dubl
relaie: de succesor si de predecesor.

Modelul listei dublu nlnuite, este prezentat n figura 2.

Fig.2 Model de list dublu nlnuit

Tipul unui nod dintr-o list dublu nlnuit este definit astfel:

n acest caz, se terge n mod secvenial fiecare nod:

Ca i la lista simplu nlnuit, principalele operaii sunt:


crearea;
accesul la un nod;
27
inserarea unui nod;
tergerea unui nod,
tergerea listei.
Lista dublu nlnuit va fi gestionat prin pointerii prim i ultim.

1.Crearea unei liste dublu nlnuite


Iniial lista este vid.
Dup alocarea de memorie i citirea datelor n nod, introducerea nodului de
pointer n list se va face astfel:

2.Accesul la un nod
Accesul la un nod se poate face:
secvenial nainte (de la prim spre ultim):
secvenial napoi ( de la ultim spre prim):
pe baza unei chei. Cutarea unui nod de cheie dat key se va face
identic ca la lista simplu nlnuit.

3.Inserarea unui nod


Inserarea unui nod ntr-o list dublu nlnuit se poate face astfel:
a) naintea primului nod:
b) dup ultimul nod:
c) naintea unui nod de cheie dat key;
d) dup un nod de cheie dat key:

4.tergerea unui nod


Exist urmtoarele cazuri de tergere a unui nod din list:
a) tergerea primului nod;

b) tergerea ultimului nod:


c) tergerea unui nod precizat printr-o cheie key.

5.tergerea listei
tergerea ntregii liste se realizeaz tergnd nod cu nod.

Stive, cozi: definire i memorare utiliznd listele liniare; operaii


(adugarea/eliminarea unui nod)

Definiie

O stiv se definete ca o list liniar simplu nlnuit n care toate intrrile i ieirile
se fac pe la un singur capt al ei. Stiva este o o structur de tip LIFO (Last In First Out),
adic ultimul nod introdus este primul scos. Rezult c, nregistrarea de pe nivelul k

28
reine nregistrarea de pe nivelul k-1. n cazul stivei se reine doar elementul din vrful
stivei.

Fig.3. Model de stiv

Fiind o structur particular a unei liste simplu nlnuite, operaiile principale asupra
unei stive sunt:
- push = adugare - pune un element pe stiv; funcia se realizeaz prin
inserarea unui nod naintea primului;
- pop = eliminare - scoate elementul din vrful stivei; funcia se realizeaz
prin tergerea primului nod;
- clear - tergerea stivei;

Numrul de noduri care pot fi memorate la un moment dat este mai mic dect n cazul
alocrii dinamice nlnuite, n funcie de gradul de ocupare al segmentului de date.
Pe un anumit nivel se reine, de regul, o singur informaie, ns este posibil s existe
i mai multe informaii pe un nivel.

Definiie

O coad este o list pentu care toate inserrile sunt fcute la unul din capete, toate
tergerile, consultrile, modificrile la cellalt capt. Coada este o structur de tip FIFO
(First In, First Out), adic primul nod introdus este primul scos.

Se introduce
un element
nou

Fig. 4. Model de coad

Operaiile importante sunt:


introducerea unui element n coad - funcia se realizeaz prin inserarea dup
ultimul nod;
scoaterea unui element din coad funcia se realizeaz prin tergerea primului
nod;
tergerea cozii se terge secvenial fiecare nod

29
Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de concepte cu exemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n determinarea listelor simplu i dublu
nlnuite, a stivelor, cozilor.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise.

30
Tema 4 : Implementarea structurilor dinamice de date

Fia suport 1.7. Grafuri

Definiie

Se numeste graf sau graf neorientat o pereche de multimi G = (A,B) in care A este
multimea nodurilor (este finita si nevida) si B e multimea relatiilor/muchiilor.

B = { (x,y) / x apartine lui A, y apartine lui A }

Exemplu1: un graf neorientat

A = {1,2,3,4,5}

B = {(1,2),(1,3),(2,3),(2,5)}

o Dou noduri distincte pot fi unite prin cel mult o muchie.


o Nu exist o muchie care unete un nod cu el nsui (o muchie unete dou
noduri distincte).
o O muchie n care extremitile coincid se numete bucl.

Definiie

Un graf G se numete simplu dac oricare dou noduri ale sale sunt extremiti pentru
cel mult o muchie.

Definiie

Un graf G = (V,E) este finit dac V i E sunt finite.

Definiie

Se numeste graf orientat o multime ordonata G = (V,E) in care V este multimea


nodurilor (finita si nevida), iar E este multimea arcelor.
Exemplu2:

V = {1,2,3,4,5}

E = {(1,2),(2,1),(2,3),(3,1),(5,2)}

31
Explicaii:
Daca (x,y) apartine de B atunci:
- x si y sunt noduri adiacente
- x si y sunt extremitatile arcului (x,y)
- x si y sunt incidente cu (x,y)
- in cazul grafurilor orientate:
- x este extremitatea initiala a (x,y)
- y este extremitatea finala a (x,y)
u = (x,y); v = (y,z); => u si v sunt incidente

Exemplu:
1 este adiacent cu 2 si 3
1 si 2 sunt extremitatile (1,2)
nodul 1 este incident cu (1,2)
(5,2) si (2,3) sunt incidente

Gradul unui nod: numarul de muchii incidente cu el


d(x) - gradul nodului x
1: d(1) = 2
2: d(1) = 3
Pentru grafurile orientate, se definesc:
Gradul exterior al lui x: d+(x) = numarul arcelor care pleaca din x
Gradul interior al lui x: d-(x) = numarul arcelor care intra in x
Exemplu:
pentru 2: d(1)=3; d+(1)=1; d-(1)=2;

Nodurile de grad 0 se numesc noduri izolate.


Nodurile de grad 1 se numesc noduri terminale.

Proprietati

1. d+(x) + d-(x) = d(x)


2. Daca un graf are m muchii sau arce atunci: d(x 1) + d(x2) + ... + d(xn) = 2m
3. Daca un graf orientat are m arce:
o d+(x1) + d+(x2) + ... + d+(xn) = m
o d-(x1) + d-(x2) + ... + d-(xn) = m

Lanturi. Drumuri

A. Pentru grafuri neorientate

Se numeste lant o succesiune de noduri x1 ... xk, cu proprietatea ca oricare doua noduri
vecine (xi,xi+1) apartin de B.
x1, xk sunt extremitatile lantului.
Lungimea lantului este egala cu numarul de muchii care il compun, k-1.
Daca nodurile din lant sunt distincte, atunci lantul este elementar.

Exemplu3:

32
1,2,3,1,4 - Lant neelementar (lungime 4)
1,2,3,4 - Lant elementar (lungime 3)
1,2,3,1,2,5 - Lant neelementar (lungime 5)
1,2,3,5 - Nu este lant

B. Pentru grafuri orientate

Se numeste lant o succesiune de arce u1, u2 ... uk, cu proprietatea ca oricare doua arce
de pe pozitii consecutive au un nod comun.
Observatie: nu conteaza ordinea de parcurgere
Se numeste drum o succesiune de noduri x1, x2 ... xk cu proprietatea ca (xi,xi+1) este arc.
Observatie: conteaza ordinea de parcurgere
Daca nodurile sunt distincte, drumul se numeste elementar

Exemplu4:

Lanturi
Drumuri
(1,2),(2,3),(3,4) - Da
1,2,3,1,2 - Drum neelementar
(1,2),(5,2),(2,3) - Da
1,2,3,4 - Drum elementar
(1,2),(2,1),(1,3) - Nu
3,1,2,5 - Nu este drum
(1,2),(2,3),(1,5),(5,2) - Nu
Cicluri. Circuite
A. Pentru grafuri neorientate
Se numeste ciclu intr-un graf neorientat un lant x 1,x2 ... xk si oricare 2 muchii (xi,xi+1) sunt
distincte.
Daca un ciclu are toate nodurile distincte 2 cate 2 cu exceptia capetelor, atunci el se
numeste ciclu elementar.

Exemplu5:

1,2,3,4,1 - Ciclu elementar


2,3,4,1,2 - Ciclu elementar
1,2,3,4,2,3,1 - Nu este ciclu
1,2,3,4,2,5,1 - Ciclu neelementar

B. Pentru grafuri orientate


Se numeste circuit intr-un graf un drum x1,x2 ... xk cu proprietatea ca x1 = xk si arcele
(xi,xi+1) sa fie distincte 2 cate 2.
Un circuit in care toate nodurile sunt distincte cu exceptia capetelor se numeste circuit
elementar.

33
Exemplu6:

1,2,3,1 - Circuit elementar


2,3,1,2 - Circuit elementar
1,2,3,1,2,1 - Nu este circuit
2,1,2,3,1,5,2 - Circuit neelementar
Reprezentarea grafurilor in memorie
1. Reprezentarea prin matrice de adiacenta
2. Liste de adiacenta
3. Vector de muchii
4. Matrice arce-noduri
1. Matricea de adiacenta
A. Pentru grafuri neorientate
a[i,j] = 1, daca intre i si j este muchie
a[i,j] = 0 altfel.

0 1 1 1 1

1 0 1 1 1

1 1 0 1 0

1 1 1 0 0

1 1 0 0 0
Observatie: Pe diagonala principala toate elementele sunt 0 (nu avem bucle).
Matricea este simetrica fata de diagonala principala, deci: a[i,j] = a[j,i].

B. Pentru grafuri orientate

a[i,j] = 1, daca exista arcul (i,j);


a[i,j] = 0, altfel.

0 1 0 0 1

1 0 1 0 0

1 0 0 1 0

0 0 0 0 0

0 1 0 0 0

2. Liste de adiacenta

Pentru fiecare nod se memoreaza o lista a vecinilor sai.

Pentru intregul graf este necesar un vector de liste (P) in care P i este adresa primului
element al listei asociate lui i.

34
Exemplu7:

Nod Lista de adiacenta asociata


1 2,3,5
2 1,3
3 1,2
4 -
5 1

Exemplu8:
Nod Lista de adiacenta asociata
1 2,3
2 1,3
3 2
4 -
5 1

Observatie: pentru grafurile orientate se memoreaza in lista lui i nodurile k pentru care
exista arcul (i,k).
struct elem {
int nod;
elem *next;
};
elem *p[100];
int n;
3. Vector de muchii
struct muchie{
int x,y; // capetele arcului
} v[100];
int n,m;

4. Matricea noduri-arce

Este folosita in special pentru grafurile orientate


Exemplu9:

35
Matricea noduri-arce aferenta:

Metoda Breadth First(n lime)


A. Pentru grafuri neorientate
Exemplu10:

x=1
1, 2, 3, 4, 6, 7, 8, 9, 5
Se porneste de la un nod oarecare x.
Se viziteaza toti vecinii directi ai nodului x daca nu au fost deja vizitati.
Fiecare dintre nodurile vizitate la pasul anterior devine nod curent si este prelucrat la fel
ca nodul x.
Structuri de date necesare pentru implementare sunt:
Matrice de adiacenta (sau alte variante de reprezentare): a
Coada (in care se memoreaza in ordinea parcursa nodurile vizitate): c
o p, u - indicatorii primului si ultimului element din coada
Vectorul nodurilor vizitate: v
o v[i]=1, daca i a fost vizitat;
o v[i]=0, altfel.
Parcurgerea BF se efectueaz prin utilizarea structurii numit coad, avnd grij ca un
nod s fie vizitat o singur dat. Atunci cnd un nod a fost introdus n coad, se
marcheaz ca vizitat.
B. Pentru grafuri orientate
Observatie: algoritmul se adapteaza astfel incat sa poata fi luati in considerare toti
vecinii unui nod.
Exemplu11:

X=1
1, 2, 3, 4, 5
Metoda Depth First(n adncime)

36
A. Pentru grafuri neorientate

x=1
1, 2, 4, 5, 10, 9, 7, 8, 6, 3

Se porneste de la un nod oarecare x.


Se alege primul vecin al lui x care nu a fost inca vizitat.
Pentru nodul ales se reia procedeul.
Daca un nod nu are nici un vecin nevizitat se revine la nodul vizitat anterior acestuia.
Structuri de date necesare implementarii:
Matrice de adiacenta (sau alte variante): a
Stiva: s (in care se memoreaza nodurile in ordinea parcurgerii)
Daca se implementeaza varianta recursiva se va folosi stiva procesorului
Vectorul nodurilor vizitate: v
B. Pentru grafuri orientate

Exemplu13:
x = 10
10, 4, 2, 1, 3, 6, 8, 7, 9

Parcurgerea este similara, punandu-se conditia de parcurgere a tuturor vecinilor unui


nod indiferent de sens.

Tipuri de grafuri
1. Graf partial
Fie G=(A,B) si G1=(A1,B1).
Spunem ca G1 este un graf partial al lui G daca A=A1 si B1 este inclus sau egal cu B.
Un graf partial se obtine dintr-un graf, indepartand o parte dintre muchiile sale si
pastrand toate nodurile acestuia.

Exemplu14:

37
Graful initial Da

Da Nu (are o muchie in plus)


Da

2. Subgraful unui graf


Fie G=(A,B) si G1=(A1,B1);
A1 inclus sau egal cu A; B1 inclus sau egal cu B.
B1 = {(x,y) / oricare x,y apartine A1 daca (x,y) apartine de B => (x,y) apartine de B1}
Subgraful se obtine din graful initial selectand o parte din nodurile sale si o parte din
nodurile adiacente cu acesta.

Exemplu15:

Graful iniial Nu (nu are toate muchiile)

38
Da
3. Graf complet
Un graf este complet daca oricare doua varfuri distince sunt adiacente.
Exemplu16:

Un graf neorientat cu n noduri are n(n-1)/2 muchii.


Exista un singur graf complet neorientat cu n noduri.
Exista mai multe grafuri orientate complete cu n noduri.
4. Grafuri bipartite
Fie G=(A,B) neorientat.
G este bipartit daca exista doua multimi, A1 si A2 astfel incat A1 A2 = si A1 U A2 = A,
iar oricare muchie (x,y) apartinand lui B are un capat in multimea A 1 si celalalt in A2.
Exemplu17:

Un graf bipartit este bipartit complet daca fiecare nod din multimea A 1 este adiacent cu
toate nodurile din A2 si reciproc.

Exemplu18:

39
5. Grafuri conexe
Un graf este conex daca este format dintr-un singur nod sau daca intre oricare doua
noduri ale sale exista cel putin un lant.

A. Pentru grafuri neorientate


Exemplu19:

Da Nu

B. Pentru grafuri orientate


Exemplu20:

Da Nu

Se numeste componenta conexa a unui graf un subgraf al sau care este conex si care
este maximal in raport cu aceasta proprietate (daca i se adauga un nod isi pierde
aceasta proprietate).
Observatie: pentru grafurile orientate nu se tine cont de orientarea arcelor.

40
6. Grafuri tare conexe
Un graf este tare conex daca ar un singur nod sau daca oricare ar fi (x,y) exista drum
de la x la y si exista drum de la y la x.
Determinarea componentelor tare conexe
Se poate realiza prin 3 metode:
1. Utilizand metoda DF/BF
2. Utilizand matricea drumurilor
3. Algoritmul +/-
O componenta tare conexa este un subgraf al sau care este tare conex si care este
maximal in raport cu aceasta proprietate.
Observatie: reunind toate arcele din componentele tare conexe se poate obtine o
multime mai mica decat multimea arcelor grafului initial.
Se poate construi un graf al componentelor tare conexe in care fiecare componenta tare
conexa formeaza un nod iar arcele simuleaza legaturile dintre ele.
Exemplu21:

Da Nu

Determinarea componentelor tar

e conexe utilizand matricea drumurilor


d(i,j) = 1, daca exista drum de la i la j
d(i,j) = 0, altfel

1 1 0 1 0

1 1 0 1 0

1 1 1 1 1

1 1 0 1 0

1 1 1 1 1

7. Grafuri hamiltoniene

41
Lant hamiltonian: lant elementar care contine toate nodurile grafului.
Ciclu hamiltonian: ciclu elementar care contine toate nodurile grafului.
Graf hamiltonian: graf care contine un ciclu hamiltonian.

Conditii de suficienta:
Teorema lui Dirac: Fie G dat prin perechea (A,B). Daca G are un numar de cel putin 3
varfuri astfel incat gradul fiecarui nod respecta conditia d(x)n/2, atunci graful este
hamiltonian.
Algoritmi de determinare a unei solutii
Algoritmul utilizat este Backtracking, care este adaptat in mod corespunzator.

8. Grafuri euleriene
Ciclu eulerian: ciclu care trece prin toate muchiile unui graf exact o data.
Graf eulerian: graf care contine cel putin un ciclu eulerian.

Da (1,2,3,4,5,3,1) Da

Nu
Conditii de suficienta
Teorema: Fie un graf conex fara noduri izolate cu n 3 noduri. Graful este eulerian daca
si numai daca pentru oricare nod al sau, x, d(x) este par.

42
Se porneste de la un nod oarecare si se construieste un ciclu.
Se parcurg nodurile din ciclul determinat anterior; daca exista un nod care mai
are muchii neincluse in ciclul anterior se construieste un nou ciclu provenind de
la acest nod.
Ciclul construit este inclus in ciclul initial in locul nodului gasit la pasul anterior.
pas 1:
o c1: 1,2,3,1
o c2: 2,4,7,2
pas 2:
o c1: 1,2,4,7,2,3,1
o c2: 7,5,10,7
pas 3:
o c1: 1,2,4,7,5,10,7,2,3,1
o c2: 7,8,11,7
pas 4:
o c1: 1,2,4,7,8,11,7,5,10,7,2,3,1
o c2: 7,6,9,7
pas 5:
o c1: 1,2,4,7,6,9,7,8,11,7,5,10,7,2,3,1

Drumuri maxime/minime in graf


Problemele de optim presupun ca fiecare muchie a grafului are asociat un anumit cost
(de exemplu, distanta intre doua orase, i si y). Aceste informatii se memoreaza in
matricea costurilor:
c(i,j) = costul asociat muchiei (i,j);
c(i,j) = +, daca nu exista muchia (i,j);
Observatie: daca intereseaza, un drum maxim, in loc de + se memoreaza - sau o
valoare adecvata.
Exista mai multe tipuri de probleme de optim:
1. sursa unica/destinatii multiple
2. sursa multipla/destinatii multiple
1. Algoritmi pentru drum minim cu sursa unica
1. Algoritmul lui Dijkstra
2. Algoritmul lui Lee

Algoritmul lui Dijkstra

43
Se considera un graf orientat in care fiecare arc are asociat un anumit cost. Dandu-se
un nod x oarecare, se cere sa se determine drumurile de cost minim care pornesc de la
nodul x si ajung la toate celelalte noduri ale grafului.
Observatie: daca sunt mai multe noduri de acelasi cost minim intre x si y, se va gasi
unul dintre ele.
Observatie: metoda folosita este metoda Greedy.
Se utilizeaza urmatoarele structuri:
s - vectorul nodurilor selectate;
s[i]=1, daca nodul i este selectat
s[i]=0 altfel
d
d[i] = costul drumului minim de la x la y
d[i]=+, daca nu exista drum de la x la i
t - vectorul de "tati"; vectorul predecesorilor
t[i]=predecesorul lui i in drumul de la x la i
t[i]=0, daca nu exista drum.

Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de concepte cu exemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n determinarea drumurilor, lanurilor;
parcurgeri n grafuri, aflarea matricelor de adiacen, clasificarea grafurilor.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise.

44
Tema 4 : Implementarea structurilor dinamice de date

Fia suport 1.8. Arbori

Definiie

Un arbore este un graf neorientat, conex i fr cicluri. Arborii reprezint


grafurile cele mai simple ca structur din clasa grafurilor conexe, ei fiind cel mai frecvent
utilizai n practic. Un arbore cu n varfuri are n-1 muchii.

Definiie

Fie G = (V,E) graf arbore. Subgraful H = (V1,E1) al lui G este un subarbore al lui G,
dac H este graf arbore.

Un arbore este o multime de elemente numite noduri sau vrfuri pentru


care:

1. exista un nod cu destinatie speciala (radacina arborelui);


2. celelalte noduri sunt repartizate n n0 seturi disjuncte A1, A2, ..., An fiecare set
constituind la rndul sau un arbore.

n structura ierarhica a arborelui, fiecare nod (mai putin radacina) este


subordonat unui alt nod (relatie fiu-parinte). Daca un nod nu are fi, el se
numeste terminal (sau frunza)

Fie un graf neorientat G=(V,E), unde V e mulimea vrfurilor, iar E cea a muchiilor
sale. Urmtoarele afirmaii sunt echivalente:

1. G este arbore.
2. G este un graf conex, minimal cu aceast proprietate (dac se elimin o
muchie oarecare, se obine un graf neconex).
3. G este un graf fr cicluri, maximal cu aceast proprietate (dac se
adaug o muchie, se obine un graf care are mcar un ciclu).

Un arbore cu n 2 vrfuri conine cel puin dou vrfuri terminale.


Orice arbore cu n vrfuri are n-1 muchii.
Fie G un graf neorientat. Un graf parial H al lui G, cu proprietatea c H este
arbore, se numete arbore parial al lui G.

45
Un graf neorientat G conine un arbore parial dac i numai dac G este conex.
Un graf neorientat care nu conine cicluri se numete pdure.

Definiie

Fiind dat un graf neorientat conex, se numeste arbore parial al grafului un graf parial
cu proprietatea c este arbore. Intuitiv, un arbore parial este un arbore obinut prin
eliminarea unor muchii din graf.

Un arbore parial al unui graf neorientat conex poate fi definit ca un graf parial conex cu
numr minim de muchii, sau un graf parial aciclic cu numr maxim de muchii.

Corolar: Un arbore cu n varfuri are n - 1 muchii.

De exemplu :

daca alegem 2 ca fiind radacina, reprezentarea arborelui pe nivele este:

46
iar nodul 2 este tatal nodurilor 6, 1, 3, si 7; 5 este fiul lui 6; 4 este fiul lui 3; iar 8 este fiul
lui 7. Nodurile 5, 4, 8, si 1 nu au nici un fiu. Nodurile care nu au fii se mai numesc frunze
sau noduri terminale, iar muchiile dintre noduri, ramuri. Nodurile 6, 1 , 3 si 7 sunt frati.
Nodurile 6, 1 , 3 si 7 sunt urmasii lui 2. De asemenea, nodurile 5, 4 si 8 sunt urmasii lui
2, iar nodul 2 este stramosul tuturor nodurilor (mai putin el insusi), 2 fiind radacina
raborelui. 2 adica radacina este singurul nod care nu are tata.
In general, un nod al unui arbore poate avea un numar arbitrar de fii. Daca
orice nod al unui arbore nu are mai mult de n fii atunci arborele se numeste arbore n-ar.

Definiie

Un arbore in care orice nod nu are mai mult de 2 fii se numeste arbore binar.

Definiie

Se numeste inaltime a unui arbore lungimea celui mai lung drum de la radacina la un
nod terminal din arbore. Pentru arborele de mai sus inaltimea este 2.Se observ ca
intre orice nod si radacina exista exact un singur drum.

Definiie

Un arbore binar este un arbore in care orice nod are cel mult doi descendenti facandu-
se distincatie clara intre descendentul drept si descendentul stang. Radacina unui
arbore binar are doi subarbori, subarborele stang, cel care are drept radacina fiul stang
si subarborele drept, cel care are ca radacina fiul drept. Orice aubarbore al unui arbore
binar este el insusi arbore binar. De exemplu, arborele de mai jos este un arbore binar;
radacina 10, are drept fiu stang nodul 4, iar fiu drept nodul 21, nodul 21 are subarborele
stang format din nodul 15 si subarborele drept format din nodurile 23 si 28.

Nota: Un arbore binar poate fi si vid (adica fara nici un nod).


Un arbore binar pentru care orice nod neterminal are exact doi fii se numeste
arbore plin ("full").

Arborele binar este arborele n care un nod are cel mult doi fii. n aceasta situatie se
poate vorbi (pentru un arbore nevid) de cei doi subarbori (stng si drept) ai unui arbore.

47
Schematic avem: Arbore binar

Reprezentare
De obicei, nodurile unui arbore, in particular binar, contin pe langa informatia
corespunzatoare si informatii despre cei doi fii stang si drept. In calculator, arborii binari
se pot reprezenta in doua moduri.

Reprezentarea secventiala

Pentru fiecare nod al arborelui se precizeaza informatia si descendentii directi ca


elemente a trei vector diferiti, INFO[i], ST[i] si DR[i], unde i este indicele asociat unui
nod. Cei trei vectori au dimensiunea egala cu numarul de noduri din arbore. De
exemplu, pentru arborele de mai sus, daca numerotam nodurile incepand cu nivelul 0,
de la stanga la dreapta, obtinem urmatorii vectori, cu conventia ca radacina este nodul
1: INFO= (10, 4, 21, 1, 9, 15, 23, 28), ST=(1, 4, 6, 0,0, 0, 0, 0), DR = (3, 5, 7, 0, 0, 0, 8,
0).

Reprezentarea inlantuita

Pentru fiecare nod al arborelui se precizeaza informatia si descendentii directi ca


elemente ale unei structuri definita astfel:
struct nodarbore
{
T info;
struct nodarbore *stang;
struct nodarbore *drept;
};
typedef struct nodarbore NODARB;
unde T este presupus definit anterior (eventual printr-o definitie typedef), stang este
pointer la subarborele stang al nodului, iar drept este pointer la subarborele drept al
nodului. Pentru identificarea radacinii arborelui vom defini NODARB rad; drept un
pointer la radacina arborelui. Daca unul din subarbori este vid, atunci pointerul la acel
subarbore este NULL. Pentru arborele de mai sus, reprezentarea inlantuita este:

48
Traversare
De multe ori dorim sa accesam ("vizitam") nodurile unei structuri (lista sau arbore).
Pentru arbori aceasta accesare, examinare a unui nod, sau, mai exact, examinarea
tuturor nodurilor unui arbore se numeste traversare si se poate face:
o in preordine: intai vizitam radacina arborelui, apoi subarborele stang urmat de
subarborele drept
o in inordine (simetrica): intai vizitam subarborele stang, , apoi radacina
arborelui si apoi subarborele drept
o in postordine: intai vizitam subarborele stang si subarborele drept si ultima
data radacina arborelui.
Actiunea explicita de vizitare a unui nod depinde de scopul traversarii (de exemplu,
aflarea numarului de elemente ale arborelui, gasirea unei valori date in arbore). Pentru
arborele de mai sus, de exemplu, traversarile sunt:
o preordine: 10, 4, 1, 9, 21, 15, 23, 28
o inordine (simetrica): 1, 4, 9, 10, 15, 21, 23, 28
o postordine: 1, 9, 4, 15, 28, 23, 21.

Arbori pariali de cost minim

Definiie

Fie G = <X, V> un graf neorientat conex, unde X este multimea varfurilor si U este
multimea muchiilor.Un arbore este un asemenea graf ce nu are cicluri. Fiecare muchie
are un cost pozitiv (sau o lungime pozitiva). Pentru a gasi un arbore se pune problema
sa gasim o submultime A inclusa in U, astfel incat toate varfurile din X sa ramina
conectate atunci cand sunt folosite doar muchii din A.Numim arbore partial de cost
minim acel arbore ce are multimea varfurilor X si a muchiilor A iar suma lungimilor
muchiilor din A este minima.Cautam deci o submultime A de cost total minim care sa
lege printr-un drum oricare doua noduri din X. Aceasta problema se mai numeste si
problema conectarii oraselor cu cost minim, avand numeroase aplicatii.
Graful partial <X, A> este un arbore si este numit arborele partial de cost minim
al grafului G (minimal spanning tree). Un graf poate avea mai multi arbori partiali de
cost minim.

49
Observatii:
In orice nod intra cel mult un arc;
In nodul radacina nu intra nici un arc;
Nodurile pot fi etichetate sau nu.

naltimea unui arbore este maximum dintre nivelele nodurilor terminale sau echivalent
1+maximul dintre naltimile subarborilor sai.

Exemplu: Arborele prezentat n figura de mai sus are naltimea 5.

Reprezentarea n memorie a arborilor poate fi statica sau dinamica. n cazul static


arborii se pot simula cu ajutorul tablourilor.

Exemplu: n tabloul arbore cu n componente, arbore(i) (i=1...n) reprezinta tatal nodului


i. Astfel, arborele din figura de mai sus se poate reprezenta sub forma:

Avantajul acestei implementari este urmatorul: fiecarui nod avnd cel mult un tata, i
atasam n tablou o singura informatie (Luam arbore(i)=0 daca nodul i este radacina).

Datorita dinamismului structurilor modelate printr-un arbore, varianta de implementare


dinamica este preferabila variantei statice. In acest caz, daca arborele este binar, o
celula va contine trei cmpuri: un cmp pentru memorarea informatiei specifice nodului
(informatia utila) si doua cmpuri care contin adresa radacinii subarborelui stng,
respectiv drept.

Operatiile fundamentale asupra arborilor includ: parcurgerea arborelui, stergerea,


cautarea sau adaugarea unui nod.

Doua tipuri de parcurgere a unui arbore sunt folosite frecvent: parcurgerea n latime si
parcurgerea n naltime.

In cazul parcugerii n latime se viziteaza si prelucreaza nodurile n ordinea: radacina,


nodurile de la stnga spre dreapta de pe primul nivel, de pe al doilea nivel etc. Astfel,
rezultatul parcurgerii n latime a arborelui din figura este lista de noduri 1, 2, 5, 6, 3, 4, 7,
8, 9, 10.

50
Putem realiza pacurgerea n latime a unui arbore binar printr-un algoritm care utilizeaza
o coada drept element ajutator:

Operaii pe arbori binari:

Operaiile pe arbori se grupeaz n urmtoarele categorii:

Operaii de creare a arborilor binari.

Crearea arborilor binari presupune construirea n memorie a unui arbore binar folosind
informaii din mediul extern, sursele cele mai frecvente fiind introducerea de la tastatura
de ctre utilizator sau fiierele. Algoritmii de creare ai unui arbore binar presupun a
cunoate relaiile n care se afl un nod cu celelate noduri din arbore. O metod simpl
de a specifica aceste relaii este ca dup crearea unui nod s se specifice fiul stng i
fiul drept, dac ei exist.

Operaii cu elemente (noduri), categorie din care cele mai importante sunt
operaiile de inserare i tergere de noduri n i din arbore.

Deoarece operaia de inserare a unui nod necesit specificarea relaiei n care se afl
nodul respectiv cu celelate noduri din arbore, iar tergerea unui nod implic formarea
unor noi relaii ntre noduri, aceste operaii sunt uor de definit in cazul n care peste
mulimea informaiilor din noduri exist o relaie de ordine.

Traversri de arbori att pentru prelucrarea informaiei utile ct i pentru


cutare de informaie n arbore.

Cele mai frecvente moduri de traversare utilizate n cazul arborilor binari sunt:
- preordine: traversarea se face prin rdcina arborelui, apoi se traverseaz
subarborele stng, iar apoi subarborele drept;
- inordine: traversarea se face ncepnd cu subarborele stng, apoi prin rdcin,
iar apoi se traverseaz subarborele drept;
- postordine: traversarea se face ncepnd cu subarborele stng, apoi se
traverseaz subarborele drept, iar apoi rdcina.

Algoritmul pentru operaia de cutare ntr-un arbore binar de cutare este urmtorul:
1. Se compar cheia cutate cu cheia din radcin;
2. Dac sunt egale algoritmul se incheie;
3. Dac valoarea cheii cutate este mai mic dect valoarea din rdacin atunci
se va relua algoritmul pentru subarborele stng. Dac nu exist subarbore
stng, inseamn c informaia cutat nu se gsete in arbore;
4. Altfel, dac valoarea cheii cutate este mai mare dect valoarea cheii din
radacin, se va relua algoritmul pentru subarborele drept. Dac nu exist
subarbore drept, inseamn c informaia cutat nu se gsete in arbore;

Conversii i stocare n fiier.

Conversiile i stocarea n fiiere presupune traversarea arborilor i salvarea informaiilor


n alte structuri de date aflate n memorie sau n fiiere pe medii de stocare.

Arbori binari de cutare.

51
Definiie

Se numete arborescen un arbore caracterizat astfel:


-are un vrf special numit rdcin;
-celelalte noduri pot fi grupate n p>=0 mulimi disjuncte, astfel
nct fiecare dintre aceste mulimi s conin un nod adiacent cu rdcina
iar subgrafurile generate de acestea s fie la rndul lor arborescene.

OBSERVAII!
1. Dac o arborescen este format dintr-un singur nod spunem c este
format doar din nodul rdcin.
2. Dac ordinea relativ a arborescenelor, are importan, arborescena se
numete se numete arbore ordonat.
Informaia din fiecare nod este mai mare dect informaia din nodul fiului stng i mai
mic sau egal cu cea din nodul fiului drept. Un astfel de arbore se poate reprezenta
printr-o structur de date nlnuit, n care fiecare nod este un obiect. Pe lng un
cmp cheie i date adiionale, fiecare obiect nod conine cmpurile stnga, dreapta i p
care puncteaz spre nodurile corespunztoare fiului stng, fiului drept i respectiv
printelui nodului.
nt-un arbore binar de cutare, cheile sunt ntotdeauna astfel memorate nct ele
satisfac proprietatea arborelui binar de cutare:
Fie x un nod dintr-un arbore binar de cutare. Dac y este un nod din subarborele stng
al lui x, atunci cheie[y] cheie[x]. Dac y este un nod din subarborele drept al lui x,
atunci cheie[x] cheie[y].

Proprietatea arborelui binar de cutare ne permite s afim toate cheile n ordine


cresctoare, parcurgnd nodurile arborelui n inordine.

Exemple:

(a) (b)

Sugestii metodologice

52
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de concepte cu exemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n reprezentarea i parcurgerea arborilor,
determinarea unui arbore de cost minim.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise.

53
Tema 5 : Funcii / metode predefinite

Fia suport 1.9. Tipuri de funcii/metode predefinite

Definiie

Un program scris n limbajul C/C++ este un ansamblu de funcii, fiecare dintre acestea
efectund o activitate bine definit. Din punct de vedere conceptual, funcia reprezint
o aplicaie definit pe o mulime D (D=mulimea, domeniul de definiie), cu valori n
mulimea C (C=mulimea de valori, codomeniul), care ndeplinete condiia c oricrui
element din D i corespunde un unic element din C.

Funciile comunic prin argumente: ele primesc ca parametri (argumente) datele de


intrare, efectueaz prelucrrile descrise n corpul funciei asupra acestora i pot returna
o valoare (rezultatul, datele de ieire). Execuia programului ncepe cu funcia
principal, numit main. Funciile pot fi descrise n cadrul aceluiai fiier, sau n fiiere
diferite, care sunt testate i compilate separat, asamblarea lor realizndu-se cu ajutorul
linkeditorului de legturi.

O funcie este formata din antet si corp:


antet_funcie
{
corpul_funciei
}
Orice mediu de programare este prevzut cu una sau mai multe biblioteci de funcii
predefinite. Orice bibliotec este format din:
fiierele header (conine prototipurile funciilor, declaraiile de variabile);
biblioteca (arhiva) propriu-zis (conine definiii de funcii).

Pentru ca funciile predefinite s poat fi utilizate, fiierele header n care se gsesc


prototipurile acestora trebuie inclus n funcia (programul) apelant printr-o directiv
preprocesor (exemplu #include <stdio.h>). Deasemenea, utilizatorul i poate crea
propriile headere proprii. Pentru a putea utiliza funciile proprii, el trebuie s includ
aceste headere n programul apelant (exemplu #include "my_header.h").

Pentru funciile predefinite, au fost create fiiere header orientate pe anumite numite
tipuri de aplicaii. De exemplu, funciile matematice se gsesc n headerul <math.h>.
Headerul <stdlib.h> care conine funcii standard. Headerul <values.h> definete o serie
de constante simbolice (exemplu MAXINT, MAXLONG) care reprezint, n principal,
valorile maxime i minime ale diferitelor tipuri de date.

. Funcii matematice (headerul <math.h>)

Funcii aritmetice
Valori absolute
int abs(int x);
Returneaz un ntreg care reprezint valoarea absolut a argumentului.
long int labs(long int x);
Analog cu funcia abs, cu deosebirea c argumentul i valoarea returnat
sunt de tip long int.

54
double fabs(double x);
Returneaz un real care reprezint valoarea absolut a argumentului real.

Funcii de rotunjire
double floor(double x);
Returneaz un real care reprezint cel mai apropiat numr, fr zecimale,
mai mic sau egal cu x (rotunjire prin lips).
double ceil(double x);
Returneaz un real care reprezint cel mai apropiat numr, fr zecimale,
mai mare sau egal cu x (rotunjire prin adaos).

Funcii trigonometrice
double sin(double x);
Returneaz valoarea lui sin(x), unde x este dat n radiani. Numrul real
returnat se afl n intervalul [-1, 1].
double cos(double x);
Returneaz valoarea lui cos(x), unde x este dat n radiani. Numrul real
returnat se afl n intervalul [-1, 1].
double tan(double x);
Returneaz valoarea lui tg(x), unde x este dat n radiani.

Funcii trigonometrice inverse


double asin(double x);
Returneaz valoarea lui arcsin(x), unde x se afl n intervalul [-1, 1].
Numrul real returnat (n radiani) se afl n intervalul [-pi/2, pi/2].
double acos(double x);
Returneaz valoarea lui arccos(x), unde x se afl n intervalul [-1, 1].
Numrul real returnat se afl n intervalul [0, pi].
double atan(double x);
Returneaz valoarea lui arctg(x), unde x este dat n radiani. Numrul real
returnat se afl n intervalul [0, pi].
double atan2(double y, double x);
Returneaz valoarea lui tg(y/x), cu excepia faptului ca semnele
argumentelor x i y permit stabilirea cadranului i x poate fi zero. Valoarea
returnat se afl n intervalul [-pi,pi]. Dac x i y sunt coordonatele unui
punct n plan, funcia returneaz valoarea unghiului format de dreapta
care unete originea axelor carteziene cu punctul, fa de axa absciselor.
Funcia folosete, deasemenea, la transformarea coordonatelor cartezine
n coordonate polare.

Funcii exponeniale i logaritmice


double exp(double x);
long double exp(long double x);
Returneaz valoarea e x .
double log(double x);
Returneaz logaritmul natural al argumentului ( ln(x) ).
double log10(double x);
Returneaz logaritmul zecimal al argumentului (lg (x) ).
double pow(double baza, double exponent);
Returneaz un real care reprezint rezultatul ridicrii bazei la exponent (
baza exp onent ).
double sqrt(double x);

55
Returneaz rdcina ptrat a argumentului x .
double hypot(double x, double y);
Funcia distanei euclidiene - returneaz x 2 y 2 , deci lungimea
ipotenuzei unui triunghi dreptunghic, sau distana punctului P(x, y) fa de
origine.

Funcii de generare a numerelor aleatoare


int rand(void) <stdlib.h>
Genereaz un numr aleator n intervalul [0, RAND_MAX].

Funcii de clasificare (testare) a caracterelor

Au prototipul n headerul <ctype.h>. Toate aceste funcii primesc ca argument un


caracter i returneaz un numr ntreg care este pozitiv dac argumentul
ndeplinete o anumit condiie, sau valoarea zero dac argumentul nu
ndeplinete condiia.

int isalnum(int c);


Returneaz valoare ntreag pozitiv daca argumentul este liter sau
cifr. Echivalent cu: isalpha(c)||isdigit(c)
int isalpha(int c);
Testeaz dac argumentul este liter mare sau mic. Echivalent cu
isupper(c)|| islower(c).
int iscntrl(int c);
Testeaz dac argumentul este caracter de control (neimprimabil).
int isdigit(int c);
Testeaz dac argumentul este cifr.
int isxdigit(int c);
Testeaz dac argumentul este cifr hexagesimal (0-9, a-f, A-F).
int islower(int c);
Testeaz dac argumentul este liter mic.
int isupper(int c);
Testeaz dac argumentul este liter mare.
int ispunct(int c);
Testeaz dac argumentul este caracter de punctuaie (caracter
imprimabil, dar nu liter sau spaiu).
int isspace(int c);
Testeaz dac argumentul este spaiu alb (' ', '\n', '\t', '\v', '\r')
int isprint(int c);
Testeaz dac argumentul este caracter imprimabil, inclusiv blancul.

Funcii de conversie a caracterelor (prototip n <ctype.h>)


int tolower(int c);
Funcia schimb caracterul primit ca argument din liter mare, n
liter mic i returneaz codul ASCII al literei mici. Dac argumentul nu
este liter mare, codul returnat este chiar codul argumentului.
int toupper(int c);
Funcia schimb caracterul primit ca argument din liter mic, n
liter mare i returneaz codul acesteia. Dac argumentul nu este liter
mic, codul returnat este chiar codul argumentului.

56
Funcii de conversie din ir n numr (de citire a unui numr dintr-un ir)
(prototip n <stdlib.h>)
long int atol(const char *npr);
Funcia convertete irul transmis ca argument (spre care pointeaz
npr) ntr-un numr cu semn, care este returnat ca o valoare de tipul long
int. irul poate conine caracterele '+' sau '-'. Se consider c numrul
este n baza 10 i funcia nu semnalizeaz eventualele erori de depire
care pot apare la conversia din ir n numr.
int atoi(const char *sir);
Converteste irul spre care pointeaza sir ntr-un numr ntreg.
double atof(const char *sir);
Funcia converteste irul transmis ca argument ntr-un numr real cu
semn (returneaz valoare de tipul double). n secvena de cifre din ir
poate apare litera 'e' sau 'E' (exponentul), urmat de caracterul '+' sau '-' i
o alt secven de cifre. Funcia nu semnaleaz eventualele erori de
depire care pot apare.

Funcii de intrare/ieire (prototip n <stdio.h>)


Streamurile (fluxurile de date) implicite sunt: stdin (fiierul, dispozitivul standard de
intrare), stdout (fiierul, dispozitivul standard de ieire), stderr (fiier standard pentru
erori), stdprn (fiier standard pentru imprimant) i stdaux (dispozitivul auxiliar
standard). De cte ori este executat un program, streamurile implicite sunt deschise
automat de ctre sistem. n headerul <stdio.h> sunt definite i constantele NULL
(definit ca 0) i EOF (sfrit de fiier, definit ca -1, CTRL/Z).
int getchar(void);
Citete un caracter (cu ecou) din fiierul standard de intrare
(tastatur).
int putchar(int c);
Afieaz caracterul primit ca argument n fiierul standard de ieire
(monitor).
char *gets(char *sir);
Citete un ir de caractere din fiierul standard de intrare (pn la
primul blank ntlnit sau linie nou). Returneaz pointerul ctre irul citit.
int puts(const char *sir);
Afieaz irul argument n fiierul standard de ieire i adaug
terminatorul de ir. Returneaz codul ultimului caracter al irului
(caracterul care precede NULL) sau -1 n caz de eroare.
int printf(const char *format, ... );
Funcia permite scrierea n fiierul standard de ieire (pe monitor) a datelor, ntr-
un anumit format. Funcia returneaz numrul de octei (caractere) afiai, sau 1
n cazul unei erori.

n limbajul C, operaiile asupra fiierelor se realizeaz cu ajutorul unor funcii din


biblioteca standard (stdio.h). Transferurile cu dipozitivele periferice (tastatur, monitor,
disc, imprimant, etc.) se fac prin intermediul unor dispozitive logice identice numite
stream-uri (fluxuri) i prin intermediul sistemului de operare. Un flux de date este un
fiier sau un dispozitiv fizic tratat printr-un pointer la o structur de tip FILE (din header-
ul stdio.h). Cnd un program este executat, n mod automat, se deschid urmtoarele
fluxuri de date predefinite, dispozitive logice (n stdio.h):
stdin (standard input device) - dispozitivul standard de intrare (tastatura) - ANSII C;

57
stdout (standard output device) - dispozitivul standard de ieire (monitorul) - ANSII
C;
stderr (standard error output device) - dispozitivul standard de eroare (de obicei un
fiier care conine mesajele de eroare rezultate din execuia unor funcii) - ANSII C;
stdaux (standard auxiliary device) - dispozitivul standard auxiliar (de obicei interfaa
serial auxiliar) - specifice MS-DOS;
stdprn (standard printer) - dispozitivul de imprimare - specifice MS-DOS.

n abordarea limbajului C (impus de stdio.h), toate elementele care pot comunica


informaii cu un program sunt percepute - n mod unitar - ca fluxuri de date. Datele
introduse de la tastatur formeaz un fiier de intrare (fiierul standard de intrare).
Datele afiate pe monitor formeaz un fiier de ieire (fiierul standard de ieire).
Sfritul oricrui fiier este indicat printr-un marcaj de sfrit de fiier (end of file). n
cazul fiierului standard de intrare, sfritul de fiier se genereaz prin Ctrl+Z (^Z) (sub
MS-DOS) (sau Ctrl+D sub Linux). Acest caracter poate fi detectat prin folosirea
constantei simbolice EOF (definit n fiierul stdio.h), care are valoarea -1. Aceast
valoare nu rmane valabil pentru fiierele binare, care pot conine pe o poziie
oarecare caracterul \x1A.
De obicei, schimbul de informaii dintre programe i periferice se realizeaz folosind
zone tampon. O zon tampon pstreaz una sau mai multe nregistrri. Prin operaia
de citire, nregistrarea curent este transferat de pe suportul extern n zona tampon
care i corespunde, programul avnd apoi acces la elementele nregistrrii din zona
tampon. n cazul operaiei de scriere, nregistrarea se construiete n zona tampon,
prin program, fiind apoi transferat pe suportul extern al fiierului. n cazul monitoarelor,
nregistrarea se compune din caracterele unui rnd. De obicei, o zon tampon are
lungimea multiplu de 512 octei. Orice fiier trebuie deschis inainte de a fi prelucrat, iar
la terminarea prelucrrii lui, trebuie nchis.

Fluxurile pot fi de tip text sau de tip binar. Fluxurile de tip text mpart fiierele n linii
separate prin caracterul \n (newline=linie nou), putnd fi citite ca orice fiier text.
Fluxurile de tip binar transfer blocuri de octei (fr nici o structur), neputnd fi citite
direct, ca fiierele text.

Funcia fopen
Creaz un flux de date ntre fiierul specificat prin numele extern (nume_fiier) i
programul C. Parametrul mod specific sensul fluxului de date i modul de
interpretare a acestora. Funcia returneaz un pointer spre tipul FILE, iar n caz de
eroare - pointerul NULL (prototip n stdio.h).
FILE *fopen(const char *nume_fiier, const char *mod);
Parametrul mod este o constant ir de caractere, care poate conine caracterele
cu semnificaiile:
r : flux de date de intrare; deschidere pentru citire;
w : flux de date de ieire; deschidere pentru scriere (creaz un fiier nou sau
suprascrie coninutul anterior al fiierului existent);
a : flux de date de ieire cu scriere la sfritul fiierului, adugare, sau crearea
fiierului n cazul n care acesta nu exist;
+ : extinde un flux de intrare sau ieire la unul de intrare/ieire; operaii de
scriere i citire asupra unui fiier deschis n condiiile r, w sau a.
b : date binare;
t : date text (modul implicit).
Exemple:
"r+" deschidere pentru modificare (citire i scriere);

58
"w+" deschidere pentru modificare (citire i scriere);
"rb" citire binar;
"wb" scriere binar;
"r+b" citire/scriere binar.

Funcia freopen (stdio.h)


Asociaz un nou fiier unui flux de date deja existent, nchiznd legtura cu vechiul
fiier i ncercnd s deschid una nou, cu fiierul specificat. Funcia returneaz
pointerul ctre fluxul de date specificat, sau NULL n caz de eec (prototip n
stdio.h).
FILE*freopen(const char*nume_fi,const char*mod,FILE *flux_date);

Funcia open
Deschide fiierul specificat conform cu restriciile de acces precizate n apel.
Returneaz un ntreg care este un indicator de fiier sau -1 (n caz de eec)
(prototip n io.h).
int open(const char *nume_fiier, int acces [,int mod]);
Restriciile de acces se precizeaz prin aplicarea operatorului | (disjuncie logic la
nivel de bit) ntre anumite constante simbolice, definite n fcntl.h, cum sunt :
O_RDONLY - citire;
O_WRONLY - scriere
O_RDWR - citire i scriere
O_CREAT - creare
O_APPEND - adugare la sfritul fiierului
O_TEXT - interpretare CR-LF
O_BINARY - nici o interpretare.,
Restriciile de mod de creare se realizeaz cu ajutorul constantelor:
S_IREAD - permisiune de citire din fiier
S_IWRITE - permisiune de scriere din fiier, eventual legate prin
operatorul |.

Funcia creat
Creaz un fiier nou sau l suprascrie n cazul n care deja exist. Returneaz
indicatorul de fiier sau -1 (n caz de eec). Parametrul un_mod este obinut n mod
analog celui de la funcia de deschidere (prototip n io.h).
int creat(const char *nume_fiier, int un_mod);

Funcia creatnew
Creaz un fiier nou, conform modului specificat. Returneaz indicatorul fiierului
nou creat sau rezultat de eroare (-1), dac fiierul deja exist (prototip n io.h).
int creatnew(const char *nume_fiier, int mod);

Dup cum se observ, informaia furnizat pentru deschiderea unui fiier este aceeai
n ambele abordri, diferena constnd n tipul de date al entitaii asociate fiierului.
Implementarea din io.h ofer un alt tip de control la nivelul comunicrii cu
echipamentele periferice (furnizat de funcia ioctrl), asupra cruia nu vom insista,
deoarece desfurarea acestui tip de control este mai greoaie, dar mai profund.

NCHIDEREA UNUI FIIER

Funcia fclose
int fclose(FILE *pf);

59
Funcia nchide un fiier deschis cu fopen i elibereaz memoria alocat (zona
tampon i structura FILE). Returneaz valoarea 0 la nchiderea cu succes a
fiierului i -1 n caz de eroare (prototip n stdio.h).

Funcia fcloseall
int fcloseall(void);
nchide toate fluxururile de date i returneaz numrul fluxurilor de date nchise
(prototip n stdio.h).

Funcia close
int close(int indicator);
nchide un indicator de fiier i returneaz 0 (n caz de succes) sau -1 n caz de
eroare (prototip n io.h).

In general nu se scriu functii care sa aloce memorie fara sa o elibereze,


deoarece apelarea repetata a unor astfel de functii poate duce la consum inutil
de memorie. La fel, nu se admite ca sarcina eliberarii memoriei alocate sa
revina celui care apeleaza functia.

Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de concepte cu exemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n determinarea i utilizarea funciilor.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise.

60
Tema 6 : Modaliti i tehnici de utilizare a funciilor / metodelor predefinite

Fia suport 1.10. Modaliti i tehnici de utilizare a funciilormetodelor


predefinite

Limbajul C poseda o biblioteca de functii C care pot fi utilizate in cadrul programului.


Informatii despre functiile din biblioteca sunt precizate in niste fisiere de tip *.h,
( headere) standard care sunt adaugate programului printr-o directiva preprocesor de
tip, #include.
In cazul operatiilor de intrare/iesire, I/E, se specifica fisierul header standard stdio.h cu
ajutorul directivei:
#include stdio.hsau #include <stdio.h> constructie ce nu este o instructiune C care se
introduce in cadrul functiilor, nici un cuvint cheie al limbajului si nici nu se termina cu ;,
dar se scrie din prima coloana. In bibliotecile standard ale limbajului C si C++ exista
functii predefinite care pot fi usor folosite de catre utilizatori. Apelul lor implica existenta
prototipului lor.
Pentru aceste functii standard exista anumite fisiere standard, headere, de tip *.h,
(stdio.h, string.h, etc.) care contin prototipul unor functii inrudite. Aceste fisiere headere
se includ printr-o directiva preprocesor.

stdio.h - contine functii de introducere - extragere a datelor. Functiile utilizate pina in


acest moment (de ex: getchar, printf, gets, etc.) opereaza cu fisierele standard de
introducere si extragere: stdin(implicit tastatura) si stdout (implicit monitorul). Prin
redirectare aceste fisiere standard se pot asocia cu alte fisiere.

Definiie

Un fisier este o structura dinamica, situata in memoria secundara ( pe flopyy disk-uri


sau harddisk-uri ); numarul de elemente ale unui fisier este variabil, chiar nul..

Limbajul C permite operarea cu fisiere:

de tip text - un astfel de fisier contine o succesiune de linii, separate prin NL ('\n')
de tip binar - un astfel de fisier contine o succesiune de octeti, fara nici o
structura.

Prelucrarea unui fisier presupune asocierea acestuia cu un canal de I/E ( numit flux sau
stream ). Exista doua canale predefinite, care se deschid automat la lansarea unui
program:
stdin - fisier de intrare, text, este intrarea standard - tastatura
stdout - fisier de iesire, text, este iesirea standard - ecranul monitorului.

Pentru a prelucra un fisier, trebuie parcurse urmatoarele etape:


se defineste o variabila de tipFILE *pentru accesarea fisierului; FILE * este un tip
structura definit in stdio.h, care contine informatii referitoare la fisier si la
tamponul de transfer de date intre memoria centrala si fisier ( adresa, lungimea
tamponului, modul de utilizare a fisierului, indicator de sfarsit, de pozitie in fisier )
se deschide fisierul pentru un anumit mod de acces, folosind functia de biblioteca
fopen, care realizeaza si asocierea intre variabila fisier si numele extern al
fisierului

61
se prelucreaza fisierul in citire/scriere cu functiile specifice
se inchide fisierul folosind functia de biblioteca fclose.

Practic nu exista program care sa nu apeleze functii din bibliotecile existente


si care sa nu contina definitii de functii specifice aplicatiei respective.
In limbajul C exista numai functii, dar pentru functiile fara rezultat direct
(asociat numelui functiei) s-a introdus tipul void. Pentru o functie cu rezultat
direct tipul functiei este tipul rezultatului.
Argumentele folosite la apelul functiei se numesc argumente efective si pot
fi orice expresii (constante, functii etc.). Argumentele efective trebuie sa
corespunda ca numar si ca ordine (ca semnificatie) cu argumentele formale (cu
exceptia unor functii cu numar variabil de argumente Este posibil ca tipul unui argument
efectiv sa difere de tipul argumentului formal corespunzator, cu conditia ca tipurile sa fie
"compatibile" la atribuire.
Conversia de tip (intre numere sau pointeri) se face automat, la fel ca si la
atribuire.

Tipul unei functii C poate fi orice tip numeric, orice tip pointer, orice tip
structura (struct) sau void. In lipsa unei declaratii de tip explicite se considera ca tipul
implicit al functiei este int. Functia "main" poate fi declarata fie de tip void, fie de tip int,
explicit sau implicit.
Variabilele definite intr-o functie pot fi folosite numai in functia respectiva,
cu exceptia celor declarate extern. Pot exista variabile cu aceleasi nume in
functii diferite, dar ele se refera la adrese de memorie diferite.
O functie are in general un numar de argumente formale (fictive), prin care
primeste datele initiale necesare si poate transmite rezultatele functiei. Aceste
argumente pot fi doar nume de variabile (nu orice expresii) cu tipul declarat in
lista de argumente, pentru fiecare argument in parte.

Standardul limbajului C contine si o serie de functii care trebuie sa existe in


toate implementarile limbajului. Declaratiile acestor functii sunt grupate in
fisiere antet cu acelasi nume pentru toate implementarile.
In afara acestor functii standard exista si alte functii specifice sistemului de
operare, precum si functii utile pentru anumite aplicatii (grafica pe calculator,
baze de date, aplicatii de retea s.a.).
Uneori, aceleasi operatii se pot realiza cu functii universale sau cu functii
dependente de sistem: obtinere/modificare timp, operatii cu directoare s.a.
Utilizarea functiilor standard din biblioteci reduce timpul de dezvoltare a
programelor, mareste portabilitatea lor si contribuie la reducerea diversitatii
programelor, cu efect asupra usurintei de citire si de intelegere a lor.
Functiile de biblioteca nestandard utilizate ar trebui marcate prin comentarii.
Informatii complete asupra functiilor de biblioteca pot fi obtinute prin ajutor
(Help) oferit de orice mediu IDE sau prin examinarea fisierelor antet, de tip H.

Cteva grupuri de functii standard utile:


- Functii standard de intrare-iesire pentru consola si fisiere
- Functii de alocare memorie, de conversie din caractere in binar
(atoi, atol, atof), de sortare si cautare (qsort, bsearch), functii diverse (exit).
-Functii standard matematice (cu rezultat si argumente double)
("abs","sqrt","pow","sin","cos","exp","log" s.a.)
-Functii standard pentru operatii cu siruri de caractere

62
-Functii de verificare tip caractere si de conversie caractere
-Functii pentru operatii cu timpi si date calendaristice
-Functii (macrouri) pentru functii cu numar variabil de argumente
-Functii standard de intrare-iesire stil Unix
-Functii de intrare-iesire cu consola (ecranul si tastatura)
-Functii pentru executie procese (taskuri)

In definirea functiilor se folosesc pointeri pentru:


- Transmiterea de rezultate prin argumente;
- Transmiterea unei adrese prin rezultatul functiei;
O functie care trebuie sa modifice mai multe valori primite prin argumente
sau care trebuie sa transmita mai multe rezultate calculate de functie trebuie sa
foloseasca argumente de tip pointer.

Anumite aplicatii numerice necesita scrierea unei functii care sa poata apela
o functie cu nume necunoscut, dar cu prototip si efect cunoscut. Prin conventie, in
limbajul C, numele unei functii neinsotit de o lista de argumente (chiar vida) este
interpretat ca un pointer catre functia respectiva
(fara a se folosi operatorul de adresare '&'). Deci "sin" este adresa functiei
"sin(x)" in apelul functiei "listf".

O eroare de programare care trece de compilare si se manifesta la executie


este apelarea unei functii fara paranteze; compilatorul nu apeleaza functia si
considera ca programatorul vrea sa foloseasca adresa functiei.

O functie este apelata prin nume, urmat de o lista de argumente intre paranteze. O
metoda de a comunica date intre functii este prin intermediul argumentelor functiei. O
functie fara argumente se indica prin "( )".
Acoladele "{ }" includ instructiunile care alcatuiesc functia. Un program C, oricare
i-ar fi marimea, consta din una sau mai multe "functii" care specifica operatiile
efective de calculat care trebuiesc facute.

Orice mediu de programare este prevzut cu una sau mai multe biblioteci de funcii
predefinite. Orice bibliotec este format din:
fiierele header (conine prototipurile funciilor, declaraiile de variabile);
biblioteca (arhiva) propriu-zis (conine definiii de funcii).

Pentru ca funciile predefinite s poat fi utilizate, fiierele header n care se gsesc


prototipurile acestora trebuie inclus n funcia (programul) apelant printr-o directiv
preprocesor (exemplu #include <stdio.h>). Deasemenea, utilizatorul i poate crea
propriile headere proprii. Pentru a putea utiliza funciile proprii, el trebuie s includ
aceste headere n programul apelant (exemplu #include "my_header.h").

Pentru funciile predefinite, au fost create fiiere header orientate pe anumite numite
tipuri de aplicaii. De exemplu, funciile matematice se gsesc n headerul <math.h>.
Headerul <stdlib.h> care conine funcii standard. Headerul <values.h> definete o serie
de constante simbolice (exemplu MAXINT, MAXLONG) care reprezint, n principal,
valorile maxime i minime ale diferitelor tipuri de date.

n limbajul C, operaiile asupra fiierelor se realizeaz cu ajutorul unor funcii din


biblioteca standard (stdio.h). Transferurile cu dipozitivele periferice (tastatur, monitor,

63
disc, imprimant, etc.) se fac prin intermediul unor dispozitive logice identice numite
stream-uri (fluxuri) i prin intermediul sistemului de operare. Un flux de date este un
fiier sau un dispozitiv fizic tratat printr-un pointer la o structur de tip FILE (din header-
ul stdio.h). Cnd un program este executat, n mod automat, se deschid urmtoarele
fluxuri de date predefinite, dispozitive logice (n stdio.h):
stdin (standard input device) - dispozitivul standard de intrare (tastatura) - ANSII C;
stdout (standard output device) - dispozitivul standard de ieire (monitorul) - ANSII
C;
stderr (standard error output device) - dispozitivul standard de eroare (de obicei un
fiier care conine mesajele de eroare rezultate din execuia unor funcii) - ANSII C;
stdaux (standard auxiliary device) - dispozitivul standard auxiliar (de obicei interfaa
serial auxiliar) - specifice MS-DOS;
stdprn (standard printer) - dispozitivul de imprimare - specifice MS-DOS.

n abordarea limbajului C (impus de stdio.h), toate elementele care pot comunica


informaii cu un program sunt percepute - n mod unitar - ca fluxuri de date. Datele
introduse de la tastatur formeaz un fiier de intrare (fiierul standard de intrare).
Datele afiate pe monitor formeaz un fiier de ieire (fiierul standard de ieire).
Sfritul oricrui fiier este indicat printr-un marcaj de sfrit de fiier (end of file). n
cazul fiierului standard de intrare, sfritul de fiier se genereaz prin Ctrl+Z (^Z) (sub
MS-DOS) (sau Ctrl+D sub Linux). Acest caracter poate fi detectat prin folosirea
constantei simbolice EOF (definit n fiierul stdio.h), care are valoarea -1. Aceast
valoare nu rmane valabil pentru fiierele binare, care pot conine pe o poziie
oarecare caracterul \x1A.
De obicei, schimbul de informaii dintre programe i periferice se realizeaz folosind
zone tampon. O zon tampon pstreaz una sau mai multe nregistrri. Prin operaia
de citire, nregistrarea curent este transferat de pe suportul extern n zona tampon
care i corespunde, programul avnd apoi acces la elementele nregistrrii din zona
tampon. n cazul operaiei de scriere, nregistrarea se construiete n zona tampon,
prin program, fiind apoi transferat pe suportul extern al fiierului. n cazul monitoarelor,
nregistrarea se compune din caracterele unui rnd. De obicei, o zon tampon are
lungimea multiplu de 512 octei. Orice fiier trebuie deschis inainte de a fi prelucrat, iar
la terminarea prelucrrii lui, trebuie nchis.

Fluxurile pot fi de tip text sau de tip binar. Fluxurile de tip text mpart fiierele n linii
separate prin caracterul \n (newline=linie nou), putnd fi citite ca orice fiier text.
Fluxurile de tip binar transfer blocuri de octei (fr nici o structur), neputnd fi citite
direct, ca fiierele text.

Prelucrarea fiierelor se poate face la dou niveluri:


Nivelul superior de prelucrare a fiierelor n care se utilizeaz funciile specializate n
prelucrarea fiierelor.
Nivelul inferior de prelucrare a fiierelor n care se utilizeaz direct facilitile oferite
de sistemul de operare, deoarece, n final, sarcina manipulrii fiierelor revine
sistemului de operare. Pentru a avea acces la informaiile despre fiierele cu care
lucreaz, sistemul de operare folosete cte un descriptor (bloc de control) pentru
fiecare fiier.

Ca urmare, exist dou abordri n privina lucrului cu fiiere:


abordarea implementat n stdio.h, asociaz referinei la un fiier un stream (flux
de date), un pointer ctre o structur FILE.
abordarea definit n header-ul io.h (input/output header) asociaz referinei la un

64
fiier un aa-numit handle (n cele ce urmeaz acesta va fi tradus prin indicator de
fiier) care din punct de vedere al tipului de date este in;

Scopul lucrului cu fiiere este acela de a prelucra informaia coninut. Pentru a putea
accesa un fiier va trebui s-l asociem cu unul din cele dou modaliti de manipulare.
Acest tip de operaie se mai numete deschidere de fiier. nainte de a citi sau scrie ntr-
un fiier (neconectat automat programului), fiierul trebuie deschis cu ajutorul funciei
fopen din biblioteca standard. Funcia primete ca argument numele extern al fiierului,
negociaz cu sistemul de operare i retuneaz un nume (identificator) intern care va fi
utilizat ulterior la prelucrarea fiireului. Acest identificator intern este un pointer la o
structur care conine informaii despre fiier (poziia curent n buffer, dac se citete
sau se scrie n fiier, etc.). Utilizatorii nu trebuie s cunoasc detaliile, singura declaraie
necesar fiind cea pentru pointerul de fiier.

Dup deschiderea unui fiier, toate operaiile asupra fiierului vor fi efectuate cu
pointerul su. Operaiile de citire i scriere ntr-un fiier text pot fi:
intrri/ieiri la nivel de caracter (de octet);
intrri/ieiri la nivel de cuvnt (2 octei);
intrri/ieiri de iruri de caractere;
intrri/ieiri cu formatare.

Comunicarea de informaie de la un fiier ctre un program este asigurat prin funcii


de citire care transfer o cantitate de octei (unitatea de msur n cazul nostru) din
fiier ntr-o variabil-program pe care o vom numi buffer, ea nsi avnd sensul unei
niruiri de octei prin declaraia void *buf. Comunicarea de informaie de la un program
ctre un fiier este asigurat prin funcii de scriere care transfer o cantitate de octei
dintr-o variabil-program de tip buffer n fiier.

Fiierele sunt percepute n limbajul C ca fiind, implicit, secveniale (informaia este


parcurs succesiv, element cu element). Pentru aceasta, att fluxurile de date ct i
indicatorii de fiier au asociat un indicator de poziie curent n cadrul fiierului. Acesta
este iniializat la 0 n momentul deschiderii, iar operaiile de citire, respectiv scriere, se
refer la succesiunea de octei care ncepe cu poziia curent. Operarea asupra fiecrui
octet din succesiune determin incrementarea indicatorului de poziie curent.

PRELUCRAREA UNUI FIIER LA NIVEL DE CARACTER

Fiierele pot fi scrise i citite caracter cu caracter folosind funciile putc (pentru scriere)
i getc (citire).
Funcia putc
int putc (int c, FILE *pf);
c este codul ASCII al caracterului care se scrie n fiier;
pf este pointerul spre tipul FILE a crui valoare a fost returnat de funcia fopen.
Funcia putc returneaz valoarea lui c (valoarea scris n caz de succes), sau 1
(EOF) n caz de eroare sau sfrit de fiier.

Funcia getc
int getc (FILE *pf);
Funcia citete un caracter dintr-un fiier (pointerul spre tipul FILE transmis ca
argument) i returneaz caracterul citit sau EOF la sfrit de fiier sau eroare.

65
PRELUCRAREA UNUI FIIER LA NIVEL DE CUVNT

Funciile putw i getw (putword i getword) sunt echivalente cu funciile putc i getc, cu
diferena c unitatea transferat nu este un singur octet (caracter), ci un cuvnt (un int).
int getw(FILE *pf);
int putc (int w, FILE *pf);

Se recomand utilizarea funciei feof pentru a testa ntlnirea sfritului de fiier.

PRELUCRAREA UNUI FIIER LA NIVEL DE IR DE CARACTERE

ntr-un fiier text, liniile sunt considerate ca linii de text separate de sfritul de linie
('\n'), iar n memorie, ele devin iruri de caractere terminate de caracterul nul ('\0').
Citirea unei linii de text dintr-un fiier se realizeaz cu ajutorul funciei fgets, iar scrierea
ntr-un fiier - cu ajutorul funciei fputs.

Funcia fgets este indentic cu funcia gets, cu deosebirea c funcia gets citete din
fiierul standard de intrare (stdin). Funcia fputs este indentic cu funcia puts, cu
deosebirea funcia puts scrie n fiierul standard de ieire (stdout).

Funcia fputs
int fputs(const char *s, FILE *pf);
Funcia scrie un ir de caractere ntr-un fiier i primete ca argumente pointerul spre
zona de memorie (buffer-ul) care conine irul de caractere (s) i pointerul spre structura
FILE. Funcia returneaz ultimul caracter scris, n caz de succes, sau -1 n caz de
eroare.

Funcia fgets
char *fgets(char *s, int dim, FILE *pf);
Funcia citete maximum dim-1 octei (caractere) din fiier, sau pn la ntlnirea
sfaritului de linie. Pointerul spre zona n care se face citirea caracterelor este s.
Terminatorul null ('\0') este plasat automat la sfritul irului (buffer-lui de memorie).
Funcia returneaz un pointer ctre buffer-ul n care este memorat irul de caractere, n
caz de succes, sau pointerul NULL n cazul eecului.

INTRRI/IEIRI FORMATATE

Operaiile de intrare/ieire formatate permit citirea, respectiv scrierea ntr-un fiier text,
impunnd un anumit format. Se utilizeaz funciile fscanf i fprintf, similare funciilor
scanf i printf (care permit citirea/scrierea formatat de la tastatur/monitor).
Funcia fscanf
int fscanf(FILE *pf, const char *format, . . .);

Funcia fprintf
int fprintf(FILE *pf, const char *format, . . .);
Funciile primesc ca parametri fici pointerul (pf ) spre tipul FILE (cu valoarea atribuit la
apelul funciei fopen), i specificatorul de format (cu structur identic celui prezentat
pentru funciile printf i scanf). Funciile returneaz numrul cmpurilor citite/scrise n
fiier, sau -1 (EOF) n cazul detectrii sfritului fiierului sau al unei erori.

Sugestii metodologice

66
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?

Ca materiale suport se pot folosi:


O prezentare multimedia care s cuprind definiii de concepte cu exemplificri i
apoi problematizare sau exerciiu .
Studiu de caz pe anumite subiecte n determinarea i utilizarea funciilor
predefinite, a fiierelor.

Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi.

Ca materiale de evaluare se pot folosi:


o Probe orale i scrise.

67
Unitatea de nvmnt __________________

IV. Fia rezumat

Clasa ________________ Profesor______________________

Nume i Competena 1 Competena 2 Competena 3


Nr.
prenume Observaii
Crt. A1 A2 AX A1 A2 A3 A1 A2 A3
elev
1 zz.ll.aaaa1
2
3
4
...
Y

1
zz.ll.aaaa reprezint data la care elevul a demonstrat c a dobndit cunotinele, abilitile i atitudinile vizate prin activitatea respectiv
V. Bibliografie

1. V.Huanu, T.Sorin Manual de informatic, Ed.L&S Soft, Bucureti, 2006


2. B. Overland Ghid pentru nceptori C++, Ed. Corint, Bucureti, 2006
3. E. Cerchez, M. erban Programarea n limbajul C/C++ pentru liceu, Ed.
Polirom, Bucureti 2007
4. ***www.cs.utcluj.ro,13.06.2009
5. ***www.labs.cs.utt.ro,15.06.2009
6. ***www.facultate.regielive.ro,14-15.06.2009
7. ***www.didactic.ro,12.06.2009
8. ***www.infoscience.3x.ro,14.06.2009

S-ar putea să vă placă și