Les fonctions
SP qui retourne une valeur
Sous-programme avec/sans résultat
Deux types de Sous-programme (SP)
• SP qui retourne une valeur résultat
– toujours appelé fonction
• SP qui ne retourne pas de résultat
– appelé procédure ou fonction (selon les habitudes)
Fonction : SP avec résultat
• Le résultat d'une fonction est une valeur
– d'un certain type
– valeur calculée par la fonction
– valeur utilisée par le programme qui appelle la fonction
• Une fonction booléenne retourne un résultat de type booléen
• Une fonction réelle retourne une valeur de type réel.
Que contient l'entête d'une fonction en pseudo-code ?
1. nom de la fonction
2. liste des paramètres :
– nom du paramètre – type du paramètre – rôle du paramètre
3. type et description du résultat s'il y en a un (voir exemples sur les deux diapos précédantes)
Exemple de SP avec et sans résultat
Sans résultat
PROCEDURE afficheSuiteTcheque(n : entier)
PROCEDURE dessineEtoile(nbBr:entier, larg:entier) Avec résultat
FONCTION longSuiteTcheque(n:entier) entier FONCTION estBissextile(an:entier) booléen FONCTION pourcentPairTcheq(n:entier) réel
Entêtes de fonctions
FONCTION longSuiteTcheque(n:entier) entier
//retourne le nombre de termes de la suite tchèque de n FONCTION estBissextile(an:entier) booléen
// retourne vrai si an est une année bissextile FONCTION pourcentPairTcheq(n:entier) réel
// retourne le pourcentage de nombres pairs dans la suite tchèque de n
Exemple d'appels de fonctions
Deux appels de procédures
afficheSuiteTcheque(3,Vrai) dessineEtoile(5,10)
Trois appels de fonctions
l longueurSuiteTcheque(3) si estBissextile(200)alors
...
afficher(pourctPairTcheque(3), "% de pairs")
Que faire du résultat d'une fonction ?
Une fonction qui retourne un résultat est appelée dans le code
à la place d'une valeur de même type que le résultat
Exemple :
long1 245
long2 longueurSuiteTcheque(3) print(555)
print(longueurSuiteTcheque(4444))
Appel d'une fonction (SP avec résultat)
• pour appeler une fonction, on écrit
le nom de la fonction suivi de parenthèses, dans une instruction qui exploite le résultat
uneVar nomFct(liste des valeurs des param.)
• Exemples d’appels de fonctions
y cos(30)
NbPet nbArea(im23, ’cat’) + nbArea(im23, ’dog’) affiche ("Surface du cone : ", surfaceCone(r,h))
FONCTION nomFct(par1 : type1, …) typeRes // rôle de la fct, résultat et rôle des paramètres Variables locales :
v1 : type // rôle de la variable
…
varRes : type // variable contenant le résultat DEBUT
<instructions>
RETOURNE varRes FIN FONCTION
FONCTION nbOccurences (car : caractère,
ch : chaine ) entier // retourne le nombre de caractères car
dans le texte ch
nbE nbOccurences('e', "table") nbI nbOccurences('i', "table") afficher ("il y a ")
afficher (nbOccurences('o', "table")) afficher (" 'o' dans le mot table") Trois exemples d'appel de cette fonction
Entête de la fonction
Exemple de fonction
FONCTION nbOccurences (car : caractère,
ch : chaine) entier
// retourne le nombre de caractères car dans le texte ch Variables locales :
i : entier // position d’un caratère dans le texte
nbOcc: entier // nb de caract. car trouvés dans le texte ch
DEBUT FONCTION nbOcc 0
i 0
TANT QUE i < longueur(ch) SI ch[i] =? car alors
nbOcc nbOcc + 1 FIN SI
i i + 1 FIN TANT QUE
RETOURNER nbOcc FIN FONCTION
Exercice : moy de 10 notes valides
• Calculer et afficher la moyenne de 10 notes
saisies au clavier en s'assurant que chaque note est bien dans l'intervalle [0,20].
Remarque : dans cet exercice on ne souhaite pas "conserver" les notes
Exercice
Exercice : moy de 10 notes valides
• Calculer et afficher la moyenne de 10 notes
saisies au clavier en s'assurant que chaque note est bien dans l'intervalle [0,20].
Remarque : dans cet exercice on ne souhaite pas "conserver" les notes
Exercice
Observez
l'analyse descendante
d'où vient l'idée de créer une fonction
Exercice : moy de 10 notes valides
Discussion :
A-t-on besoin de 10 variables pour les 10 notes ? Et si on le fait de tête (sans papier)
est-on obligé de mémoriser les 10 notes ?
Exercice
Exercice : moy de 10 notes valides
Discussion :
Idée : si on calcule la somme des notes au fur et à mesure qu'on les saisit,
on n'a pas besoin de garder la note en mémoire, donc on peut ré-utiliser la même variable pour les la note suivante
>>> une seule variable note
et une variable pour la somme des notes
Exercice
Exercice : moy de 10 notes valides
Table des variables :
• note : réel // contient une note saisie
• total : réel // somme des notes saisies
Exercice
Exercice : moy de 10 notes valides
Algo en pseudo code (version intermédiaire ) : répéter 10 fois (boucle pour) :
saisir une note (valide)
l'ajouter au total des notes déjà saisies calculer er afficher la moyenne : total / 10
remarques (comment procéder ?) - utiliser les variables (note et total)
- détecter les nouvelles variables (compteur boucle pour) - oublier les "détails" (ne pas se focaliser d'abord
sur la validité de la note)
Exercice
Exercice : moy de 10 notes valides
Algorithme (version intermédiaire) : total 0
POUR i de 1 à 10
saisir une note valide total total + note FIN POUR
afficher ("moyenne : ", total / 10)
Exercice
Exercice : moy de 10 notes valides
Table des variables :
• note : réel // une note saisie
• total : réel // somme des notes saisies
• i : entier // compteur des notes
Exercice
Exercice : moy de 10 notes valides
Algorithme (version intermédiaire sans les détails) : total 0
POUR i de 1 à 10
saisir une note valide // instr. complexe total total + note
FIN POUR
afficher ("moyenne : ", total / 10)
Exercice
Exercice : moy de 10 notes valides
• Exécution
Exercice : moy de 10 notes valides
total 0
POUR i de 1 à 10
note saisir1noteValide() total total + note
FIN POUR
afficher ("moyenne : ", total / 10)
Exercice
noteOK Faux
TANT QUE noteOK =? Faux saisir (note)
SI note est dans [0,20]
noteOK ← Vrai FIN SI
FIN TANT QUE
On met le détail dans une fonction
qui retourne la note correcte
Exercice : moy de 10 notes valides
Algorithme
total 0
POUR i de 1 à 10
noteOK Faux
Tant que noteOK =? Faux saisir (note)
SI note est dans [0,20]
noteOK ← Vrai FIN SI
FIN TANT QUE
total total + note FIN POUR
afficher ("moyenne : ", total / 10 )
Exercice
instructions pour saisir une
note valide
Définition d'une fonction
qui saisit et retourne une note valide
FONCTION saisir1noteCorrecte() réel
// retourne une note entre 0 et 20 saisie par l'utilisateur VARIABLES
noteOK : booléen // vrai si la note est dans [0, 20]
note : réel // la note saisie DEBUT
noteOK Faux
TANT QUE noteOK =? Faux saisir(note)
SI note est dans [0,20]
noteOK ← Vrai FIN SI
FIN TANT QUE RETOURNE note
FIN FONCTION
Exercice
Rôle du SP et des paramètres
Comment comprenez vous ces descriptions de SP ?
Deux entêtes pour un même SP
dans le module turtle, le SP speed (vitesse)
PROCEDURE vitesse (v : entier)
// définit la vitesse de la tortue : la valeur 1 est la plus lente, et 10correspond à l'animation la plus rapide.
Avec la valeur 0, il n'y a pas d'animation, le dessin est quasi instantané.
--- FONCTION vitesse () entier
// retourne la valeur courante de la vitesse de la tortue
PROCEDURE selonVotreGout( )
// demande à l'utilisateur s'il veut accélerer ou ralentir la tortue selon sa vitesse actuelle
VARIABLE
vitActuelle : entier // vitesse actuelle DEBUT
vitActuelle vitesse() afficher la vitActuelle
demander si ralentir, accélérer ou rien et agir FIN
procédure ou fonction ?
PROCEDURE selonVotreGout( )
// accélère ou ralentit la tortue selon le choix de l'utilisateur et la vitesse cour.
VARIABLE vitActuelle : entier // vitesse actuelle
rep : chaine // réponse de l'utilisateur DEBUT
vitActuelle vitesse()
afficher ("vitesse actuelle : ", vitActuelle)
afficher ("Voulez vous Ralentir, Accélérer ou Ne rien faire (R/A/N) ?") saisir (rep)
SI rep = 'R' ET vitActuelle > 1 ALORS vitesse(vitAtuelle - 1)
SINON SI rep = 'A' ET vitActuelle < 10 ALORS vitesse(vitAtuelle + 1)
FIN SI FIN SI
FIN
procédure ou fonction ?
PROCEDURE selonVotreGout( )
// accélère ou ralentit la tortue selon le choix de l'utilisateur et la vitesse cour.
VARIABLE vitActuelle : entier // vitesse actuelle
rep : chaine // réponse de l'utilisateur DEBUT
vitActuelle vitesse()
afficher ("vitesse actuelle : ", vitActuelle)
afficher ("Voulez vous Ralentir, Accélérer ou Ne rien faire (R/A/N) ?") saisir (rep)
SI rep = 'R' ET vitActuelle > 1 ALORS vitesse(vitAtuelle - 1)
SINON SI rep = 'A' ET vitActuelle < 10 ALORS vitesse(vitAtuelle + 1)
FIN SI FIN SI
FIN
procédure ou fonction ?
Rappel
On affecte un valeur à une variable : variable valeur
exemples de valeur :
0.1 une constante
a valeur de la variable a
a + 0.1 valeur de l'expression
cos(34) valeur retournée par la fonction cos calculeTruc(a) valeur retournée par la fonction
Retenez
Le programme qui appelle la fonction doit gérer la valeur que la fonction lui retourne :
Dans le programme appelant :
• on peut affecter le résultat de la fonction à une variable : variable fonctionTruc(…)
• on peut afficher le résultat de la fonction : afficher("résultat : ", fonctiontruc(…))
Retenez
Une fonction booléenne peut être appelée dans une condition
POUR n de 1 à 10
SI estPremier(n) ALORS afficher (n)
FIN SI FIN POUR
Exercice : définir la fonction moyHasard
FONCTION moyHasard(n : entier, binf : entier, bsup : entier) réel // retourne la moyenne de n entiers tirés au hasard dans [binf, bsup]
VARIABLE
i : entier //
tot : entier // total des nombres tirés au hasard DEBUT
tot 0
POUR i de 1 à n
tot tot + hasard(binf, bsup) FIN POUR
RETOURNER tot / n FIN FONCTION
Appel de la fonction moyHasard
VARIABLES
i : entier // compte les itérations
n : entier // nombre d'entiers tirés au hasard
r : réel // moyenne
DEBUT n 10
afficher ("Moyennes de n nombres tirés dans [0,100] : ") POUR i de 1 à 5
r moyHasard(n, 0,100)
afficher ("moyenne avec ", n , "nombres : ", r) n n*10
FIN POUR FIN