Sie sind auf Seite 1von 18

6/03/2018

M.YANDOUZI - ENSAO 2017/2018

CHAPITRE 1
La programmation modulaire et les fonctions

M.YANDOUZI - ENSAO 2017/2018

Pourquoi?
• Difficultés pour comprendre un programme une fois qu’il
dépasse une ou deux pages de texte,
• La programmation modulaire permet d’éviter des
séquences d’instructions répétitives,
• La possibilité de travailler en groupe

1
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

1 - La fonction : la seule sorte de module existant en C

Dans certains langages :


• Les fonctions : proches de la notion mathématique
• Les procédures (terme Pascal) ou sous-programmes
(terme Fortran ou Basic) : ne possède plus de valeur à
proprement parler et son appel ne peut plus apparaître au
sein d’une expression

En C, C++ et JAVA : il n’existe qu’une seule sorte de


module, nommé fonction

M.YANDOUZI - ENSAO 2017/2018

2 - Exemple de définition et d’utilisation d’une fonction en C


#include <stdio.h>
main()
{ float fexple (float, int, int) ; /* déclaration de 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) ; }
/*************** 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 ; }

2
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

La définition d’une fonction

M.YANDOUZI - ENSAO 2017/2018

3 - Quelques règles

• 3.1 - Arguments muets et arguments effectifs :

« arguments muets » = « arguments formels » =


« paramètres formels » (de l’anglais : formal parameter)
= Les noms des arguments figurant dans l’en-tête de la
fonction

« arguments effectifs » = « paramètres effectifs »


= Les arguments fournis lors de l’utilisation (l’appel) de la
fonction

3
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

3 - Quelques règles

• 3.2 - L’instruction return


o L’instruction return peut mentionner n’importe quelle
expression
o L’instruction return peut apparaître à plusieurs reprises
dans une fonction
Exemple :
double absom (double a, double b)
{ double s ;
s=a+b;
if (s>0) return (s) ;
else return (-s) }
L’instruction return définit la valeur du résultat mais en
même temps, elle interrompt l’exécution de la fonction

M.YANDOUZI - ENSAO 2017/2018

3 - Quelques règles

• 3.2 - L’instruction return (suite)


o Une fonction peut ne pas contenir d’instruction return
 Procédure

o Si le type de l’expression figurant dans return est


différent du type du résultat tel qu’il a été déclaré dans
l’en-tête :
 Conversion implicite

4
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

3 - Quelques règles

• 3.3 - Cas des fonctions sans valeur de retour


ou sans arguments
Exemples de déclarations :
void sansval (int) ;
float tirage (void) ;
void message (void);
void main(void)  main ()

M.YANDOUZI - ENSAO 2017/2018

4 - Les fonctions et leurs déclarations


• La déclaration complète d’une fonction porte le nom de
prototype.
• Il est possible, dans un prototype, de faire figurer des noms
d’arguments,
• Déclaration facultative :
float fexple (float x, int b, int c)
{
....
}
main()
{
float fexple (float, int, int) ; /* déclaration de la fonc. fexple */
.....
y = fexple (x, n, p) ;
.....
}

5
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

4 - Les fonctions et leurs déclarations

• Où placer la déclaration d’une fonction :

Dans l’exemple : Dans main()


Déclaration locale

Avant la définition de la première fonction


Déclaration globale

M.YANDOUZI - ENSAO 2017/2018

5 – La directive #include

Permet d’inclure un fichier bibliothèque (classe de fonction)


Nom_de_la_bibliothèque.h
Contenant les définitions des fonctions

Chemin des bibliothèques pour DEV C++:


C:\Dev-Cpp\include

6
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

Exo 1 :

Ecrire un programme se servant d'une fonction


MOYENNE du type float pour afficher la moyenne
arithmétique de deux nombres réels entrés au clavier.

M.YANDOUZI - ENSAO 2017/2018

Exo 2 :

Ecrire un programme qui permet d'afficher à l'écran un


rectangle de longueur L et de hauteur H, formé
d'astérisques '*' :

7
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

6 - En C, les arguments sont transmis par valeur

Problématique : Exemple

M.YANDOUZI - ENSAO 2017/2018

6 - En C, les arguments sont transmis par valeur

Solutions :

1- Utiliser des variables globales


2- Transmettre en argument la valeur de l’adresse d’une variable

8
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

7 - Les variables globales

• Une variable globale est partagée par plusieurs fonctions

Exemple d’utilisation de variables globales

M.YANDOUZI - ENSAO 2017/2018

7 - Les variables globales

• La portée des variables globales :


La portée est limitée à la partie du programme source qui suit leur
déclaration Les variables n et x sont
accessibles aux fonctions
fct1 et fct2, mais pas au
programme
principal

Pour des raisons de lisibilité,


on regroupe les déclarations
de toutes les variables
globales au début du
programme source.

9
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

8 - Les variables locales

• La portée des variables locales :


La portée est limitée à la fonction où elles sont déclarées

La variable p de main n’a aucun


rapport avec la variable p de fct1.

La variable n de fct1 n’a aucun


rapport avec la variable globale n.

Il est alors impossible, dans la


fonction fct1, d’utiliser cette variable
globale n.

M.YANDOUZI - ENSAO 2017/2018

8 - Les variables locales

• Les variables locales statiques :

La classe d’allocation des variables locales est automatique :


 les valeurs des variables locales ne sont pas conservées d’un
appel au suivant

Le mot-clé static :
 Pour attribuer un emplacement permanent à une variable locale
et ainsi sa valeur se conserve d’un appel au suivant.

