Professional Documents
Culture Documents
Cursul 1
Cuprins
Introducere Evaluare Prezentare curs Bibliografie Alocarea dinamica a memoriei Pointeri la funcii
Evaluare
Din oficiu 10 puncte Examen 50 de puncte Proba practic pe calculator 30 puncte Teme rezolvate la seminar 10 puncte
Prezentare curs
1.
Curs introductiv. Cunoatere, prezentarea obiectivelor i competenelor urmrite, a metodelor de lucru, surselor de documentare i a cerinelor de evaluare. Pointeri la funcii. Iterativitate i recursivitate. Subprograme recursive. Metoda Divide et Impera. Cutare secvenial i binar. Interclasare. Sortare prin interclasare. Fiiere de date. Organizarea extern a datelor n fiiere . Algoritmi de prelucrare cu fiier conductor. Fiiere n C. Prelucrarea masivelor memorate n fiiere binare. Fiiere de date. Algoritmi de prelucrare a fiierelor binare organizate secvenial Fiiere de date. Algoritmi de prelucrare a fiierelor binare organizate relativ. Algoritmi de prelucrare a fiierelor binare organizate indexat
2.
3. 4.
5.
6.
7.
Prezentare curs
8. 9. 10. 11. 12.
13.
Metoda Backtracking. Exemplificare n cazul problemei generrii tuturor permutrilor unei mulimi, respectiv a problemei celor 8 regine.
Recapitularea temelor abordate.
14.
Bibliografie
1.
I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, Programarea calculatoarelor. Algoritmi n programare, Editura ASE Bucureti, 2007 C. Uscatu, M. Popa, L. Btgan, C. Silvestru, Programarea calculatoarelor. Aplicaii, Editura ASE Bucureti 2012 Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest, Introducere n algoritmi, Computer Libris Agora, 2000 D. Knuth, Arta programrii calculatoarelor, vol. 1-3, Ed. Teora, 1999, 2000, 2001
2. 3. 4.
Tipuri existente ntregi Reale Caracter Masiv Articol Fiier Pointer Referin
Instruciuni :
instruciunea vid, instruciunea expresie if switch while do-while for
Simbol * & *
Rol
Definirea de tipuri de dat tip * pointer float* Extrage adresa unei variabile Acceseaz zona de memorie indicat de un pointer
Pointeri
Un pointer este o variabila care are ca valori adrese. Pointerii se folosesc pentru a face referire la datele cunoscute prin adresele lor.
int* p, x; x = 4; p = &x; *p = x; p are ca valoare adresa lui x *p reprezinta chiar valoarea lui x
Pointeri
Noiunea de pointer joac un rol important n: subprograme transmiterea parametrilor; alocarea dinamica a memoriei; lucrul cu masive.
Subprograme
Transmiterea parametrilor
Prin variabile globale Prin parametri
Funcii importante:
malloc() tip *p; p = (tip*) malloc(dimensiune); free free(p);
tip* p; Alocare p = (tip*) malloc( n * sizeof(tip)); Utilizare *(p+i) Eliberare (dezalocare) free(p);
Pointeri la funcii
Pointerii la funcii se utilizeaz pentru transmiterea funciilor ca parametri ai altor funcii. Exemplu :
Dac dorim ca funcia f s apeleze funcia g sub forma f(g), funcia g avnd antetul:
float g(int x)
Pointeri la funcii
Numele unei funcii poate fi folosit ca pointer constant (asemntor masivelor) Semnificaia: adresa din memorie unde se afl codul executabil al subprogramului respectiv Tipul: Pointer ctre un subprogram care primete o list de parametri i ntoarce un anumit tip de rezultat Utilizare: Transmiterea subprogramelor ca parametri pentru alte subprograme
Pointeri la funcii
Funcia care sorteaz elementele unui vector Tipul sortrii se stabilete printr-o funcie care este trimis ca parametru funciei de sortare
void sorteaza(float v[], int n, int (*dir)(int, int));
Pointeri la funcii
int asc(int a, int b) { if (a > b) return 1; else return 0; } int desc(int a, int b) { if (a < b) return 1; else return 0; }
void schimba(int *a, int *b) { int aux = *a; *a = *b; *b = aux; }
Pointeri la funcii
void sorteaza(int v[], int n, int (*dir)(int, int)) { for (int i=0; i < n -1; i++) { for (int j = i; j < n; j++) { if ((*dir)(v[i], v[j])==1) { schimba(&v[i], &v[j]); } } } }
Pointeri la funcii
...
sorteaza(x, n, asc);
sau
sorteaza(x, n, desc);
Pointeri la funcii
sol
Pointeri la funcii
float fct(float x) {
return x*x-4*x+3;
}
Pointeri la funcii
void bisectie(float a, float b, long n, float eps, float (*f)(float), int * cod, float *sol) { *cod = 0; if ((*f)(a)*(*f)(b)<=0) while ((n) && (*cod==0)) { *sol=(a+b)/2; if ((*f)(*sol)==0) *cod=1; if (fabs(a-b)<=eps) *cod=2; else if((*f)(*sol)*(*f)(a)<0) b=*sol; else a=*sol; n--; } }
Pointeri la funcii
void main() { float a,b,eps,x; int cod; long n; printf("captele intervalului:"); scanf("%f %f",&a, &b); printf("eroarea admisa:"); scanf("%f",&eps); printf("numarul maxim de iteratii:"); scanf("%li",&n); bisectie(a, b, n, eps, fct, &cod, &x); if (cod==0) printf("nu se poate calcula solutia aproximativa"); else printf("solutia aproximativa este:%5.2f",x); }