Vous êtes sur la page 1sur 70

ENSA de Tanger

Module Langage C

Chapitre 5: Les fonctions

Ensa de Tanger 1
ENSA de Tanger

Chapitre 5: Les Fonctions.

1- Présentation des fonctions en


C

Ensa de Tanger 2
Présentation des fonctions en C

● Tout problème peut être divisé en sous problèmes.

● Donc écrire un programme qui résout un problème revient


toujours à écrire des sous-programmes qui résolvent des
sous parties du problème initial.

● Les sous-programmes permettent de structurer les


programmes, et rendent leur manipulation facile.
Présentation des fonctions en C
 Définition
La programmation modulaire permet de découper un
programme en plusieurs parties nommées « modules »:

 la programmation modulaire consiste à construire des


programmes (applications) constitués de plusieurs sous-
programmes ( modules ) indépendants.
 Chaque module reçoit des données et transmet des résultats
qui sont alors réutilisés par le reste du programme.

Ensa de Tanger 4
Présentation des fonctions en C
● Intérêt des fonctions :
 Eviter d'écrire plusieurs fois une séquence d'instructions ;
 en faire une fonction et l'appeler autant de fois que
nécessaire.

 Réutiliser facilement des traitements déjà écrits sous forme


de fonctions.

 Partage du travail entre programmeurs lors de la résolution


d'un problème informatique complexe.
Prgramme XX Prgramme XX
--------- ---------
Début
---------

Début
Soit- -un
- - - -programme
---
---------
contenant un bloc
Appel du bloc
---------
d’instructions qui est
Appel du bloc
--------- répété à plusieurs
--------- ---------
--------- endroits
- - - - - - -du
--
---------
programme.
Appel du bloc
--------- ---------
--------- ---------
Appel du bloc
---------
--------- Fin
Fin
Présentation des fonctions en C
Définition d’une fonction en C
● En C un sous-programme est appelé fonction.
● Une fonction = petit bloc de programme : créer ou modifier
quelque chose dans le programme.
● Une fonction = ensemble d’instructions effectuant un calcul
sur des paramètres dont les valeurs sont “passées” à la
fonction, celle-ci s’en sert alors pour calculer un résultat
unique qu’elle retourne en fin de traitement.
● Le "résultat" ou "paramètre en sortie" n’est pas spécifié: il
s’identifie au nom de la fonction elle-même.
Présentation des fonctions en C
● Les fonctions retournent un seul résultat (comme les fonctions
mathématiques y = f(x,y,. . . ))

● Le nombre de paramètres en entrée d’une fonction peut être


quelconque ( nombre fixe (≥ 0)).

● une fonction possède un seul type, qui est le type de la valeur


retournée.

● la valeur de retour est spécifiée par l’instruction return

● Une fonction peut être appelée aussi bien par le programme


principal que par une autre fonction.
Présentation des fonctions en C
● Une fonction est obligatoirement caractérisée par un nom (un
identifiant) unique.

● Lorsqu’une fonction a été définie ou explicitée, son nom


devient une nouvelle instruction, qui peut être utilisé dans
d’autres (sous-)programmes.

● Le (sous-)programme qui utilise un sous-programme est


appelé (sous-)programme appelant.

9
ENSA de Tanger

Chapitre 5: Les Fonctions.

2- La syntaxe d’une fonction en C

Ensa de Tanger 10
La syntaxe d’une fonction en C
Exemple 1

Ensa de Tanger 11
La syntaxe d’une fonction en C
Exemple 2

Ensa de Tanger 12
La syntaxe d’une fonction en C
Exemple 3

Ensa de Tanger 13
La syntaxe d’une fonction en C
 syntaxe

<type_retour> <Nom> (<types et noms des paramètres d’entrée>)


