Sunteți pe pagina 1din 48

+

Algoritmi și tehnici de
programare

Cursul 3
+
Cuprins

 Algoritmi de prelucrare cu fișier conducător.

 Algoritmi de prelucrare a fișierelor binare organizate


secvențial

 Problema cu grade de total


+
Operaţii de citire/scriere fără conversie

 Citirea dintr-un fişier binar

 size_t fread(void* ptr, size_t dim, size_t n, FILE* f);

 Scrierea într-un fişier binar

 size_t fwrite(const void* ptr, size_t dim, size_t n, FILE* f);


+
Exemplu

 Citirea unei înregistrări dintr-un fișier:


 fread(&inreg, sizeof(tipInreg), 1, fis);
 Citirea a zece (10) înregistrări dintr-un fișier:
 fread(vectInreg, sizeof(tipInreg), 10, fis);
 Scrierea unei înregistrări intr-un fișier:
 fwrite(&inreg, sizeof(tipInreg), 1, fis);
 Scrierea a zece (10) înregistrări intr-un fișier:
 fwrite(vectInreg, sizeof(tipInreg), 10, fis);
+
Operaţii de poziţionare în fisier

 Determinarea poziţiei curente


 int fgetpos(FILE* f, fpos_t* poziţie);
 long ftell(FILE* f);

 Poziţionarea în fişier
 int fsetpos(FILE* f, const fpos_t poziţie);
 int fseek(FILE* f, long deplasare, int origine);
 Originea poate fi:
 SEEK_SET (0)
 SEEK_CUR (1)
 SEEK_END (2)
+
Exemplu

 Determinarea poziției curente in fișier

 long pozCrt = ftell(fis);

 Poziționare la sfîrșitul fișierului

 fseek(fis, 0, SEEK_END);
+
Fișier conducător

 Fișier de intrare

 Parcurs secvențial

 Asigură controlul prelucrărilor

 Prelucrarea acestuia nu depinde de prelucrarea altor fișiere

 La un moment dat există un singur fișier conducător

 Pot fi fișiere standard (stdin) sau utilizator


+
Schema logică generală
START

Operații standard ÎNCEPUT


Operații specifice

! (sfîrşit prelucrare) Da

Prelucrare articol
Nu

Operații standard SFÎRŞIT


Operații specifice

STOP
+
Schema logică generală

 Operații standard inițiale


 Deschiderea fișierului

 Operații specifice inițiale


 Inițializare variabile
 Scriere cap de tabel

 Operații standard finale


 Închiderea fișierului

 Operații specifice finale


 Scriere totaluri finale tabel
+
Varianta 1
START

Operaţii iniţiale

Citeşte
articol

!feof(f) Da

Prelucrare articol
Nu

Operaţii finale Citeşte


articol

STOP
+
Varianta 2
START

Operaţii iniţiale

SF = fread (…)

SF != 0 Da

Prelucrare articol
Nu

Operaţii finale SF = fread (…)

STOP
+
Varianta 3
START

Operaţii iniţiale

!fread (…) Da

Nu Prelucrare articol

Operaţii finale

STOP
+
Varianta 4
START

Operaţii iniţiale

Calculare număr
articole (nr)

i=1

i ≤ nr Da

Citeşte
articol

Nu
Prelucrare articol

Operaţii finale
i = i+1

STOP
+
Operaţii de gestiune a fişierelor
 Creare/Populare

 Consultare

 Actualizare:
 Adăugare
 Modificare
 Ştergere
+
Algoritmi de prelucrare a fișierelor
binare organizate secvențial

 Algoritmi pentru prelucrări uzuale


 Populare (Creare)
 Consultare
 Actualizare
+
Operații generale

 Populare (creare)

 Consultare (căutare)
 Un articol (căutare)
 Mai multe articole (selecție)
 Toate articolele (integrală)

 Actualizare:
 Adăugare
 Modificare (articol unic / selecție / integrală)
 Ștergerea nu este definită (simulare)
+
Determinarea încheierii prelucrărilor

 Număr cunoscut de pași

 Convențional

 Sfârșit de fișier standard (CTRL-Z)

 Sfârșit de prelucrare pe bază de chestionar


+
Populare (creare) fișier

 Să se creeze un fişier binar cu articole de următoarea


structură. Sfârșitul introducerii datelor este marcat
standard.
Tip (Vânzări pe tip de
Denumire
Cod Companie Localitate Judet carburant - lei)
staţie
0 1 … 3
char
Int char [30] char [30] char [20] float float … float
[30]

 Schema bloc a programului

CREARE Vanzari.dat
+
Populare (creare) fișier

typedef struct int nrart(FILE *f, int p)


{ {
int cod; int r, l, n;
char nume_sucursala[30]; r = ftell(f);
char comp[30]; fseek(f, 0, 2);
char loc[20]; l = ftell(f);
char jud[30]; n = l / p;
float tip[4]; fseek(f, r, 0);
} carburant; return(n);
}
+
Populare (creare) fișier

 Schema logică structurată


Start

Deschidere
S-a tastat fișier
CTRL-Z?
Cod

