Documente Academic
Documente Profesional
Documente Cultură
<tip>NumeFuncţie (<tip1><arg1>,…,<tipn><argn>)
{
<instrucţiuni de declarare de tip a variabilelor locale>
……………
<instrucţiuni>
}
CORPUL FUNCŢIEI cuprinde între acolade { ...} partea de declarare a variabilele locale funcţiei
respective şi partea de prelucrare a datelor: secvenţă de instrucţiuni prin care se prelucrează
variabilele locale sau altele cu caracter global.
În ANTETUL unei funcţii este precizat tipul de dată pe care îl returnează <tip>. Acesta poate
fi void, caz în care funcţia nu returnează nimic.
Parantezele rotunde (….) ce urmează numelui funcţiei delimitează lista argumentelor
funcţiei.. Fiecărui argument îi este precizat tipul şi numele sub care este referit în cadrul funcţiei
curente.
Parametri formali şi parametri efectivi
void NumeFuncţie ()
{
… //corpul functiei
}
NumeFuncţie();
Funcţie fără tip şi fără parametrii
Exemplu:
Se defineşte o funcţie Cifre care tipăreşte cifrele arabe. Funcţia va fi apelată în funcţia main.
#include <stdio.h>
void Cifre()
{
int i; //declaraţie de variabilă locală
for(i=0;i<=9;i++) printf(“%d”,i);
}
void main(void)
{
Cifre(); //apelul functiei Cifre
}
Funcţie fără tip şi fără parametrii
void main()
void suma()
{int a,b;
{char op;
cin>>a; cin>>b; op=getch(); //cin>>op;
cout<<(a+b); switch case (op)
} {
void produs() case ‘+’:suma();break;
{int a,b; case ‘*’ produs();break;
cin>>a; cin>>b;
case ‘*’ diferenta();break;
cout<<(a*b);
default: cout<<“nu este operatie”;
}
void diferenta() }
{int a,b; }//main
cin>>a; cin>>b;
cout<<(a-b);
}
Funcţii cu tip
Dacă unei funcţii îi este precizat tipul (diferit de void) acest lucru
spune că funcţia returnează codului apelant o valoare de acest
tip. În caz contrar, funcţia nu returnează valoare.
void main(void)
{ void main(void) //varianta compacta
int valoare; {
valoare=CitesteValoare();//apel printf(“valoarea este: %d”, CitesteValoare());
printf(“valoarea este: %d”, valoare); }
}
Funcţii parametrizate
Funcţiile cu parametri corespund acelor subalgoritmi care
prelucrează date de intrare
Intrările funcţiei sunt descrise prin lista parametrilor formali ce
conţine nume generice ale datelor prelucrate în corpul funcţiilor.
Parametrii efectivi/actuali sunt transmişi la apelul funcţiilor,
aceştia înlocuind corespunzător parametrii generici specificaţi.
În limbajul C transmiterea parametrilor actuali funcţiilor apelate se
face prin valoare: înţelegând prin aceasta că valorile curente ale
parametrilor actuali sunt atribuite parametrilor generici ai
funcţiilor.
Funcţii parametrizate
Exemplu:
int minim(int a, int b)
{ return ( (a>b)?a:b) }
//apelul din functia main
int nr1,nr2, min;
nr1=7; nr2=6;
min=minim(nr1,nr2); // la apel a va primi valoarea 7 şi b – valoarea 6
min=minim(nr2,nr1); // la apel a va primi valoarea 6 şi b – valoarea 7
Parametri transmişi prin valoare
Fie funcţia:
tip NumeFuncţie(tip1 pf1, tip2 pf2, … , tipn pfn)
{…};
La apelul:
NumeFuncţie(pa1, pa2, … , pan);
se vor transmite prin valoare parametrii actuali şi fiecare parametru
formal din antetul funcţiei este înlocuit cu valoarea parametrului
actual. Dacă parametrul actual este o expresie, aceasta este initial
evaluată la o valoare care ulterior este copiată în parametrul formal
corespunzător.
Observaţie: modificările aduse parametrilor formali în cadrul
funcţiei apelate nu afectează valorile parametrilor actuali !!!
Parametri transmişi prin valoare
Definitie functie:
tip NumeFunctie (tip1 pf1, tip2 pf2, … , tipn pfn)
{...instructiuni...};
Apel functie:
NumeFunctie ( pa1, pa2, … , pan);
#include <stdio.h>
void putere(int n) //ridică la pătrat valoarea n şi afişează rezultatul
{
n=n*n;
printf(“ valoarea lui n in functie este %d”,n); //n este 25
}
void main(void)
{
int n=5;
printf(“ valoarea lui n inainte de apel este %d”,n); // efectul: valoarea lui n inainte de apel este 5
putere(n); // efectul: valoarea lui n in functie este 25
printf(“ valoarea lui n dupa de apel este %d”,n); //efectul: valoarea lui n dupa de apel este 5
// (!nu s-a modificat parametrul actual)
}
Parametri transmişi prin adresă
p=&x;
p ff02
x=2;
*p=3;
Transmiterea parametrilor prin adresă
folosind pointeri
Probleme …
Variabile referintă (C++)
- Prezentare generală
- Proceduri şi funcţii recursive
- Probleme
Recursivitate
Recursivitatea se obţine prin instrucţiunea de apel a unei funcţii în
corpul definirii funcţiei respective:
<tip>NumeFuncţie(<tip1><arg1>,…,<tipn><argn>)
{
<instrucţiuni de declarare de tip a variabilelor locale>
……………
<instrucţiuni>
……………
NumeFuncţie(pa1, pa2, … , pan); //auto apelul funcţiei
……………
}
Recursivitate
La fiecare apel al funcţiei recursive, pe stiva programului sunt
depuse noul set de variabile locale (parametri). Chiar dacă
variabile locale au acelaşi nume cu cele existente înainte de
apelarea funcţiei, valorile lor sunt distincte, şi nu există conflicte
de nume. Practic, ultimele variabile create sunt luate în
considerare în operaţiile conţinute de funcţie!
Recursivitate – exercitiu 1
Problemă 1: Să se calculeze P(n)=n! printr-o funcţie recursivă.
int SUMA(int n)
{ if(n==0) //testarea conditiei de terminare a recursivitatii
return 0;
else
return (SUMA(n/10)+n%10);
//obs: n/10 – impartirea intreaga!!!
}
void main()
{ int n;
cin>>n;
SUMA(n);
}
Exercitiu 6 – recursivitate
(Divide et impera)
Maximul dintr-un vector (global) int main( )
int TAB[10],n;
{
int maxim(int st, int dr) cout<<”n=”;
{ cin>>n;
int a, b, m;
for (int i=1; i<=n; i++)
if (st==dr) return TAB[i];
else {
{ cout<<”TAB[“<<i<<”]=”;
median = (i+j)/2;
cin>>TAB[i];
max1 = maxim(st, median);
max2 = maxim(median+1, dr);
}
if (max1>max2) return max1; cout<<”max=”<<max(1,n);
else return max2; return 0;
}
}
}