Définir ses propres fonctions

Sommaire

Index

Définition de procédures ou de fonctions

Exemple d’un programme avec des groupes instructions similaires et répétitifs

ECRIRE("Etes-vous un homme ?")
REPONSE <-- ""
TANT QUE REPONSE != "O" OU REPONSE != "N"
    ECRIRE "Saisir O ou N"
    REPONSE <-- LIRE()
FIN TANT QUE

ECRIRE("Avez-vous des enfants ?")
REPONSE2 <-- ""
TANT QUE REPONSE2 != "O" OU REPONSE2 != "N"
    ECRIRE "Saisir O ou N"
    REPONSE2 <-- LIRE()
FIN TANT QUE

ECRIRE("Etes-vous majeur(e) ?")
REPONSE <-- ""
TANT QUE REPONSE != "O" OU REPONSE != "N"
    ECRIRE "Saisir O ou N"
    REPONSE <-- LIRE()
FIN TANT QUE

Fonction

Renvoi de valeur

L’appel d’une fonction permet de récupérer une valeur

La fonction appelée renvoie une valeur

valeur_sinus <-- sin(45) // (racine de 2 / 2)

La fonction appelée renvoie une valeur

Passage de paramètre

Les fonctions sin cos prennent en paramètre une valeur.

sin(angle)

Mot clé: renvoyer

Procédure

Une procédure réalise une suite d’opérations sans renvoyer de valeur

ECRIRE("a", 2, "b", 3)

C’est l’équivalent soit:

Définition d’une fonction questionOuiNon

FONCTION questionOuiNon() renvoie TEXTE
VARIABLES
TEXTE reponse
DEBUT FONCTION
    reponse <-- ""
    TANT QUE reponse != "O" OU reponse != "N"
        ECRIRE "Saisir O ou N"
        reponse <-- LIRE()
    FIN TANT QUE
    RENVOYER reponse
FIN FONCTION

VARIABLES
TEXTE rep1, rep2, rep3
DEBUT

    ECRIRE("Etes-vous un homme ?")
    rep1 <-- questionOuiNon()
    ECRIRE("Avez-vous des enfants ?")
    rep2 <-- questionOuiNon()
    ECRIRE("Etes-vous majeur(e) ?")
    rep3 <-- questionOuiNon()

FIN

Passage de paramètres

Définition d’une fonction questionOuiNonMessage

Déclaration 1

FONCTION questionOuiNonMessage(message) renvoie TEXTE
PARAM
TEXTE message
...

Déclaration 2

FONCTION questionOuiNonMessage(message: TEXTE) renvoie TEXTE
VARIABLES
TEXTE reponse
DEBUT FONCTION
    ECRIRE(message)
    reponse <-- ""
    TANT QUE reponse != "O" OU reponse != "N"
        ECRIRE "Saisir O ou N"
        reponse <-- LIRE()
    FIN TANT QUE
    RENVOYER reponse
FIN FONCTION

VARIABLES
TEXTE rep1, rep2, rep3
DEBUT
    rep1 <-- questionOuiNon("Etes-vous un homme ?")
    rep2 <-- questionOuiNon("Avez-vous des enfants ?")
    rep3 <-- questionOuiNon("Etes-vous majeur(e) ?")
FIN

Définition d’une fonction questionOuiNonMessage (variante avec réponses attendues)

FONCTION questionOuiNonMessage(message: TEXTE, repA: TEXTE, repB: TEXTE) renvoie TEXTE
VARIABLES
TEXTE reponse
DEBUT FONCTION
    ECRIRE(message)
    reponse <-- ""
    TANT QUE reponse != repA OU reponse != repB
        ECRIRE("Saisir " + repA + " ou " + repB)
        reponse <-- LIRE()
    FIN TANT QUE
    RENVOYER reponse
FIN FONCTION

VARIABLES
TEXTE rep1, rep2, rep3
DEBUT
    rep1 <-- questionOuiNonMessage("Etes-vous ?", "une femme", "un homme")
    rep2 <-- questionOuiNonMessage("Avez-vous des enfants ?", "o", "n")
    rep3 <-- questionOuiNonMessage("Etes-vous majeur(e) ?", "o", "n")
FIN

Définition de procédure

Fonction qui ne renvoie pas de valeur

Exemple: afficher une table de multiplication

DEBUT
    afficher_table_mult(7)
    afficher_table_mult(8)
FIN
PROCEDURE afficher_table_mult(param: ENTIER)
DEBUT PROCEDURE
    ECRIRE("Table de multiplication par " + param)
    POUR i allant de 0 à 11
        ECRIRE(param + " x " + i + " = "+ (param * i*))
    FIN POUR: i <-- i + 1
