CHAPITRE 5�� LANGAGE DE � PROGRAMMATION: C
F. Karami
Plan
*
Programmer en langage C
2
���� II- Les Fonctions
*
Programmer en langage C
3
Les Fonctions
*
Programmer en langage C
4
Définition
*
Programmer en langage C
5
Les fonctions
Définition : Syntaxe
type identificateur ( liste de-déclarations-de-paramètres )
{
liste-de-déclarationsoption(optionnel)
liste-d'instructions
}
🖝porte le nom de prototype de fonction.
*
Programmer en langage C
6
Les fonctions
Définition : Sémantique
*
Programmer en langage C
7
Les fonctions
Définition: Appel d’une fonction
🡺 identificateur ( liste-d'expressions );
*
Programmer en langage C
8
Les fonctions
Exemple de définition et d’utilisation d’une fonction en C
/*************** la fonction fexple ****************/
float fexple (float x, int b, int c){
float val ; /* déclaration d’une variable "locale" à fexple
val = x * x + b * x + c ;
return val ;
}
*
Programmer en langage C
9
Les fonctions
Exemple de définition et d’utilisation d’une fonction en C
#include <stdio.h>
/***** le programme principal (fonction main) *****/
main(){
/* déclaration de fonction fexple */
float fexple (float, int, int) ; /* prototype de la fonction fexple */
float x = 1.5 ;
float y, z ;
int n = 3, p = 5, q = 10 ;
/* appel de fexple avec les arguments x, n et p */
y = fexple (x, n, p) ;
printf ("valeur de y : %e\n", y) ;
/* appel de fexple avec les arguments x+0.5, q et n-1 */
z = fexple (x+0.5, q, n-1) ;
printf ("valeur de z : %e\n", z) ;
}
*
Programmer en langage C
10
Les fonctions
Exemple de définition et d’utilisation d’une fonction en C
/* définition de la fonction */
long cube(long x) { /* en-tête de la fonction cube*/
long x_cube; /* variable “locale” à la fonction cube */
x_cube= x*x*x;
return x_cube;
}
*
Programmer en langage C
11
Les fonctions
Exemple de définition et d’utilisation d’une fonction en C
#include<stdio.h>
/* déclaration de la fonction cube*/
long cube(long ); /* prototype de la fonction cube */
/****************************************************/
long input, reponse;
main(){
printf("entrez une valeur entière : ");
scanf("%ld",&input);
reponse=cube(input);
printf("\n\n le cube de %ld est %ld\n", input, reponse);
}
*
Programmer en langage C
12
Les fonctions
Exercice
Quels seront les résultats fournis par ce programme :
main(){ �int arrondi (float) ; /* prototype de la fonction arrondi */
float v1 = 1.6, v2 = 2.8 ;
int p ;
p = arrondi (v1) ; printf (“%d\n”, p) ;
p = arrondi (v2) ; printf (“%d\n”, p) ;
printf (“%d %d\n”, arrondi(v1+v2), arrondi(v1) + arrondi(v2) ) ;
}
int arrondi (float r)
{ float y ;int n ;
y = r + 0.5 ;
n = y ;
return n ;
}
*
Programmer en langage C
13
Les fonctions
Autre exemple
/*définition d’une fonction, nommée max, qui fournit en
résultat la plus grande des trois valeurs entières reçues en
paramètres*/
int max (int a, int b, int c){
int m ;
m = a ;
if ( b>m ) m = b ;
if ( c>m ) m = c ;
return m ;
}
*
Programmer en langage C
14
Les fonctions
Autre exemple
/*programme principal*/
main(){ �int max (int, int, int) ; /* prototype de notre fonction max */
int n, p, q, m ;
n = 3 ; p = 5 ; q = 2 ;
m = max (n, p, q) ;
printf (“max de %d %d %d : %d\n”, n, p, q, m) ;
m = max (5*n, n+p, 12) ;
printf (“valeur : %d\n” , m) ;
}
*
Programmer en langage C
15
Les fonctions
Exemple de fonction sans résultat
Soit la définition de fonction nommée optimist :
void optimist (int nfois){ �int i ;
for (i=0 ; i<nfois ; i=i+1)
printf (“il fait beau\n”) ;
}
*
Programmer en langage C
16
Les fonctions
Exemple de fonction sans résultat
optimist (k) ; /* instruction simple provoquant
l’appel de optimist à laquelle on
transmet en paramètre, la valeur de k */
*
Programmer en langage C
17
Les fonctions
Exemple de fonction sans résultat
main(){
void optimist (int) ; /* prototype de la fonction optimist */
int n = 2, p = 1 ;
optimist (n) ;
optimist (p) ;
optimist (n+p) ;
}
void optimist (int nfois)
{ int i ;
for (i=0 ; i<nfois ; i=i+1)
printf (“il fait beau\n”) ;
}
*
Programmer en langage C
18
Les fonctions
Le cas des fonctions sans paramètres
int fexple1 (void) ;
*
Programmer en langage C
19
Les fonctions
Le cas des fonctions sans paramètres
#include<stdio.h>
void affiche(void);
main(){ �affiche();�}
void affiche(void){
printf(‘’bonjour’’);�}
*
Programmer en langage C
20
Les fonctions
Règles
*
Programmer en langage C
21
Les fonctions
Règles: L’instruction return
double s ;
s = a + b ;
if (s>0) return (s) ;
else return (-s);
}
*
Programmer en langage C
22
Les fonctions
Règles : Prototype
*
Programmer en langage C
23
Les fonctions
Règles : Initialisation des variables locales
void affiche (void){ � int n = 10 ;
printf (“%d”, n) ;
n = n + 1 ;
}
*
Programmer en langage C
24
Les fonctions
Une fonction peut en appeler une autre
main(){
int f1 (float) ; /* prototype de f1 */
.....
f1 (...) ; /* appel de f1 */
.....
}
int f1 (float x){ �void f2 (int) ; /* prototype de f2 */
.....
Return(…);}
void f2 (int n) {
.....
}
*
Programmer en langage C
25
Les fonctions
En langage C, les paramètres sont transmis par valeur
main(){
void echange (int a, int b) ;
int n=10, p=20 ;
printf (“avant appel : %d %d\n”, n, p) ;
echange (n, p) ;
printf (“après appel : %d %d”, n, p) ;
}
void echange (int a, int b){� int c ;
printf (“début echange : %d %d\n”, a, b) ;
c = a ; a = b ; b = c ;
printf (“fin echange : %d %d\n”, a, b) ;
}
*
Programmer en langage C
26
Les fonctions
avant appel : 10 20
début echange : 10 20
fin echange : 20 10
après appel : 10 20
En langage C, les paramètres sont transmis par valeur
emplacements nommés a et b. C’est effectivement sur ces copies qu’a travaillé la fonction echange, de sorte que les valeurs des variables n et p n’ont, quant à elles, pas été modifiées. C’est ce qui explique le résultat constaté.
*
Programmer en langage C
27
Les fonctions
En langage C, les paramètres sont transmis par valeur
*
Programmer en langage C
28
Les fonctions
Passage de tableau en paramètre
main(){
int i ;
int t[5] = { 1, 1, 1, 1, 1 } ; /* initialisation du tableau */
void affiche (int [5]) ; /* prototype de la fonction affiche */
printf (“tableau t avant appel de affiche : ”) ;
for (i=0 ; i<5 ; i=i+1) printf (“%d ”, t[i]) ;
printf (“\n”) ;
affiche (t) ; /* appel de affiche, à laquelle on transmet en paramètre le tableau t */
printf (“tableau t après appel de affiche : ”) ;
for (i=0 ; i<5 ; i=i+1) printf (“%d ”, t[i]) ;
}
void affiche (int v[5]){ � int i ;
for (i=0 ; i<5 ; i=i+1)
v[i] = i+1 ;}
*
Programmer en langage C
29
Les fonctions
Passage de tableau en paramètre
*
Programmer en langage C
30
Les fonctions
Passage de tableau en paramètre
void mat (int t[5][4]){ �int i, j ;
for (i=0 ; i<5 ; i++)
for (j=0 ; j<4 ; j++)
t[i][j] = 1 ;
}
Voici quelques exemples d’utilisation de cette fonction :
main (){
int tab [5] [4] ;
mat (tab) ;
}
*
Programmer en langage C
31
Les fonctions
Passage de tableau en paramètre
*
Programmer en langage C
32
Les fonctions
Passage de structure en paramètre
#include<stdio.h>
#include<conio.h>
struct data{
float montant;
char fnom[20];
char lnom[20];
}rec;
void affiche_rec(struct data x);
main(){
printf("Entrez le montant du don\n");
scanf("%f",&rec.montant);
printf("Entrez le nom et le prénom du donateur\n");
scanf("%s %s", rec.lnom,rec.fnom);
printf("**********************\n");
affiche_rec(rec);
}
void affiche_rec(struct data x){ �printf("\n le donateur %s %s a donné %.2f dh\n", x.lnom, x.fnom, x.montant);
}
*
Programmer en langage C
33
Les fonctions
Passage de structure en paramètre
#include<stdio.h>
#define MAX 4
struct personne{
int numero;
char nom[10];
} data[MAX]={{1,"Smith"},{2,"Jones"},{3,"Adams"},{4,"Wilson"}};
void affiche_str(struct personne [MAX]);
main(){
affiche_str(data);
}
void affiche_str(struct personne x[MAX]){
int i;
for(i=0; i<MAX;i++)
printf("%d \t %s \n", x[i].numero,x[i].nom);
}
*
Programmer en langage C
34
Les fonctions
Fonctions récursives
long fac (int n){
if (n>1) return (fac(n-1)*n) ;
else return(1) ;
}
*
Programmer en langage C
35
Les fonctions
Fonctions prédéfinies : math.h
*
Programmer en langage C
36
Les fonctions
Fonctions prédéfinies : math.h
*
Programmer en langage C
37
Les fonctions