Cours 4 :
Les fonctions en langage C
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
0.1_Rappels : programmes non structurés
BSIO1 - SI4 Les bases de la programmation
Historiquement, les lignes de programmation portaient des numéros. Et ces lignes étaient exécutées par la machine dans l’ordre de ces numéros.
Ce type de langages se présente comme une suite de branchements emmêlés les uns dans les autres.
D’une part, on ne peut pas dire que cela favorise la lisibilité du programme.
D’autre part, c’est une source importante d’erreurs.
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
0.2_Rappels: les programmes structurés
A l’inverse, la programmation structurée, surtout si l’on prend soin de rationaliser la présentation en mettant des lignes de commentaires et en pratiquant l’indentation, évite des erreurs, et révèle sa structure logique de manière très claire.
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
BSIO1 - SI4 Les bases de la programmation
0.2_Rappels : code source structuré
Le code d'un programme C est toujours contenu dans un ou plusieurs fichier(s) source(s) dont l'extension est .c ou .cpp.
Le code est structuré en fonctions et en sous-fonctions.
Chaque fonction doit être déclarée en donnant son prototype : son nom, qui doit être unique à l'intérieur d'un même programme, ses paramètres appelés paramètres d'entrée, et son résultat appelé retour de fonction.
Il est possible de réutiliser des fonctions déjà codées, dont le code est défini dans des fichiers d'en-tête (extension .h), bibliothèques ou librairies.
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
0.2_Rappels: Exemple de code source en C
- L’unique fonction main() est toujours le point de départ d’un programme.
- La valeur de retour est rendue au système d’exploitation. Par convention, 0 signifie succès.
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
#include <stdio.h>
/* This program displays the string "Hello World!" */
int main()
{
printf("Hello World!\n");
return 0;
}
1.1_Les sous-fonctions
Le but d'une fonction ou sous-fonction (aussi appelée sous-programme ou procédure) est d'optimiser le code et son exécution en évitant la redondance.
Un sous-programme (ou procédure, fonction ou sous-fonction) est un bout de code indépendant dont l'exécution va produire un résultat précis à partir de paramètres (ou arguments) qui lui seront fournis au début de son exécution.
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
1.1_Les sous-fonctions
Le sous-programme va contenir du code (des instructions) qui devra être utilisé plusieurs fois par le programme principal. Pour utiliser le code d'un sous-programme, on réalise au besoin un appel du sous-programme ou encore un appel de fonction.
Il n'y a pas de limite dans les appels (sauf en cas de récursivité).
Lorsque la fonction est appelée, le contexte d'exécution du programme principal est sauvegardé. Le contexte d'exécution de la fonction est mis en place. À la fin de la fonction, le contexte d'exécution du programme principal est rechargé et reprend là où il s'était arrêté.
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
1.1_Les sous-fonctions
La fonction est caractérisée par :
- son nom
- ses paramètres d'entrée (ou arguments) *facultatif*
- sa valeur de retour (son unique résultat) *facultatif*
La fonction doit être déclarée (son code doit être explicitement rédigé) en dehors du programme principal, soit dans le même fichier que le main, soit dans un fichier .c indépendant.
Ceci est le prototype d'une fonction :
type_retour nom_fonction(liste des paramètres)
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
1.2_Les sous-fonctions: La sortie standard
printf() est la fonction permettant d'écrire sur le flux de sortie standard (la console). Elle est incluse dans la bibliothèque stdio.h
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
#include <stdio.h>
int main()
{
int a = 5;
int b = 7;
printf("Addition de a et de b, resultat dans c\n");
int c = a + b;
printf("%d + %d = %d\n", a, b, c);
return 0;
}
1.2_Les sous-fonctions: L'entrée standard
scanf() est plus ou moins l’inverse de printf(). Elle permet de récupérer le contenu du flux d'entrée standard (le clavier).
On l’utilise parce que c’est simple, mais la gestion d’erreurs est difficile. Il faut lui donner l’adresse de chaque élément lu.
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
#include <stdio.h>
int main()
{
int a, b, c;
printf("Enter the first value: ");
scanf("%d", &a);
printf("Enter the second value: ");
scanf("%d", &b);
c = a + b;
printf("%d + %d = %d\n", a, b, c);
return 0;
}
1.3_Les sous-fonctions:
exemple 1
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
#include <stdio.h>
/*
Déclaration du code de la fonction
en dehors du main
*/
void MaFonctionBonjour()
{
printf("Bonjour!\n");
return;
}
int main()
{
int i;
MaFonctionBonjour(); // appel de la fonction
for(i=0; i<5; i++)
MaFonctionBonjour();
return 0;
}
Déclarez une fonction qui permet, à chaque fois qu'on l'appelle, d'afficher le message "Bonjour" sur la console avec un retour à la ligne.
1.3_Les sous-fonctions:
exemple 2
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
#include <stdio.h>
/*
Cette fonction permet d'afficher sur la console le message
"Bonjour" suivi du nom de la personne saluée
@param: chaîne de caractère contenant le nom de la personne saluée
@return: void - rien
*/
void BonjourUntel(char* pnom)
{
printf("Bonjour %s !\n", pnom);
return;
}
int main()
{
char nom[30];
printf("Veuillez saisir votre nom\t");
gets(nom);
BonjourUntel(nom); // appel de la fonction avec passage de paramètre
return 0;
}
Déclarez une fonction qui permet, à chaque fois qu'on l'appelle, d'afficher le message "Bonjour " suivi du nom de la personne saluée passé en paramètre. Ce message doit s'afficher sur la console avec un retour à la ligne.
1.3_Les sous-fonctions:
exemple 3
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
#include <stdio.h>
/*
Cette fonction permet d'afficher sur la console
la moyenne de deux valeurs entières passées en paramètre.
@param1: entier contenant la valeur entière 1
@param2: entier contenant la valeur entière 2
@return: void - rien
*/
void MaMoyenne(int val1, int val2)
{
float moy=0.00;
moy = (val1 + val2) / 2 ;
printf("La moyenne de %d et %d est %f\n", val1, val2, moy);
return;
}
int main()
{
int note1, note2;
MaMoyenne(15, 19);
printf("Veuillez saisir la note numéro 1\t");
scanf("%d", ¬e1);
printf("Veuillez saisir la note numéro 2\t");
scanf("%d", ¬e2);
MaMoyenne(note1, note2); // appel de la fonction avec passage de paramètre
return 0;
}
Déclarez une fonction qui permet, à chaque fois qu'on l'appelle, d'afficher la moyenne de deux valeurs entières passées en paramètre.
1.3_Les sous-fonctions:
exemple 4
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
#include <stdio.h>
/*
Cette fonction permet de calculer
la moyenne de deux valeurs entières passées en paramètre.
@param1: entier contenant la valeur entière 1
@param2: entier contenant la valeur entière 2
@return: réel valeur de la moyenne
*/
float MaMoyenne(int val1, int val2)
{
float moy=0;
moy = (val1 + val2) / 2 ;
return(moy);
}
int main()
{
int note1, note2;
float moyenne=0.00;
// appel de la fonction avec valeurs fixes
moyenne = MaMoyenne(15, 19);
printf("La moyenne de %d et %d est %f\n", 15, 19, moyenne);
// appel de la fonction avec valeurs saisies
printf("Veuillez saisir la note numéro 1\t");
scanf("%d", ¬e1);
printf("Veuillez saisir la note numéro 2\t");
scanf("%d", ¬e2);
moyenne = MaMoyenne(note1, note2); // appel de la fonction avec passage de paramètre
printf("La moyenne de %d et %d est %f\n", note1, note2, moyenne);
return 0;
}
Déclarez une fonction qui permet, à chaque fois qu'on l'appelle, de calculer la moyenne de deux valeurs entières passées en paramètre. Le résultat de la fonction est la moyenne calculée.
Exercice
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
Donnez le code C d'un programme permettant à l'utilisateur de saisir la longueur (en cm) du rayon d'un cercle, puis d'afficher la surface du cercle par appel à une fonction dont le rôle est de calculer la surface à partir de la longueur du rayon passé en paramètre puis de retourner cette valeur. Axes de réflexion :
- Quel est le nom de la fonction?
- Quels sont ses paramètres d'entrée?
- Quel est le type de sa valeur de retour?
- Déclarez cette fonction (donnez son code)
- Donnez le code du programme principal faisant appel à cette fonction.
Exercice
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
Ecrire une fonction MIN et une fonction MAX qui déterminent le minimum et le maximum de deux nombres réels.
Ecrire un programme se servant des fonctions MIN et MAX pour déterminer le minimum et le maximum de quatre nombres réels entrés au clavier.
Axes de réflexion :
- Quels sont ses paramètres d'entrée de chaque fonction?
- Quel est le type de leur valeur de retour?
- Déclarez ces fonctions (donnez leur code)
- Donnez le code du programme principal faisant appel à ces fonctions.
2_La portée des variables
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
Les fonctions en C sont définies à l'aide de blocs d'instructions. Un bloc d'instructions est encadré d'accolades et composé de deux parties:
Blocs d'instructions en C
{
<déclarations locales>
<instructions>
}
Par opposition à d'autres langages de programmation, ceci est vrai pour tous les blocs d'instructions, non seulement pour les blocs qui renferment une fonction. Ainsi, le bloc d'instructions d'une commande if, while ou for peut théoriquement contenir des déclarations locales de variables et même de fonctions.
2_La portée des variables
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
Exemple
La variable d'aide I est déclarée à l'intérieur d'un bloc conditionnel. Si la condition (N>0) n'est pas remplie, I n'est pas défini. A la fin du bloc conditionnel, I disparaît.
if (N>0)
{
int I;
for (I=0; I<N; I++)
...
}
2.1_Les variables locales
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
Les variables déclarées dans un bloc d'instructions sont uniquement visibles à l'intérieur de ce bloc. On dit que ce sont des variables locales à ce bloc.
void HELLO()
{
char NOM[20];
printf("Introduisez votre nom : ");
gets(NOM);
printf("Bonjour %s !\n", NOM);
return;
}
Exemple:
La variable NOM est définie
localement dans le bloc
extérieur de la fonction HELLO.
Ainsi, aucune autre fonction
n'a accès à la variable NOM
Attention ! Une variable déclarée à l'intérieur d'un bloc cache toutes les variables du même nom des blocs qui l'entourent.
2.2_Les variables globales
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
Les variables déclarées au début du fichier (à l'extérieur de toutes les fonctions) sont disponibles à toutes les fonctions du programme.
Ce sont alors des variables globales.
En général, les variables globales sont déclarées immédiatement derrière les instructions #include au début du programme..
#include <stdio.h>
int STATUS;
void A(...)
{
...
if (STATUS>0)
STATUS--;
else
...
...
}
void B(...)
{
...
STATUS++;
...
}
Les variables globales
BSIO1 - SI4 Les bases de la programmation
BTS SIO - AMEP Redoute - Année scolaire 2015-2016 - Préparé par Axel Féliot
Conseils
- Les variables globales sont à utiliser avec précaution, puisqu'elles créent des liens invisibles entre les fonctions. La modularité d'un programme peut en souffrir et le programmeur risque de perdre la vue d'ensemble.
- Il faut faire attention à ne pas cacher involontairement des variables globales par des variables locales du même nom.
- Le codex de la programmation défensive nous conseille d'écrire nos programmes aussi 'localement' que possible.
L'utilisation de variables globales devient néanmoins inévitable, si
- plusieurs fonctions qui ne s'appellent pas ont besoin des mêmes variables, ou
- plusieurs fonctions d'un programme ont besoin du même ensemble de variables. Ce serait alors trop encombrant de passer toutes les variables comme paramètres d'une fonction à l'autre.
BSIO1-SI4-C4. Les sous fonctions
By Axel FELIOT
BSIO1-SI4-C4. Les sous fonctions
Présentation des fonctions et de leur utilisation en langage C
- 1,327