41
Versiunea 2014 G. Albeanu, Programare procedurala M4 1 Programare procedurala– M4 Operații de intrare-ieșire. Fișiere Grigore ALBEANU http://www.ad-astra.ro/galbeanu/

Programareprocedurala2014-M4

Embed Size (px)

DESCRIPTION

pp albeanu

Citation preview

  • Versiunea 2014 G. Albeanu, Programare procedurala M4 1

    Programare procedurala M4

    Operaii de intrare-ieire. Fiiere

    Grigore ALBEANUhttp://www.ad-astra.ro/galbeanu/

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 2

    Cuprins

    Funcii de intrare-ieire folosind consola: cu format implicit/explicit, descriptori de format

    Funcii de intrare-ieire generale: tipurile FILE i FILE *, funcii pentru deschiderea/nchiderea fiierelor, funcii pentru lucrul cu fiiere text, funcii pentru lucrul cu fiiere binare, alte funcii.

    Exemple de funcii C i programe C pentru rezolvarea unor probleme: Evaluarea funciilor polinomiale, Metoda lui Nichomachus pentru determinarea cmmdc, Algoritmul Roy-Warshall, Sortarea datelor cu memorarea intern a cheilor, Sortare extern prin interschimbare, Sortare extern prin metoda seleciei.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 3

    Funcii de intrare-ieire folosind consola (1)

    Consola sau dispozitivul standard de intrare-ieire reprezentate de tastatur (zona de date - stdin) i ecran (zonele de date - stdout istderr) permit utilizatorului interaciunea cu programul aflat n executare. Sunt posibileoperaii de citire/scriere fr formatare ioperaii de citire/scriere cu formatare.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 4

    Funcii de intrare-ieire folosind consola (2)

    Operaii de citire/scriere fr formatare: getchar(), getch(), getche(), gets(=), puts(=)

    Operaii de citire/scriere cu format explicit: scanf(=), printf(=)

    Descriptori de format pentru scriere Descriptori de format pentru citire

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 5

    Operaii de citire/scriere fr formatare: getchar(), getch(),getche(), gets(), puts()

    Funciile permit lucrul cu caractere (char) sau cu iruri de caractere (* char).

    Pentru citirea unui caracter din stdin pot fiutilizate funciile: int getchar(void); intgetche(void); i int getch(void); ultimele douvariante nefiind prevzute de standardulANSI, dar sunt prezente n versiunile Borland(fiierul antet conio.h).

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 6

    Funciile getchar(), getch() i getche()

    Funcia getchar ntoarce primul caracter din stdin, care corespunde primei taste apsate, dar numai dup apsareatastei Enter. Caracterul este transformat n ntreg fr semn. ncazul unei erori sau la ntlnirea combinaiei EOF (sfrit de fiier) funcia ntoarce valoarea -1 (codificat prin EOF).

    Funcia getche (getch echo) ateapt apsarea unei taste intoarce caracterul corespunztor pe care l afieaz pe ecran(nu e nevoie de Enter).

    Funcia getch este similar cu getche(), dar nu afieaz ecoulpe ecran.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 7

    Funcia putchar()

    Pentru scrierea unui caracter la stdout se utilizeazfuncia int putchar (int c); care afieaz pe ecrancaracterul cu codul ASCII c.

    Dac operaia reuete, funcia ntoarce caracterulafiat, iar n caz de eec valoarea EOF (-1).

    unsigned int reverse_line(void){int c = getchar();unsigned int length = ((c == '\n') ? 0 : 1 + reverse_line());putchar(c);return length;}

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 8

    Funciile gets() i puts()

    Pentru citirea (resp. scrierea) irurilor de caractere se lucreaz cu funcia gets (respectiv puts).

    Funcia cu prototipul char *gets (char *s); citete caractere din stdin ile depune n zona de date de la adresa s, pn la apsarea tasteiEnter. n ir, tastei Enter i va corespunde caracterul '\0'. Dac operaiareuete, funcia ntoarce adresa irului, altfel valoarea NULL ( = 0 ).

    Funcia cu prototipul int puts(const char *s); afieaz pe ecran irul de la adresa s sau o constant ir de caractere (secven de caracterentre ghilimele) i apoi trece la linie nou. La succes, funcia ntoarceultimul caracter, altfel valoarea EOF (-1).

    char s1[100], s2[100];puts("s1="); gets(s1);puts("s2="); gets(s2);if(strcmp(s1,s2)==0) puts("Siruri identice.");

    else puts("Siruri diferite.");

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 9

    Operaii de citire/scriere cu formatare: scanf(), printf() La citire, formatarea specific conversia datelor de la

    reprezentarea extern n reprezentarea binar. Pentru operaia ce scriere se efectueaz conversia invers. Pentru citirea datelor se utilizeaz funcia scanf cu

    prototipul:int scanf( const char * format [, lista_adrese_variabile]);

    Funcia scanf ntoarce numrul de cmpuri citite i depusela adresele din list. Dac nu s-a stocat nici o valoare, funcia ntoarce valoarea 0.

    Pentru scrierea datelor se utilizeaz funcia printf cu prototipul:int printf( const char *format, lista_valori);

    Funcia printf ntoarce numrul de octei transferai sauEOF (-1) n caz de eec.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 10

    irul de caractere format irul de caractere format poate conine n general:

    I. specificatori de format: iruri precedate de caracterul '%' care descriu fiecare cmpateptat;

    II. caractere de spaiere: spaiu (' '), tab ('\t'), linie nou ('\n');III. orice alt caracter ASCII (Unicode).

    Fiecrei variabile din list i corespunde o specificaie de format (tipul I.). Funcia scanf citete succesiv caractere din stdin pe care le interpreteaz prin

    compararea succesiv a caracterului citit cu informaia curent din irul format. Prezena unui caracter de tip II determin citirea fr memorare a secvenei pnla ntlnirea unui caracter de tip I sau III. Prezena unui caracter de tip III determin citirea fr stocare a caracterului curent de la tastatur, dac esteidentic.

    La scriere, caracterele de tip II i III se afieaz pe ecran aa cum apar n irulformat.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 11

    Descriptori pentru scriere (1)

    Forma general a unui descriptor pentru scriere este:% [flags] [width][.prec][lmod] type

    specificaiile dintre [ i ] fiind opionale. Elementele de mai sus au urmtoarea semnificaie:

    flags - poate fi unul dintre semnele: +, -, 0, spaiu, #. Semnele au urmtoarea semnificaie:

    - : aliniere la stnga a argumentului n cadrul cmpului;+ : numerele vor fi obligatoriu tiprite cu semn;0 : indic completarea la stnga cu zerouri (la numere);spaiu: dac primul caracter nu este semnul, se va afia un spaiu;# : foreaz inserarea simbolului 0 in faa numerelor octale, a secvenei

    0x sau 0X n faa numerelor hexazecimale i a punctului zecimal atunci cnd fie partea real, fie partea fracionar a unui numr lipsete

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 12

    Descriptori pentru scriere (2)

    width: este un numr care specific limea minim a cmpului. Argumentul corespunztor va fi afiat pe un cmp cu lime cel puinwidth. Dac sunt mai puine caractere de scris, se va completacmpul cu spaii la stnga (implicit) sau la dreapta, dac s-a specificat flagul -. Dac s-a specificat flagul 0, se va completa la stnga cu zero. Dac width este caracterul *, atunci limea estedat de urmtorul argument din list (trebuie s fie neaprat un int).

    prec: este un numr care specific precizia de scriere; pentru %s prec indic numrul maxim de caractere ce se va scrie; pentru %e, %E i %f prec indic numrul de zecimale; pentru %g i %G precindic numrul de cifre semnificative, iar la descriptorii pentru ntregiindic numrul minim de cifre. Dac prec este *, atunci se considerc limea de scriere este dat de urmtorul argument din list, care trebuie s fie de tip int.

    lmod: este un specificator de lungime care specific un argument short sau unsigned short (h), long sau unsigned long (l), respectivlong double (L).

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 13

    Descriptori pentru scriere (3)

    type: este descriptorul propriu-zis. Se utilizeaz urmtoarele caractere: d, i (int) - notaie zecimal cu semn; o (int) - notaie n baza 8 fr semn;x, X (int) - notaie n baza 16 fr semn cu abcdef pentr x i ABCDEF

    pentru X; u (int) - notaie zecimal fr semn; c (int) - un caracter; s (char *) - ir de caractere terminat cu \0; f (double) - numrul n virgul mobil cu format standard; e, E (double) - numrul n virgul mobil cu format exponenial; g, G (double) - n loc de f, e, E; p (void *) - se tiprete argumentul ca adres; % - se tiprete %.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 14

    Descriptori pentru citire

    Forma general a unui descriptor pentru citire este:% [*][width][lmod]type

    unde:* - suprim atribuirea urmtorului cmp din stdin la urmtoarea variabil;width, lmod au semnificaia prezentat n cadrul descriptorilor pentru scriere;type - descrie tipul de conversie.

    Cele mai importante specificaii de conversie sunt: d (int *) - ntreg zecimal; i (int *) - ntreg oarecare (zecimal, octal sau hexa); o (int *) - ntreg octal; u (unsigned int *) - ntreg zecimal fr semn; x (int *) - ntreg hexa, c (char *) - caractere; s (char *) - ir de caractere (se va ncheia cu \0); e, f, g (float *) - numere n virgul mobil; p (void *) - valoarea unei adrese aa cum e tiprit de printf. n descrierea de mai sus, ntre paranteze se indic tipul argumentului supus operaiei

    de intrare-ieire. Notaia tip * nseamn adres a unei locaii de tipul tip.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 15

    Exemplul 1. (Evaluarea unei funciipolinomiale date explicit):

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 16

    Exemplul 2. (O implementare a algoritmului lui Nicomachus - utilizarea

    scderilor repetate - pentru determinarea celui mai mare divizor comun a

    dou numere naturale nenule)

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 17

    Exemplul 3. (Implementarea algoritmului lui Roy Warshall

    pentru determinarea matricei existene drumurilor pentru un graf (o hart) G cu maxim 20 de vrfuri (orae))

    Se noteaz cu x matriceade adiacen a grafului(x[i][j] = 1 dac vrfurile i i j sunt conectate direct, x[i][j] = 0, n caz contrar). Se va obine matricea y cu elemente: y[i][j] = 1 dac vrfurile i i j suntconectate printr-un drum, y[i][j] = 0, n caz contrar.

    Dac x descrie o relaie binar R atunci y reprezint matricea nchiderii tranzitive a relaiei R.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 18

    Exemplul 4. (Evaluarea unor funcii).

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 19

    FILE *

    Conceptul de baz relativ la operaiile de intrare-ieire standard este cel de pointer la fiier. Mai precis, n fiierul stdio.h este definit un tip de structur, numit FILE. Din punct de vedere intern, fiierele prezente n funciile de intrare-ieire sunt specificate prin variabile de tip FILE *.

    Declararea unui pointer la fiier se realizeaz prin: FILE * ; Dispozitivele de intrare-ieire standard au asociate permanent cte un

    asemenea pointer al crui nume este predefinit: stdin (consola pentru intrare), stdout (consola pentru ieire), stderr (consola pentru ieire), stdaux (pentruprimul port al interfeei seriale ), stdprn (pentru primul port al interfeei paralele); ultimii doi identificatori fiind caracteristici implementrii BORLAND pentrucalculatoare compatibile IBM - Microsoft.

    n fiierul stdio.h, mai sunt definite constantele FILENAME_MAX (pentru a indicalungimea maxim a numelui unui fiier, din punct de vedere extern) iFOPEN_MAX (care precizeaz numrul maxim de fiiere ce pot fi deschisesimultan.)

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 20

    Fluxuri de date

    Se disting dou categorii de tipuri de transfer: un stream de tip text care transfer secvene de caractere organizate n linii; n C separarea liniilor se face

    prin caracterul LF. Pentru adaptarea la dispozitivul fizic poate fi necesar nlocuirea caracterului LF cu secventa CR-LF.

    un stream binar care transfer o secven de octei fr alte prelucrri. Distingerea ntre cele dou categorii nu este obligatorie; programatorul este cel care trebuie s rezolve

    eventualele probleme de conversie a datelor. Prin operaia de deschidere, se aloc o zon de memorie de dimensiune sizeof (FILE) care va conine:

    numele extern al fiierului, adresa unei zone tampon util n realizarea transferurilor i informaii utile privindstarea operaiilor de intrare-ieire. Aceast conexiune logic rezultat n urma deschiderii unui fiier se numete stream (sau flux de date).

    Eliberarea zonei alocate se realizeaz n urma operaiei de nchidere.

    Deschiderea fiierelor se realizeaz folosind funcia fopen care returneaz, cnd toate condiiile de prelucrare sunt ndeplinite, un pointer ctre structura FILE. Este unica modalitate prin care se atribuiecorect o valoare unui pointer la fiier.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 21

    Funcia fopen() Prototipul funciei fopen este:

    FILE * fopen(const char * nume_fis, const char * mod_acces);unde: nume_fis este un ir de caractere (constant sau obinut prin atribuire) care specific numele extern al fiierului, mod_acces este un ir de caracter (constituit similar) care descrie modul de acces. n cazul unei operaii de deschidere corecte, pointerul returnat de apel este diferit de NULL, n caz contrar rezultatul apelului este

    NULL. Modurile posibile de acces sunt: deschidere flux de tip text (r sau rt), respectiv flux binar (rb) pentru citire (mod reset); deschidere flux de tip text (w sau wt), respectiv flux binar (wb) pentru scriere (cu distrugerea fiierului anterior, dac acesta

    exista- mod rewrite); deschidere flux de tip text (a sau at), respectiv flux binar (ab) pentru adugare la sfrit (mod append); deschidere flux de tip text (r+ sau r+t), respectiv flux binar (r+b) pentru actualizare (citire i scriere folosind acelai pointer la

    fiier); deschidere flux de tip text (w+ sau w+t), respectiv flux binar (w+b) pentru actualizare (dac fiierul exista anterior, coninutul

    su se pierde); deschidere flux de tip text (a+ sau a+t), respectiv flux binar (a+b) pentru actualizare cu scriere la sfritul fiierului.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 22

    Alte funcii (1) nchiderea fiierelor se realizeaz apelnd funcia fclose definit astfel:

    int fclose(FILE * );care ntoarce EOF (= -1) n caz de eroare sau 0 n caz normal. Prin nchidere nceteaz conexiunea logic dintre pointer i fiier cu scrierea datelor din

    zona tampon de ieire (n cazul deschiderii pentru scriere/actualizare), respectiv cu pierderea datelor din zona tampon de intrare (n cazul deschiderii pentru citire/actualizare).

    Detectarea sfritului de fiier se realizeaz prin utilizarea macrodefiniiei feof cu prototipul:int feof(FILE * );

    al crei rezultat este nenul (s-a detectat EOF) respectiv zero (nu s-a detectat EOF). Asocierea unui nou fiier la un flux deschis deja se realizeaz folosind funcia freopen cu

    prototipul:FILE * freopen(const char * , const char * , FILE * p_fis);

    unde p_fis este identificatorul fluxului existent care se va nchide n urma apelului i se vadeschide fiierul cu numele n modul de prelucrare atribuindpointerul la structura creat variabilei p_fis. Funcia returneaz valoarea atribuit lui p_fis.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 23

    Alte funcii (2)

    Forarea scrierii zonelor tampon asociate fiierelor deschise pentruscriere se realizeaz folosind funcia fflush cu prototipul:

    int fflush(FILE * );care returneaz EOF n caz de eroare, respectiv 0 n cazul normal.

    Multe aplicaii necesit lucrul cu fiiere temporare care s fie terseautomat la nchidere sau la terminarea normal a programului.

    n sprijinul programatorului, pentru a nlesni astfel de activiti, biblioteca C ofer o funcie cu prototipul: FILE *tmpfile(void); care la apel creeaz un fiier temporar n modul wb+. Funcia ntoarce un pointer la acel fiier. Apeluri succesive vor deschide fiiere distincte.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 24

    Aplicaii (1)

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 25

    Alte funcii (3) Alte operaii la nivel de fiier sunt: tergerea unui fiier - folosind funcia

    int remove(const char * nume_fis); schimbarea numelui - folosind funcia

    int rename(const char *f_nou, const char *f_vechi); Ambele funcii ntorc o valoare nenul n caz de eroare i zero n cazul normal. Folosind funcia rewind are loc poziionarea la nceputul fiierului. Prototipul funciei rewind

    este:void rewind(FILE *fp);

    Pentru a obine informaii despre un fiier se pot utiliza funciile stat i fstat cu prototipuldeclarat n fiierul stat.h din catalogul sys. Ne vom referi la funcia stat. Aceasta are prototipul:

    int stat (char *cale, struct stat * statzona);unde: cale reprezint numele fiierului sau catalogului, iar statzona este adresa unei structuri de

    tip stat ale crei cmpuri descriu starea entitii n discuie. De exemplu, cmpul st_sizefurnizeaz dimensiunea unui fiier, n octei.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 26

    Fluxuri text (1)

    Flux de tip text: Scriere cu format. Se pot folosi urmtoarele funcii: fprintf, printf, sprintf, vfprintf,

    vprintf, vsprinf. Ne vom referi numai la funciile fprintf i printf. Funcia fprintf este o funcie cu numr variabil de parametrii

    avnd prototipul:int fprintf(FILE *fp, const char *format, ...);

    unde fp se refer la fluxul de date deschis n vederea realizriitransferului, iar format respect specificaiile descrise n momentul prezentrii funciilor scanf() i printf().

    Funcia printf(format, ...) este echivalent cu fprintf(stdout,format, ...).

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 27

    Fluxuri text (2)

    Flux de tip text: Citire cu format.

    Se pot folosi urmtoarele funcii: fscanf, scanf, sscanf. Acum ne vom referi numai la funciile fscanfi scanf.

    Funcia fscanf este o funcie cu numr variabil de argumente i are prototipul:

    int fscanf(FILE *fp, const char *format, ...); Parametrii apelului au aceleai semnificaii ca mai

    sus, iar apelul scanf (format, ...) este echivalent cu fscanf(stdin, format, list_adrese).

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 28

    Fluxuri text (3)

    Flux de tip text: Citire de caractere din fiiere text.

    Se pot utiliza funcia fgetc i macrodefiniia getc. Funcia cu prototipul int fgetc(FILE *fp); ntoarce urmtorul

    caracter din fp ca un ntreg fr semn, convertit la int sau EOF dac s-a detectat sfritul de fiier sau a aprut o eroare.

    Macrodefiniia cu prototipul int getc(FILE *fp); este echivalentcu funcia fgetc. Reamintim posibilitatea utilizrii apeluluigetchar() echivalent cu getc(stdin).

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 29

    Fluxuri text (4)

    Flux de tip text: Scriere de caractere n fiiere text.

    Scrierea unui caracter c ntr-un fiier text cu identificatorul intern fp se realizeaz folosind funcia cu prototipul:

    int fputc(int c, FILE *fp);care returneaz c n cazul succesului, respectiv EOF n caz de

    eec. Se poate utiliza i macroinstruciunea cu prototipul int putc(int c,

    FILE *fp); similar cu fputc. Apelul putchar(c); este echivalent cu putc(c, stdout);

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 30

    Fluxuri text (5)

    Citirea unui ir de caractere din fiiere text se realizeaz folosind funcia cu prototipul:

    char *fgets(char *s, int n, FILE *fp);la al crei apel se citesc, n s, cel mult n-1 caractere din fiierul fp la

    care se adaug caracterul \0 i se returneaz s sau NULL n caz unei erori sau la ntlnirea codului EOF.

    Reamintim utilizarea funciei cu prototipul: char *gets(char *s);

    care citete urmtoarea linie de la consol i o depune n s.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 31

    Fluxuri text (6)

    Scrierea unui ir de caractere ntr-un fiier text se realizeaz n urma apelului funciei cu prototipul:

    int fputs(const char *s, FILE *fp);care ntoarce EOF n caz de eroare, respectiv numrul

    de caractere transferate n caz de succes. Pentru scriere la consol se utilizeaz funcia:

    int puts(const char *s);

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 32

    Fluxuri binare (1)

    n aceast categorie intr funciile de intrare/ieire n acces direct care citesc/scriu din/n fiiere fr nici o conversie i fr a se face vreo interpretare a datelor.

    Noiunea fundamental este cea de zon compact de octei (nregistrare) care se citete sau se scrie.

    Citirea/scrierea se face de la / la poziia curent din fiier, care poate fi modificat cu funcii speciale dup cum vom vedea mai jos.

    Dup executarea operaiei, poziia indicatorului (de octet n cazul limbajului C) este actualizat automat, pentru a indica urmtoarea nregistrare.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 33

    Fluxuri binare (2)

    Citirea a nrec nregistrri din fiierul cu identificatorul fp, fiecare avnd lungimea L, cu stocare n tabloul ptr se realizeaz folosind apelul:

    n = fread(ptr, L, nrec, fp);care ntoarce un ntreg n ce furnizeaz numrul de nregistrri citite. Dac

    s-a ntlnit EOF sau eroare atunci n va fi 0.

    Pentru scrierea a nrec nregistrri de lungime L fiecare, din zona cu adresa ptr n fiierul cu identificatorul intern fp se folosete apelul:

    m = fwrite(ptr, L, nrec, fp);unde m va reprezenta numrul de nregistrri scrise, cu m < nrec numai n

    caz de eroare.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 34

    Controlul indicatorului de poziie (1)

    Citirea valorii indicatorului de poziie: Funcia fgetpos nscrie valoarea indicatorului n variabila poz i ntoarce 0 n caz de succes. Prototipul funciei este:

    int fgetpos(FILE *fp, long int *poz); Funcia ftell ntoarce poziia curent n fiier n caz de succes i -1L n

    caz de eec. Aceasta are prototipul: long int ftell(FILE * fp);

    Modificarea valorii indicatorului de poziie: Sunt disponibile funciile: fsetpos, fseek i rewind. Funcia fsetpos are prototipul:

    int fsetpos(FILE *fp, const long int *poz); i atribuie indicatorului valoarea variabilei poz i ntoarce 0 n caz de

    succes.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 35

    Controlul indicatorului de poziie (2)

    Funcia fseek face o deplasare a indicatorului de poziie cu nr_octei relativ la o poziie de referin specificat prin constanta ntreag origine.

    Se pot utiliza urmtoarele valori: 0 = SEEK_SET (nceput de fiier), 1=SEEK_CUR (poziie curent), 2 = SEEK_END (sfrit de fiier). Valoarea ntoars de fseek este 0 pentru succes i nenul n caz de eec.

    Prototipul funciei fseek este:int fseek(FILE *fp, long nr_octei, int origine);

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 36

    Aplicaii (2): Aflarea dimensiunii unui fiier folosind funciile de citire-modificare a indicatorului de poziie

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 37

    Aplicaii (3): Metode de sortare a datelor stocate n fiiere Sortarea datelor stocate ntr-un fiier se poate realiza cu aducerea integral a

    datelor n memoria volatil (sortare intern) sau cu aducerea n memoria principal a cte unui articol (sortare extern).

    Metodele prezentate aici nu sunt din cele mai performante, ele ilustreaz accesul la datele stocate n fiiere i principalele modaliti de prelucrare.

    O alt metod de sortare a datelor externe utilizeaz procedeul interclasrii coleciilor ordonate. Principiul acestei metode va fi explicat n contextul rezolvrii problemelor prin metoda divide et impera (algoritmi recursivi).

    Sortarea intern (Stocarea integral a datelor n memoria principal, Sortare cu manipularea cheii de sortare i a poziiei articolului n fiier);

    Sortare extern (sortare prin interschimbare, sortare prin selecie)

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 38

    Aplicaii (4)

    Stocarea integral a datelor n memoria principal: Se va utiliza un vector de articole (record, struct), compararea fiind realizat prin intermediul cheii de sortare.

    Se utilizeaz pentru dimensiuni reduse. Pentru sortare intern se poate utiliza oricare dintre

    metodele cunoscute. n final, vectorul sortat se nregistreaz n fiierul redeschis pentru scriere. Coninutul vechi va fi automat distrus.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 39

    Aplicatii (5) Sortare cu manipularea cheii

    de sortare i a poziiei articolului n fiier (indexul articolului).

    Aceast metod presupune memorarea ntr-un vector numai a valorii cheii de sortare, mpreun cu numrul relativ al articolului fiierul de sortat.

    Comparaiile asupra valorilor cheii de sortare vor conduce la interschimbri n vectorul intern.

    Obinerea fiierului sortat se va face prin parcurgerea n acces secvenial a fiierului iniial i scrierea articolelor, n ordine, n fiierul rezultat.

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 40

    Aplicatii (6): sortare prin

    interschimbare

  • Versiunea 2013 G. Albeanu, Programare procedurala M4 41

    Aplicatii (7): sortare prin selectie