Académique Documents
Professionnel Documents
Culture Documents
1.1 Structuration
A.BENMAKHLOUF Page 1
Chapitre-5 : Les Fonctions & les Procédures
simples, lesquels peuvent à leur tour être décomposés eux-mêmes en fragments plus petits, et
ainsi de suite.
Les fonctions et les procédures présentent donc un intérêt primordial dans les conceptions des
algorithmes. Ils ont comme rôles de :
Regrouper un ensemble d’instruction dans le même algorithme afin de pouvoir y faire
appel autant de fois que nécessaire.
Avoir un algorithme principal qui fait appel aux différents fonctions et/ou procédures
Avoir une lisibilité et identification faciles des erreurs.
Il est inutile de connaître comment est définie une fonction ou une procédure pour y faire
appel. Par contre il est nécessaire de connaître sa déclaration (son manuel d’utilisation):
Quel est son rôle?
Quels sont les arguments à fournir?
Quelles est la valeur retournée?
Dans les déclarations des fonctions ou des procédures les paramètres sont appelés
paramètres formels. Pendant l’appel de ces fonctions ou procédures dans le programme
principale (fonction principal main()), ils sont appelés paramètres effectifs. Le nom d’un
paramètre effectif peut être différent de celui du paramètre formel associé. Mais Dans
l’écriture des paramètres effectifs on doit respecter le même ordre qu’on a donné aux
paramètres formels.
A.BENMAKHLOUF Page 2
Chapitre-5 : Les Fonctions & les Procédures
1.3 Les fonctions
Les fonctions sont des sous-programmes admettant des paramètres et retournant un seul
résultat (comme les fonctions mathématiques y=f(x,y,. . .)
les paramètres sont en nombre fixe (n>=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 « retourner (renvoyer) »
Généralement le nom d’une fonction doit être explicite: Maximum() ; Minimum()
Syntaxe en Langage C
Dans la syntaxe, on précise le type de valeur renvoyée par la fonction puis le nom de la
fonction. Les paramètres de la fonction (d’entrés, de sorties et d’entrées/sorties) sont
introduites entre parenthèses avec pour chacun d’eux son type. Dans la partie traitement de la
fonction on trouve la partie déclarative des variables locaux (variables qui vont être utilisées
seulement dans la fonction). A la fin du traitement on précise ce que cette fonction va
renvoyer une fois exécutée.
Exercice1 : Ecrire un programme C qui permet de calculer les termes U1, U2, …., U10 d’une
suite arithmétique connaissant le premier terme U0, la raison « r » et le rang « n ».
Solution :
#include <stdio.h>
main(){
int U0, U, r, n;
printf("donner le terme0 ") ;
scanf("%d",&U0);
printf("donner la raison ") ;
A.BENMAKHLOUF Page 3
Chapitre-5 : Les Fonctions & les Procédures
scanf("%d",&r);
for (n=1; n<=10; n++)
{U=F(n, r, U0);
printf("U%d = %d\n", n, U);}}
Exercice2 : Ecrire une fonction Maximum(T, n) qui permet de trouver le maximum d’un
tableau d’un certain nombre de valeurs. Ecrire un algorithme test qui appelle cette fonction.
Solution
#include <stdio.h>
int Fmax(int *T, int n)
{int Max, i;
Max=T[0];
for(i=0; i<n; i++)
{if(T[i]>Max)
Max=T[i];}
return(Max);}
main(){
int i, n, *tab;
printf("donner le nombre de valeur n = ") ;
scanf("%d",&n);
tab=(int*)malloc(n*sizeof(int));
for (i=0; i<n; i++)
{printf("tab(%d) = ", i);
scanf("%d", tab+i);}
printf("le maximum est : %d", Fmax(tab, n));}
Les procédures sont des sous-programmes qui ne retournent aucun résultat. Par contre elles
admettent des paramètres d’entrés, de sorties ou d’Entrées/Sorties.
Syntaxe en langage C
Exercice-1 :
Ecrire une procédure permute(a, b) qui permute les valeurs de ceux variables entiers. Ecrire
un algorithme d’essai.
A.BENMAKHLOUF Page 4
Chapitre-5 : Les Fonctions & les Procédures
#include <stdio.h>
void permute(int *a, int *b)
{int k;
k = *a;
*a = *b;
*b = k;}
main()
{int x, y;
printf("x = ");
scanf("%d", &x);
printf("y = ");
scanf("%d", &y);
permute(&x, &y);
printf("x = %d\n", x);
printf("y = %d", y);}
Dans cette exercice nous constatons que les paramètres d’entrées de la fonction permute()
sont des pointeurs. En effet nous somme obligé dans ce cas de faire passer à la fonction les
adresse des variables et non pas les valeurs puisque nous avons choisi d’appeler la fonction
permute() avec des variables différentes que celles utilisées par la fonction elle-même.
Exercice-2 :
Ecrire une procédure permute(a, b) qui permute les valeurs de ceux variables entiers.
Ecrire une autre procédure Tri (x, y, z) qui tri dans l’ordre croissant en appelant la procédure
permute(a, b). Ecrire un algorithme d’essai.
Solution :
#include <stdio.h>
void permute(int *a, int *b){
int k;
k=*a;
*a=*b;
*b=k;}
void tri(int x, int y, int z){
if (x<y)
permute(&x,&y);
if (y<z)
A.BENMAKHLOUF Page 5
Chapitre-5 : Les Fonctions & les Procédures
permute(&y,&z);
if (x<y)
permute(&x,&y);
printf("%d%d%d", x, y, z);}
main(){
int z1,z2,z3;
printf("donner trois valeurs\n");
scanf("%d", &z1);
scanf("%d", &z2);
scanf("%d", &z3);
tri(z1, z2, z3);}
Exercice-3 :
Créer une fonction max2(a, b) qui renvoi le maximum de deux variables:
Créer une fonction VMAX(T) qui permet trouver le maximum des éléments d’un vecteur de 4
valeurs et ceci en appelant la fonction max2().
Créer un algorithme d’essai.
Solution :
#include <stdio.h>
int Max(int a, int b){
int res;
res=a;
if(b>a)
{res=b;}
return (res);}
main(){
int V[5], i;
for (i=0; i<=4; i++){
printf("V[%d]=", i);
scanf("%d", &V[i]);}
printf("le maximum est: %d\n", VMAX(V));}
A.BENMAKHLOUF Page 6
Chapitre-5 : Les Fonctions & les Procédures
1.5 Processus d’analyse
Exemple de Récursivité
n! = 1*2*…..*(n-1)*n
n! = n*(n-1)!
A.BENMAKHLOUF Page 7
Chapitre-5 : Les Fonctions & les Procédures
Pour calculer la valeur de n!, il suffit donc de savoir calculer (n-1)! Et ensuite de multiplier
cette valeur par n.
Le sous problème du calcul (n-1)! Est le même problème initial, mais pour un cas « plus
simple » car (n-1 < n)
main()
{
int x;
printf("x = ");
scanf("%d", &x);
printf("%d! = %d", x, fact(x));
}
A.BENMAKHLOUF Page 8
Chapitre-5 : Les Fonctions & les Procédures
Fact(5)=5*Fact(4)
=5*4*Fact(3)
=5*4*3*Fact(2)
=5*4*3*2*Fact(1)
=5*4*3*2*1
Solution :
Méthode itérative
#include <stdio.h>
float abs(float x){
if (x>0)
{return (x);}
else
{return (-x);}}
float racine(float A, float e){
float X;
X=1;
while(abs(X*X-A)>e)
X=(X+A/X)/2;
return(X);}
main(){
float Y, e;
printf("Y=");
scanf("%f", &Y);
printf("e=");
scanf("%f", &e);
printf("Racine(%f)=%f", Y, racine(Y,e));
}
Méthode récursive
La récursivité ne porte pas sur la variable principale du problème A (variable dont on cherche
la racine : A) mais la récursivité porte sur une autre variable X
#include <stdio.h>
A.BENMAKHLOUF Page 9
Chapitre-5 : Les Fonctions & les Procédures
float abs(float x){
if (x>0)
{return (x);}
else
{return (-x);}}
float racine(float A, float e, float X){
float res;
if (abs(X*X-A) <= e)
{res=X;}
else
{res = racine(A, e, (X+A/X)/2);}
return (res);}
main(){
float y0, e, A;
printf("Y=");
scanf("%f", &A);
printf("e=");
scanf("%f", &e);
printf("Y0=");
scanf("%f", &y0);
printf("Racine(%f)=%f", A, racine(A,e,y0));}
Ecrire une fonction récursive « RecMax(V, n) » qui renvoi le maximum des valeurs d’un
tableau V de dimension n. cette fonction aura pour argument les éléments du vecteur V et la
dimension n
Solution
A.BENMAKHLOUF Page 10
Chapitre-5 : Les Fonctions & les Procédures
if (a > b) printf("Donnez le nombre de valeur \n") ;
return(a); scanf("%d",&n);
else T=(int*)malloc(n*sizeof(int));
return(b); for(i=0; i<=n-1; i++){
} printf("T(%d) = ", i);
scanf("%d",&T[i]);}
int RecMax(int *V, int N){
int G; printf("le max est:%d\n", RecMax(T, n));}
if (N==2)
G=Max(V[0],V[1]);
else
G=Max(RecMax(V, N-1) ,V[N-1]);
return (G);
}
Pour trouver le maximum des valeurs d’un tableau de dimension n (V(0..n-1)) en utilise la
méthode « diviser pour régner ». Cette méthode se compose de trois étapes
Algorithme :
On suppose qu’on dispose d’une fonction Max() qui permet de trouver la maximum de deux
valeurs.
Soit les variables :
Deb : indice du premier élément du tableau
Fin : indice du dernier élément du tableau
Med : indice du milieu d tableau
Max1 : le maximum du premier demi-tableau
Max2 : le minimum du deuxième demi-tableau
Il existe plusieurs méthodes de tri qui se différencient par leur complexité d'exécution et leur
complexité de compréhension pour le programmeur.
Le tri à bulles
Dans les deux premières méthodes de tri, on doit utiliser une procédure qui permet d'échanger
(de permuter) la valeur de deux variables.
2.1 Le tri par la méthode du Min ou Max successif (Tri par sélection)
Cette méthode consiste à parcourir le tableau de gauche à droite, on cherche le plus petit
élément puis on le positionne dans l’indice i du tableau. On recommence la même opération
pour le sous-tableau de droite qui commence par l’indice i+1.
plus généralement : Pour trier le sous-tableau t[i n-1] il suffit de positionner au rang i le
plus grand élément de ce sous-tableau et de trier le sous-tableau t[i+1 n-1]
Par exemple, pour trier [221, 215, 130, 163, 147, 120] suivant un ordre croissant, on va avoir
les boucles suivantes :
A.BENMAKHLOUF Page 12
Chapitre-5 : Les Fonctions & les Procédures
- une fonction poxmax() qui soit capable de renvoyer l’indice pmax du plus grand
élément d'un tableau à partir d'un certain r.
- Une procédure Tri() qui appelle la fonction posmax() pour trouver l’indice pmax
correspondant au maximum puis permute l’élément pmax avec l’élément i.
int posmax(int *T, int n, int r){ void Tri(int *V, int n){
int pmax, Max, i; int rang, i, indexmax, k;
Max=T[r]; for(i=0; i<n; i++)
pmax=r; {
for(i=r; i<n; i++) indexmax=posmax(V, n, i);
{ if(V[i]!=V[indexmax])
if(T[i]>Max) permute(V+i, V+indexmax);
{Max=T[i]; }}
pmax=i;}
}
return(pmax);}
Par exemple, pour trier [130, 156, 213, 230, 300] suivant un ordre décroissant, on va avoir les
boucles suivantes :
A.BENMAKHLOUF Page 13
Chapitre-5 : Les Fonctions & les Procédures
i=2 ; ………….
Par exemple, pour trier [12, 34, 13, 9, 15, 0] suivant un ordre décroissant, on va avoir les
boucles suivantes :
A.BENMAKHLOUF Page 14
Chapitre-5 : Les Fonctions & les Procédures
C'est l’un des tris les plus rapides, et les plus utilisés. La méthode est constituée de deux
méthodes.
Placer un élément du tableau (appelé pivot) à sa place définitive, en permutant tous les
éléments de telle sorte de placer toutes les valeurs inférieures au pivot à sa gauche et placer
ceux qui sont supérieurs à sa droite. Cette opération s'appelle le partitionnement.
Pour chacun des sous-tableaux de gauche et de droite, on applique par récurrence le même
traitement avec un nouveau pivot, jusqu'à ce que l'ensemble des éléments soit trié.
A.BENMAKHLOUF Page 15
Chapitre-5 : Les Fonctions & les Procédures
- L’exemple ci-dessous montre l’opération de partitionnement avec le pivot V[0].
- Les appelles récursive de l’opération de partitionnement dans les sous tables se sont
représenté par la figure ci-dessous.
A.BENMAKHLOUF Page 16
Chapitre-5 : Les Fonctions & les Procédures
A.BENMAKHLOUF Page 17
Chapitre-5 : Les Fonctions & les Procédures
int i;
i=0;
while(i<n && x!=T[i])
i++;
if(x==T[i])
printf("la valeur est trouvee a i = %d", i);
else
printf("la valeur est introuvable");
}
3.2 Recherche linéaire dans un ensemble trié suivant un ordre croissant
On procède par une recherche linéaire on parcourant le tableau et tant que l’élément du
tableau est inférieur au nombre recherché (t(i) < X) on continu la recherche. Si on parcourt
tous le tableau sans trouver la valeur recherchée on déclare que le nombre n’existe pas. La
procédure écrite en C qui permet de faire cette recherche est :
A.BENMAKHLOUF Page 18
Chapitre-5 : Les Fonctions & les Procédures
mid=(deb+fin)/2;
if(T[mid]==x)
printf("valeur trouvee a %d", mid);
else
{
if(x<T[mid])
fin=mid;
else
deb=mid+1;
Rech_Dico(T, deb, fin, x);
}
}
}
A.BENMAKHLOUF Page 19