FIN PROCEDURE

Exercices

Somme 5 nombres

Écrivez une fonction qui renvoie la somme de cinq nombres fournis en argument.

Somme tableau nombres

Écrivez une fonction qui renvoie la somme des nombres placés dans un tableau passé en argument.

Est pair

Créer la fonction est_pair(int) qui renvoie 1 si le nombre passé en paramètre est pair, 0 sinon.

Écrire le programme principal permettant d’afficher si 2, 5, 8 et 13 sont pairs ou pas.

Exemple d’affichage

2 est pair
5 n'est pas pair

Pythagore

Utiliser la fonction puissance2 vue précédemment (avec des entiers) pour écrire le calcul du carré de l’hypothénuse dans un triangle rectangle.

Écrire la fonction racine(int) qui prend un entier en paramètre et renvoie la valeur flottante de la racine carrée du paramètre.

Dans le programme principal, demander à l’utilisateur les valeurs des côtés et afficher la valeur de l’hypothénuse (arrondie à un chiffre après la virgule).

Les fonctions de texte

Chaîne de caractères

0 1 2 3 4
'T' 'e' 'x' 't' 'e'

Définitions

Tous les langages, je dis bien tous, proposent peu ou prou les fonctions suivantes, même si le nom et la syntaxe peuvent varier d’un langage à l’autre :

Ce sont les deux seules fonctions de chaînes réellement indispensables. Cependant, pour nous épargner des algorithmes fastidieux, les langages proposent également :

Exemples :

length("Bonjour, ça va ?")                 vaut      16
length("")                                 vaut      0
substring("Zorro is back", 4, 7)              vaut      "ro is b"
substring("Zorro is back", 12, 1)             vaut      "c"
left("Et pourtant…", 8)                 vaut      "Et pourt"
right("Et pourtant…", 4)                vaut      "t…"
trouve("Un pur bonheur", "pur")         vaut       4
trouve("Un pur bonheur", "techno")      vaut       -1

Il existe aussi dans tous les langages des fonctions qui renvoient

Asc("N")                                vaut      78
Chr(63)                                 vaut      "?"

Exercices

Nombre voyelles

Écrivez une fonction qui renvoie le nombre de voyelles contenues dans une chaîne de caractères passée en argument. Au passage, notez qu’une fonction a tout à fait le droit d’appeler une autre fonction.

On va découper cet algorithme en trois fonctions:

FONCTION lettreA(chaine: TEXTE, pos: ENTIER)
DEBUT FONCTION
    RENVOYER RIGHT(LEFT(chaine, pos + 1), pos)
FIN FONCTION

FONCTION estVoyelle(car : CARACTERE)
DEBUT FONCTION
    RENVOYER car == "a" || car == "e"
                        || car == "i"  || car == "o"  
                        || car == "u"  || car == "y"
                        || car == "A"  || car == "E"
                        || car == "I"  || car == "O"  
                        || car == "U"  || car == "Y"
FIN FONCTION

FONCTION nbVoyelles(chaine : TEXTE)
VARIABLE
ENTIER i
CARACTERE car
ENTIER compteur
DEBUT FONCTION
    compteur <-- 0
    POUR i allant de 0 à LENGTH(chaine)
        car <-- lettreA(chaine, i)
        SI ( estVoyelle(car) ) ALORS
            compteur <-- compteur +1
        FIN SI
    FIN POUR: i <-- i + 1

    RENVOYER compteur
FIN FONCTION
Bonjour ça va
pos = 0
LEFT(chaine, pos + 1) -> "B"
RIGHT("B", pos) -> "B"

pos = 1
LEFT(chaine, pos + 1) -> "Bo"
RIGHT("Bo", pos) -> "o"

Version alternative de estVoyelle :

FONCTION estVoyelle(car : CARACTERE)
TABLEAU DE CARACTERE voyelles[12]
BOOLEEN drapeau
INTEGER i
DEBUT FONCTION
    drapeau <-- FAUX
    voyelles[0] = "a"
    voyelles[1] = "e"
    voyelles[2] = "i"
    ...
    voyelles[11] = "Y"
    POUR i allant de 0 à 12
        drapeau <-- drapeau OU (car == voyelles[i])
    FIN POUR: i <-- i + 1
    RENVOYER drapeau
FIN FONCTION

Variante de l’alternative

