Sunteți pe pagina 1din 32

+

Algoritmi și tehnici de
programare

Cursul 4
+
Cuprins

 Fișiere organizate relativ

 Algoritmi de prelucrare a fișierelor binare organizate


relative

 Validarea datelor
+
Organizarea relativă
 Cheie relativă  numărul relativ al articolului în fişier
Indicatorul de stare e un cîmp
 rezultă spaţii libere şi spaţii ocupate în fişier
care poate lua două valori
 distincţia se face prin includerea unui cîmpdistincte (uzual 0/1),
suplimentar în unde 0
identifică spaţii libere, iar 1
structura articolului: indicator de stare
identifică articole valide

Structura fizică a articolului

Spaţiu liber

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Articol valid
+
Organizarea relativă

 Număr relativ articol  Cheie

Domeniu de valori: Domeniu de valori:


0, 1, 2, … 1001, 1002, 1003, 1004,

1, 2, 3, 4, …
-20, -19, -18, -17, …
50, 51, 52, 53, …
 Translație
 domeniul cheilor → domeniul numerelor relative
 nr. relativ = valoare cheie – valoare început domeniu
+
Probleme de rezolvat

 Crearea fişierului cu populare/adăugare de articole


noi

 Căutarea în fişier
 articol unic sau set de articole

 Modificarea datelor
 un articol sau mai multe

 Ştergerea articolelor din fişier


+
Creare fişier, cu populare

17

4 7 15 16 17

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+
Creare fişier, cu populare
Start

Nume fișier
Calcul nr. articole nr
Deschidere fișier
Da Nu nr<=n Da

Preformare fișier Extindere fișier


Pregătire Nr. rel. art. nou n
fişier Poziționare pe
art. cu nr. n
!feof(stdin)
Adăugare Citire art. x
articol Nu
Nu x.is == 0 Da
Închidere Mesaj eroare Cîmpurile
fișier “Cod duplicat” articolului

Stop x.is = 1

Scrie art. x în
fișier la poz. n

Nr. rel. art. nou n


+
Creare fişier, cu populare
typedef struct{
int zi;
int luna;
int an;
} data;
typedef struct {
char is;
char nume[30];
char prenume[30];
char dep[20];
char prof[20];
int varsta;
float sal[3];
data data_ang;
} ang;
+
void creare() scanf("%d", &a.data_ang.an);
{ fwrite(&a,sizeof(ang),1,f);
FILE *f; }
ang a; else {
int n,i,er; fseek(f,(n-1)*sizeof(ang),0);
er=fopen_s(&f,"angajat1.dat","wb+"); fread(&a,sizeof(ang),1,f);
int nr=sizeof(ang); if(a.is==0) {
printf("n="); scanf_s("%d",&n); a.is=1;
while(!feof(stdin)) printf("nume="); getc(stdin); gets_s(a.nume);
{ printf("prenume="); gets_s(a.prenume);
if(n>nr_art(f,sizeof(ang))) printf("dep="); gets_s(a.dep);
{ printf("prof="); gets_s(a.prof);
fseek(f,0,2); printf("varsta="); scanf_s("%d",&a.varsta);
a.is=0; for(i=0;i<3;i++)
for(i=nr_art(f,sizeof(ang));i<n;i++) {
fwrite(&a,sizeof(ang),1,f); printf("sal din luna %d", i+1);
fseek(f,(n-1)*sizeof(ang),0); scanf_s("%f",&a.sal[i]);
a.is=1; }
printf("nume="); getc(stdin); gets_s(a.nume); printf("data angajaraii zi/luna/an:");
printf("prenume="); gets_s(a.prenume); scanf("%d", &a.data_ang.zi);
printf("dep="); gets_s(a.dep); scanf("%d", &a.data_ang.luna);
printf("prof="); gets_s(a.prof); scanf("%d", &a.data_ang.an);
printf("varsta="); scanf_s("%d",&a.varsta); fseek(f,(n-1)*sizeof(ang),0);
for(i=0;i<3;i++) fwrite(&a,sizeof(ang),1,f);
{ }
printf("sal din luna %d", i+1); else printf("inreg. exista\n");
scanf_s("%f",&a.sal[i]); }
} printf("n="); scanf_s("%d",&n);
printf("data angajaraii zi/luna/an:"); }
scanf("%d", &a.data_ang.zi); fclose(f);
}
scanf("%d", &a.data_ang.luna);
+
Creare fişier, cu populare

Preformare
Nr. articole nra

x.is = 0

i=0

i < nra Da
Scrie art.
Nu x în fișier

Stop i = i+1
+
Creare fişier, cu populare

Calcul nr. articole


Reține poziția
curentă poz
Poziționare la
sfîrșitul fișierului
Determină
poziția curentă p
Calcul nr. articole
nr = p / dim. articol
Revenire la
poziția poz

Stop
+
Creare fişier, cu populare

Ce se modifică dacă vrem să adăugăm


articole într-un fișier existent?

Nu mai este necesară preformarea


Mod de deschidere specific (“rb+”)
+
Prelucrare articol unic
Articolul este identificat Start Deschidere “rb+”
după cheia relativă
Calcul nr. articole nr
(căutare, modificare, Pregătire fișier
ştergere etc.) Verificare cheie (domeniu valori)
Verificare articol indicat de cheie
Cheie articol Prelucrare articol
căutat n

!feof(stdin) Da
Prelucrare cheie n
Nu

