Aller au menu - Aller au contenu

Icône Les fonctions

Avatar
Mise à jour : 13/12/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
23 410 visites depuis 7 jours, dont 607 sur ce chapitre classé 14/786
Eh bien, tant de choses à apprendre.
Attaquons-nous tout de suite à une notion importante et dont vous n'allez plus pouvoir vous passer : les fonctions !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Ça se mange ?

Alors oui, bonne question : à quoi vont nous servir les fonctions ? Tout d'abord, sachez que vous en utilisez déjà : je vous les ai expliquées, en plus ! Concrètement, une fonction répète une action bien précise.

Les fonctions que nous connaissons déjà sont, par exemple, le BEEP : il remplit la fonction de faire bip (sans blague !).
Il y a aussi la petite fonction IsNumeric(), qui vérifie que la valeur d'une variable est bien un nombre.

Tout ça pour dire que ces fonctions, des programmeurs les ont déjà créées et les ont intégrées dans les librairies, d'énormes fichiers qui les rassemblent toutes, que vous possédez sur votre ordinateur dès lors que vous avez installé Visual Basic Express. Nous allons donc à notre tour programmer une fonction et apprendre à l'utiliser.

Image utilisateur

En résumé, la fonction effectue une tâche bien précise.

Créons notre première fonction !

Nous allons donc créer notre première fonction, la plus basique qui soit : sans argument, sans retour.

Cette fonction, on va tout de même lui faire faire quelque chose... Pourquoi, par exemple, ne pas additionner deux nombres que l'on saisit à l'écran ?

Vous vous rappelez certainement le TP avec l'addition. Eh bien, on va factoriser l'addition avec la demande des nombres (factoriser signifie mettre sous forme de fonction).

Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Module Module1

    Sub Main()
        Addition()
    End Sub

    Sub Addition()
        Dim ValeurEntree As String = ""
        Dim Valeur1 As Integer = 0
        Dim Valeur2 As Integer = 0

        Console.WriteLine("- Addition de deux nombres -")
        'Récupération du premier nombre
        Do
            Console.WriteLine("Entrez la première valeur")
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)
        'Écriture de la valeur dans un integer
        Valeur1 = ValeurEntree

        'Récupération du second nombre
        Do
            Console.WriteLine("Entrez la seconde valeur")
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)
        'Écriture de la valeur dans un integer
        Valeur2 = ValeurEntree

        'Addition
        Console.WriteLine(Valeur1 & " + " & Valeur2 & " = " & Valeur1 + Valeur2)

        'Pause factice
        Console.Read()
    End Sub
End Module

Il n'y a plus rien dans le main : cela ne va plus marcher !

Bien au contraire : j'ai placé dans le main l'appel de la fonction.

Lorsque vous créez une fonction, ce n'est pas comme le main, elle ne se lance pas toute seule ; si je n'avais pas ajouté cet appel, le programme n'aurait rien fait !

La ligne Addition() appelle donc la fonction, mais pourquoi ?
Avez-vous remarqué le Sub que j'ai placé en dessous du main ?

Un Sub, contrairement à une Function (que nous verrons par après) ne renvoie aucune valeur.

C'est pour cela que j'ai écrit Sub Addition() , et non Function Addition() (Function étant le mot-clé déclarant une fonction).

Et donc, dans ce Sub, j'ai copié-collé exactement le code de notre TP sur l'addition.

Vous pouvez tester : ça... fonctionne !

Ajout d'arguments et de valeur de retour

Vous avez vu comment créer une fonction que je qualifierais d'« indépendante », ce qui signifie que cette dernière n'influera pas sur le reste du programme, et exécutera toujours la même chose : demander des valeurs, les additionner et afficher le résultat.

Cependant, ce style de raisonnement va vite nous limiter. Heureusement, les créateurs des langages de programmation ont pensé à un truc génial : les arguments et le retour.

Les arguments


Image utilisateur


Vous savez déjà ce qu'est un argument ; je vous l'ai dit : par exemple, dans la fonction Write(), l'argument est la valeur placée entre parenthèses, et cette fonction effectue « Affiche-moi cette valeur ! ».

Vous l'avez donc sûrement compris, les arguments sont mis entre parenthèses... « les », oui, exactement, parce qu'il peut y en avoir plusieurs ! Et vous l'avez déjà remarqué : lorsque nous avons étudié le BEEP, les arguments étaient la fréquence et la durée. Et tous deux séparés par... une virgule (« , ») !

Dans une fonction, les différents arguments sont séparés par une virgule. Vous savez donc comment passer des arguments à une fonction, mais comment créer une fonction qui les reçoive ?