FONCTION estVoyelle(car : CARACTERE)
TABLEAU DE CARACTERE voyelles[12]
INTEGER i
DEBUT FONCTION
    voyelles[0] = "a"
    voyelles[1] = "e"
    voyelles[2] = "i"
    ...
    voyelles[11] = "Y"
    POUR i allant de 0 à 12
        SI (car == voyelles[i]) ALORS
            RENVOYER VRAI
        FIN SI
    FIN POUR: i <-- i + 1
    RENVOYER FAUX
FIN FONCTION

trouve

Réécrivez la fonction Trouve, vue précédemment, à l’aide des fonctions substring et length (comme quoi, Trouve, à la différence de substring et length, n’est pas une fonction indispensable dans un langage).

La fonction substring va nous permettre de récupérer une chaîne de la même longueur que la chaîne à chercher.

Cela amène à étudier deux cas d’utilisation possibles:

FONCTION trouve(chaine: TEXTE, cherchee: TEXTE)
ENTIER longueur_cherchee
ENTIER i
DEBUT FONCTION
    longueur_cherchee <-- length(cherchee)
    POUR i allant de 0 à length(chaine) - longueur_cherchee
        SI (cherchee IDENTIQUE_A substring(chaine, i, longueur_cherchee)) ALORS
            RENVOYER i
        FIN SI
    FIN POUR: i <-- i + 1
    RENVOYER -1
FIN FONCTION

purge

Ecrivez une fonction qui purge une chaîne d’un caractère, la chaîne comme le caractère étant passés en argument. Si le caractère spécifié ne fait pas partie de la chaîne, celle-ci devra être retournée intacte. Par exemple :

purge avec nombre

Même question que précédement, mais cette fois, on doit pouvoir fournir un nombre quelconque de caractères à supprimer en argument.

Variables globales / locales

Reprenons la fonction questionOuiNonMessage(...) définie précédemment.

Définition de la variable locale reponse

FONCTION questionOuiNonMessage(message: TEXTE) renvoie TEXTE
VARIABLES
TEXTE reponse
DEBUT FONCTION
    ECRIRE(message)
    reponse <-- ""
    TANT QUE reponse != "O" OU reponse != "N"
        ECRIRE "Saisir O ou N"
        reponse <-- LIRE()
    FIN TANT QUE
    RENVOYER reponse
FIN FONCTION

Définition et utilisation de la variable globale:

PROCEDURE traiterReponse()
DEBUT PROCEDURE
    ECRIRE(reponse)
FIN PROCEDURE

VARIABLES
TEXTE reponse, rep1, rep2, rep3
DEBUT
    // Dans ce contexte, reponse est une variable globale
    reponse <-- "Bravo"
    rep1 <-- questionOuiNon("Etes-vous un homme ?")
    traiterReponse()
    rep2 <-- questionOuiNon("Avez-vous des enfants ?")
    rep3 <-- questionOuiNon("Etes-vous majeur(e) ?")
FIN

Variable locale entre procédures/fonctions

PROCEDURE f()
VARIABLE
ENTIER x
DEBUT
    x <-- 5
    g()
    ECRIRE(x)
FIN

PROCEDURE g()
VARIABLE
ENTIER x
DEBUT
    x <-- 2
    ECRIRE(x)
FIN

DEBUT
    f()
    ECRIRE(x) //ERREUR
FIN

Sortie:

2
5

Variable localisée:

Portée des paramètres des fonctions

FONCTION f(x: ENTIER)
VARIABLE
ENTIER y
DEBUT
    y <-- g(2 * x)
    y <-- y + x * x
    RENVOYER y
FIN

FONCTION g(x: ENTIER)
DEBUT
    RENVOYER x + 1
FIN

DEBUT
    ECRIRE(f(2))
FIN

Sortie:

9

Récursivité

Une fonction s’appelle elle-même

Calcul de la factorielle d’un nombre: n!

On va appeler cette fonction fact

Définition itérative

FONCTION fact(x : ENTIER)
VARIABLE
ENTIER res
DEBUT FONCTION
    res <-- 1
    TANT QUE x > 1
        res <-- res * x
        x <-- x - 1
    FIN TANT QUE

    RENVOYER res
FIN FONCTION

Définition récursive

Si n > 1: n! = n * (n - 1)! Si n = 1: n! = 1

FONCTION fact(x : ENTIER)
VARIABLE
ENTIER res
DEBUT FONCTION
    res <-- 1
    SI x == 1 ALORS
        res <-- 1
    SINON
        res <-- x * fact(x - 1)
    FIN SI
    RENVOYER res
FIN FONCTION