Chapitre VI:
Les fonctions
partie 1
Pr Bekkari
Cycle préparatoire de l’ENSA de
Marrakech
Année universitaire 2020 - 2021
1
Programmation en langage C 30/12/2020
Contenu du chapitre
1) Définition d’une fonction
2) Appel d’une fonction
3) Déclaration du prototype d’une fonction
4) Transmission de tableaux (types composés)
5) Visibilité des variables
6) Notion de récursivité
Programmation en langage C 30/12/2020
Introduction
• En langage C, une seule fonction existe obligatoirement, il
s’agit de la fonction principale main()
• Dans le main() on peut faire appel à une ou plusieurs fonctions
(déclarées avant), et chaque fonction peut appeler d’autres
fonctions
• Les fonctions sont des sous-programmes qui servent à:
• répondre à un besoin répétitif dans un programme, i.e. factoriser
les parties qui se répètent
• réutiliser et anticiper d’éventuels besoins futurs (évolutivité du
programme) : chaque fonction répond à un objectif précis
• faciliter la maintenance (1 seule modification à faire)
• Améliorer la lisibilité et la compréhension du programme en le
structurant en fonctions 3
Programmation en langage C 30/12/2020
Définition d’une fonction
• Syntaxe:
type nom_fonction (type_1 arg_1,…, type_n arg_n){
déclaration de variables locales;
instructions;
return expression; //dépend du type
}
• La première ligne de la définition s’appelle l’entête de la
fonction. Elle peut commencer par:
• type prédéfini: il s’agit du type de résultat renvoyé par la fonction.
Exemple: si la fonction renvoi une valeur de type int, l’entête
commencera par: int nom_fonction();
• void: quand la fonction ne renvoie pas de résultat, on parle de
procédure. Son prototype devient: void nom_fonction(); Une
4
procédure ne contient pas de retour (pas de return)
Programmation en langage C 30/12/2020
Définition d’une fonction
• Une fonction peut avoir 1 ou plusieurs arguments: paramètres
formels. Chaque argument est déclaré par son type
type nom_fonction (type_1 arg_1,…, type_n arg_n){
déclaration de variables locales;
instructions;
return expression;
}
• Le type d’un argument est aussi un type prédéfini
• Le nom de la fonction et les noms des arguments doivent
respecter les mêmes règles adoptées pour les noms des
variables (règles des identificateurs)
• Une fonction peut ne pas avoir d’arguments:
type nom_fonction() ou type nom_fonction(void) 5
Programmation en langage C 30/12/2020
Définition: exemples
• Fonction qui calcule et renvoie la somme de deux entiers:
int somme(int x, int y ){
int somme(int x, int y ){
int s;
ou return (x+y);
s = x + y;
}
return s;
}
• Fonction qui affiche la somme de deux réels:
void somReel(double x, double y){
printf ("%lf", x+y );
}
Programmation en langage C 30/12/2020
Définition: exemples
• Fonction qui affiche un menu et renvoi le choix effectué par
l’utilisateur: int afficheMenu(){
int choix;
printf(″1: Consulter fiche etudiant\n″);
printf(″2: Modifier fiche etudiant\n″);
printf(″3: Supprimer fiche etudiant\n″);
printf(″4: Quitter le programme\n″);
printf(″Faites votre choix de 1 à 4: ″);
scanf(″%d″, &choix);
return choix;
}
• Une fonction peut avoir plusieurs "return" (mais un seul sera
exécuté): int compare(int x, int y){
if (x>y) return 1;
else return 0; 7
}
Programmation en langage C 30/12/2020
Appel d’une fonction
• L’appel de la fonction se fait par son nom suivi des paramètres
effectifs:
nom_fonction (param1, …, param_n);
• Les paramètres effectifs contiennent les valeurs nécessaires
pour effectuer le traitement de la fonction. Ils doivent
correspondre aux types et à l’ordre des paramètres formels
Exemple général:
void f1(int param1){ … }
L ’appel de la fonction:
f1(x) ; //avec x un entier
• Les paramètres effectifs ne changent pas à l’appel de la
fonction (sauf dans le cas des pointeurs : chapitre VII)
• La définition de la fonction doit toujours être placée avant son
appel dans le main() ou son appel dans une autre fonction 8
Programmation en langage C 30/12/2020
Appel d’une fonction: exemple
• Calcul de la somme d’un entier et d’un réel:
#include<stdio.h>
float somme(int x, float y ){
return (x+y);
}
int main(){
int x; float y, s;
printf(″entrez la valeur de x: \n″);
scanf(″%d″, &x);
printf(″entrez la valeur de y: \n″);
scanf(″%f″, &y);
s = somme(x,y);
printf(″la somme est: %f″, s);
}
9
Programmation en langage C 30/12/2020
Déclaration du prototype
• Le prototype d’une fonction: il s’agit de son entête
type nom_fonction(type_1 param1,…, type_n param_n);
Ou type nom_fonction (type_1,…, type_n);
• La déclaration du prototype d’une fonction permet au
compilateur de vérifier que le nombre et le type des
paramètres utilisés dans la définition concordent bien avec
l’appel de la fonction
• Quand l’appel d’une fonction est placé avant sa définition, il
est nécessaire de déclarer le prototype avant son appel (en
tout début du programme de préférence)
• Remarque: Ne pas définir des fonctions à l’intérieur d’autres
fonctions car elles ne seront pas visibles
10
Programmation en langage C 30/12/2020
Déclaration du prototype: exemple
#include<stdio.h>
//le prototype
float somme(int x, float y);
//la fonction principale
int main(){
int x; float y, s;
printf(″entrez la valeur de x: \n″);
scanf(″%d″, &x);
printf(″entrez la valeur de y: \n″);
scanf(″%f″, &y);
s = somme(x,y);
printf(″la somme est: %f″, s);
}
// la fonction somme
float somme(int x, float y ){
return (x+y); 11
}
Programmation en langage C 30/12/2020
Exercices d’application
• Ecrire la fonction max() qui prend 2 entiers en paramètres et
renvoie un entier qui est le maximum des 2. Appeler cette
fonction dans un programme qui lit quatre entiers au clavier
en même temps et affiche le plus grand des quatre
#include<stdio.h>
int max(int x, int y){
if (x>y) return x;
else return y;
}
int main(){
int a, b, c, d;
printf("Saisir 4 entiers: ");
scanf("%d %d %d %d", &a,&b,&c,&d);
printf("la valeur max est: %d", max(a,max(b,max(c,d))));
return 0; 12
}
Programmation en langage C 30/12/2020
Exercices d’application
• Ecrire la fonction moyenne() qui prend 2 réels en paramètres
et renvoie la moyenne de ces 2 nombres. Appeler cette
fonction dans un programme main.
#include<stdio.h>
int main(){
float MOYENNE(float X, float Y);
float A,B;
printf("Introduire deux nombres : ");
scanf("%f %f", &A, &B);
printf("La moyenne arithmétique de %.2f et %.2f est %.4f\n",
A, B, MOYENNE(A,B));
return 0;
}
float MOYENNE(float X, float Y) {
return (X+Y)/2;
13
}
Programmation en langage C 30/12/2020
Exercices d’application
• Ecrire la fonction nchiffres() qui prend entier en paramètres et
renvoie le nombre de chiffre que contient ce nombre. Appeler
cette fonction dans un programme main.
#include<stdio.h>
int NCHIFFRES(int N) {
int i;
if (N<0) N *= -1;
for (i=1; N>=10; i++)
N /= 10;
return i;
}
int main(){
int A;
printf("Introduire un nombre entier : ");
scanf("%d", &A);
printf("Le nombre %d a %d chiffres.\n",A ,NCHIFFRES(A)); 14
return 0;
}
Programmation en langage C 30/12/2020
Exercices d’application
• Ecrire la fonction miroir() qui prend entier n (supposé positif), en
paramètres et renvoie l’entier dont l’écriture décimale est le miroir de
celle de n. Appeler cette fonction dans un programme main.
#include<stdio.h>
int MIROIR(int N) {
int M=0;
while (N > 0) {
M = 10 * M + (N % 10); N /= 10;
}
return M;
}
int main(){
int A;
printf("Introduire un nombre entier : ");
scanf("%d", &A);
printf("Le nombre miroir de %d a %d .\n",A ,MIROIR(A)); 15
return 0;
}
Programmation en langage C 30/12/2020