La ligne se présente sous la forme suivante :

Code : VB.NET
1
Sub Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer)

Vous remarquez bien les ByVal Valeur1 As Integer ; cette syntaxe est à utiliser pour chaque argument : le mot « ByVal », le nom de la variable, « As » et le type de la variable.

Ce qui nous donne, dans un cas comme notre addition :

Code : VB.NET
1
2
3
4
5
6
7
Sub Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer)
        'Addition des deux arguments
        Console.WriteLine(Valeur1 & " + " & Valeur2 & " = " & Valeur1 + Valeur2)

        'Pause factice
        Console.Read()
End Sub

Voilà par exemple le Sub que j'ai écrit, et qui additionne deux valeurs passées en argument.

Pourquoi n'as-tu pas déclaré les variables Valeur1 et Valeur2 ?

Elles ont été automatiquement déclarées dans la ligne de création de fonction.

Si vous souhaitez appeler cette fonction, comment faut-il procéder ?

Code : VB.NET
1
Addition(Valeur1, Valeur2)

Vous avez bien compris ?

Vous n'êtes pas obligés de mettre les mêmes noms du côté de l'appel et du côté de la déclaration des arguments dans votre fonction ; la ligne Addition(Valeur10, Valeur20) aurait fonctionné, mais il faut bien sûr que « Valeur10 » et « Valeur20 » soient déclarées du côté de l'appel de la fonction.

Vous avez dû le remarquer, il faut obligatoirement utiliser tous les arguments lors de l'appel de la fonction, sauf une petite exception que je vous présenterai plus tard.

Les arguments doivent être passés dans le bon ordre !


Valeur de retour


Image utilisateur


Imaginez que vous ayez envie d'une fonction qui effectue un calcul très compliqué ou qui modifie votre valeur d'une certaine manière. Vous voudriez sans doute récupérer la valeur ? C'est ce qu'on appelle le retour :

Code : VB.NET
1
Function Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer) As Integer

C'est le morceau du bout (As Integer) qui nous intéresse : c'est cette partie qui indiquera à la fonction le type de valeur qu'elle doit renvoyer. Dans le cas présent, il s'agit d'un type numérique, mais j'aurais très bien pu écrire As String.

Hop hop hop, pourquoi as-tu écrit « Function » au début et non plus « Sub » ?

Je vous l'ai dit tout en haut : les Sub ne renvoient rien, il faut donc passer par les fonctions si on veut une valeur de retour.

Code : VB.NET
1
2
3
4
5
6
7
8
Function Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer) As Integer
        Dim Resultat As Integer
        'Addition des deux arguments
        Resultat = Valeur1 + Valeur2

        'Renvoie le résultat
        Return Resultat
End Function

Cette fonction additionne donc les deux nombres passés en argument et renvoie le résultat.

La ligne Return Resultat est très importante car c'est elle qui détermine le retour : si vous n'écrivez pas cette ligne, aucun retour ne se fera.

Ce qui suit le Return ne sera pas exécuté ; la fonction est quittée lorsqu'elle rencontre cette instruction. Vérifiez donc bien l'ordre de déroulement de votre programme.

La valeur retournée, « Resultat » dans ce cas-ci, doit être du même type que le type de retour indiqué dans la déclaration de la fonction.

Maintenant, comment appeler cette fonction ? La forme Addition(Valeur1, Valeur2) aurait pu fonctionner, mais où va la valeur de retour ? Il faut donc récupérer cette valeur avec un « = ».

Code : VB.NET
1
Resultat = Addition(Valeur1, Valeur2)

Une fois cet appel écrit dans le code, ce dernier additionne les deux valeurs. Je suis conscient que cette démarche est assez laborieuse et qu'un simple Resultat = Valeur1 + Valeur2 aurait été plus simple, mais c'était pour vous faire découvrir le principe.

Cette fonction peut être directement appelée dans une autre, comme ceci par exemple :

Code : VB.NET
1
Console.WriteLine(Addition(Valeur1, Valeur2))

Sachez que les fonctions vont vous être très utiles. J'espère qu'à présent, vous savez les utiliser. :p

Petits plus sur les fonctions

Les arguments facultatifs


Tout d'abord, une petite astuce que je vais vous expliquer : l'utilisation des arguments facultatifs. Je vous ai dit que tous les arguments étaient indispensables, sauf exception ; eh bien, voici l'exception.

Les arguments facultatifs sont des arguments pour lesquels on peut choisir d'attribuer une valeur ou non au moment de l'appel de la fonction. Pour les déclarer, tapez Optional ByVal Valeur3 As Integer = 0.

