Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Pointeri pe functii

c



+ Font mai mare | - Font mai mic



Pointeri pe functii

In C functia in sine nu este o variabila, dar exista posibilitatea

de a defini un pointer pe o functie, care poate fi manipulat,



transmis functiilor, plasat in tablouri etc. Vom ilustra aceasta

modificind procedura de sortare scrisa mai anterior in acest cap,

in asa fel incit fiind dat argumentul optional-n sa se sorteze

liniile input memorie, nu linii copiate.

De obicei, un sort consta in trei parti-o comparatie care

realizeaza ordonarea oricarei perechi de obiecte, o schimbare,

prin care se inverseaza oridinea obiectelor si un algoritm de

sortare care face comparatii si schimbari pina cind obiectele

sint definitiv ordonate. Algoritmul de sortare este independent de

operatiile de comparare si schimbare, astfel incit prin transmite-

rea functiei de comparare si schimbare catre el, se va putea

realiza sortarea pe diferite criterii. Acest lucru ni-l propunem

in noul sort.

Compararea lexicografica a doua linii este realizata prin

strcmp iar schimbarea prin swap; avem nevoie de o rutina

numecmp care compara doua linii pe baza valorilor numerice si

returneaza un indice de conditie de acelasi fel ca si strcmp.

Aceste trei functii sint declarate in main iar pointerii pe ele

sint transmisi la sort. Sort la rindul sau apeleaza functiile

prin sort, la rindul sau apeleaza functiile prin pointeri. Am

sarit peste procesul de tratare a arguentelor eronate, concentrin-

du-ne astfel pe rezolvarea problemelor principale.

#define LINES 1000 /* maximum de linii de sortat */

main(argc, argv) /* sortarea linii input */

int argc;

char *argv[];

else

printf('intrare prea mare pentru sortn');

}

strcmp, numecmp si swap sint adrese de functii; din moment ce ele

sint cunoscute ca fiind functii, operatorul & nu este necesar la

fel cum el nu este necesar inaintea numelui unui tablou. Compila-

torul este cel care rezolva transmiterea adresei functie.

Al doilea pas este modificarea lui sort:

sort(v, n, comp, exch)

/* sorteaza sirurile v[0]. . . v[n-1] */

char *s[];

int n;

int (*comp)(), (*exch)();

}

Declaratiile vor fi studiate cu grija.

int (*comp)()

spune ca comp este un pointer pe o fc ce returneaza un int.

Primul set de paranteze este necesar; fara ele

int *comp()

ar spune ca cmp este o functie ce returneaza un pointer pe un

integer, ceea ce este cu totul altceva. Utilizarea lui comp in

linia

if ((*comp)(v[j], v[j+gap]) <= 0)

este comparabila cu declaratia potrivit careia cmp este u pointer

pe o functie; *comp este functie, iar

(*comp)(v[j], v[j+gap])

este apelul ei. Parantezele sint necesare pentru asocierea corecta

a componentelor.

Am ilustrat deja prin strcmp compararea a doua siruri.

Iata numecmp care compara doua siruri numerice pe baza valorii

numerice:

numcmp(s1, s2) /* compara numeric s1 cu s2 */

char *s1, *s2;

Pasul final este adaugarea functiei swap care schimba doi

pointeri. Aceasta este adoptata direct din ceea ce am prezentat

mai devreme in acest capitol.

swap(px, py) /* interschimba *px si *py **/

char *px[], *py[];

Exista o varietate de alte optiuni care pot fi adaugate la

programul de sortare; unele dintre ele pot fi reincercate ca

exerctii.

Exercitiul 5.11. Modificati sort in asa fel incit sa gestioneze

un flag, -r care indica sortarea in ordine inversa (descresca-

toare). Bineinteles -r trebuie sa fie compatibil cu -n.

Exercitiul 5.12. Adaugati optiunea -n pt a prelucra impreuna

literele mari si literele mici adica sa nu se mai faca distinc-

tia intre aceste doua tipuri de caractere grafice intimpul

sortarii; datele cu litere mari si cee cu litere mici sint

sortate impreuna, in asa fel incit a si A apar adiacent, nu

separate prin intregul alfabet al literelor mici sau mari.

Exercitiul 5.13. Adaugati optiunea -d ('ordinea din dictionar')

care realizeaza comparari doar pentru litere, numere si

flancuri. Asiguarti-va ca -d merge impreuna cu -f.

Exercitiul 5.14. Adaugati o faclitatea legata de gestionarea

cimpurilor, in asa fel incit sortarea sa poata fi facuta pe

cimpuri si interiorul liniilor, fiecare corespunzind unui set

independent de optiuni. (Indexul acestei carti fost sortat cu

-df pt ordinea alfabetica si cu -n pentru paginilor.)



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 960
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved