Documente Academic
Documente Profesional
Documente Cultură
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:
CONSULTAN:
2
Cuprins
I. INTRODUCERE.............................................................................................................5
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
V. BIBLIOGRAFIE...........................................................................................................86
I. Introducere
Competene /
Teme Fise suport
rezultatele ale
invrii
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:
7
III. Resurse
Tema 1: Subprograme
Noiunea de subprogram
Definiie
Subprogramele sunt pri ale unui program, identificabile prin nume, care se pot
activa la cerere prin intermediul acestor nume.
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;
}
Tipuri de subprograme
Clasificarea subprogramelor:
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.
10
Tema 1: Subprograme
Structura subprogramelor.
Definiie
Definiie
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.
# include <iostream.h>
# include <conio.h>
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.
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.
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.
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.
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.
n apel, parametrii efectivi corespunztori parametrilor formali transmii prin valoare pot
fi : valori, variabile, expresii sau alte funcii.
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?
14
Tema 1: Subprograme.
Definiie
Apelul subprogramului este modul prin care subprogramul este pus n execuie.
Apelul subprogramului se poate realiza n dou moduri:
nume (lista_parametrilor_actuali);
unde nume : reprezint numele subprogramului. Lista parametrilor actuali este format
dintr-o succesiune de expresii, separate prin virgul.
nume (lista_parametrilor_actuali)
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.
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.
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:
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>
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?
17
Definiie
Definiie
Definiie
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;
}
Definiie
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.
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?
20
Tema 3: Alocarea memoriei
Definiie
Segment de date
Segment de stiv
Heap
Definiie
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.
Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?
22
Tema 4 : Implementarea structurilor dinamice de date
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 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
23
Avantajele alocrii dinamice sunt:
- memorie suplimentar pentru programe
- posibilitatea de a utiliza aceast memorie
Definiie
Liste liniare : lista simplu i dublu nlnuit. Operaii cu liste (crearea, adugare,
eliminare, parcurgere, prelucrare nod)
Definiie
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.
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:
data leg
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:
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
Definiie
Lista dublu nlnuit este lista dinamic ntre nodurile creia s-a definit o dubl
relaie: de succesor si de predecesor.
Tipul unui nod dintr-o list dublu nlnuit este definit 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.
5.tergerea listei
tergerea ntregii liste se realizeaz tergnd nod cu 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.
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
29
Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?
30
Tema 4 : Implementarea structurilor dinamice de date
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.
A = {1,2,3,4,5}
B = {(1,2),(1,3),(2,3),(2,5)}
Definiie
Un graf G se numete simplu dac oricare dou noduri ale sale sunt extremiti pentru
cel mult o muchie.
Definiie
Definiie
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
Proprietati
Lanturi. Drumuri
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
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:
33
Exemplu6:
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].
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 intregul graf este necesar un vector de liste (P) in care P i este adresa primului
element al listei asociate lui i.
34
Exemplu7:
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
35
Matricea noduri-arce aferenta:
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
Exemplu13:
x = 10
10, 4, 2, 1, 3, 6, 8, 7, 9
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
Exemplu15:
38
Da
3. Graf complet
Un graf este complet daca oricare doua varfuri distince sunt adiacente.
Exemplu16:
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.
Da Nu
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
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
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?
44
Tema 4 : Implementarea structurilor dinamice de date
Definiie
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.
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).
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.
De exemplu :
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.
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
Reprezentarea inlantuita
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.
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.
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).
Doua tipuri de parcurgere a unui arbore sunt folosite frecvent: parcurgerea n latime si
parcurgerea n naltime.
50
Putem realiza pacurgerea n latime a unui arbore binar printr-un algoritm care utilizeaza
o coada drept element ajutator:
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.
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;
51
Definiie
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].
Exemple:
(a) (b)
Sugestii metodologice
52
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?
53
Tema 5 : 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.
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 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.
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.
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.
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.
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 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.
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).
Sugestii metodologice
UNDE? Sala de clas care are tabl, videoproiector sau flipchart.
CUM?
60
Tema 6 : Modaliti i tehnici de utilizare a funciilor / metodelor predefinite
Definiie
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.
61
se prelucreaza fisierul in citire/scriere cu functiile specifice
se inchide fisierul folosind functia de biblioteca fclose.
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.
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)
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 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 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.
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.
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.
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.
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);
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?
67
Unitatea de nvmnt __________________
1
zz.ll.aaaa reprezint data la care elevul a demonstrat c a dobndit cunotinele, abilitile i atitudinile vizate prin activitatea respectiv
V. Bibliografie