!feof(stdin) Da

Citire câmpuri
Nu

Închidere Articol
fișier
Cod
Stop
+
Populare (creare) fișier
La adaugare
difera modul de
deschidere

La adaugare se face
pozitionare la
sfârșitul fișierului
binar organizat
secvențial
+
Consultare, un articol

 Consultare secvențială, un articol, cu posibilitate de repetare.

 Să se calculeze media vânzărilor staţiilor ale căror coduri se introduc de


la tastatură. Sfârșitul introducerii datelor este marcat standard.

 Schema bloc a programului

1 2
AFIŞARE vanzari.dat

3
+
Consultare, un articol
 Schema logică structurată

Start

Deschidere
fișier

Cod căutat

!feof(stdin) Da

Nu Prelucrare articol
după Cod căutat
Închidere
fișier
Cod căutat
Stop
+
Consultare, un articol
 Schema logică structurată

Prelucrare Cod căutat


Poziționare pe
început fișier f

Articol x

vb = 0

!feof(f) și vb==0 Da
Prelucrare
Nu articol
Nu vb==0 Da Articol x
Nu a fost găsit
codul căutat!

Ieșire
+
Consultare, un articol
 Schema logică structurată

Prelucrare articol

Nu Cod == Cod căutat Da


m=0
m = m + tip[i]
i = 0,n-1
m = m/n
denum, m

vb = 1

Ieșire
+
Consultare, un articol
+
Consultare, cu selecție

 Consultare secvențială, mai multe articole, cu selecție după câmp cu valori


duplicate și cu posibilitate de repetare.

 Să se listeze într-un fișier text numele staţiilor din judeţele ale căror
denumiri se introduc de la tastatură. Sfârșitul introducerii datelor este
marcat standard.

 Schema bloc a programului:

1 2
Listare vanzari.dat

3
+
Consultare, cu selecție
 Schema logică structurată

Start

Deschidere
fișier

den_jud

!feof(stdin) Da

Nu Prelucrare
după den_jud
Închidere
fișier
den_jud
Stop
+
Consultare, cu selecție
 Schema logică structurată

Prelucrare după den_jud


Poziționare pe
început fișier f

Deschide lista

Articol x

vb = 0

!feof(f) Da

Nu
Prelucrare
articol
Închide lista

Nu vb==0 Da
Articol x
mesaj succes mesaj eroare
Șterge lista

Ieșire
+
Consultare, cu selecție
 Schema logică structurată

Condiția de
selecție
Prelucrare articol

Nu jud == den_jud Da

denum, m

vb = 1

Ieșire
+
Consultare, cu selecție
+
Consultarea integrală
 Scop: Obţinerea unor situaţii cu elemente grupate
după anumite caracteristici comune, pe mai
multe niveluri.

Aceste caracteristici comune


reprezintă caracteristici de
grupare sau caracteristici de
control.

O caracteristică de grupare Toate articolele care au o


este un câmp al articolului valoare comună pentru o
din fişierul de date, care are caracteristică de grupare se
aceeaşi valoare pentru mai pot ordona în submulțimi
multe înregistrări. formând o grupă de control.
+
Descriere
 La fiecare nivel de grupare se poate calcula o valoare totală - grad de
total.

Sumă, medie, dispersie etc. – un indicator


calculat pe baza valorilor individuale ale
elementelor grupului

 Numărul maxim de grade de total este superior cu unu numărului de


caracteristici de control stabilite.

 Între caracteristicile de grupare se stabileşte o relaţie de ordine ierarhică.

 Pentru prelucrarea fişierului, cu utilizarea minimă de memorie, articolele


trebuiesc sortate după caracteristicile de control.

 Lista/raportul se generează într-un fişier text.


+
Algoritmul general

 Cum se obţine raportul pornind de la un fişier


secvenţial brut?

 Elementele apar într-o anumită ordine, în funcţie de


valorile caracteristicilor
 fişierul trebuie sortat înainte de a genera raportul

 După sortare fişierul se prelucrează secvenţial


+
Schema de sistem a programului
Consultare_GT

Consultare_GT
1 3
2

Vânzări. dat Raport.txt


Manevră.dat

Imprimant
a
+
Exemple
Caracteristică de grupare Valoare a caracteristicii
Sursa: Institutul National de Statistica

Salariile medii pe departamente dintr-o lună Analiză pentru investiţie potenţială – miliarde
RON
- mii RON -analiză pe anul 2020-
Departamentul Contabilitate Regiune Sud- Vest
Salariat Popescu I. 2.000 Judeţul Dolj 13,53
Salariat Ionescu M. 1.500 Judeţul Gorj 9,64
………………………………....................... Judeţul Vâlcea 7,37
Total contabilitate 10.000 ……………………………….........................
Departamentul Financiar PIB la nivelul regiuni sud-vest 42,26
Salariat Mihailă P.
2.000
Total
………………………………...................................
Salariat Petrescu D. 2.500 Regiune Sud- Est
………………………………....................... Judeţul Constanţa
Total financiar 17.000 21,73

