Problema 1
Se dau două numere naturale
nșim. Să se determine suma dintre oglinditul luinși oglinditul luim.
Programul următor rezolvă problema de mai sus.
#include <iostream>
using namespace std;
int ogl(int x)
{
int r = 0;
do
{
r = 10 * r + x % 10;
x /= 10;
}
while(x != 0);
return r;
}
int main(){
int n , m;
cin >> n >> m;
cout << ogl(n) + ogl(m);
return 0;
}
Funcția care calculează oglinditul unui număr este int ogl(int x).
Antetul funcției
Funcția are un antet: int ogl(int x), din care deducem că:
- funcția se numește
ogl; - funcția are un parametru,
x, de tipint. Parametrul este important, deoarece prin el se precizează care este numărul pentru care se determină oglinditul:- o funcție poate avea mai mulți parametri;
- parametrii care apar în antetul funcției se numesc parametri formali;
- parametrii unei funcții se mai numesc și argumente;
- funcția are un anumit tip, aici
int, care precizează care este tipul rezultatului;
Corpul funcției
Funcția are un bloc de instrucțiuni, corpul funcției, delimitat de acolade {}, care precizează operațiile prin care se obține rezultatul. Mai mult:
- corpul funcției poate avea propriile variabile (aici
r);- aceste variabile se numesc variabile locale;
- în corpul funcției, parametrul se comportă ca o variabilă locală;
- nu putem avea o variabilă locală cu același identificator ca parametrul formal;
- în corpul funcției nu se cunosc valorile parametrilor formali. Funcția trebuie să determine rezultatul corect indiferent de valoarea lor;
- rezultatul determinat în cadrul funcției este întors în programul apelant prin instrucțiunea return. Rezultatul este calculat în mod obișnuit în variabila
r. Prin instrucțiuneareturn r;, valoarea curentă a variabileireste returnată în programul apelant;
Apelul funcției
În funcția main găsim apelul funcției ogl:
- apelul funcției se face într-o expresie:
cout << ogl(n) + ogl(m);. Pentru operația de adunare, operanzii vor fi rezultatele apelurilor celor două funcții; - parametrii
n, respectivm, întâlniți în apel, se numesc parametri efectivi sau parametri actuali. Valorile parametrilor
actuali sunt cunoscute – valorile citite pentru cele două variabile;
Problema 2
Se citește un tablou cu elemente numere întregi. Să se ordoneze crescător elementele tabloului și apoi să se afișeze.
O rezolvare C/C++ care folosește funcții este următoarea:
#include <iostream>
using namespace std;
void citire(int & n, int x[])
{
cin >> n;
for(int i = 0 ; i < n ; ++ i)
cin >> x[i];
}
void sortare(int n, int x[])
{
bool sortat = false;
while(! sortat)
{
sortat = true;
for(int i = 0 ; i < n - 1 ; i++)
if(x[i] > x[i+1])
{
int aux = x[i];
x[i] = x[i+1];
x[i+1] = aux;
sortat = false;
}
}
}
void afisare(int n, int x[])
{
for(int i = 0 ; i < n ; ++ i)
cout << x[i] << " ";
}
int main(){
int k, v[1005];
citire(k , v);
sortare(k , v);
afisare(k , v);
return 0;
}
Față de cele de mai sus, putem observa următoarele:
- funcțiile
citire,sortareșiafisarenu returnează valori și au un tip al rezultatului special,void. Tipulvoideste un tip de date care nu conține valori și poate fi folosit tocmai în asemenea situații. Am putea spune că sunt de tip procedură; - apelul acestor funcții se face în instrucțiuni de sine stătătoare;
- funcțiile au câte doi parametri, numărul de elemente ale tabloului și tabloul propriu zis. Pentru parametrul formal de tip tablou nu trebuie să fie precizată dimensiunea declarată a tabloului;
- numele parametrilor actuali nu trebuie să fie aceiași cu cei ai parametrilor formali. Trebuie însă să corespundă numărul lor, tipul lor și ordinea;
- parametrul actual de tip tablou nu conține
[]:- dacă am fi avut apelul
citire(k , v[]);am fi obținut o eroare de sintaxă, sintagmav[]neavând înțeles; - dacă am fi avut apelul
citire(k , v[k]);am fi obținut de asemenea eroare de sintaxă,v[k]fiind elementul de indicekdin tabloulv, deci o variabilă de tipint, nu tablou;
- dacă am fi avut apelul
- observați prezența caracterului
&înaintea parametrului formalndin antetul funcțieicitire. Acesta transformă parametrul formal într-o referință a parametrului actual, iar modificările făcute asupra parametrului formalnau loc de fapt asupra parametrului actualkdinmain;