Fonctions
Voici un exemple de fonction en C :
In [1]:
Copied!
float aire_cercle(float r) {
return 3.14*r*r;
}
float aire_cercle(float r) {
return 3.14*r*r;
}
float aire_cercle
signifie que l'on définit une fonction qui s'appelleaire_cercle
et dont le type de retour estfloat
r
est l'argument de la fonction, de typefloat
- les accolades délimitent le corps de la fonction (ce qui va être exécuté quand on l'appelle)
- la valeur
3.14*r*r
est renvoyée par la fonction
In [4]:
Copied!
aire_cercle(1.) // test de la fonction
aire_cercle(1.) // test de la fonction
Out[4]:
3.14000f
Le prototype d'une fonction ressemble beaucoup au type/signature de fonction qu'on a pu voir en OCaml. Par exemple, le prototype de aire_cercle
est :
float aire_cercle(float)
void
¶
void
est un type qui signifie "rien" et qui peut-être utilisé pour dire qu'une fonction ne renvoie pas de valeur :
In [2]:
Copied!
void f() {
printf("Hello");
return; // pas de valeur de retour
}
f()
void f() {
printf("Hello");
return; // pas de valeur de retour
}
f()
Hello
Récursivité¶
Il est possible de définir une fonction récursive, sans mot-clé supplémentaire :
In [3]:
Copied!
int expo(int a, int n) { // renvoie a**n
if(n == 0)
return 1;
int b = expo(a, n/2);
if(n % 2 == 0)
return b*b;
return a*b*b;
}
expo(2, 10)
int expo(int a, int n) { // renvoie a**n
if(n == 0)
return 1;
int b = expo(a, n/2);
if(n % 2 == 0)
return b*b;
return a*b*b;
}
expo(2, 10)
Out[3]:
1024
Remarque : Il semblerait qu'exécuter 2 fois la même fonction récursive pose des problèmes avec xeus-cling (le kernel C++ qu'on utilise pour Jupyter). Réexécuter votre fonction encore une fois dans ce cas.
Exercice
Écrire l'algorithme d'Euclide en C.