Author
adriana
View
239
Download
0
Embed Size (px)
8/8/2019 Programarea Calculatoarelor M7
1/7
Programarea Calculatoarelor(limbajul C)
Curs 7 Funcii i Recursivitate
Universitatea Politehnica din BucuretiFacultatea de Electronic, Telecomunicaii i
Tehnologia Informaiei
.l. Bogdan IONESCUProf. Drago BURILEANUProf. Claudius DAN
2010-20112
Cuprins
7.1. Funcii
7.2. Recursivitate
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 1/36
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 2/36
7.1. Funcii
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 3/36
Definirea funciilor
> Pentru rezolvarea unor probleme complexe de calcul,acestea trebuie descompuse n sub-probleme mai simple.
> Descompunerea fizic a codului n poriuni, ce realizeazanumite sub-probleme de calcul, se face cu ajutorul funciilor.
divide et impera ar spune romanii.
modulare program (fiecare modul se ocup deanumite operaii).
> Pe lng structurarea programului, funcia are avantajul de afi scris o singur dat, dar folosit de cte ori este nevoie,evitnd astfel rescrierea codului aferent de fiecare dat.
5Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 4/36
Subprograme funcii (continuare)
> Ce nseamn o funcie ?
> Din punct de vedere matematic:
f(x,y) = sin(x*y)
numelefunciei
argumentefuncie (variabile)
corpul funciei(calculul realizat)valoarea
returnat
> Din punct de vedere al programriin C, funcia ipstreaz sensul matematic (programare funcional).
6Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 5/36
Definirea funciilor (continuare)
> Astfel, n limbajul C, funciile i pstreaz sensulmatematic:
Form general:
(,...,){;;...;[return ;]
} [ ] = opional
: reprezint tipul datelor returnate de funcie,Atenie: o funcie nu poate returna dect o singur valoare.
8/8/2019 Programarea Calculatoarelor M7
2/7
7Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 6/36
Definirea funciilor
(continuare)
(,...,){;;...;[return ;]
}
: reprezint identificatorul funciei pe baza cruiaaceasta va fi apelat pe parcursul rulrii programului.
(var1,...,varN): reprezint variabilele de intrare, pe care leprimete funcia din programul, sau sub-programul n care esteapelat. Este posibil ca funcia s nu primeasc date de intrare,caz n care lista este vid: (), sau se poate folositipul void: (void).
: dac funcianu returneaz nici o valoare
atunci se specific tipulvoid procedur.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 7/36
> Observaie: o funcie chiardac nu primete variabile,
aceasta poate interacionacu programul pe bazavariabilelor globale din program (vizibile pentru orice funcie)
Definirea funciilor
(continuare)
(,...,){;;...;[return ;]
}
de evitat, deoarece funcia nu mai este independentde program, portabilitatea ntr-un alt program fiind redus.
{ secvene instruciuni }: corpul funciei (ceea ce se execut)este specificat ntre { i }. Acesta poate fi vzut, el nsui caun program.
9Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 8/36
return :funcia return este folositpentru a returna valoareadorit.
Definirea funciilor
(continuare)
(,...,){;;...;[return ;]
}
> Efect: funcia se ncheie n momentul n care se executcomanda return, iar specificat este returnat cadat de ieire a funciei.
dac aceasta nu corespunde tipului specificat (),conversie la acesta, dac nu este posibil, atunci eroare.
> Observaie: folosirea funciei return este opional chiar dacs-a specificat c funcia trebuie s returneze ceva (warning).
10Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 9/36
Definirea funciilor (continuare)
Exemplu de funcie:
int adunare((((int a,a,a,a, int b)b)b)b){{{{
int r;r=a+b;
return r;}}}}
-am definit funcia adunare careprimete dou numere ntregi ireturneaz un numr ntreg,
-calculeaz suma n variabila ri returneaz valoarea lui r.
Optimizare:int adunare((((int a,a,a,a, int b)b)b)b){{{{
return a+b;}}}}
-funcia return poate primi oexpresie i nu neaprat o singurvariabil.
> Cum se poate rescrie funcia mai eficient ???
11Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 10/36
Definirea funciilor (continuare)
> Unde se definesc funciile.
Form general program:
#include...
int main(){
}
comenzi depreprocesare
programulprincipal (main)
int adunare((((int a,a,a,a, int b)b)b)b){{{{
return a+b;}}}}
Varianta 1: funciile pot fi definitenaintea funciei main, acesteafiind scrise integral.
12Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 11/36
Definirea funciilor (continuare)
> Unde se definesc funciile (continuare).
Form general program:
#include...
int main(){
}
comenzi depreprocesare
programulprincipal (main)
Varianta 2: funciile pot fianunate naintea funciei main,(prototip), acestea fiind descriseintegral dup funcia main.
int adunare((((int a,a,a,a, int b)b)b)b){{{{
return a+b;}}}}
int adunare((((int a,a,a,a, int b)b)b)b);
8/8/2019 Programarea Calculatoarelor M7
3/7
13Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 12/36
Definirea funciilor (continuare)> Unde se definesc funciile (continuare).
Exemplu:
#include#include
double factorial(int n){int i; double fact=n;for(i=n-1; i>0; i--)fact=fact*i;
return fact;}
int main(){
printf(20!=%lf, factorial(20) );}
-am definit funcia factorial carecalculeaz factorialul unui numrntreg n i returneaz aceast
valoare sub forma unui double ?
-funciile se apeleaz n modidentic cu modul de apelare alfunciilor disponibile n C.
factorial(20)-n=20,-se efectueaz calculele,-factorial(20) devine val.specificat de return.
14Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 13/36
Definirea funciilor (continuare)> Unde se definesc funciile (continuare).
Alt variant:
#include#include
double factorial(int n);int main(){
printf(20!=%lf, factorial(20) );}
double factorial(int n){int i; double fact=n;for(i=n-1; i>0; i--)fact=fact*i;
return fact;}
-am anunat funcia i amspecificat prototipul acesteia.
-corpul funciei este detaliat dupprogramul principal.
-n cazul n care funciile nu suntevidente (complexe), iarconceperea lor necesit un timpsemnificativ, putem scrie mainti programul principal, ca icum funciile exist deja.
15Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 14/36
Definirea funciilor (continuare)
> Vizibilitatea variabilelor n cadrul funciilor
double factorial(int n){int i; double fact=n;for(i=n-1; i>0; i--)fact=fact*i;
return fact;}
int main(){
printf(%d, %lf, i, factorial(20) );}
Exemplu:
variabilele declarate n corpul unei funcii sunt valabile doarn acesta, i doar pe parcursul execuiei funciei respective.
-variabila i este o variabil locala funciei factorial ce va fialocat n memorie doar cndfuncia este apelat.
- variabila i i fact nu exist ncadrul celorlalte funcii, inclusivmain().
eroare!
16Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 15/36
Definirea funciilor (continuare)
> Vizibilitatea variabilelor n cadrul funciilor
variabilele declarate n afara programului principal main(),n seciunea de variabile globale, sunt vizibile peste tot nprogram: n funcia main(), n toate funciile definite, etc.
#include
int offset=3;
float produs(float a, float b){
return a*b+offset;}
int main(){
printf(%d, %f, offset, produs(5,6) );}
Exemplu: -variabila offset este definitdup comenzile de preprocesare,dar naintea definirii funciilorprogramului,
-aceasta este astfel vizibil attn procedura produs ct i nmain.
>3, 5*6+3=33
17Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 16/36
Definirea funciilor (continuare)
> Vizibilitatea variabilelor n cadrul funciilor
#include
float produs(float a, float b){return a*b+offset;
}int offset=3;
int main(){
printf(%d, %f, offset, produs(5,6) );}
Exemplu: -variabila offset este definitdup definirea proceduriiprodus, ce se ntmpl ???
eroare!
> Principiu: o declaraie de variabile sau de funcii este vizibilpentru toate funciile ce sunt definite dup aceasta.
variabila offset este vizibil deaici n jos.
18Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 17/36
Definirea funciilor (continuare)
> Vizibilitatea variabilelor n cadrul funciilor
#includefloat produs(float a, float b){int offset=4;return a*b+offset;
}int offset=3;
int main(){
printf(%d, %f, offset, produs(5,6) );}
Exemplu:-ce valoare va returna funciaprodus ???
>3, 30+4=34.00
-n funcie, variabila offset estedefinit local i are valoarea 4.
-n main(), variabila offset estecea definit global, cea dinfuncie neexistnd dect ninteriorul fc. produs (execuie).
offsetoffset
offset
offset
8/8/2019 Programarea Calculatoarelor M7
4/7
19Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 18/36
Definirea funciilor (continuare)
> Vizibilitatea variabilelor n cadrul funciilor
#include
int offset=3;float produs(float a, float b){int offset=4;return a*b+offset;
}
int main(){
printf(%d, %f, %d, offset, produs(2,3), offset );}
Exemplu: -ce valoare va returna funciaprodus ???
>3, 2*3+4=10.00, 3
-cu toate c variabila offseteste definit global i estevizibil i n funcia produs,redefinirea ei local, duce laignorarea variabilei globale .
offsetoffset
offset
offset offset
20Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 19/36
Definirea funciilor (continuare)
PEnun: s se realizeze o funcie care permiteafiarea pe ecran a unei matrice ptratice de numerentregi. Matricea se va afia pe linii i coloane.
Variabile de intrare/lucru:
int M[100][100];
Variabile de ieire:
nu
int dim;int i, j;voidAfisareM(int dim, int M[100][100]);
program principalmain()
definiie funcieAfisareM()
21Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 20/36
Definirea funciilor (continuare)
#include#include/* procedura este definita inaintea funciei main */void AfisareM(int dim, int M[100][100]){int i,j;
printf("\n");for(i=0; i
8/8/2019 Programarea Calculatoarelor M7
5/7
25Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 24/36
Funcii recursive (continuare)
> Astfel, un obiect sau un fenomen se definete n modrecursiv dac n definiia sa exist o referire la el nsui.
Exemple:
definirea numerelor ntregi:0Ndac iN atunci i+1N
definirea funciei factorial:
>
==
0)!1(
01!
ndacnn
ndacn
definirea irului Fibonacci:
>+
=
=
=
1)2()1(
11
00
)(
ndacnfibnfib
ndac
ndac
nfib
0, 1, 1, 2, 3, 5, 8, 13, 21, ...
26Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 25/36
Funcii recursive (continuare)
> O funcie recursiv trebuie s fie bine format:
- o funcie nu se poate defini doar n funcie de sinensi,
- o funcie recursiv se poate folosi numai de noiuni deja
definite anterior,
- orice ir de apeluri de funcii recursive trebuie s seopreasc (nu va genera un calcul infinit).
exemplu: f(n) =2+f(n) greit, se execut la
exemplu: f(n)=f(n+1)-2 greit (valoare inexistent f(n+1)),
exemplu: f(0)=1, f(n)=f(n-1)+3,f(3)=f(2)+3=f(1)+3+3=f(0)+3+3+3=1+3+3+3=10
27Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 26/36
Funcii recursive (continuare)
> n general distingem:
- un caz de baz: pentru care funcia este definit direct,de exemplu: f(0)=1
- un pas inductiv (recursivitatea propriu-zis): funciaeste definit folosind aceeai funcie, dar pe un caz maisimplu, de exemplu: f(n+1)=f(n)*PI
> n limbajul C crearea de funcii recursive nu necesit oanumit sintax sau folosirea unui anumit cuvnt cheie,aceasta reiese automat din modul de definire al funciei.
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 27/36
Funcii recursive (continuare)
int Factorial(int n){if(n==0)
return 1;else
return n*Factorial(n-1);}
- funcia primete valoarea n ireturneaz valoarea calculat afactorialului.
Exemplu: funcia factorial
- condiia de oprire a recursivitii:dac n a ajuns la valoarea 0, sereturneaz 1 (0!)
- pasul inductiv: relaia de calculrecursiv ce depinde de valorilede rang inferior ale funciei:Factorial(n-1), Factorial(n-2)
n=11==0 Falsreturn 1*Factorial(1-1)
iteraia 2
Factorial(1)
int main(){
printf(%d, Factorial(2) );}
iteraia 1
n=22==0 Falsreturn 2*Factorial(2-1)
Factorial(2)
Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 28/36
Funcii recursive (continuare)
Modul de execuie
int Factorial(int n)
{ if(n==0)return 1;
elsereturn n*Factorial(n-1);
}
> Funcia returneaz valoarea: 1*1*2
n=00==0 Adevratreturn 1
iteraia 3
Factorial(0)
30Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 29/36
Funcii recursive (continuare)
Exemplu: o funcie recursiv care numr de la a la b n senscresctor, i invers.
void printnum(int a, int b){printf("%d ",a);if(a
8/8/2019 Programarea Calculatoarelor M7
6/7
31Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 30/36
Funcii recursive (continuare)
Mod de execuie:
void printnum(int a, int b){printf("%d ",a);if(a
8/8/2019 Programarea Calculatoarelor M7
7/7
37Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 36/36
Sfritul Cursului 7