PROG Les Fonctions
PROG Les Fonctions
PROG Les Fonctions
1
Objectifs
3
Les fonctions en C
4
Plan
Définition et utilité
Fonctions et tableaux
5
Définition et utilité
6
Programmation modulaire en C
8
Intérêts des fonctions
• Faciliter la maintenance.
• Faciliter la conception.
9
Intérêts des fonctions
10
Caractéristiques des fonctions
• La valeur d’une fonction peut dans certains cas ne pas être utilisée
(comme les valeurs de retour de printf() et scanf())
12
Utilisation des fonctions
#include <stdio.h>
void NomFonction()
{
1 Définition de la fonction
……………….
}
Fonction appelante
void main()
{
int a, b, valmax;
printf(“ Tapez deux entiers: “);
scanf(“%d %d”, &a, &b);
Appel de la fonction
14
Définition d’une fonction
15
Définition d’une fonction
17
Définition d’une fonction ( exemple )
val=0;
Les instructions
val=2*(a+b);
Exemple:
void afficherBonjour ()
{
printf ("Bonjour\n");
}
Il est interdit de définir des fonctions à l'intérieur d'une autre fonction.
19
Définition d’une fonction ( type de
retour )
Une focntion retourne une valeur avec l'instruction return.
22
Appel d’une fonction
L’appel des fonctions dépend du type de retour :
23
Appel d’une fonction
Cas 1: La fonction n'a pas un résultat à retourner:
1. Lors de l'implémentation de la fonction: void NomFonction()
{
• La fonction a le type void dans sa déclaration // instructions
• Aucune instruction return n'est nécessaire }
25
Appel d’une fonction
#include <stdio.h> #include <stdio.h>
void calculerMoy ( ); // Déclaration void calculerMoy ( );
float saisieNote ( );
void main( )
{ void main()
int i; {
int i;
for (i = 1; i<=50; i++)
for (i = 1; i<=50; i++)
calculerMoy ( ); // Appel
calculerMoy ( );
}
}
void calculerMoy ( )
void calculerMoy ( ) //
{
Implémentation float N1, N2, M;
{
float N1, N2, M; N1 = saisieNote ();
N2 = saisieNote ();
printf ("Note 1: "); M=(N1*0.8)+(N2*0.2);
scanf ("%f", &N1); printf (“Moyenne: %f", M);
printf ("Note 2: "); }
scanf ("%f", &N2);
float saisieNote ( )
M=(N1*0.8)+(N2*0.2); {
float X;
printf (“Moyenne: %f", M);
} printf("Note:");
scanf("%f", &X);
return X;
} 26
Application
27
Fonctions et tableaux
28
Manipulation des tableaux par les fonctions
• Il est interdit de définir des fonctions qui retournent des tableaux !
• un tableau peut être passé en paramètre d'une fonction.
29
Manipulation des tableaux par les fonctions
#include <stdio.h>
float MoyenneTableau (int v[], int Taille);
int main()
{ Taille de v
int Valeurs[4] = {2, 4, 3, 8};
float ValeurMoyenne;
ValeurMoyenne = MoyenneTableau (Valeurs, 4);
printf(“Moyenne: %f\n”, ValeurMoyenne);
}
float MoyenneTableau (int V[], int Taille)
{
int i, Somme;
Somme = 0;
for (i = 0; i < Taille; i++)
Somme = Somme + V[i];
return (float)Somme / Taille;
}
30
Paramètres effectifs
& paramètres formels
31
Paramètres effectifs et paramètres formels
33
Paramètres effectifs et paramètres formels
#include <stdio. h>
Paramètres formels
Déclaration
int max( int v1, int v2);
void main()
{
Fonction int a, b, valmax;
principale printf(“ Tapez deux entiers: “);
scanf(“%d %d”, &a, &b);
35
Modes de passage des paramètres
36
Passage par copie de valeur
• Au moment de l'appel, la valeur du paramètre effectif est copiée dans
la variable locale désignée par les paramètres formels correspondants.
• La fonction travaille sur des copies des paramètres et ne peut pas les
modifier.
Principe :
• la fonction appelante fait une copie de la valeur passée en paramètre,
• passe cette copie à la fonction appelée à l’intérieur d'une variable crée
dans l'espace mémoire.
• Cette variable est accessible de manière interne par la fonction à partir
de l'argument formel correspondant. 37
Passage par copie de valeur
Copie des valeurs des paramètres effectifs dans les paramètres formels.
38
Passage par copie de valeur
Copie des valeurs des paramètres effectifs dans les paramètres formels.
39
Passage par copie de valeur
Copie des valeurs des paramètres effectifs dans les paramètres formels.
40
Passage par copie de valeur
Copie des valeurs des paramètres effectifs dans les paramètres formels.
41
Passage par copie de valeur
Copie des valeurs des paramètres effectifs dans les paramètres formels.
42
Passage par copie de valeur
Copie des valeurs des paramètres effectifs dans les paramètres formels.
43
Passage par copie de valeur
int max(int v1,int v2);
int main()
{
int a,b,m;
printf("introduire a et b\n");
scanf("%d%d",&a,&b); Le valeur de a est copié dans v1
m=max(a,b); La valeur de b est copié dans v2
printf("\ n le maximum est %d",m);
}
int max(int v1,int v2)
{
if(v1>v2)
L’appel de la fonction prend comme
return v1;
valeur la valeur renvoyée par
else l’instruction return
return v2;
}
44
Passage par copie de valeur
Que se passe-t-il ?
45
Passage par copie de valeur
46
Passage par copie de valeur
• La fonction ne travaille que sur une copie qui va être supprimée à la fin
de la fonction.
47
Passage par adresse
•on appelle passage par adresse quand le paramètre effectif qui est transmis à
la fonction lors de l'appel est l'adresse de la variable.
•La fonction ne travaille plus sur une copie de l'objet mais sur l'objet lui
même, puisque elle en connait l'adresse.
➔ Le paramètre effectif est alors l'adresse de la variable.
•Principe :
•la fonction appelée range l'adresse transmise dans un paramètre approprié
(de type adresse) qui est une variable locale à la fonction appelée.
•la fonction appelée a maintenant accès, via ce paramètre à la variable de la
fonction appelante.
48
Passage par adresse
49
Variables locales
& variables globales
50
Variables locales
• Ce sont les variables déclarées dans un bloc d'instructions.
• Par défaut, elles sont visibles uniquement à l’intérieur de la fonction
dans laquelle elles sont déclarées.
• A la sortie de la fonction, les variables locales sont détruites et leur
valeurs seront perdues.
Exemple
void fonction( )
{
char note = 'l’; // note est une variable locale
printf("La note est %c\n",note);
note=’s’;
}
51
main()
Variables globales
• Une variable globale est une variable déclarée en dehors de toute fonction
(même le main).
• Elles sont disponibles à toutes les fonctions du programme.
• En général, elles sont déclarées immédiatement derrière les instructions
#include au début du programme.
• Les variables déclarées au début de la fonction principale main() ne sont
pas des variables globales, mais elles sont locales à main() !
• Il faut faire attention à ne pas cacher involontairement des variables
globales par des variables locales du même nom.
52
Structure d’un programme
53
Portée d’une variable
54
Portée d’une variable
55
Application
56
Références bibliographiques
57