Vous êtes sur la page 1sur 6

Programmation C

Fonctions
David Pointcheval

Plan

1 2 3 4

- Fonctions - Prototype - Passage darguments par valeurs - Retour de rsultats

E-mail : David.Pointcheval@ens.fr Web : http://www.di.ens.fr/~pointche/enseignement/ensta

David Pointcheval LIENS - CNRS

Programmation C - ENSTA - 2

Un programme
Programme (un module) =
inclusions (infos externes) types (nouveaux types dobjets) variables ( cases mmoires rserver) liste de fonctions
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 3

Blocs rptition
Au cours du programme, certaines parties interviennent plusieurs fois (affichage, calcul, etc ) Autant les crire une fois pour toutes ! dcouper le programme en petits blocs : fonctions
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 4

Les fonctions
Fonctions en-tte (vue de l extrieur) mode opratoire

Avantages
Dcouper un programme en petits morceaux indpendants aide crire un programme correct aide au dboguage (fonction par fonction) Pouvoir appeler chaque bloc plusieurs fois avec des arguments diffrents
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 6

cases mmoires rserver liste squentielle des oprations effectuer Instructions


Programmation C - ENSTA - 5

David Pointcheval LIENS - CNRS

Prototype de fonction
Le prototype dune fonction (ou en-tte) prcise la vue de lextrieur de la fonction :
le nom de la fonction les types des arguments pris en entre le type de retour

Prototypes (suite)
Exemple de prototype de fonction : double puissance(double a, int e)
Nom de la fonction Type du rsultat Premier argument type nom local
David Pointcheval LIENS - CNRS

int addition(int a, int b) double puissance(double a, int e)


David Pointcheval LIENS - CNRS Programmation C - ENSTA - 7

Deuxime argument
Programmation C - ENSTA - 8

Utilisation
Pour le prototype suivant
double puissance(double a, int e)

Nom des arguments !


Pour le prototype suivant les variables a et e sont dclares, et locales la fonction lors de lappel : le contenu de x est copi dans a le contenu de n est copi dans e initialisation des variables a et e
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 10

double puissance(double a, int e)

on utilisera la fonction puissance : o x est un double, et n un int tous deux dclars et initialiss, le rsultat ira dans la variable y, de type double, dclare : affectation (ou initialisation)
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 9

y = puissance(x,n)

y = puissance(x,n)

Retour dune fonction


double puissance(double a, int e)

Exemple I
La fonction puissance peut tre programme de la faon suivante :
double puissance(double a, int e) { int i; double b = 1; for (i=0; i<e; i++) b = b*a; return b; }

La fonction puissance retourne une valeur de type double il faut la stocker dans une variable de type double
double y; y = puissance(x,n);

La valeur de b en fin de fonction est la valeur rsultat return b;


David Pointcheval LIENS - CNRS Programmation C - ENSTA - 12

David Pointcheval LIENS - CNRS

Programmation C - ENSTA - 11

Exemple I - analyse
lappel de la fonction puissance le double 3.01 double y; est stock dans a y = puissance(3.01, 5); et lint 5 est stock dans e Le rsultat, double puissance(double a, int e) la fin de la fonction { int i; (la valeur de b) double b = 1; est stock dans y
for (i=0; i<e; i++) b = b*a; return b; }
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 13

Fonction sans valeur de retour


Une fonction peut ne rien retourner ex. : une fonction daffichage affiche lcran des rsultats ne retourne rien type void void affiche(int tab[], int n) pas de return en fin de fonction
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 14

Exemple II
Laffichage dun tableau peut tre programm de la faon suivante :
void affiche(int tab[], int n) { int i; for (i=0; i<n; i++) printf(%d ,tab[i]); printf(\n); }

Exemple II - analyse
lappel de la fonction affiche le tableau T (pointeur) int T[5] = {2, 5, 3, 9, 1}; est stock dans tab affiche(T, 5); et lint 5 void affiche(int tab[], int n) est stock dans n { int i; la fin de la fonction for (i=0; i<n; i++) (aprs les affichages), printf(%d ,tab[i]); printf(\n); on revient au main } aprs lappel la fonction, sans rien retourner
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 16

Fonction de type void pas de return


David Pointcheval LIENS - CNRS Programmation C - ENSTA - 15

void, pas void


double puissance(double a, int e) { int i; double b = 1; for (i=0; i<e; i++) b = b*a; return b; } } void affiche(int tab[], int n) { int i; for (i=0; i<n; i++) printf(%d ,tab[i]); printf(\n);

Passage par valeur


La fonction ne manipule que des copies des variables passes en arguments ne connat que les valeurs de ces arguments, pas leur emplacement mmoire ne peut pas modifier le contenu dune variable passe en argument seules les copies locales sont modifies, mais dtruites la sortie.
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 18

Fonction de type double return b


double y; y = puissance(3.01, 5);

Fonction de type void pas de return


int T[5] = {2, 5, 3, 9, 1}; affiche(T, 5);

affectation y =
David Pointcheval LIENS - CNRS

appel sans affectation


Programmation C - ENSTA - 17

Exemple III
/* incrementation.c */ #include <stdlib.h> #include <stdio.h>

Exemple III - analyse


a = 10; b = incrementation(a);

>gcc incrementation.c -o incrementation >incrementation 10 b = 11 , a ?? = 10 Rsultat

int incrementation(int x) { int main(int argc, char *argv[]) x = x+1; { return x; int a,b; } a = atoi(argv[1]); b = incrementation(a); print(b = %d, a = %d\n,b,a); return 0; }
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 19

a 10 Appel de incrementation(a) x variable locale la fonction a pas modifie x a (soit x 10) x x+1 (soit x 11) int incrementation(int x) return x (soit 11) { b 11
x = x+1; return x; }
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 20

Variables globales Variables locales


Les variables dclares en tte dun module sont visibles dans toutes les fonctions du module Les variables dclares dans une fonction ne sont visibles quau cours de la fonction (et ont une dure de vie limite lexcution de la fonction) Rq : Une variable locale masque une variable globale du mme nom
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 21

Intrt des fonctions


On a dj vu les avantages des fonctions
utilisations multiples et rutilisation ultrieure dune partie de code

Mais surtout, a aide crire un programme qui marche !

plus une fonction est courte, plus elle a de chances dtre correcte dcouper le programme en petites fonctions de moins de 20 lignes (une fentre)
Programmation C - ENSTA - 22

David Pointcheval LIENS - CNRS

Utilisation de fonctions
Fichiers de headers (*.h) premier argument, un double second argument, un entier retourne le premier puissance le second Len-tte suffit dcrire une fonction cf. man
David Pointcheval LIENS - CNRS Programmation C - ENSTA - 23

Exemple : atoi

int addition(int a, int b) double puissance(double, int)

prend une chane de caractres et retourne un entier


(ventuellement une constante, et non une variable)

man atoi int atoi(const char *str)

David Pointcheval LIENS - CNRS

Programmation C - ENSTA - 24

Vous aimerez peut-être aussi