Sunteți pe pagina 1din 29

+

Algoritmi i tehnici de
programare
Cursul 5

+
Cuprins

Fiiere text i binare

Validarea datelor

Algoritmi de prelucrare cu fiier conductor.

Prelucrarea masivelor memorate n fiiere binare.

Fiiere text i binare

Exist dou tipuri de fiiere cu care se poate opera ntr-un


program:

Fiierele text:

stocheaz datele ca o secven de caractere alfanumerice i


coninutul acestor fiiere poate fi vizualizat i poate fi editat direct
cu ajutorul unui editor de texte.

Fiierele binare:

stocheaz informaia fr prelucrri exact aa cum apare ea n


memorie

Fiiere text i binare


typedef struct Student{
short int nota1;
short int nota2;
char nume[30];
float medie;
} Student;
// ... main() i alte funcii ...
Student stud;
stud.nota1 = 7;
stud.nota2 = 10;
stud.medie = (stud.nota1 + stud.nota2) / 2.0;
strcpy(stud.nume,Ana");

Fiiere text i binare


FILE* f = fopen(test.txt","w");
fprintf(f,"%d %d %f %s\n", stud.nota1, stud.nota2, stud.medie, stud.nume);
Fiierul arat n memorie astfel:
0

00110111

00100000

00110001

00110000

00100000

00111000

00101110

9
01100001

10

11

01101110

0110001

8
12
00001010

\n

7
00110101

8
00110111

Fiiere text i binare


FILE* g = fopen(test_binar.dat","wb");
fwrite(&stud, sizeof(stud), 1, g);
Fiierul arat n memorie astfel:

0
00000111

1
00000000

2
00001010

(short int) 7

00000000

4
01000001

(short int) 10

8
01100001

9
01101110

00001000

6
00000000

(float) 8.5

10
0110001

11 ..17
00000000

\0

xxxxxxx

7
00000000

Validarea datelor
Niveluri de validare
cmp ndeplinirea condiiilor proprii
articol corelaii ntre cmpuri, alte condiii
Ex: CNP, Nume, Vrsta etc.
grup de articole relaii ntre articole, completitudine
pachet, totaluri etc.
fiier completitudine, totaluri etc.

Validarea datelor
nr. = 0

Mesaj, dac e
citire de la
tastatur

er = 0

-> cmp

NU

condiie 1

=11
erer=

<- mesaj
eroare 1

DA
condiie 2

NU

DA

=1 2
erer=

<- mesaj
eroare 2

NU
=1 n
erer =

Ecran e/ citire
Dac
fiier
de la tastatur
jurnal

<- mesaj
eroare n

nr. = 0
er > 0 i
nr < max

== 10
erer>
NU

DA

condiie n

DA

Validarea datelor
Tipuri de validri la nivel de cmp / articol
Existen
Natur
Lungime
Ex: CNP
Semn
Ex: Pret
apartenen la o mulime / interval
Ex: Sex: {m, f/}
corelaii ntre cmpuri (aritmetice, logice etc.)

Validarea datelor
Natur

numeric
alfabetic
alfanumeric

0-9 . (spaii la nceput/sfrit)


a-z, A-Z, spaiu altele (submulime)
orice caracter / submulime

Validarea datelor

Validare natur numeric


direct (prin citire) depinde de posibilitile limbajului
ir de caractere, [verificat fiecare caracter], conversie

Validare natur alfabetic


ir de caractere, verificat fiecare caracter

Validarea datelor

er = 1;
while( er )
{
printf("\nVarsta = ");
fflush( stdin );
if( scanf("%d", &x) == 1 )
er = 0;
}

Validarea datelor
Pentru conversia datelor din format numeric n format
ir de caractere i invers se folosesc dou seturi de
funcii:

din format ir de caractere n format numeric (atoi, atof, atol)

int atoi(const char *s);

long atol(const char *s);

double atof(const char *s);

din format numeric n ir de caractere (itoa, ltoa, ultoa).

Validarea datelor

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void main()
{
char *s[]={"12345","12345.67","123456.78","123a45.67","a12345.67",
"12345.a67"};
int j, n, er, i, nr, k=0,v[5];
for(j=0; j<6; j++)
{ n=strlen(s[j]);er=1;
for(i=0;i<n;i++)
if((s[j][i]<'0')|| (s[j][i]>'9')) er=0;
if (er==1) {
v[k]=atoi(s[j]);
k++;
}
}
for(i=0;i<k;i++)
printf("v[%d]=%d\n",i,v[i]);
}

Validarea datelor

Lungime
existen (diferit de zero)
lungime propriu-zis

Domeniu / mulime de valori


ir de caractere: tabel predefinit de iruri
numeric: tabel de valori, capete interval
caracter: valori predefinite, capete interval

Fiier conductor

Fiier de intrare

Parcurs secvenial

Asigur controlul prelucrrilor

Prelucrarea acestuia nu depinde de prelucrarea altor fiiere

La un moment dat exist un singur fiier conductor

Pot fi fiiere standard (stdin) sau utilizator

Schema logic general


START

Operaii standard
Operaii specifice

NCEPUT

! (sfrit prelucrare)

Nu

Operaii standard
Operaii specifice

SFRIT

STOP

Da

Prelucrare articol

Schema logic general


Operaii standard iniiale

Operaii specifice iniiale

Iniializare variabile

Scriere cap de tabel

Operaii standard finale

Deschiderea fiierului

nchiderea fiierului

Operaii specifice finale

Scriere totaluri finale tabel

+
Varianta 1
START

Operaii iniiale

Citete
articol

!feof(f)

Nu

Operaii finale

STOP

Da
Prelucrare articol

Citete
articol

+
Varianta 2
START

Operaii iniiale

SF = fread ()

SF != 0

Da
Prelucrare articol

Nu

Operaii finale

STOP

SF = fread ()

+
Varianta 3
START

Operaii iniiale

!fread ()
Nu
Operaii finale

STOP

Da
Prelucrare articol

+
Varianta 4

START

Operaii iniiale
Calculare numr
articole (nr)

i=1

i nr

Da
Citete
articol

Nu
Prelucrare articol

Operaii finale

STOP

i = i+1

Masive memorate n fiier

Scop:

memorarea masivelor de date de dimensiuni mari

Problema

principal:
determinarea poziiei unui anumit element din
masiv n cadrul fiierului.

Masive memorate n fiier

Prelucrarea

depinde de:

numrul de dimensiuni ale masivului;

ordinea de memorare n fiier (lexicografic sau invers


lexicografic);

modul de memorare (dens sau nedens);

ordinea de parcurgere a masivului.

Masive memorate n fiier

Vectorii se memoreaz dens

Numrul relativ al articolului depinde de rangul elementului n


cadrul vectorului, astfel:

nr_relativ=rang(xi+1) =i, pentru i=0..n-1,

vectorul se memoreaz ncepnd cu primul articol

dimensiunea vectorului este


n=ftell(fisier)/sizeof(articol)

Masive memorate n fiier


O matrice poate fi memorat ntr-un fiier binar:

nedens

n ordine lexicografic

invers lexicografic.

dens

n ordine lexicografic

invers lexicografic.

Masive memorate n fiier

Pe prima poziie se memoreaz numrul de linii n cazul


memorrii lexicografice

Numrul de coloane =numrul total de elemente / numrul de


linii

ftell(fisier) - sizeof(nr_linii)
nr_coloane
sizeof(articol) * nr_linii

Masive memorate n fiier

Pe prima poziie se memoreaz numrul de coloane n cazul


memorrii invers lexicografice

Numrul de linii =numrul total de elemente/ numrul de


coloane

ftell(fisier) - sizeof(nr_coloane)
nr_linii
sizeof(articol) * nr_coloane

Masive memorate n fiier


Numrul relativ al elementului aij se determin astfel:

rang(aij)=i*nr_coloane+j+1, n cazul memorrii lexicografice,


unde nr_coloane este fie numrul coloanelor efective (populare
dens), fie numrul coloanelor rezervate (populare nedens);

rang(aij)=j*nr_linii+i+1,
n
cazul
memorrii
invers
lexicografice, unde nr_linii este fie numrul liniilor efective
(populare dens), fie numrul liniilor rezervate (populare
nedens).