Le mot clé « Optional » est là pour dire qu'il s'agit d'un argument facultatif, le reste de la syntaxe étant la même que pour les autres fonctions.

Un argument facultatif doit toujours être initialisé et se faire attribuer une valeur dans la ligne de déclaration de la fonction.

Code : VB.NET
1
2
3
Function Operation(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer, Optional ByVal Valeur3 As Integer = 0) As Integer
        Return Valeur1 + Valeur2 + Valeur3
End Function

Voilà donc la nouvelle fonction. Dans l'appel de cette fonction, je peux maintenant écrire Operation(1, 5), ce qui me renverra 6, ou alors Operation(10, 15, 3) qui me renverra 28. Les deux appels sont valides.

Commenter sa fonction


Je vous ai déjà résumé la marche à suivre pour commenter des lignes. Mais voilà, comment faire pour commenter des fonctions entières ?
Placez-vous sur la ligne juste avant la fonction.

Code : VB.NET
1
2
3
Function Operation(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer, Optional ByVal Valeur3 As Integer = 0) As Integer
        Return Valeur1 + Valeur2 + Valeur3
End Function

Ajoutez ensuite trois quotes : « ''' ».
Des lignes vont s'afficher :

Code : VB.NET
1
2
3
4
5
6
7
8
''' <summary>
''' 
''' </summary>
''' <param name="Valeur1"></param>
''' <param name="Valeur2"></param>
''' <param name="Valeur3"></param>
''' <returns></returns>
''' <remarks></remarks>

Ces lignes permettent de commenter la fonction : dans summary, expliquez brièvement le rôle de la fonction ; dans les paramètres, précisez à quoi ils correspondent ; et dans la valeur de retour, indiquez ce que la fonction retourne.

Par exemple, j'ai commenté ma fonction comme ceci :

Code : VB.NET
1
2
3
4
5
6
7
8
''' <summary>
''' Additionne les valeurs passées en argument
''' </summary>
''' <param name="Valeur1">Première valeur à additionner</param>
''' <param name="Valeur2">Seconde valeur à additionner</param>
''' <param name="Valeur3">Troisième valeur à additionner, Optionnel</param>
''' <returns>L'addition des arguments</returns>
''' <remarks></remarks>

Cliquez ensuite sur cette petite flèche pour « replier » cette zone :

Image utilisateur


À présent, à chaque endroit où vous allez écrire cette fonction, un cadre s'affichera vous indiquant ce qu'il faut lui donner comme arguments.

Image utilisateur


Cela est très utile lorsque vous avez beaucoup de fonctions.

Petit exercice

Pour clore ce chapitre, je vous propose un petit exercice.

Je vais vous demander de remplir un tableau de dix cases et d'additionner les valeurs, la récupération de ces valeurs devant se faire en toute sécurité, comme dans notre TP sur l'addition.
La partie qui demande la valeur et qui vérifie s'il s'agit d'un nombre devra être écrite dans une fonction séparée.

À vos claviers !

Secret (cliquez pour afficher)
Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Module Module1

    Sub Main()
        Dim TableauDeValeurs(9) As Integer
        Dim Resultat As Integer = 0

        'Demande les valeurs en passant par la fonction
        For i As Integer = 0 To TableauDeValeurs.Length - 1
            TableauDeValeurs(i) = DemandeValeur(i)
        Next

        'Additionne les valeurs
        For i As Integer = 0 To TableauDeValeurs.Length - 1
            Resultat = Resultat + TableauDeValeurs(i)
        Next

        'Affiche le résultat
        Console.WriteLine(Resultat)

        'Pause
        Console.Read()
    End Sub

    Function DemandeValeur(ByVal Numero As Integer) As Integer
        Dim ValeurEntree As String

        'Demande la valeur
        Do
            Console.WriteLine("Entrez valeur " & Numero + 1)
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)

        'Convertit la valeur en integer et la renvoie
        Return CInt(ValeurEntree)
    End Function
End Module

Clarifions un peu ce code.

J'entre dans une boucle dans laquelle j'appelle la fonction, en passant comme paramètre le numéro de la boucle. Mais pourquoi ?
Allons faire un tour du côté de la fonction : ce paramètre me permet de dire à l'utilisateur quel est le numéro qu'il entre (Console.WriteLine("Entrez valeur " & Numero + 1) ; j'ajoute « 1 » pour ne pas avoir de Entrez valeur 0).

Cette fonction, vous la connaissez : c'est la même que pour l'addition ; sauf que... la ligne Return CInt(ValeurEntree) vous inquiète...

J'explique : ce que je viens de faire s'appelle un Cast, c'est-à-dire que l'on convertit un type en un autre.
Cette ligne fait appel à la fonction CInt(), qui permet de convertir une variable de type string, par exemple, en integer. Pourquoi ai-je fait cela ?

Parce que je renvoie un integer, et que la variable est pour le moment un string. Je peux le faire en toute sécurité puisque je vérifie que mon string contient bien une valeur numérique ; s'il avait contenu, par exemple, un mot, il y aurait eu une erreur.

Vous auriez très bien pu passer par une variable intermédiaire, comme on l'a vu précédemment.

Voilà qui clôt notre chapitre sur les fonctions.

Q.C.M.

Est-ce que je peux créer une fonction avec le mot clé "Sub" qui prend des arguments en paramètres ?
Est-ce que je peux créer un sub qui retourne une valeur ?
Est-ce que cette fonction :

Code : VB.NET
1
Sub Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer, Optional ByVal Valeur3 As Integer)

Est correcte ?
Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Function Choix(ByVal Numero As Integer) As String
     Select Case Numero
         Case 1
              return "Bonjour"
         Case 2
              return "Bonsoir"
         Case Else
              return "Bonne Nuit"
     End Select
End Function


Que ferait cette fonction si je l'appelle avec la syntaxe :
Code : VB.NET
1
2
Console.WriteLine(Choix(10))
Console.read()
Est-ce que Code : VB.NET
1
Sub (ByVal Valeur1 As integer) as integer
marcherait ?

Statistiques de réponses au QCM

Chapitre précédent Sommaire Chapitre suivant

Partager

18 commentaires pour "Les fonctions"
Note moyenne : 3.60 / 4 (543 votes)
Pseudo Commentaire
Hors ligne leguims # Posté le 25/03/2011 à 15:30:31

Merci pour ce tutoriel, c'est très utile et ca fait gagner du temps. Par contre, je viens de passer du temps à corriger une erreur que je dois au tutoriel lui-même. Globalement, il m'a fait gagner plus de temps que j'en ai perdu, t'inquiete pas ! :)

Dans le chapitre "Ajout d'arguments et de valeur de retour":
Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Sub Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer)
...
Sub Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer)
        'Addition des deux arguments
        Console.WriteLine(Valeur1 & " + " & Valeur2 & " = " & Valeur1 + Valeur2)

        'Pause factice
        Console.Read()
    End Sub
...
Addition(Valeur1, Valeur2)


Tu appelles la "Sub avec paramètre" avec :
Addition(Valeur1, Valeur2)


Malheureusement, VB est très particulier. Car pour les "Sub avec paramètre(s)", il y a 2 façons de faire l'appel :
Call Addition(Valeur1, Valeur2)
ou
Addition Valeur1, Valeur2

Je t'invite donc à le corriger. Merci encore pour tout, c'est vraiment super ce genre d'outil d'apprentissage. :D
Hors ligne pradier4 # Posté le 26/06/2011 à 18:31:18

Bonjour
Quel sera le code complet dans "Ajout d'arguments et de valeur de retour"?
Jai mis dans sub ce qu'il écrit et ça ne marche pas!
Hors ligne pradier4 # Posté le 26/06/2011 à 18:31:23

Merci
Hors ligne karhel # Posté le 03/07/2011 à 16:10:57
Avatar

Bonjour,
J'ai un problème (vous vous en doutez bien :D )
Alors, Je rencontre un problème à l'ajout d'arguments dans une fonction :
J'ai tout fait comme vous et on m'affiche une erreur : "Argument non spécifié pour le paramètre valeur1 de "public Sub Addition(Valeur1 As Integer, Valeur2 As Integer)" et la même chose pour la valeur2.

Voilà mon code :

Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Module Module1

    Sub Main()
        Addition()
    End Sub

    Sub Addition(ByVal Valeur1 As Integer, ByVal Valeur2 As Integer)
        Console.WriteLine(Valeur1 & "+" & Valeur2 & "=" & Valeur1 + Valeur2)
        Console.Read()
    End Sub
End Module


Merci.
Karhel
Hors ligne gillardj77 # Posté le 21/08/2011 à 17:42:53
Avatar

bonjour a tous ,
ce tuto est super
mais j'aurais voulu savoir si on savais separer les fonction du code vb
dans un autre fichier a inclure
un peu comme du c++ avec le fichier main.cpp et le MaFonction.cpp et MaFonction.h
ou encore mieu rajouter une fonction dans la biliotheque
merci a tous

Voir tous les commentaires