CHAPITRE 7 : Les fonctions en langage C

... (avec return) un seul résultat de type simple (float, char et int dans le cadre du
cours IFT 1810) à partir (fréquemment) d'une liste de paramètres (des données) ...

Part of the document


CHAPITRE 6 : Les fonctions en langage C

Il est souhaitable, pour diverses raisons, de décomposer un problème en
plusieurs sous-tâches, et de programmer ces sous-tâches comme des blocs
indépendants. C'est le concept de la programmation modulaire qui utilise
des sous-programmes.

En langage C, il y a une seule sorte de sous-programmes : les fonctions. On
commence d'abord avec l'écriture et les appels des fonctions. On verra plus
tard les avantages de la programmation modulaire.


A)Fonction naturelle avec return


Une fonction "naturelle" est un sous-programme permettant de calculer et de
"retourner" (avec return) un seul résultat de type simple (float, char et
int dans le cadre du cours IFT 1810) à partir (fréquemment) d'une liste de
paramètres (des données).


1) Syntaxe


type_résultat_de_retour nom_fonction(liste de paramètre(s))
{
déclarations locales si nécessaire
calcul et retour (avec return) du résultat
}

Illustration de la syntaxe à l'aide d'un exemple

La fonction suivante permet de calculer et de retourner la plus grande
valeur parmi deux réels.

float plusGrand(float x, float y)
{
if (x > y)
return x;
else
return y;
}

Les déclarations locales sont "localement" utiles pour le calcul du
résultat à partir des données. Pour la fonction "plusGrand" ci-dessus, on
n'a besoin d'aucune déclaration locale.


La fonction suivante permet de calculer le prix total à payer d'un article
taxable à partir du prix de l'article. Dans le calcul du prix total à
payer, on a besoin des informations intermédiaires. On les déclare
"localement" à l'intérieur de cette fonction.

float prixAPayer(float prix)
{
/* déclarations locales : */
const float TAUX_TPS = 0.06,
TAUX_TVQ = 0.075;
float tps, tvq;


/* calcul du prix total à payer : prix + les 2 taxes */
tps = prix * TAUX_TPS;
tvq = (prix+TPS) * TAUX_TVQ;
return prix + tps + tvq;
}


2) Remarques


a) Le nom de la fonction ne contient pas de résultat de retour comme en
PASCAL.
b) Il faut utiliser le résultat retourné dans un bon contexte (affichage,
affectation, comparaison, ...).
c) L'instruction "return" provoque la fin de la fonction. On revient
ensuite à l'endroit où la fonction a été appellée. Il doit avoir au
moins une instruction "return" dans la fonction.
d) Dans l'en-tête, on ne peut pas regrouper les paramètres de même type :


float plusGrand(float x, y) /* erroné! */


e) Ne pas terminer l'en-tête par un point virgule :


float plusGrand(float x, float y); /* erroné! */


3) Exemples



Exemple 1 : fonction qui retourne un entier comme résultat


Écrire un programme permettant de saisir un entier n supérieur à zéro (par
exemple : 5284).

Le programme calcule (par les fonctions) et affiche à l'écran :
. la somme des chiffres du nombre n (ici 19);


. l'envers du nombre n (ici 4825).

Solution

#include

int somChif(int n)
{
int somme = 0;

while (n > 0){
somme += n % 10;
n /= 10;
}
return somme;
}

int envers(int n)
{
int k = 0;

while (n > 0){
k = k * 10 + n % 10;
n /= 10;
}
return k;
}

void main()
{
int nombre;

printf("Entrez un entier positif : ");
scanf("%d", &nombre);

printf("La somme des chiffres de %d est %d ", nombre,
somChif(nombre));
printf("L'envers du nombre %d est %d ", nombre,
envers(nombre));
printf("Cliquez sur le bouton de fermeture ");
}

Exécution

Entrez un entier positif : 875
La somme des chiffres de 875 est 20

L'envers du nombre 875 est 578



Exemple 2 : fonction qui retourne un réel comme résultat


Écrire une fonction permettant de calculer le bonus dépendant du poste de
travail :
poste 'A' (analyste) : 234.50 $ de bonus
poste 'P' (programmeur) : 210.90 $ de bonus
poste 'O' (opérateur) : 189.00 $ de bonus

Écrire quelques appels (utilisations) valides de cette fonction.

Solution

float montantBonus(char poste)
{
const float BONUS_A = 234.50,
BONUS_P = 210.90,
BONUS_O = 189.00;
float bonus;

switch (toupper(poste)){
case 'A': bonus = BONUS_A;
break ;
case 'P': bonus = BONUS_P;
break ;
case 'O': bonus = BONUS_O;
}

return bonus;
}

Quelques appels valides

a) dans l'affichage (plus courant)

printf("bonus d'un analyste : %6.2f\n", montantBonus('A'));

b) dans une affectation :

float salHebdo, salTotal;
char poste;
...
salTotal = salHebdo + montantBonus(poste);

c) dans une comparaison :

if (montantBonus (poste) > 200.00)
printf("Pas si mal\n");


Exemple 3 : fonction qui retourne un caractère comme résultat


Écrire une fonction permettant de jouer le même rôle que "toupper"
(conversion d'un caractère en majuscule).

Écrire un appel valide de cette fonction.

Solution

char majuscule(char c)
{
if (c >= 'a' && c