Cours de C pour débutants, chapitre 4Par Mathias Hiron
Version imprimable4.2 Utilisation de paramètres
4.2.1 Fonctions à un paramètre
Nous venons de voir comment les fonctions permettent d'éviter de répéter exactement les mêmes instructions à plusieurs endroits d'un programme. Cependant il arrive souvent que l'on répète les mêmes instructions, mais avec de légères différences d'une version à l'autre. Supposons par exemple que nous souhaitions afficher une ligne d'étoiles au début et une ligne de tirets un peu plus loin. Les instructions utilisées dans les deux cas sont identiques à un caractère près.
Il est possible d'écrire des fonctions dont l'exécution dépend de certaines valeurs. Ces valeurs sont appelées des paramètres de la fonction. On pourra par exemple écrire une fonction ayant pour paramètre le caractère à utiliser pour afficher une ligne.
Un paramètre prend la forme d'une variable. Pour écrire notre fonction, nous devons commencer par exprimer son contenu en le faisant dépendre de la valeur d'une variable qui contient le caractère à afficher :
void ligneEtoiles()
{
char caractereAffiche = '*';
int nbColonnes = 0;
while (nbColonnes < 40)
{
printf("%c", caractereAffiche);
nbColonnes++;
}
printf("\n");
}
On ne veut cependant pas que cette variable soit initialisée dans le corps de la fonction (elle aurait toujours la même valeur). C'est au moment de l'appel de cette fonction que l'on doit pouvoir choisir le caractère : '*' lors d'un appel, puis '-' lors d'un autre. Pour transmettre une valeur à la fonction, on procède comme on le fait lors des appels à printf : on place la valeur entre parenthèses, lors de l'appel :
int main()
{
double nombreLu;
ligneCaracteres('*');
printf("Entrez un nombre décimal : ");
scanf("%lf", &nombreLu);
printf("\nLe carré de ce nombre est %lf\n", nombreLu*nombreLu);
ligneCaracteres('-');
return 0;
}
Pour pouvoir appeler la fonction de cette manière, avec un paramètre, puis utiliser sa valeur dans ses instructions, il est nécessaire de modifier la déclaration de la fonction en indiquant que la fonction prend un paramètre, que ce paramètre est de type char et qu'on utilisera l'identifiant caractereAffiche pour le manipuler dans le corps de la fonction. Voici la nouvelle déclaration :
void ligneCaracteres(char caractereAffiche)
{
int nbColonnes = 0;
while (nbColonnes < 40)
{
printf("%c", caractereAffiche);
nbColonnes++;
}
printf("\n");
}
Au sein de cette fonction, l'identifiant caractereAffiche est alors considéré comme une variable, qui a été initialisée à la valeur indiquée lors de l'appel. On peut l'utiliser comme une variable donc également modifier sa valeur au cours de la fonction. Modifier la valeur d'un paramètre d'une fonction n'est cependant pas conseillé, car cela rend la fonction plus difficile à comprendre.
Dans le cas où l'on modifierait sa valeur, il est important de noter que cette modification n'a d'effet qu'à l'intérieur de la fonction. Si le paramètre a été passé sous la forme d'une variable au moment de l'appel, celle-ci ne sera pas modifiée, comme le montre l'exemple suivant :
#include <stdio.h>
void afficheEtModifie(int parametre)
{
printf("Valeur du paramètre au début de la fonction : %d\n", parametre);
parametre++;
printf("Valeur du paramètre à la fin de la fonction : %d\n", parametre);
}
int main()
{
int valeur = 42;
printf("Valeur avant l'appel de la fonction : %d\n", valeur);
afficheEtModifie(valeur);
printf("Valeur après l'appel de la fonction : %d\n", valeur);
return 0;
}
Le programme affiche la sortie suivante, qui montre que la modification dans la fonction n'affecte pas la valeur de la variable utilisée pour l'appel :
Valeur avant l'appel de la fonction : 42
Valeur du paramètre au début de la fonction : 42
Valeur du paramètre à la fin de la fonction : 43
Valeur après l'appel de la fonction : 42
On gardera en tête que lorsque l'on passe une valeur en paramètre à une fonction, cette valeur est copiée dans une variable de la fonction.
Exercice : Reprenez l'exercice précédent, mais en écrivant cette fois une fonction qui prend en paramètre le code secret numérique à trouver et qui lit des entiers au clavier, tant que l'utilisateur n'a pas entré ce code. Appelez la fonction une première fois avec le code 4242, puis une deuxième fois avec 2121.
Votre fonction doit afficher le texte "Entrez le code :" à chaque fois que l'utilisateur doit faire un essai. Lorsque le premier code est trouvé, votre programme doit afficher "Premier code bon.". Lorsque le deuxième code est trouvé, votre programme doit afficher "Bravo.".
Vous pouvez soumettre votre solution pour cet exercice, puis lire la correction dans l'épreuve "Cours de programmation C : Chapitre 4" sur www.france-ioi.org
4.2.2 Fonctions à plusieurs paramètres
Il est aussi possible de déclarer des fonctions qui prennent plusieurs paramètres. Dans l'exemple de la fonction qui affiche plusieurs fois une ligne de caractères, on peut imaginer que le nombre de fois où le caractère doit être affiché n'est pas toujours identique et doit être passé en paramètre lors de l'appel. Pour cela, il suffit de séparer les paramètres par des virgules lors de l'appel :
ligneCaracteres('*', 40);
ou
ligneCaracteres('-', 35);
Pour pouvoir faire un tel appel, il faut cependant avoir défini dans la déclaration de la fonction que celle-ci prend un deuxième paramètre, cette fois un entier, puis modifier les instructions pour qu'elles utilisent la variable correspondante. Comme pour l'appel, on ajoute simplement un paramètre dans la déclaration en le séparant du premier par une virgule. On nommera par exemple ce paramètre nbCaracteres :
void ligneCaracteres(char caractereAffiche, int nbCaracteres)
{
int nbColonnes = 0;
while (nbColonnes < nbCaracteres)
{
printf("%c", caractereAffiche);
nbColonnes++;
}
printf("\n");
}
Remarque : si l'on a défini que la fonction prenait deux paramètres, on ne peut plus l'appeler en n'en fournissant qu'un seul.
On peut définir les règles suivantes :
Déclaration de fonction :
Pour permettre à une fonction de dépendre de paramètres, on place après l'identifiant de la fonction, entre les parenthèses, la description des différents paramètres, séparés par des virgules. Chaque paramètre est défini par son type, puis le nom de la variable qui contiendra sa valeur dans le corps de la fonction.
Appel de fonction :
Pour transmettre des valeurs en paramètre lors de l'appel d'une fonction, on place ces valeurs entre les parenthèses qui suivent l'identifiant de la fonction, séparés par des virgules. Les valeurs doivent être dans le même ordre que celui défini lors de la déclaration de la fonction et doivent être du type correspondant.
Exercice : écrivez une fonction qui prend en paramètre un caractère et deux entiers, et qui affiche un rectangle rempli du caractère fourni, dont le nombre de lignes et de colonnes sont les entiers fournis. Appelez ensuite cette fonction pour afficher un rectangle de 4 lignes de 10 caractères 'X', puis un rectangle de 6 lignes de 5 caractères 'O'.
Vous pouvez soumettre votre solution pour cet exercice, puis lire la correction dans l'épreuve "Cours de programmation C : Chapitre 4" sur www.france-ioi.org
===> Suite du cours (4.3 : Valeur de retour) |