Post on 07-Nov-2015
description
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