cursul05_atp2015
DESCRIPTION
Curs Algoritmi si tehnici de programareTRANSCRIPT
-
+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-unprogram:
Fiierele text:
stocheaz datele ca o secven de caractere alfanumerice iconinutul acestor fiiere poate fi vizualizat i poate fi editat directcu ajutorul unui editor de texte.
Fiierele binare:
stocheaz informaia fr prelucrri exact aa cum apare ea nmemorie
-
+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 1 2 3 4 5 6 7 8
7 1 0 8 . 5
9 10 11 12
a n a \n
00110111 0011000100100000 00110000 00100000 00111000 00101110 00110101 00110111
01100001 011000101101110 00001010
-
+Fiiere text i binare
FILE* g = fopen(test_binar.dat","wb");
fwrite(&stud, sizeof(stud), 1, g);
Fiierul arat n memorie astfel:
0 1 2 3 4 5 6 7
(short int) 7 (short int) 10 (float) 8.5
8 9 10 11 ..17
a n a \0
00000111 0000101000000000 00000000 01000001 00001000 00000000 00000000
01100001 011000101101110 00000000 xxxxxxx
-
+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
er = 0
condiie 1
-> cmp
NU
er = 1
-
+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 0-9 . (spaii la nceput/sfrit)
alfabetic a-z, A-Z, spaiu altele (submulime)
alfanumeric 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 formatir de caractere i invers se folosesc dou seturi defuncii:
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
#include
#include
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
-
+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
STOP
! (sfrit prelucrare) Da
NuPrelucrare articol
NCEPUT
SFRIT
Operaii standardOperaii specifice
Operaii standardOperaii specifice
-
+ Operaii standard iniiale
Deschiderea fiierului
Operaii specifice iniiale
Iniializare variabile
Scriere cap de tabel
Operaii standard finale
nchiderea fiierului
Operaii specifice finale
Scriere totaluri finale tabel
Schema logic general
-
+Varianta 1
START
STOP
Da
Citete articol
!feof(f)
Citete articol
Operaii finale
Nu
Operaii iniiale
Prelucrare articol
-
+START
STOP
Da
SF = fread ()
SF != 0
Operaii finale
Nu
Operaii iniiale
Prelucrare articol
SF = fread ()
Varianta 2
-
+START
STOP
Da!fread ()
Operaii finale
Nu
Operaii iniiale
Prelucrare articol
Varianta 3
-
+ START
STOP
Dai nr
Operaii finale
Nu
Operaii iniiale
Prelucrare articol
Calculare numrarticole (nr)
i = 1
Citete articol
i = i+1
Varianta 4
-
+Masive memorate n fiier
Scop:
memorarea masivelor de date de dimensiuni mari
Problema principal:
determinarea poziiei unui anumit element dinmasiv 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 ncadrul 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 cazulmemorrii lexicografice
Numrul de coloane =numrul total de elemente / numrul delinii
nr_linii*icol)sizeof(art
linii)sizeof(nr_-er)ftell(fisi nr_coloane
-
+Masive memorate n fiier
Pe prima poziie se memoreaz numrul de coloane n cazulmemorrii invers lexicografice
Numrul de linii =numrul total de elemente/ numrul decoloane
nr_coloane*icol)sizeof(art
coloane)sizeof(nr_-er)ftell(fisi nr_linii
-
+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 (popularedens), fie numrul coloanelor rezervate (populare nedens);
rang(aij)=j*nr_linii+i+1, n cazul memorrii inverslexicografice, unde nr_linii este fie numrul liniilor efective(populare dens), fie numrul liniilor rezervate (popularenedens).