Cheie articol
Închidere fișier căutat n

Stop
+
Prelucrare articol unic

Start

Nume fișier

Deschidere fișier
Nu nr<=n Da
Calcul număr de
articole nr Poziționare pe Mesaj eroare
art. cu nr. n “Cod eronat”
Cheie articol
căutat n Citire
articol x

!feof(stdin) Da Nu x.is == 1 Da
Mesaj eroare Prelucrare
Nu
“Cod eronat” articol
Închidere
fișier
Cheie articol
Stop
căutat n
+
Prelucrare articol (modificare)

Vizualizare Pentru cîmpurile a căror


articol modificare se doreşte

Confirmare Citirea noilor


modificare valori se face în
variabile separate,
Nu Se confirmă? Da cu validare

Mesaj “Modificare Preluare valori Renunţare?


abandonată” noi

Poziționare pe
articolul cu numărul n

Scrie articol în
fișier
+
Afișare articol
+
Prelucrare articol (modificare)
+
Prelucrare set de articole
(căutare, modificare, ştergere etc.)
Start
Articolele sunt identificate după o
Pregătire fișier valoare comună

Regăsirea tuturor articolelor


Valoare căutată corespunzătoare, în acces
val secvenţial, şi prelucrarea lor

!feof(stdin) Da

NU
Prelucrare val

Stop Valoare
căutată val
+
Prelucrare set de articole
(căutare, modificare, ştergere etc.)
Poziționare la
Verificare
începutul fiș. articol valid Verificare
articol căutat
Citire articol
din fișier x

!feof(f) Da

x.is == 1 Da
Nu
x.cîmp == val Da
Nu
Prelucrare
NU
articol

Citire articol
din fișier x
+
Afișare set de articole
+
Prelucrare set de articole
+
Afișare integrală
+
Operații de bază

 Prelucrare

 Căutare
 Vizualizare articol găsit (ecran / fișier text)

 Modificare
 Vizualizare articol (partea semnificativă)
 Confirmare (diverse metode)
 Introducere valori noi
 Rescriere articol, pe vechea lui poziţie în fişier

 Ştergere
 Modificarea câmpului indicator de stare pentru articolul ce trebuie
şters
+
Validarea datelor

 Niveluri de validare
 câmp – îndeplinirea condițiilor proprii

 articol – corelații între câmpuri, alte condiții

 Ex: CNP, Nume, Vârsta etc.

 grup de articole – relații între articole, totaluri etc.

 fişier – completitudine, totaluri etc.


+
Validarea datelor la nivelul câmpului

 Prin validarea datelor se are în vedere ca pentru anumite câmpuri


să nu se poată introduce decât date care îndeplinesc anumite condiţii.
 Procedeul este realizat pentru fiecare câmp şi poate afişa un mesaj de
eroare dacă s-a completat o valoare neacceptabilă.
+
Validarea datelor

 Restricţiile care pot fi impuse pentru conţinutul unei câmp se


referă la:
 Existenţă

 Natură
 Lungime
 Ex: CNP

 Semn

 Ex: Pret
 apartenenţă la o mulţime / interval
 Ex: Sex: {m, f}

 corelaţii între câmpuri (aritmetice, logice etc.)


+
Validarea datelor

 Natură

 numerică 0-9 . – (spații la început/sfîrșit)


 alfabetică a-z, A-Z, spaţiu altele (submulțime)
 alfanumerică orice caracter / submulţime
+
Validarea datelor

 Validare natură numerică


 direct (prin citire) – depinde de posibilitățile limbajului

 şir de caractere, (verificat fiecare caracter), conversie

int er, x;
er = 1;
while (er)
{
printf("\nVarsta = ");
getc(stdin);
if (scanf_s("%d", &x) == 1)
er = 0;
}
printf("%d\n", x);
+
Validarea datelor
 Validare natură alfabetică
 şir de caractere, verificat fiecare caracter
char nume[20];
int sum,i,n;
printf("numele=");
scanf_s("%s", nume, sizeof(nume));
fflush(stdin);
do
{sum = 0;
n = strlen(nume);
for (i = 0; i < n; i++)
if (((nume[i] >= 'a') && (nume[i] <= 'z')) || ((nume[i] >= 'A') &&
(nume[i] <= 'Z')))
sum =sum+ 1;
if (sum == n) puts(nume);
else
{printf("numele=");
scanf_s("%s", nume, sizeof(nume));}
} while (sum != n);
+
Validarea datelor

 Lungime
 existenţă (diferită de zero)

 lungime propriu-zisă

 Domeniu / mulţime de valori


 şir de caractere: tabel predefinit de şiruri

 numerică: tabel de valori, capete interval

 caracter: valori predefinite, capete interval


+
Validarea datelor
nr. = 0 er = 0 Mesaj, dacă e
citire de la
tastatură
-> cîmp

NU condiţie 1 DA

erer=
=1
1 NU condiţie 2 DA

<- mesaj erer=


=1 2

eroare 1

<- mesaj
eroare 2 NU condiţie n DA

Ecran e/ citire
Dacă fișier
erer =
=1 n

de la tastatură
jurnal
<- mesaj
eroare n

nr. = 0

er > 0 și erer>
== 10 DA

nr < max NU
+
Bibliografie

 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

 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

 C. Uscatu, M. Popa, L. Bătăgan, C. Silvestru, Programarea


Calculatoarelor. Aplicații, Ed. ASE, 2012

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