M10 Langage de Programmation Structuree VB - Net Console
M10 Langage de Programmation Structuree VB - Net Console
M10 Langage de Programmation Structuree VB - Net Console
NET
1.1 Introduction
Nous traitons VB.NET d'abord comme un langage de programmation classique. Nous aborderons les objets ultérieurement.
Dans le tableau ci-dessus, on découvre qu'il y a deux types possibles pour un entier sur 32 bits : Integer et System.Int32.
Les deux types sont interchangeables. Il en est de même pour les autres types VB et leurs équivalents dans la plate-forme
.NET. Voici un exemple de programme :
var1=100
var2=10000000000
var3=100
var4=4
var5=4,56789
var6=3,4
var7=-0,000103
var8=01/01/2003 12:08:04
var9=True
var10=A
var11=abcde
var12=System.Object
Char "A"c
String "aujourd'hui"
Boolean true, false
date New Date(2003, 1, 1) pour le 01/01/2003
1. La lecture du programme sera plus aisée si l'on a donné à la constante un nom significatif : [const taux_tva as
single=0.186F]
2. La modification du programme sera plus aisée si la "constante" vient à changer. Ainsi dans le cas précédent, si le taux de
tva passe à 33%, la seule modification à faire sera de modifier l'instruction définissant sa valeur : [const
taux_tva as single=0.336F]. Si l'on avait utilisé 0.186 explicitement dans le programme, ce serait alors de nombreuses
instructions qu'il faudrait modifier.
Long.Parse(chaine) ou
Int64.Parse chaîne -> Double
Double.Parse(chaîne)
chaîne -> Single Single.Parse(chaîne)
La conversion d'une chaîne vers un nombre peut échouer si la chaîne ne représente pas un nombre valide. Il y a alors
génération d'une erreur fatale appelée exception en VB.NET. Cette erreur peut être gérée par la clause try/catch suivante :
try
appel de la fonction susceptible de générer l'exception
catch e as Exception
traiter l'exception e
end try
instruction suivante
Si la fonction ne génère pas d'exception, on passe alors à instruction suivante, sinon on passe dans le corps de la clause catch
puis à instruction suivante. Nous reviendrons ultérieurement sur la gestion des exceptions. Voici un programme
présentant les principales techniques de conversion entre nombres et chaînes de caractères. Dans cet exemple la fonction
affiche écrit à l'écran la valeur de son paramètre. Ainsi affiche(S) écrit la valeur de S à l'écran.
' directives
Option Strict On
' espaces de noms importés
Imports System
Sub Main()
' procédure principale
' données locales
Dim S As String
Const i As Integer = 10
Const l As Long = 100000
Const f As Single = 45.78F
Dim d As Double = -14.98
' affiche
Public Sub affiche(ByVal S As String)
Console.Out.WriteLine("S=" + S)
End Sub
End Module
S=10
S=100000
S=45,78
S=-14,98
S=False
S=10
S=Erreur [10.67] : Le format de la chaîne d'entrée est incorrect.
S=100
S=Erreur [10.675] : Le format de la chaîne d'entrée est incorrect.
Les bases de VB.NET 10
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.
On remarquera que les nombres réels sous forme de chaîne de caractères doivent utiliser la virgule et non le point décimal.
Ainsi on écrira Dim d As Double = -14.98 mais Dim d1 As Double = Double.Parse("100,87")
où n est l'indice du dernier élément de tableau. La syntaxe Tableau(i) désigne la donnée n° i où i appartient à l'intervalle [0,n].
Toute référence à la donnée Tableau(i) où i n'appartient pas à l'intervalle [0,n] provoquera une exception. Un tableau peut être
initialisé en même temps que déclaré. Dans ce cas, on n'a pas besoin d'indiquer le n° du dernier élément.
Les tableaux ont une propriété Length qui est le nombre d'éléments du tableau. Voici un programme exemple :
Module tab0
Sub Main()
' un premier tableau
Dim tab0(5) As Integer
For i As Integer = 0 To UBound(tab0)
tab0(i) = i
Next
For i As Integer = 0 To UBound(tab0)
Console.Out.WriteLine("tab0(" + i.ToString + ")=" + tab0(i).tostring)
Next
et son exécution
: tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50
où n+1 est le nombre de lignes, m+1 le nombre de colonnes. La syntaxe Tableau(i,j) désigne l'élément j de la ligne i de
Tableau. Le tableau à deux dimensions peut lui aussi être initialisé en même temps qu'il est déclaré :
Le nombre d'éléments dans chacune des dimensions peut être obtenue par la méthode GetLenth(i) où i=0 représente la
dimension correspondant au 1er indice, i=1 la dimension correspondant au 2ième indice, …Voici un programme d'exemple :
Module Module2
tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50
La déclaration ci-dessus crée un tableau de n+1 lignes. Chaque élément Tableau(i) est une référence de tableau à une
dimension. Ces tableaux ne sont pas créés lors de la déclaration ci-dessus. L'exemple ci-dessous illustre la création d'un tableau
de tableaux :
Ici noms(i) est un tableau de i+1 éléments. Comme noms(i) est un tableau, noms(i).Length est son nombre d'éléments. Voici un
exemple regroupant les trois types de tableaux que nous venons de présenter :
' directives
Option Strict On
Option Explicit On
' imports
Imports System
' initialisation
For i = 0 To noms.Length°- 1
noms(i) =°New String(i) {}
For j = 0 To noms(i).Length - 1
noms(i)(j) = "nom" & i & j
Next
Next
' affichage
For i = 0 To noms.Length°- 1
For j = 0 To noms(i).Length - 1
Console.Out.WriteLine("noms[" & i & "][" & j & "]=" & noms(i)(j))
Next
Next
End Sub
End Module
entiers[0]=0
entiers[1]=10
entiers[2]=20
entiers[3]=30
réels[0,0]=0,5
réels[0,1]=1,7
réels[1,0]=8,4
réels[1,1]=-6
noms[0][0]=nom00
noms[1][0]=nom10
noms[1][1]=nom11
noms[2][0]=nom20
noms[2][1]=nom21
noms[2][2]=nom22
noms[3][0]=nom30
noms[3][1]=nom31
noms[3][2]=nom32
noms[3][3]=nom33
Les instructions élémentaires apparaissent clairement lorsqu'on considère la structure d'un micro-ordinateur et de ses
périphériques.
U. C MEMOIRE ECRAN
+-------------------+ +-------+
¦ 2 <-+--> ¦ 3 ¦ ¦
+-----------+ 1 ¦ ¦ ----+------+-> ¦
¦ CLAVIER +-----------+--------+--> ¦ ¦ ¦
+-----------+ +-------------------+ +-------+
4^
\
\ 5 +-------+
\ ---->¦ ¦
¦ DISQUE¦
+-------+
où expression est tout type de donnée qui puisse être converti en chaîne de caractères pour être affiché à l'écran. Dans les
exemples vus jusqu'ici, nous n'avons utilisé que l'instruction Console.Out.WriteLine(expression).
La classe System.Console donne accès aux opérations d'écriture écran (Write, WriteLine). La classe Console a deux propriétés
Out et
Error qui sont des flux d'écriture de type StreamWriter :
• Console.WriteLine() est équivalent à Console.Out.WriteLine() et écrit sur le flux Out associé habituellement à l'écran.
• Console.Error.WriteLine() écrit sur le flux Error, habituellement associé lui aussi l'écran.
Les flux Out et Error sont associés par défaut l'écran. Mais ils peuvent être redirigés vers des fichiers texte au moment de
l'exécution du programme comme nous le verrons prochainement.
La ligne tapée au clavier est rangée dans la variable ligne et peut ensuite être exploitée par le programme.Le flux In peut être
redirigé vers un fichier comme les flux Out et Error.
' options
Option Explicit On
Option Strict On
' module
Module io1
Sub Main()
' écriture sur le flux Out
Dim obj As New Object
Console.Out.WriteLine(("" & obj.ToString))
System.Object
i=10
Tapez une ligne : ceci est un essai
ligne=ceci est un essai
Les instructions
Les bases de VB.NET 14
Dim obj As New Object
Console.Out.WriteLine(obj.ToString)
ne sont là que pour montrer que n'importe quel objet peut faire l'objet d'un affichage. Nous ne chercherons pas ici à
expliquer la signification de ce qui est affiché.
En VB.NET, le flux d'écriture Console.Out écrit sur le périphérique 1, le flux d'écriture Console.Error écrit sur le
périphérique 2 et le flux de lecture Console.In lit les données provenant du périphérique 0. Lorsqu'on lance un programme
dans une fenêtre Dos sous Windows, on peut fixer quels seront les périphériques 0, 1 et 2 pour le programme exécuté.
Considérons la ligne de commande suivante :
Derrière les arguments argi du programme pg, on peut rediriger les périphériques d'E/S standard vers des fichiers:
0<in.txt le flux d'entrée standard n° 0 est redirigé vers le fichier in.txt. Dans le programme le flux
Console.In
prendra donc ses données dans le fichier in.txt.
1>out.txt redirige la sortie n° 1 vers le fichier out.txt. Cela entraîne que dans le programme le flux Console.Out
écrira ses données dans le fichier out.txt
1>>out.txt idem, mais les données écrites sont ajoutées au contenu actuel du fichier out.txt.
2>error.txt redirige la sortie n° 2 vers le fichier error.txt. Cela entraîne que dans le programme le flux
Console.Error
écrira ses données dans le fichier error.txt
2>>error.txt idem, mais les données écrites sont ajoutées au contenu actuel du fichier error.txt.
1>out.txt Les périphériques 1 et 2 sont tous les deux redirigés vers des fichiers
2>error.txt
On notera que pour rediriger les flux d'E/S du programme pg vers des fichiers, le programme pg n'a pas besoin d'être
modifié. C'est l'OS qui fixe la nature des périphériques 0,1 et 2. Considérons le programme suivant :
' options
Option Explicit On
Option Strict On
' redirections
Module console2
Sub Main()
' lecture flux In
Dim data As String = Console.In.ReadLine()
' écriture flux Out
Console.Out.WriteLine(("écriture dans flux Out : " + data))
' écriture flux Error
Console.Error.WriteLine(("écriture dans flux Error : " + data))
End Sub
End Module
Compilons ce programme :
dos>vbc es2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version
1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.
dos>dir
24/02/2004 15:39 416 es2.vb
11/03/2004 08:20 3 584 es2.exe
dos>es2.exe
un premier test
écriture dans flux Out : un premier test
écriture dans flux Error : un premier test
L'exécution précédente ne redirige aucun des flux d'E/S standard In, Out, Error. Nos allons maintenant rediriger les trois flux.
Le flux In sera redirigé vers un fichier in.txt, le flux Out vers le fichier out.txt, le flux Error vers le fichier error.txt. Cette
redirection a lieu sur la ligne de commande sous la forme
dos>more in.txt
un second test
dos>more out.txt
écriture dans flux Out : un second test
dos>more error.txt
écriture dans flux Error : un second test
On voit clairement que les flux Out et Error n'écrivent pas sur les mêmes périphériques.
Arithmétique ^, –, *, /, \, Mod, +, =
+ : addition, - : soustraction, * : multiplication, / : division réelle, \ : quotient de division entière, Mod : reste de la divion entière,
^:
élévation à la puissance. Ainsi le programme suivant :
4/3=1,33333333333333
4\3=1
4 mod 3=1
4,1/3,6=1,13888888888889
4,1^2=16,81
-0,989992496600445
Toutes ces fonctions sont définies dans une classe .NET appelée Math. Lorsqu'on les utilise, il faut les préfixer avec le nom
de la classe où elles sont définies. Ainsi on écrira :
Lorsqu'une fonction est déclarée "surchargée", c'est qu'elle existe pour divers type de paramètres. Par exemple, la fonction
Abs(x) existe pour x de type Integer, Long, Decimal, Single, Float. Pour chacun de ces types existe une définition séparée de
la fonction Abs. On dit alors qu'elle est surchargée.
Catégorie Opérateurs
Primaire Toutes les expressions sans opérateur : fonctions, parenthèses
Élévation à la puissance ^
Négation unaire +, -
Multiplication *, /
Division par un entier \
Modulo Mod
Addition +, -
= : égal à, <> : différent de, < : plus petit que (strictement), > : plus grand que (strictement), <= : inférieur ou égal, >= :
supérieur ou égal, Like : correspond à un modèle, Is : identité d'objets. Tous ces opérateurs ont la même priorité. Ils sont
évalués de la gauche vers la droite. Le résultat d'une expression relationnelle un booléen.
Module string1
Sub main()
Dim ch1 As Char = "A"c
Dim ch2 As Char = "B"c
Dim ch3 As Char = "a"c
Console.Out.WriteLine("A<B=" & (ch1 < ch2))
Console.Out.WriteLine("A<a=" & (ch1 < ch3))
Dim chat As String = "chat"
Dim chien As String = "chien"
Dim chaton As String = "chaton"
Dim chat2 As String = "CHAT"
Console.Out.WriteLine("chat<chien=" & (chat < chien))
Console.Out.WriteLine("chat<chaton=" & (chat < chaton))
Console.Out.WriteLine("chat<CHAT=" & (chat < chat2))
Console.Out.WriteLine("chaton like chat*=" & ("chaton" Like "chat*"))
End Sub
End Module
A<B=True
Les bases de VB.NET 18
A<a=True
chat<chien=True
chat<chaton=True
chat<CHAT=False
chaton like chat*=True
Soient deux caractères C1 et C2. Il est possible de les comparer avec les opérateurs : <, <=, =, <>, >, >=. Ce sont alors
leurs valeurs Unicode des caractères, qui sont des nombres, qui sont comparées. Selon l'ordre Unicode, on a les relations
suivantes :
espace < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' < .. <'z'
Les chaînes de caractères sont comparées caractère par caractère. La première inégalité rencontrée entre deux caractères induit
une inégalité de même sens sur les chaînes. Avec ces explications, le lecteur est invité à étudier les résultats du programme
précédent.
i<<n décale i de n bits sur la gauche. Les bits entrants sont des zéros.
i>>n décale i de n bits sur la droite. Si i est un entier signé (signed char, int, long) le bit de signe est préservé.
i & j fait le ET logique de i et j bit à bit.
i | j fait le OU logique de i et j bit à bit.
~i complémente i à 1
i^j fait le OU EXCLUSIF de i et j
i<<4=23F0
i>>4=123
k>>4=712
i and 4=4
Lorsqu'un opérande est placé entre deux opérateurs de même priorité, l'associativité des opérateurs régit l'ordre dans lequel
les opérations sont effectuées. Tous les opérateurs sont associatifs à gauche, ce qui signifie que les opérations sont exécutées de
gauche à droite. La priorité et l'associativité peuvent être contrôlées à l'aide d'expressions entre parenthèses.
CBool,CByte,CChar,CDate,CDbl,CDec,CInt,CLng,CObj,CShort,CSng,CStr
Ces fonctions acceptent comme argument une expression numérique ou une chaîne de caractères. Le type du résultat est
indiqué dans le tableau suivant :
Module conversion
Sub main()
Dim var1 As Boolean = CBool("true")
Dim var2 As Byte = CByte("100")
Dim var3 As Char = CChar("A")
Dim var4 As Date = CDate("30 janvier 2004")
Dim var5 As Double = CDbl("100,45")
Dim var6 As Decimal = CDec("1000,67")
Dim var7 As Integer = CInt("-30")
Dim var8 As Long = CLng("456")
Dim var9 As Short = CShort("-14")
Dim var10 As Single = CSng("56,78")
Console.Out.WriteLine("var1=" & var1)
Console.Out.WriteLine("var2=" & var2)
Console.Out.WriteLine("var3=" & var3)
Console.Out.WriteLine("var4=" & var4)
Console.Out.WriteLine("var5=" & var5)
Console.Out.WriteLine("var6=" & var6)
Console.Out.WriteLine("var7=" & var7)
Console.Out.WriteLine("var8=" & var8)
Console.Out.WriteLine("var9=" & var9)
Console.Out.WriteLine("var10=" & var10)
End Sub
End Module
var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78
On peut également utiliser la fonction CType(expression, type) comme le montre le programme suivant :
Module ctype1
Sub main()
Dim var1 As Boolean = CType("true", Boolean)
Dim var2 As Byte = CType("100", Byte)
Dim var3 As Char = CType("A", Char)
Dim var4 As Date = CType("30 janvier 2004", Date)
Dim var5 As Double = CType("100,45", Double)
Dim var6 As Decimal = CType("1000,67", Decimal)
Dim var7 As Integer = CType("-30", Integer)
Dim var8 As Long = CType("456", Long)
Dim var9 As Short = CType("-14", Short)
Dim var10 As Single = CType("56,78", Single)
Dim var11 As String = CType("47,89", String)
Dim var12 As String = 47.89.ToString
Dim var13 As String = "" & 47.89
Console.Out.WriteLine("var1=" & var1)
Console.Out.WriteLine("var2=" & var2)
Console.Out.WriteLine("var3=" & var3)
Console.Out.WriteLine("var4=" & var4)
Console.Out.WriteLine("var5=" & var5)
Console.Out.WriteLine("var6=" & var6)
Console.Out.WriteLine("var7=" & var7)
Console.Out.WriteLine("var8=" & var8)
Console.Out.WriteLine("var9=" & var9)
Les bases de VB.NET 21
Console.Out.WriteLine("var10=" & var10)
Console.Out.WriteLine("var11=" & var11)
Console.Out.WriteLine("var12=" & var12)
Console.Out.WriteLine("var13=" & var13)
End Sub
End Module
var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78
var11=47,89
var12=47,89
var13=47,89
arrête le processus en cours et rend la valeur exitCode au processus père. La valeur de exitCode peut être utilisée par celui-
ci. Sous DOS, cette variable status est rendue à DOS dans la variable système ERRORLEVEL dont la valeur peut être
testée dans un fichier batch. Sous Unix, c'est la variable $? qui récupère la valeur de exitCode.
Environment.Exit(0)
' options
Option Explicit On
Option Strict On
Module if1
Sub main()
Dim i As Integer = 10
If i > 4 Then
Console.Out.WriteLine(i & " est > " & 4)
Else
If i = 4 Then
Console.Out.WriteLine(i & " est = " & 4)
Else
Console.Out.WriteLine(i & " est < " & 4)
End If
End If
Les bases de VB.NET 22
End Sub
End Module
Le résultat obtenu :
10 est > 4
Boolean, Byte, Char, Date, Decimal, Double, Integer, Long, Object, Short, Single et String
' options
Option Explicit On
Option Strict On
Module selectcase1
Sub main()
Dim i As Integer = 10
Select Case i
Case 1 To 4, 7 To 8
Console.Out.WriteLine("i est dans l'intervalle [1,4] ou [7,8]")
Case Is > 12
Console.Out.WriteLine("i est > 12")
Case Is < 15
Console.Out.WriteLine("i est < 15")
Case Is < 20
Console.Out.WriteLine("i est < 20")
End Select
End Sub
End Module
i est < 15
Les actions sont effectuées pour chacune des valeurs prises par la variable [counter]. Considérons le programme suivant :
' options
Option Explicit On
Option Strict On
Module for1
Sub main()
Dim somme As Integer = 0
Dim résultat As String = "somme("
For i As Integer = 0 To 10 Step 2
somme += i
résultat += " " + i.ToString
Next
résultat += ")=" + somme.ToString
Console.Out.WriteLine(résultat)
End Sub
End Module
Les résultats :
somme( 0 2 4 6 8 10)=30
• groupe est une collection d'objets. La collection d'objets que nous connaissons déjà est le tableau
• datatype est le type des objets de la collection. Pour un tableau, ce serait le type des éléments du tableau
• element est une variable locale à la boucle qui va prendre successivement pour valeur, toutes les valeurs de la collection.
' options
Option Explicit On
Option Strict On
Module foreach1
Sub main()
Dim amis() As String = {"paul", "hélène", "jacques", "sylvie"}
For Each nom As String In amis
Console.Out.WriteLine(nom)
Next
End Sub
End Module
afficherait :
paul
hélène
jacques
sylvie
On boucle tant que la condition est vérifiée (while) ou jusqu'à ce que la condition soit vérifiée (until). La boucle peut ne jamais
être exécutée.
Les bases de VB.NET 24
Do
[ statements ]
Loop { While | Until } condition
On boucle tant que la condition est vérifiée (while) ou jusqu'à ce que la condition soit vérifiée (until). La boucle est
toujours exécutée au moins une fois.
While condition
[ statements ]
End While
On boucle tant que la condition est vérifiée. La boucle peut ne jamais être exécutée. Les boucles suivantes calculent
toutes la somme des 10 premiers nombres entiers.
' options
Option Explicit On
Option Strict On
Module boucles1
Sub main()
Dim i, somme As Integer
i = 0 : somme = 0
Do While i < 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do Until i = 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop Until i = 11
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop While i < 11
Console.Out.WriteLine("somme=" + somme.ToString)
End Sub
End Module
somme=55
somme=55
somme=55
somme=55
' options
Option Explicit On
Option Strict On
Module nomDuModule
Sub main()
....
End Sub
End Module
• La directive [Option Explicit on] force la déclaration des variables. En VB.NET, celle-ci n'est pas obligatoire. Une variable
non déclarée est alors de type Object.
• La directive [Option Strict on] interdit toute conversion de types de données pouvant entraîner une perte de données et
toute conversion entre les types numériques et les chaînes. Il faut alors explicitement utiliser des fonctions de conversion.
• Le programme importe tous les espaces de noms dont il a besoin. Nous n'avons pas introduit encore cette notion. Nous
avons, dans les programmes précédents, souvent rencontré des instructions du genre :
Console.Out.WriteLine(unechaine)
System.Console.Out.WriteLine(unechaine)
où System est l'espace de noms contenant la classe [Console]. En important l'espace de noms [System] avec une
instruction Imports, VB.NET l'explorera systématiquement lorsqu'il rencontrera une classe qu'il ne connaît pas. Il
répétera la recherche avec tous les espaces de noms déclarés jusqu'à trouver la classe recherchée. On écrit alors :
Console.Out.WriteLine(unechaine)
' options
Option Explicit On
Option Strict On
'espaces de noms
Imports System
' options
Option Explicit On
Option Strict On
'espaces de noms
Imports System
Ici, nous utilisons le concept de classe qui sera introduit au chapitre suivant. Lorsqu'une telle classe contient une procédure
statique
(shared) appelée main, celle-ci est exécutée. Si nous introduisons cette écriture ici, c'est parce que le langage jumeau de
VB.NET qu'est C# ne connaît que le concept de classe, c.a.d. que tout code exécuté appartient nécessairement à une classe.
La notion de classe appartient à la programmation objet. L'imposer dans la conception de tout programme est un peu
maladroit. On le voit ici dans la version 2 du programme précédent où on est amené à introduire un concept de classe et de
méthode statique là où il n'y en a pas besoin. Aussi, par la suite, n'introduirons-nous le concept de classe que lorsqu'il est
nécessaire. Dans les autres cas, nous utiliserons la notion de module comme dans la version 1 ci-dessus.
' options
Option Explicit On
Option Strict On
Module boucles1
Sub main()
Dim i, somme As Integer
i = 0 : somme = 0
Do While i < 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do Until i = 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop Until i = 11
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop While i < 11
Console.Out.WriteLine("somme=" + somme.ToString)
End Sub
End Module
Supposons qu'il soit dans un fichier appelé [boucles1.vb]. Pour le compiler, nous procédons ainsi :
dos>dir boucles1.vb
11/03/2004 15:55 583 boucles1.vb
dos>vbc boucles1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
pour Microsoft (R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.
dos>dir boucles1.*
11/03/2004 16:04 601 boucles1.vb
11/03/2004 16:04 3 584 boucles1.exe
Le programme vbc.exe est le compilateur VB.NET. Ici, il était dans le PATH du DOS :
dos>path
PATH=E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE;E:\Program Files\Microsoft Visual
Studio .NET 2003\VC7\BIN;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools;E:\Program
Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin\prerelease;E:\Program Files\Microsoft Visual
Studio .NET 2003\Common7\Tools\bin;E:\Program Files\Microsoft Visual Studio .NET
2003\SDK\v1.1\bin;E:\WINNT\Microsoft.NET\Framework\v1.1.4322;e:\winnt\system32;e:\winnt;
dos>dir E:\WINNT\Microsoft.NET\Framework\v1.1.4322\vbc.exe
21/02/2003 10:20 737 280 vbc.exe
Le compilateur [vbc] produit un fichier .exe exéutable par la machine virtuelle .NET :
dos>boucles1
somme=55
somme=55
somme=55
somme=55
• on calcule le nombre de parts du salarié nbParts=nbEnfants/2 +1 s'il n'est pas marié, nbEnfants/2+2 s'il est marié, où
nbEnfants est son nombre d'enfants.
• s'il a au moins trois enfants, il a une demi-part de plus
• on calcule son revenu imposable R=0.72*S où S est son salaire annuel
• on calcule son coefficient familial QF=R/nbParts
• on calcule son impôt I. Considérons le tableau suivant :
12620.0 0 0
13190 0.05 631
15640 0.1 1290.5
24740 0.15 2072.5
31810 0.2 3309.5
39970 0.25 4900
48360 0.3 6898.5
55790 0.35 9316.5
92970 0.4 12106
127860 0.45 16754.5
151250 0.50 23147.5
172040 0.55 30710
195000 0.60 39312
0 0.65 49062
Chaque ligne a 3 champs. Pour calculer l'impôt I, on recherche la première ligne où QF<=champ1. Par exemple, si
QF=23000 on trouvera la ligne
24740 0.15 2072.5
L'impôt I est alors égal à 0.15*R - 2072.5*nbParts. Si QF est tel que la relation QF<=champ1 n'est jamais vérifiée, alors ce
sont les coefficients de la dernière ligne qui sont utilisés. Ici :
0 0.65 49062
ce qui donne l'impôt I=0.65*R - 49062*nbParts. Le programme VB.NET correspondant est le suivant :
' options
Option Explicit On
Option Strict On
Module impots
' ------------ main
Sub Main()
dos>vbc impots1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version
1.1.4322.573
dos>dir impots1.exe
24/02/2004 15:42 5 632 impots1.exe
La compilation produit un exécutable impots.exe. Il faut noter que impots.exe n'est pas directement exécutable par le
processeur. Il contient en réalité du code intermédiaire qui n'est exécutable que sur une plate-forme .NET. Les résultats
obtenus sont les suivants
:
dos>impots1
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : 3
Salaire annuel : 200000
Impôt à payer : 16400
dos>impots1
Etes-vous marié(e) (O/N) ? w
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? q
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : q
Réponse incorrecte. Recommencez
Nombre d'enfants : 2
Salaire annuel : q
Réponse incorrecte. Recommencez
Salaire annuel : 1
Impôt à payer : 0
Le paramètre args est un tableau de chaînes de caractères qui reçoit les arguments passés sur la ligne de commande lors de
l'appel du programme.
• args.Length est le nombre d'élements du tableau args
• args(i) est l'élément i du tableau
Si on lance le programme P avec la commande : P arg0 arg1 … argn et si la procédure Main du programme P est déclarée
comme suit :
Module arg
Sub main(ByVal args() As String)
' nombre d'arguments
console.out.writeline("Il y a " & args.length & " arguments")
Dim i As Integer
For i = 0 To args.Length - 1
Console.Out.WriteLine("argument n° " & i & "=" & args(i))
Next
End Sub
End Module
dos>arg1 a b c
Il y a 3 arguments
argument n° 0=a
argument n° 1=b
argument n° 2=c
Enum mention
Les bases de VB.NET 30
Passable
AssezBien
Bien
TrésBien
Excellent
End Enum
De façon interne, ces cinq constantes sont codées par des entiers consécutifs commençant par 0 pour la première constante, 1
pour la suivante, etc... Une variable peut être déclarée comme prenant ces valeurs dans l'énumération :
' une variable qui prend ses valeurs dans l'énumération mention
Dim maMention As mention = mention.Passable
De la même façon que le type simple Integer est équivalent à la structure Int32, le type simple Enum est équivalent à la
structure Enum. Cette classe a une méthode statique GetValues qui permet d'obtenir toutes les valeurs d'un type énuméré que
l'on passe en paramètre. Celui-ci doit être un objet de type Type qui est une classe d'information sur le type d'une donnée. Le
type d'une variable v est obtenu par v.GetType(). Donc ici maMention.GetType() donne
l'objet Type de l'énumération mentions et
Enum.GetValues(maMention.GetType()) la liste des valeurs de l'énumération mentions.
' pg de test
Sub Main()
' une variable qui prend ses valeurs dans l'énumération mention
Dim maMention As mention = mention.Passable
dos>enum2
mention=0
Peut mieux faire
Passable
AssezBien
Bien
TrèsBien
Excellent
0
1
2
3
4
try
appel de la fonction susceptible de générer l'exception
catch e as Exception e)
traiter l'exception e
end try
instruction suivante
Si la fonction ne génère pas d'exception, on passe alors à instruction suivante, sinon on passe dans le corps de la clause catch
puis à
instruction suivante. Notons les points suivants :
• e est un objet dérivé du type Exception. On peut être plus précis en utilisant des types tels que IOException,
SystemException, etc… : il existe plusieurs types d'exceptions. En écrivant catch e as Exception, on indique qu'on
veut gérer toutes les types d'exceptions. Si le code de la clause try est susceptible de générer plusieurs types
d'exceptions, on peut vouloir être plus précis en gérant l'exception avec plusieurs clauses catch :
try
appel de la fonction susceptible de générer l'exception
catch e as IOException
traiter l'exception e
catch e as SystemException
traiter l'exception e
end try
instruction suivante
try
appel de la fonction susceptible de générer l'exception
catch e as Exception
traiter l'exception e
finally
code exécuté après try ou catch
end try
instruction suivante
Qu'il y ait exception ou pas, le code de la clause finally sera toujours exécuté.
• Dans la clause catch, on peut ne pas vouloir utiliser l'objet Exception disponible. Au lieu d'écrire catch e as Exception, on
écrit alors
catch.
• La classe Exception a une propriété Message qui est un message détaillant l'erreur qui s'est produite. Ainsi si on veut
afficher celui-ci, on écrira :
catch e as Exception
Console.Error.WriteLine("L'erreur suivante s'est produite : "+e.Message);
...
• La classe Exception a une méthode ToString qui rend une chaîne de caractères indiquant le type de l'exception ainsi
que la valeur de la propriété Message. On pourra ainsi écrire :
catch ex as Exception
Console.Error.WriteLine("L'erreur suivante s'est produite : "+ex.ToString)
...
end
try
L'exemple suivant montre une exception générée par l'utilisation d'un élément de tableau inexistant :
' options
Option Explicit On
Option Strict On
Module tab1
Sub Main()
' déclaration & initialisation d'un tableau
Dim tab() As Integer = {0, 1, 2, 3}
Dim i As Integer
dos>exception1
tab[0]=0
tab[1]=1
tab[2]=2
tab[3]=3
0
1
2
3
L'erreur suivante s'est produite : L'index se trouve en dehors des limites du tableau.
Voici un autre exemple où on gère l'exception provoquée par l'affectation d'une chaîne de caractères à un nombre lorsque la
chaîne ne représente pas un nombre :
' options
Option Strict On
Option Explicit On
'imports
Imports System
dos>console1
Nom : dupont
âge : 23
Vous vous appelez dupont et vous avez 23 ans
dos>console1
Nom : dupont
âge : xx
Age incorrect, recommencez...
âge : 12
Vous vous appelez dupont et vous avez 12 ans
Dans la définition de la fonction, a est appelé un paramètre formel. Il n'est là que pour les besoins de la définition de la
fonction
changeInt. Il aurait tout aussi bien pu s'appeler b. Considérons maintenant une utlisation de cette fonction :
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
End Sub
Ici dans l'instruction changeInt(age), age est le paramètre effectif qui va transmettre sa valeur au paramètre formel a. Nous
nous intéressons à la façon dont un paramètre formel récupère la valeur du paramètre effectif qui lui correspond.
' options
Option Explicit On
Option Strict On
Module param1
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
Les bases de VB.NET 34
End Sub
La valeur 20 du paramètre effectif a été recopiée dans le paramètre formel a. Celui-ci a été ensuite modifié. Le
paramètre effectif est lui resté inchangé. Ce mode de passage convient aux paramètres d'entrée d'une fonction.
' options
Option Explicit On
Option Strict On
Module param2
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif
age=" & age)) End Sub
Le paramètre effectif a suivi la modification du paramètre formel. Ce mode de passage convient aux
paramètres de sortie d'une fonction.