10
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

8 - Les variables locales

• Exemple d’utilisation de variable locale statique :

M.YANDOUZI - ENSAO 2017/2018

Exo 3 :

Ecrire la fonction LONG_CH qui retourne la longueur


d'une chaîne de caractères CH comme résultat.

11
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

Exo 4 :
La fonction LIRE_TAB à trois paramètres TAB, N et NMAX lit la dimension N et les
composantes d'un tableau TAB du type int.
La dimension N doit être inférieure à NMAX.
Implémenter la fonction LIRE_TAB en choisissant bien le type des paramètres.
Exemple:
Pour un appel par
LIRE_TAB(T, &N, 10);
la fonction se comportera comme suit:
Dimension du tableau (max.10): 11
Dimension du tableau (max.10): 4
Elément[0] : 43
Elément[1] : 55
Elément[2] : 67
Elément[3] : 79

M.YANDOUZI - ENSAO 2017/2018

Exo 5 :

Ecrire la fonction ECRIRE_TAB à deux paramètres TAB et N qui affiche N


composantes du tableau TAB du type int.

Exemple:
Le tableau T lu dans l'exemple ci-dessus sera affiché par l'appel :
ECRIRE_TAB(T, N);
et sera présenté comme suit:
43 55 67 79

12
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

Exo 6 :

Ecrire la fonction SOMME_TAB qui calcule la somme des N


éléments d'un tableau TAB du type int. N et TAB sont fournis
comme paramètres; la somme est retournée comme résultat du
type long.

Exemple d’appel :

SOMME_TAB(T,N)

M.YANDOUZI - ENSAO 2017/2018

Exo 7 :

A l'aide des fonctions des exercices précédents, écrire un


programme qui lit un tableau A d'une dimension inférieure ou
égale à 100 et affiche le tableau et la somme des éléments du
tableau.

13
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

Stockage des Matrices en mémoire :


#include <stdio.h>
#include <conio.h>
main()
{ int i,j,M[4][4]={{1,2,3},{4,5,6},{7,8,9}};
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
printf ("%X %d\t",&M[i][j],M[i][j]);
printf ("\n");
}
getch();
}

M.YANDOUZI - ENSAO 2017/2018

Stockage des Matrices en mémoire :

M[i][j] = * (M + i * CMAX + j)

14
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

Exo 8 :
a) Ecrire la fonction LIRE_DIM à quatre paramètres L, LMAX, C,
CMAX qui lit les dimensions L et C d'une matrice à deux
dimensions. Les dimensions L et C doivent être inférieures à LMAX
respectivement CMAX.

b) Ecrire la fonction LIRE_MATRICE à quatre paramètres MAT, L, C,


et CMAX qui lit les composantes d'une matrice MAT du type int et
de dimensions L et C.

c) Ecrire la fonction ECRIRE_MATRICE à quatre paramètres MAT, L,


C et CMAX qui affiche les composantes de la matrice de
dimensions L et C.

M.YANDOUZI - ENSAO 2017/2018

Exo 9 :

Ecrire la fonction MULTI_2_MATRICES qui effectue la


multiplication de deux matrices MAT1 (dimensions N et M) et
MAT2 (dimensions M et P) en une troisième matrice MAT3
(dimensions N et P):

MAT3 = MAT1 * MAT2

Supposez que les dimensions maximales des trois matrices soient


toutes égales à 30 lignes et 30 colonnes.
Ecrire un petit programme qui teste la fonction
MULTI_2_MATRICES en exploitant les fonctions de l’exercice 8.

15
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

9 - Les fonctions récursives

• 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 (le cycle pouvant d’ailleurs faire
intervenir plus de deux fonctions).

M.YANDOUZI - ENSAO 2017/2018

Exemples de fonctions récursives

• Exemple 1 : Factoriel

Relation de récurrence :
Fact (n) = 1 si n = 0
Fact (n) = Fact (n-1)*n si n > 0
Fonction C associée :

long fact (int n)


{
if (n == 0) return 1;
return n*fact (n-1);
}

16
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

Exemples de fonctions récursives

• Exemple 2 : Suite de Fibonacci

Relation de récurrence :
u1 = u2 = 1
un = un-1 + un-2 pour n > 2
Fonction C associée :
long fibo (int n)
{
if ((n==1) || (n==2))
return 1;
if (n > 2)
return (fibo (n-1) + fibo (n-2));
}

M.YANDOUZI - ENSAO 2017/2018

Exemples de fonctions récursives

• Exemple 3 : La fonction d’Ackermann

Relation de récurrence :
A(m, n) = n + 1 si m = 0,
A(m, n) = A(m − 1, 1) si m > 0 et n = 0,
A(m, n) = A(m − 1, A(m, n − 1)) si m > 0 et n > 0.
Fonction C associée :

int ackermann (int m, int n) {


if (m == 0) return (n+1) ;
if (m > 0 && n == 0) return ackermann (m-1, 1) ;
if (m > 0 && n > 0) return ackermann (m-1, (ackermann (m, n-1)));
}

17
6/03/2018

M.YANDOUZI - ENSAO 2017/2018

Exercice récapitulatif :
Écrire un programme qui
implémente une fonction
LECTURE qui lit les données
relatives à un étudiant
appartenant à une institution
universitaire telles que son nom,
son prénom, son CNE ainsi que
les notes obtenues dans 12
modules. Le programme principal
doit afficher toutes ces données
lues par la fonction ainsi que la
moyenne des notes en se servant
d’une fonction MOYENNE.

18

Das könnte Ihnen auch gefallen