Documente Academic
Documente Profesional
Documente Cultură
c)
d) e)
Funcii importante
Exemple: Alocare dinamic - vector, Alocare dinamic - matrice, Legtura dintre pointeri i masive Comparaie static-dinamic
Exemplu
S se scrie programul care determin minimul elementelor de pe fiecare linie dintr-o matrice. Masivele se vor aloca dinamic.
#include<stdio.h> #include<malloc.h> void main() { float **a, *min; int m,n,i,j; printf ("m="); scanf("%d", &m); printf ("n="); scanf("%d", &n); //alocare matrice a=(float**)malloc(m*sizeof(float*)); for(i=0;i<m;i++) a[i]=(float*)malloc (n*sizeof(float));
Subprograme - definiie
Subprogramele sunt uniti de program care:
au un algoritm propriu, pot fi proiectate independent pot fi scrise independent pot fi compilate independent nu se pot executa independent ci numai n cadrul unui program (apel)
Avantaje
evitarea scrierii repetate a aceluiai set de instruciuni creterea eficienei, prin reutilizarea subprogramelor (biblioteci de subprograme)
Clasificare
Rol
Construcie i utilizare
funcii, proceduri
Localizare
interne, externe
Aria de folosire
Construcie
Forma general
antet corp
Antet
tip_rez nume ([lista parametrilor formali]) Lista parametrilor formali declaratie1, declaratie2 tip1 nume1, tip2 nume2 Corp o instruciune compus { } Instruciunea return Rol Forma general return expresie; sau return (expresie); return;
Exemple
int suma ( int a, int b ) { return a + b; } float ecuatie ( float x ) { return x*x 2*x + 1; } void mesaj ( int cod ) { if ( cod == 3 ) printf ( \n Mesajul numarul 1); else printf ( \n Mesajul numarul 2); }
Construcie
Subrograme imbricate: NU
Prototip
antet; pot lipsi numele parametrilor (doar tipuri) int suma ( int, int );
Apel
Exemplu
S se scrie o funcie care calculeaz cel mai mare divizor comun dintre dou numere ntregi nenule (utiliznd algoritmul lui Euclid) i un apelator pentru testare. #include <stdio.h> /*definirea functiei cmmdc*/ int cmmdc(int a, int b) { int r,d=a,i=b; do {r=d%i; d=i; i=r;}
Exemplu
Acelai exemplu folosind un prototip pentru funcia cmmdc: #include <stdio.h>
int cmmdc(int, int); void main() { int n1,n2; printf("Numerele pentru care se va calcula cmmdc:"); scanf("%d%d",&n1,&n2); if(n1&&n2) printf("\ncmmdc=%d",cmmdc(n1,n2)); else printf("Numerele nu sunt nenule! "); } int cmmdc(int a, int b) { int r,d=a,i=b; do {r=d%i; d=i; i=r;} while(r!=0); return d; }
Transferul datelor
Prin variabile globale
Prin parametri
Transfer teoretic prin valoare prin referin (adresele parametrilor referin sau pointer) Not: diferena ntre transferul prin pointer i prin referin Variabile simple Masive Vectori Matrice
//x, y variabile globale, rezultatul prin numele funciei float prod1() {return x*y;}
//numerele prin valoare, rezultatul prin numele func iei float prod2(float a, float b) {return a*b;}
z,t, rez);
z,t, rez);
Transferul vectorilor
I/ : v[10], n /E: void sortare( int a[10], int n ) { a[i] }
Exemplu 1
S se calculeze produsul scalar dintre doi vectori Rezultatul se ntoarce prin numele funciei
float ps(float x[], float y[], int n) { int i; float prod=0; for(i=0;i<n;i++) prod+=x[i]*y[i]; return prod;} void main() { float a[30], b[30]; int dim; printf("produsul scalar este %5.2f", ps(a,b,dim)); }
Exemplu 1 cont.
Rezultatul se ntoarce prin parametru
void ps(float x[], float y[], int n, float *prod) { int i; *prod=0; for(i=0;i<n;i++) *prod+=x[i]*y[i]; } void main() { float a[30], b[30]; int dim; . float rez; ps(a,b,dim,&rez); printf("produsul scalar este %5.2f", rez); }
Exemplu 2
Produs vectorial ntre doi vectori Toate masivele alocate static Toate masivele alocate dinamic n apelator Toate masivele alocate dinamic, rezultatul alocat n subprogram