……………………………………………………….. Judeţul Galaţi 10,69

……………………………………………………….. ……………………………….........................

Total firmă 150.000 PIB la nivelul regiuni sud-est 57,36


…………………..................................................
Total România 578,5
+
Exemplu
Lista vânzărilor medii de carburant pe sectoare şi
pe companiile din Bucureşti în prima lună a
anului 2020
miliarde RON
Sector 1
Compania OMV
Stația de distribuție 1 320
Stația de distribuție 2 134
Caracteristici …………………………………….
Media compania OMV 284
de grupare Compania Petrom
Stația de distribuție 1 297
Stația de distribuție 2 156
….………………….......................
Valori ale Media compania Petrom 256 Total
caracteristicilor ……………………………………………..
Media sector 1 295
Sector 2
Compania OMV
Stația de distribuție 1 234
Stația de distribuție 2 156
…………………………………….
Media compania OMV 201
…………………………………………….
Media sector 2 235
……………………………………………………..
……………………………………………………..
……………………………………………………..
Media generala 266
+Sortarea fişierelor Start
Deschide fișier
calculează nr. articole n
i=0
Start
Acces direct la i<n-1 Da
n=?
i=0 elemente j=i+1
(articole)? j<n
Stop Da
Poziționare nr. rel. i
i<n-1 Da
Articol x
j=i+1 Nu
Poziționare nr. rel. j
Nu
j<n Da i=i+1 Articol y

x>y
STOP x[i]>x[j] Da Nu Da

?
Poziționare nr. rel. i
Nu x[i] <->x[j] (x.loc > y.loc) sau Articol y
Nu ((x.loc== y.loc) și
Poziționare nr. rel. j
(x.companie >
j=j+1 y.companie)) Articol x
i=i+1 j=j+1
+
Sortare fisier
+
Sortare fisier
+
Algoritmul general
Respectă cerinţele problemei

Start

Operații inițiale

Articol x

!feof(f) Da
Prelucrare
articol
Nu
Articol x

Operații finale

Stop
+
Algoritmul general - nivelul 1
Ce rezultă din examinarea listei şi
cum vrem să apară?
- se iniţializează variabila de total
specifică nivelului;
- se salvează valoarea
caracteristicii primului articol al
Prelucrare grup de nivel 1
grupei;
- alte operaţii iniţiale specifice Operații inițiale
primului nivel de grupare.
la nivelul 1

Nu s-a terminat
- conţine condiţia de prelucrare Da
specifică nivelului ; grupul
- şi nu este sfârșitul fișierului. Prelucrare grup
Nu
de nivel 2
-se afişează totalul calculat pentru
caracteristica ce se schimbă; Operații finale
- se cumulează totalul nivelului
curent la totalul nivelului ierarhic la nivelul 1
superior


- alte operaţii finale specifice
nivelului Ieșire
+
Algoritm general

Prelucrare grup de nivel 2

Operații inițiale
la nivelul 2 Prelucrare conținut
grup de nivel n
Nu s-a terminat
Da Prelucrare
grupul →…→
Prelucrare grup articol

Nu
de nivel 3
Articol x
Operații finale Ieșire
la nivelul 2

Ieșire
Algoritmul
+
Start

general Operații inițiale


generale

Articol x
Algoritm general
pentru două !feof(f) Da
niveluri de Operații inițiale
grupare la nivelul 1
v1, v2 –
caracteristicile !feof(f) și v1==c1 Da
de nivel 1 si 2 Operații inițiale
Nu
la nivelul 2
c1, c2 – valorile Nu
curente pentru
caracteristicile Operații finale !feof(f)
v1 si v2 la nivelul 1 și v1==c1 și Da
v2==c2 Prelucrare
articol
Operații finale Nu
generale Articol x
Operații finale
Stop la nivelul 2
+
Grade de total
+
Lista vânzărilor
+
Prelucrarea fișierelor secvențiale

 Actualizare:
 Adăugare (populare, diferă poziția inițială)
 Modificare (articol unic/selecție/integrală)
 necesită regăsirea articolului de modificat  consultare
 după regăsire: confirmare (dacă e cazul), modificare în memorie,
rescriere
 Ștergere (nu este definită – simulare)
 copierea tuturor articolelor care nu trebuie șterse în alt fișier
 ștergerea fișierului inițial și redenumirea celui nou
+
Bibliografie
 C. Uscatu, C. Cocianu, M. Mircea, L. Pocatilu, Algoritmi
si tehnici de programare. Aplicații, Editura ASE București
2015
 C. Uscatu, M. Popa, L. Bătăgan, C. Silvestru,
Programarea Calculatoarelor. Aplicații, Ed. ASE, 2012
 I.Gh. Roşca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C.
Uscatu, M. Mircea, Programarea calculatoarelor.
Algoritmi în programare, Ed. ASE Bucureşti, 2007
 I. Gh. Roşca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C.
Uscatu, Programarea calculatoarelor. Ştiinţa învăţării unui
limbaj de programare, Teorie şi aplicaţii, Ed. ASE, 2003

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