{
déclarations variables locales
instructions ;
return ;

Les
Unetype
 Le mot-clef
arguments
fonctionreturn
peut
doivent
de retour comporter
est
est utilisé
être typés.
plusieurs
pour Chaque
obligatoire. sortirreturn.
de paramètre
la Elle
fonction
coupe
est
en au
précédé
premier
renvoyant
return
deun
sonrésultat.
qu’elle
type. rencontre.
14
La syntaxe d’une fonction en C
 syntaxe
Entête ou prototype ou signature
de la fonction

<type_retour> <Nom> (<types et noms des paramètres d’entrée>)


{
déclarations variables locales
instructions ;
return ;
Corps
}

15
La syntaxe d’une fonction en C
 syntaxe
Une fonction s’écrit toujours sous la forme

type_retour Nom_fonction (Données d’entrée)


Entête
{
Déclarations variables locales ;
Instructions ; Corps
return ;
}

• Le mot-clef return est utilisé pour sortir de la fonction en


renvoyant un résultat
La syntaxe d’une fonction en C
 Le type de retour

 Si la fonction n’utilise pas d’arguments, elle doit être


déclarée void :

<type_retour> <nom_fonction> (void)

ou

<type_retour> <nom_fonction> ( )

17
La syntaxe d’une fonction en C
 Exemple 1
Calcul de x^y
float exposant ( float x , int y ) /* on suppose y>=0 */
{
prototype
int i; de la fonction
type de retour arguments typés
float res=1; /* Déclarations variables locales */

for (i=1 ; i<=y ; i++)


res = res*x; /* instructions */
return (res);
}
x et y sont les paramètres formels
18
La syntaxe d’une fonction en C
 Exemple 2

factoriel d’un entier


paramètre en entrée
int fact (int n)
{ type de retour

int i=1, p=1 ;


for ( ; i<=n ; i++)
p* = i ; // <=> p=p*i
return p;
}
19
La syntaxe d’une fonction en C
 type void
♦ Si une fonction ne renvoie aucun résultat, elle doit être déclarée void

Syntaxe:

void <nom_fonction> (Données d’entrée)


{
Déclarations variables locales ;
instructions ;
}

♦ Le mot-clef return peut être éventuellement utilisé pour sortir


de la procédure.
20
La syntaxe d’une fonction en C
 Exemple 3
Affichage de tous les carrés entre 1 et n

void carres (int n)


{
int i;
/* Déclarations variables locales*/
/* instructions */
for (i=1 ; i < =n ; i++)
printf ( " Le carre de %d=%d\n ", i , i*i ) ;
}
21
La syntaxe d’une fonction en C
 exemple
int main ( ) {
int a = 5 ;
void carres (int ); Affiche le résultat suivant:
carres (a); Carre de 1 = 1
return 0; Carre de 2 = 4
} Carre de 3 = 9
void carres (int n) { Carre de 4 = 16
int i ; Carre de 5 = 25
for (i=1 ; i < n ; i++)
printf ( " Carre de %d=%d\n ", i , i*i ) ;
}
22
La syntaxe d’une fonction en C
Exemple : cas général

Ensa de Tanger 23
La syntaxe d’une fonction en C
 Les arguments figurant dans l’en-tête de la fonction se
nomment des arguments muets , ou arguments formels, ils
seront utilisé dans la définition de la fonction.
 Les arguments fournis lors de l’utilisation (l’appel) de la
fonction se nomment des arguments effectifs.

 L’instruction return peut mentionner n’importe quelle


expression:

 L’instruction return peut apparaître à plusieurs reprises


dans une fonction:

Ensa de Tanger 24
24
La syntaxe d’une fonction en C
 exemple
float exposant ( float x , int y )
{
int i; paramètres formels
float res=1;
for (i=0 ; i<y ; i++)
res = res*x;
Affiche le résultat suivant:
return (res);
}
2^3=8
void main ( )
{
float a=2.0;
paramètres effectifs
int b = 3 ;
float c = exposant(a,b);
printf (" %g^%d = %g\n",a,b,c);
}
25
La syntaxe d’une fonction en C
return
 return définit la valeur du résultat, et en même temps, elle
interrompt l’exécution de la fonction en revenant dans la
fonction qui l’a appelée.

 une fonction peut ne fournir aucune valeur : elle peut


disposer d'une ou plusieurs instructions return sans
expression.

 une fonction peut ne comporter aucune instruction return,


le retour étant alors mis en place automatiquement par le
compilateur à la fin de la fonction.

Ensa de Tanger 26
26
La syntaxe d’une fonction en C
return: ces programmes sont équivalents.

Ensa de Tanger 27
27
ENSA de Tanger

Chapitre 5: Les Fonctions.

3- La déclaration d’une fonction


en C

Ensa de Tanger 28
Déclaration d’une fonction en C
 Règles
La déclaration complète d’une fonction porte le nom de
prototype :

la définition d'une fonction peut être effectué avant ou après


celle de la fonction main.
 Définition Avant : la déclaration de la fonction est
facultative.
 Définition Après : la déclaration de la fonction est
obligatoire.
Ensa de Tanger 29
Déclaration d’une fonction en C
 Règles: exemple
Le programme suivant génère un erreur de compilation

Ensa de Tanger 30
Déclaration d’une fonction en C
 Règles: exemple
Correction 1 du programme.

Ensa de Tanger 31
Déclaration d’une fonction en C
 Règles: exemple
Correction 2 du programme.

Ensa de Tanger 32
Déclaration d’une fonction en C
 Règles
 La déclaration d’une fonction peut être effectué à l’intérieur
des déclarations de toute fonction l’utilisant. (main par
exemple).
 On peut utiliser des déclarations globales des fonctions , en
les faisant apparaître avant la définition de la première
fonction.

Ensa de Tanger 33
Déclaration d’une fonction en C
 Règles
Il est recommandé de déclarer les fonctions en utilisant le
prototype, ce dernier sera utilisé par le compilateur :

 Si la définition de la fonction se trouve dans le même fichier source (que


ce soit avant ou après la déclaration), il s’assure que les arguments
muets ont bien le type défini dans le prototype. Dans le cas contraire, il
signale une erreur.

 Lorsqu’il rencontre un appel de la fonction, il met en place d’éventuelles


conversions des valeurs des arguments effectifs dans le type indiqué
dans le prototype

Ensa de Tanger 34
Déclaration d’une fonction en C
 Règles

un appel tel que :

Sera traduit par :

 l’évaluation de la valeur de l’expression n+1 (en int) et sa conversion en


float,

 l’évaluation de la valeur de l’expression 2*x (en float) et sa conversion en


int

Ensa de Tanger 35
Déclaration d’une fonction en C
 Appel d’une fonction
- affectation:
variable = nom_fonction (paramètres);

- texte:
printf( "… texte …", nom_fonction (paramètres) );

- expression mathématique ( + , - , * , / , … )
a = b (opérateur math) nom_fonction(paramètres);

- structures de contrôle ( if, while, do-while, for):


if (a > < … nom_fonction(paramètres) ) { ... }

36
Exercices d’application
Exercice d’application
Donner un programme exemple qui illustre les 4 types d’affectations.

Ensa de Tanger 37
ENSA de Tanger

Chapitre 5: Les Fonctions.

4- passage de paramètres en C

Ensa de Tanger 38
Passage de paramètre en C
 Exemple
void echange (int x, int y)
{
int T ;
T = x;
x = y;
y = T; Affiche le résultat suivant:
printf(" x=%d et y=%d\n ",x,y);
} x = 20 et y = 10
void main ( ) {
A = 10 et B = 20
int A,B ;
A = 10;
B = 20;
echange (A,B) ;
printf("A=%d et B=%d\n ",A,B);
}
39
Passage de paramètre en C
 passage de paramètres par valeur

Cas général :

 Lors de l’appel d’une fonction, les valeurs des paramètres


sont passées à la fonction.

carre (a);
 Les modifications locales à la fonction n’affectent pas les
paramètres.

40
Passage de paramètre en C
Passage de paramètres par adresse ou par
référence
- Pour modifier la valeur d’un argument effectif par la fonction
appelée; il faut que celle-ci puisse accéder non seulement à la
valeur de la variable, mais aussi à son adresse (&variable).

- C’est ce qui s’appelle le passage par adresse des arguments.

- Les modifications locales à la fonction deviennent globales


(modifications directes en mémoire) et affectent donc les
paramètres.

41
Passage de paramètre en C
 passage de paramètres par adresse
Comment réaliser ce passage ? Que doit-on utiliser ?
- Dans ce passage la fonction appelée a besoin de l'adresse de
la variable dont on veut modifier la valeur.
- Le paramètre formel doit donc être un pointeur et le paramètre
effectif une adresse ==> lors d'un appel de la fonction, il faut
envoyer l'adresse et non la valeur de la variable.

- Donc:
* la fonction appelante doit fournir l'adresse de la variable et
* la fonction appelée doit déclarer le paramètre comme
pointeur.
On peut alors atteindre la variable à l'aide du pointeur. 42
Passage de paramètre en C
exemple
void echange (int *x, int *y)
{
int T ;
T = *x;
*x = *y;
*y = T;
Affiche le résultat suivant:
printf(" x=%d et y=%d\n ",*x,*y);
} x = 20 et y = 10
A = 20 et B = 10
void main ( ) {
int A,B ;
A = 10;
B = 20;
echange (&A, &B) ;
printf("A=%d et B=%d\n ",A,B);
} 43
ENSA de Tanger

Chapitre 5: Les Fonctions.

5- les variables globales

Ensa de Tanger 44
Exercice : les variables globales
Donner le résultat du programme suivant:

i ce n’est pas une variable globale

Ensa de Tanger 45
Exercice : les variables globales
Le programme après correction:

Ensa de Tanger 46
Les variables globales
 Définition
 Les variables globales sont des variables qui peuvent être
partagées par plusieurs fonctions (main entre autres).

 Elles doivent être déclarées en dehors de toute fonction.

 une variable globale sera connue de toutes les fonctions qui


seront compilées par la suite au sein du même programme
source.

Ensa de Tanger 47
Les variables globales
 La portée des variables globales
 Les variables globales ne sont connues du compilateur que
dans la partie du programme source suivant leur déclaration.
 Leur portée (ou leur espace de validité) est limitée à la partie
du programme source qui suit leur déclaration.
 Il est possible de déclarer des variables globales à n’importe
quel endroit du programme source qui soit extérieur aux
fonctions.
 Il est recommandé de déclarer les variables globales au début
du programme source.
Ensa de Tanger 48
Les variables globales
 La portée des variables globales
 Les valeurs des variables globales peuvent être modifiées par
une fonction

x=17 x=17
Ensa de Tanger n=15 n=20 49
Les variables globales
 Classe d’allocation des variables globales
 les variables globales existent pendant toute l’exécution du
programme dans lequel elles apparaissent.

 les variables globales font partie de la classe d’allocation


statique.

 les variables globales sont initialisées à zéro, avant le début


de l’exécution du programme, si on ne leur pas attribuez
explicitement une valeur initiale.

Ensa de Tanger 50
Les variables globales
 La portée des variables globales

n=0 n=15
Ensa de Tanger 51
ENSA de Tanger

Chapitre 5: Les Fonctions.

6- les variables locales

Ensa de Tanger 52
Les variables locales
 Définition

 Les variables locales sont définies au sein d’une fonction


(main entre autres).
 Ces variables sont dites locales à la fonction dans laquelle
elles sont déclarées.

Ensa de Tanger 53
Les variables locales
La portée des variables locales

 Les variables locales ne sont connues qu’à l’intérieur de la


fonction où elles sont déclarées.

 Leur portée est donc limitée à cette fonction.

 Les variables locales n’ont aucun lien avec des variables


globales de même nom ou avec d’autres variables locales à
d’autres fonctions.

Ensa de Tanger 54
Les variables locales
La portée des variables locales
Donner le résultat de ce programme:

n=3

La variable p de main n’a aucun rapport avec la variable p de fct1. De même, la variable n
de fct1 n’a aucun rapport avec la variable globale n.
Ensa de Tanger 55
Les variables locales
La portée des variables locales

Donner le résultat de ces programmes

10 3
La valeur de n est : 10
Ensa de Tanger 56
Les variables locales
La portée des variables locales

Donner le résultat de ce programme

8
La valeur de n est : 5
Ensa de Tanger 57
Les variables locales
Les variables locales automatiques

 les variables locales ont une durée de vie limitée à celle


d’une exécution de la fonction dans laquelle elles figurent.

 Un nouvel espace mémoire leur est alloué à chaque entrée


dans la fonction et libéré à chaque sortie.

 la classe d’allocation de ces variables est automatique.

Ensa de Tanger 58
Les variables locales
Les variables locales statiques

Donner le résultat du programme suivant.

Ensa de Tanger 59
Les variables locales
 Les variables locales statiques

Exemple d’utilisation de variable locale statique

Ensa de Tanger 60
Les variables locales
 Les variables locales statiques

 On peut attribuer un emplacement permanent à une


variable locale.
 Cette variable sera nommée variable statique, on peut la
déclarer à l’aide du mot-clé static.
 le mot static employé sans indication de type est équivalent
à static int
 la valeur d’une variable statique se conserve d’un appel au
suivant.
 les variables locales de classe statique sont, par défaut,
initialisées à zéro.

Ensa de Tanger 61
Les variables locales
 Le cas des fonctions récursives
Le langage C autorise la récursivité des appels de fonctions:
 Récursivité directe : une fonction comporte, dans sa
définition, au moins un appel à elle-même,.
 Récursivité croisée : l’appel d’une fonction entraîne celui
d’une autre fonction qui, à son tour, appelle la fonction
initiale.

Ensa de Tanger 62
Les variables
 Le cas des fonctions récursives
Le langage C autorise la récursivité des appels de fonctions:
 Récursivité directe : une fonction comporte, dans sa
définition, au moins un appel à elle-même,.
 Récursivité croisée : l’appel d’une fonction entraîne celui
d’une autre fonction qui, à son tour, appelle la fonction
initiale.

Ensa de Tanger 63
Les variables locales
 Les classes d’allocation des variables
Type, portée et classe d’allocation des variables

Ensa de Tanger 64
Exercices d’application
Exercice 1
Qu’affiche le programme suivant ?

Ensa de Tanger 65
Exercices d’application
Exercice 2
Ecrire:
● une fonction, nommée f1, se contentant d’afficher "bonjour" (elle ne
possèdera aucun argument ni valeur de retour),

● une fonction, nommée f2, qui affiche "bonjour" un nombre de fois égal
à la valeur reçue en argument (int) et qui ne renvoie aucune valeur,

● une fonction, nommée f3, qui fait la même chose que f2, mais qui, de
plus, renvoie la valeur (int) 0.

 Ecrire un petit programme appelant successivement chacune de ces


trois fonctions, après les
avoir convenablement déclarées sous forme d’un prototype.

Ensa de Tanger 66
Exercices d’application
Exercice 2
Ecrire:
● une fonction, nommée max2, qui donne la valeur maximal de deux
entiers.

● Ecrire une fonction max3 appelant cette fonction pour calculer le max
de trois entiers en utilisant l’opérateur conditionnel.

● Ecrire un programme qui calcul le max de trois entiers a,b et c ,en


appelant la fonction max3.

Ensa de Tanger 67
Exercices d’application
Exercice 4
Ecrire:
● une fonction, nommée sys2, qui donne les solutions x et y d’un
ax+by=c
système
dx+ey=f
●un programme qui permet de résoudre des systèmes à 2 inconnus
fournis par l’utilisateur.

Ensa de Tanger 68
Exercices d’application
Exercice 5
● Ecrire en langage C une fonction "premier1" qui prend en argument
un entier et retourne 1 s’il est premier.

● Ecrire une fonction "premier2" qui prend en argument un entier et


l’affiche s’il est premier.

● Ecrire un programme qui saisi un entier et fait appel à ces fonctions


pour afficher la liste des nombres premiers compris entre 1 et ce nombre.

Ensa de Tanger 69
Exercices d’application
Exercice 6
Ecrire une fonction récursive calculant la valeur de la « fonction
d’Ackermann » A définie
pour m>0 et n>0 par :
A(m,n) = A(m-1,A(m,n-1)) pour m>0 et n>0
A(0,n) = n+1 pour n>0
A(m,0) = A(m-1,1) pour m>0

Ensa de Tanger 70

Vous aimerez peut-être aussi