Cours VB.NET

Image non disponible


précédentsommairesuivant

VII-A. Petites routines sur les chaînes de caractères

VII-A-1. Une string 'Nom' contient un nom, mettre si nécessaire la première lettre en majuscule

  1. En utilisant les Classes String et Char:
     
    Sélectionnez
    
    Dim Nom As String = "philippe"
    
    ' Si le premier caractère est minuscule
    
    If Char.IsLower(Nom.Chars(0)) Then
    
    ' Le transformer en majuscule et afficher
    
    MessageBox.Show(Char.ToUpper(Nom.Chars(0)) + Nom.Substring(1, Nom.Length - 1))
    
    End If

    On regarde si le premier caractère de la chaîne Nom.Chars(0) est minuscule (.IsLower).

    Si oui on transforme ce premier caractère en majuscule (.ToUpper) et on ajoute la sous chaîne allant du second au dernier caractère.

  2. En utilisant les instructions VB:
     
    Sélectionnez
    
    Dim Nom As String = "philippe"
    
    Nom = UCase(Microsoft.VisualBasic.Left(Nom, 1)) & Mid(Nom, 2)

    On prend le premier caractère de gauche : Left(Nom,1), on le transforme en majuscule (Ucase) , on ajoute la chaîne commençant par le second caractère et allant jusqu'à la fin.

VII-A-2. Comment voir si un caractère est une voyelle

 
Sélectionnez

Dim Voy As String = "aeiouy"

Dim C As String = "p" 

If Instr( Voy, C)<>0 then

..

End If

Ici on regarde si la String C est contenue dans la String Voy (qui contient toutes les voyelles), si cela retourne 0 c'est que la String C n'y est pas.

VII-A-3. Comment éliminer une combinaison bien précise de caractères en début de chaîne

Exemple: éliminer une balise html de type </b ../b0> et son contenu dans une chaîne nommée Ch:

 
Sélectionnez

' Le premier caractère est-il '<', recherche avec StartsWith 
'(en plus on élimine les espaces avec Trim())
If Ch.Trim().StartsWith("<") Then

' Rechercher le caractère '>', le premier
Dim lastLocation As Integer = Ch.IndexOf(">")

If lastLocation >= 0 Then
' éliminer la chaîne entre '<' et '>'
    Ch = Ch.Substring((lastLocation + 1))
End If
End If

VII-A-4. Vous avez une chaîne de caractères : comment afficher le premier caractère, puis les 2 premiers, puis 3... ?

Dans un formulaire (une fenêtre), il y a un TextBox1( zone de texte avec sa propriété Multiline=True)

 
Sélectionnez

Dim C As String = "DUBONET"

Dim Tx As String

Dim i As Integer

'Avec VisualBasic
For i = 1 To Microsoft.VisualBasic.Len(C)

    Tx += Microsoft.VisualBasic.Left(C, i) + ControlChars.CrLf

Next i

TextBox1.Text = Tx


'Avec le Framework c'est mieux
For i = 1 To C.Length

    Tx += C.Substring(0, i) + ControlChars.CrLf


Next i

TextBox1.Text = Tx

Mettre ce code dans Form_Load puis lancer le programme.

Affiche:

 
Sélectionnez

D

DU

DUB

DUBO

DUBON

DUBONE

DUBONET

On remarque: Tx est une string permettant de stocker temporairement la string à afficher; a chaque boucle on ajoute la nouvelle string (Tx += est équivalent à Tx=Tx+..) et un caractère de retour à la ligne.

Left fait partie de l'espace de nom Microsoft.VisualBasic.

VII-A-5. Vous avez deux chaînes de caractères : comment savoir si la seconde est un anagramme de la première ?

Pour les nuls, un anagramme c'est les mêmes lettres dans un ordre différent.

Il faut mettre les 2 chaînes dans un tableau de caractères, trier les 2 tableaux, les remettre dans des strings et les comparer.

 
Sélectionnez

'créons 2 string

Dim maString1 As String = "stressed"

Dim maString2 As String = "desserts"

 

'On passe les strings dans des tableaux

Dim myChar1 As Char =mastring1.ToCharArray

Dim myChar2 As Char =mastring2.ToCharArray

 

'On trie les tableaux

Array.Sort( myChar1)

Array.Sort( myChar2)

'On passe les caractères dans des strings

Dim MyStringTrie1 As New String (myChar1)

Dim MyStringTrie2 As New String (myChar2)

'On compare les 2 Strings, si elle sont égales cela retourne 0, l'expressin 0=0 est True, 
'on la mettre dans un Boolean

Dim anagramme As boolean =(String.Compare (MyStringTrie1 ,MyStringTrie2 )=0)

VII-A-6. Compter combien de fois un mot apparaît dans un texte

Calculer le nombre d'occurrences ( compteur )d'une sous-chaîne (monMot) dans une String (monTexte).

'On rappelle que .IndexOf permet de chercher une sous-chaîne dans une chaîne (il retourne 0 si la chaîne n'est pas présente ou la position de la chaîne).

 
Sélectionnez

Dim monTexte As String ="jfkjf...."

Dim monMot As String= "lulu"

 

Dim compteur As Integer =-1

Dim index As Integer =-1

 

Do

  compteur+= 1

  index= monTexte.IndexOf (monMot, index +1)

Loop Until index <0

On initialise le compteur à -1 car la boucle Do Loop est systématiquement effectuée une fois et incrémente le compteur une fois de trop.

On initialise l'index à -1 car dans la boucle Do Loop on utilise Index+1; sinon, si la chaîne cherchée débute au 1er caractère elle n'est pas comptée.

VII-B. Petits programmes de mathématiques

On prendra des exemples de routines mathématiques simples :
  • Calcul de l'hypoténuse d'un triangle rectangle
  • Somme de N entiers
  • Afficher les tables de multiplication
  • Valeur maximum d'un tableau
  • Calcul de factorielle (avec ou sans récursivité)
  • Un nombre est-il premier?
  • Décomposition en nombre premier
  • Diviseurs d'un nombre

VII-B-1. Calcul de l'hypoténuse d'un triangle rectangle

On crée pour cela une fonction, on envoie 2 paramètres de type Single: les 2 cotés du triangle; la fonction retourne l'hypoténuse.

 
Sélectionnez

Function Hypotenuse (ByVal Side1 As Single, ByVal Side2 As Single) As Single
    Return Sqrt((Side1 ^ 2) + (Side2 ^ 2))
End Function

Pour les nuls, on rappelle que le carré de l'Hypoténuse est égal à la somme des carrés des 2 autres cotés.

VII-B-2. Somme de N entiers

Calculer par exemple pour Nombre=20 la Somme=1+2+3+4...+18+19+20

 
Sélectionnez

Dim Somme As Integer    'Variable somme

Dim Nombre As Integer=20

Dim i As Integer        'Variable de boucle

 

For i=0 To Nombre

    Somme += i

Next i

On rappelle que Somme += i est équivalent à Somme =Somme + i

Pour afficher le résultat, si il existe une TextBox:

 
Sélectionnez

TextBox1.Text = Cstr(Somme)    'Somme est transformé en String puis affecté à la propriété Text du TextBox

VII-B-3. Afficher les tables de multiplications

On fait 2 boucles:

celle avec i (qui décide de la table: table des 1, des 2..)

On affiche 'table des' puis valeur de i

celle avec j (allant de 1 à 10 pour chaque table)

Pour chaque ligne, on affiche la valeur de i puis ' X ' puis la valeur de j puis ' = ' puis la valeur de i fois j

ControlChars.Crlf permet un saut à la ligne

A chaque fois que l'on a quelque chose à afficher, on l'ajoute à la variable String T

A la fin on affecte T à la propriété Text d'un TextBox pour rendre visible les tables.

 
Sélectionnez

Dim i As Integer

Dim j As Integer

Dim T As String

 

For i = 1 To 10

    T += ControlChars.CrLf

    T += "Table des " & i & ControlChars.CrLf

    For j = 1 To 10

        T += i.ToString & " X " & j.ToString & "=" & i * j & ControlChars.CrLf

    Next j

Next i

TextBox1.Text = T

Affiche:

 
Sélectionnez

Table des 1

1 X 1 =1

1 X 2 =2

...

VII-B-4. Trouver la valeur la plus élevée d'un tableau d'entiers

Pour cela on crée une Fonction, on l'appelle en donnant en paramètre le tableau d'entier; la fonction retourne l'entier le plus grand.

 
Sélectionnez

Function FindMax(ByVal a() As Integer) As Integer

Dim fin As Integer = UBound(a)

Dim valeurMax As Integer = a(0)

Dim i As Integer

For i = 0 To fin

If a(i) > valeurMax Then valeurMax = a(i)

Next i

Return valeurMax

End Function

Un boucle compare chaque valeur du tableau a() avec valeurMax, si l'élément du tableau est plus grand que valeurMax, valeurMax prend la valeur de l'élément.

VII-B-5. Factorielle

On rappelle que N! (factorielle N)= 1*2*3*...*(N-2)*(N-1)*N

Exemple Factorielle 3 =1*2*3

 
Sélectionnez

Dim R As Long

R=Factorielle(3)    'retournera 6

Cette fonction n'est pas fournie par VB, créons une fonction 'Factorielle':

 
Sélectionnez

Function Factorielle (ByVal N as Long) As Long

    Dim i As Long

    Resultat=1

    For i= 1 to N

        Resultat=i* Resultat

    Next i

    Return Resultat

end Function

Cela crée une fonction recevant le paramètre N et retournant un long.

Une boucle effectue bien 1*2*3...*N-1*N.

VII-B-6. Factorielle avec 'Récursivité'

Une autre manière de calculer une factorielle est d'utiliser la récursivité:

Une procédure est récursive si elle peut s'appeler elle-même.

VB gère la récursivité.

Comment faire pour les factorielles?

On sait que Factorielle N= N * Factorielle(N-1)

N!= N*(N-1)! : en sachant que 1!=1

Créons la fonction:

 
Sélectionnez

Function Factorielle (ByVal N as Long) As Long

    If N=1 then

        Return 1

    Else

        Return N* Factorielle(N-1)

    End If

end Function

Dans la fonction Factorielle on appelle la fonction Factorielle, c'est bien récursif.

Pour N=4, la fonction Factorielle est appelée 4 fois :Factorielle (4) puis Factorielle(3) puis Factorielle(2) puis Factorielle (1)

 
Sélectionnez

Factorielle (1) retourne 1

Factorielle (2)retourne  2    '2*factorielle(1)

Factorielle (3)retourne  6    '3*factorielle(2)

Factorielle (4) retourne 24   '4*factorielle(3)

Vb gère cela avec une pile des appels. il met dans une pile les uns aux dessus des autres les appels, quand il remonte, il dépile de haut en bas (Dernier rentré, premier sortie)

Attention: La pile a une taille maximum, si N est trop grand, on déclenche une erreur de type StackOverflow.

VII-B-7. Un nombre est-il premier ?

Un nombre premier est seulement divisible par 1 et lui-même.

Pour voir si N est premier on regarde successivement si ce nombre est divisible par 2 puis 3 puis 4... jusqu'a N-1

Un nombre est divisible par un autre si la division donne un entier. N/B= A Comment voir si le nombre A est entier? Pour ma part, j'utilise la méthode suivante: A est entier si A=Int(A).

Une autre méthode pour voir si N est divisible par B: il est divisible si N Mod(B)=0.

Avec une boucle For Next:

 
Sélectionnez

Dim IsPremier As Boolean                

Dim j, k As Long

 

IsPremier = True

j = 2

For k = 2 To N

     If (N Mod k = 0) And (k <> N) Then

           IsPremier = False

           j = n

     End If

     j = j + 1

Next

En sortie de boucle si IsPremier= true , le nombre N est premier.

Avec un Do Loop.

 
Sélectionnez

Dim IsPremier As Boolean

Dim N As Double=59 'nombre à étudier

Dim I As Double

I=2:  IsPremier=True

Do

    If N/I= Int(N/I) then

        IsPremier=False

    Else

        i += 1

    End if

Loop While IsPremier=True And I<N

Pour 59 IsPremier sera égal à True.

On peut améliorer la routine en remarquant:

Si un nombre n'est pas premier il admet 2 diviseurs dont un est inférieur à racine N.

on peut donc :
  • Vérifier que le nombre n'est pas pair puis
  • Vérifier s'il est divisible par les nombres allant de 3...jusqu'à racine de N en ne tenant compte que des nombres impairs.

Remarque pour ceux qui veulent tester le code :

Pour utiliser la routine sur les nombres premiers, il faut créer une petite interface: dans un formulaire créer un bouton nommé 'Button1' et une TextBox nommée 'TextBox1', enfin mettre dans la routine Button1_Click le code ci-dessous.

Quand on lance le programme, on saisit un nombre dans le textbox , puis on clique sur le bouton , cela affiche True ou False dans une MessageBox, si le nombre est premier ou non:

 
Sélectionnez

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles Button1.Click

Dim IsPremier As Boolean

Dim N As Double

Dim I As Double

N = Val(TextBox1.Text)

I = 2 : IsPremier = True

Do

If N / I = Int(N / I) Then

IsPremier = False

Else

I += 1

End If

Loop While IsPremier = True And I < N

MsgBox(IsPremier.ToString)

End Sub 

VII-B-8. Décomposition en nombre premier

 
Sélectionnez

Dim nbr As Integer = 1000 'nombre à étudier

Dim div As Integer = 2


Dim t As String = ""

While div <= nbr

While nbr / div = Int(nbr / div)

t = t & div & " x "

nbr = nbr / div

End While

div = div + 1

End While

TextBox1.Text = t

VII-B-9. Diviseurs d'un nombre

C'est une fonction qui retourne une collection de type List contenant tous les diviseurs d'un nombre nommé Number.

Si Number Mod i est égal à zéro c'est que i est un diviseur de Number; on l'ajoute à la liste.

 
Sélectionnez

Public Function Diviseur (ByVal Number As Integer) As List(Of Integer)

Dim Diviseur As New List(Of Integer)

For i As Integer = 1 To Number 

      If Number Mod i = 0 Then Diviseur.Add(i) 

Next 

End Function 

VII-C. Travail sur les tableaux et collections (tri, recherche, insertion, effacement d'éléments)

VII-C-1. Utiliser les Tableaux

Le travail sur des tableaux est très intéressant. On étudiera plusieurs routines en comparant la méthode classique et les fonctions du Framework. Puis on utilisera les collections pour faire la même chose.

VII-C-1-a. Trier un tableau

Routine de Tri .

Pour trier un tableau de chaînes de caractères, il faut comparer 2 chaînes contiguës, si la première est supérieure (c'est à dire après l'autre sur le plan alphabétique)on inverse les 2 chaînes, sinon on n'inverse pas. Puis on recommence sur 2 autres chaînes en balayant le tableau jusqu'à ce qu'il soit trié.

Tout l'art des routines de tri est de faire le moins de comparaisons possibles pour trier le plus vite possible.

Voyons une des routines les plus rapides, le Bubble Sort (ou tri à bulle); on le nomme ainsi car l'élément le plus petit monte progressivement au fur et à mesure jusqu'au début du tableau comme une bulle.(Parfois c'est l'élément le plus grand qui descend!!)

Une boucle interne balaye le tableau et compare 2 éléments contigus et les inverse si nécessaire. Une boucle externe fait tourner la boucle interne N fois.

La boucle interne fait descendre l'élément le plus grand vers la fin du tableau, la boucle externe répète l'opération N fois permettant le tri de tous les éléments.

 
Sélectionnez

Private Sub Button1_Click

'Création du tableau et de son contenu non trié.

Dim T(5) As String 'élément de 0 à 4

T(0) = "toto"

T(1) = "tata"

T(2) = "tutu"

T(3) = "lolo"

T(4) = "lulu"

 

'Création des variables

Dim N As Integer = 5  'Nombre d'éléments

Dim i, j As Integer

Dim Temp As String    'Variable temporaire

 

'Routine de tri

For i = 0 To N - 1    'Boucle externe

For j = 0 To N - 1   'Boucle interne

If T(j) > T(j + 1) Then

  Temp = T(j) : T(j) = T(j + 1) : T(j + 1) = Temp  'Inverser si pas dans le bon ordre

End If

Next j

Next i

 

' Pour afficher le tableau trié dans un textbox

Dim tt As String= ""

For i = 0 To N

tt = tt + T(i) + ControlChars.CrLf

Next i

TextBox1.Text = tt

End Sub

Remarque: pour inverser le contenu de 2 variables, on doit écrire

Temp=T(j): T(j)=T(j+1):T(j+1)=Temp (L'instruction qui faisait cela en VB6 et qui se nommait Swap n'existe plus)

Cette routine trie bien le tableau mais n'est pas optimisée: il n'est pas nécessaire que la boucle interne tourne de 0 à N-1 à chaque fois car après une boucle, le dernier élément, le plus grand, est à sa place. Pour i=0 la boucle interne tourne jusqu'à N-1, pour i=1 jusqu'à N-2...

Cela donne:

 
Sélectionnez

For i=0 To N-1

    For j=0 To N-i-1

        If T(j)>T(j+1) then 

            Temp=T(j): T(j)=T(j+1):T(j+1)=Temp

        End if

    Next j

 Next i

Il existe d'autres méthodes encore plus rapide (Méthode de Shell et Shell-Metzner), il existe aussi le QuickSort très performant pour les tableaux non triés , voir chapitre sur la récursivité.

Mais il y a plus simple:

Tri avec la méthode SORT du Framework.

Pour un tableau unidimensionnel.

 
Sélectionnez

Dim Animals(2) As String
Animals(0) = "lion"
Animals(1) = "girafe"
Animals(2) = "loup"
Array.Sort(Animals)

Et le tableau est trié!!

On rappelle que l'on ne peut pas trier un tableau multidimensionnel, mais il y a des ruses.(voir rubrique:tableau)

Les Collections peuvent être triées automatiquement aussi.

VII-C-1-b. Rechercher un élément dans un tableau

Routine de recherche:

On a un tableau de string, on veut chercher ou se trouve(en quelle position) une string.

Pour une liste non triée, on n'a pas d'autres choix que de comparer la string cherchée à chaque élément du tableau, on utilisera donc une boucle:

 
Sélectionnez

N=4  'tableau de 5 éléments.

Dim T(N) As String  'élément de 0 à 4

T(0)="vert"

T(1)="bleu"

T(2)="rouge"

T(3)="jaune"

T(4)="blanc"

Dim i  As Integer    'Variable de boucle

Dim AChercher As String= "rouge" 'String à chercher

For i=0 To N

      If T(i)=AChercher then 

            Exit For

      End if

Next i

'i contient 2

Pour une liste triée (suite ordonnée), on peut utiliser la méthode de recherche dichotomique: On compare l'élément recherché à l'élément du milieu du tableau, cela permet de savoir dans quelle moitié se situe l'élément recherché.
De nouveau on compare à l'élément recherché à l'élément du milieu de la bonne moitié...jusqu'à trouver. Pour cela on utilise les variables Inf et Sup qui sont les bonnes inférieure et supérieure de la zone de recherche et la variable Milieu.
On compare l'élément recherché à l'élément du tableau d'indice milieu, si il sont égaux on a trouvé, on sort; s'ils sont différents on modifie Inf et Sup pour pointer la bonne plage puis on donne à Milieu la valeur du milieu de la nouvelle plage et on recommence.

 
Sélectionnez

Dim N As Integer

Dim T(N) As String  'élément de 0 à 4

Dim Inf, Sup, Milieu As Integer '

Dim Reponse As Integer 'contient le numero de l'élément

                       'ou -1 si élément non trouvé 

Dim i  As Integer    'Variable de boucle

Dim AChercher As String= "c" 'String à chercher

 

N=4  'tableau de 5 éléments.

T(0)="a"

T(1)="b"

T(2)="c"

T(3)="d"

T(4)="e"

Inf=0: Sup=N

Do

    if inf>Sup then Reponse=-1: Exit Do

    Milieu= INT((Inf+Sup)/2)

    If Achercher=T(Milieu) then Reponse=Milieu:Exit Do

    If Achercher<T(Milieu) then Sup=Milieu-1

    If Achercher>T(Milieu) then Inf=Milieu+1

Loop

'Reponse =2

La recherche dichotomique est rapide car il y a moins de comparaisons.

Recherche avec les facilités du Framework.

Mais comme d'habitude VB.Net possède des propriétés permettant de rechercher dans un tableau trié ou non et cela sans avoir à écrire de routine.

Binarysearch recherche un élément dans un tableau trié unidimensionnel.(algorithme de comparaison binaire performant sur tableau trié: probablement une recherche dichotomique)

Exemple :

 
Sélectionnez

I=Array.BinarySearch(Mois, "Février") 

IndexOf

Recherche un objet spécifié dans un tableau unidimensionnel (trié ou non), retourne l'index de la première occurrence.

 
Sélectionnez

Dim myIndex As Integer = Array.IndexOf(myArray, myString)
 

Retourne -1 si l'élément n'est pas trouvé.

LastIndexOf fait une recherche à partir de la fin.

VII-C-1-c. Effacer, insérer un élément dans un tableau

1- Éliminer un élément.

Avec une routine:

Soit un tableau de 4 String T(0), T(1), T(2),T(3).

Toto
Tata
Tonton
Titi

On veut éliminer l'élément "Tata", le second élément; il faut passer le troisième dans le second, le quatrième dans le troisième... et effacer le dernier élément du tableau.

 
Sélectionnez

Dim N As Integer

Dim T(N) As String  'création d'un tableau de String.

Dim i As Integer

For i= 1 To N-1

    T(i)=T(i+1)

Next i

T(N-1)=""           'ne pas oublier de modifier le dernier élément  

On obtient:

Toto
Tonton
Titi
 

On remarque que la boucle démarre au niveau de l'élément à enlever et pas à la fin du tableau.

Avec les facilités du Framework:

On peut décaler les éléments d'un tableau avec la méthode Copy de la Classe Array:

Il suffit de copier le tableau sur le même tableau mais décalé d'un élément.

 
Sélectionnez

Array.Copy(T, 2, T, 1, T.Length - 2)

T(T.Length-1)=""

On utilise ici une surcharge de Copy:

 
Sélectionnez

Array.Copy(Tor, indexOrigine, td, indexDestitation, nombredElements)

Tor: Tableau d'origine; Td tableau destination.

2-Insérer un élément.

Avec une routine:

Soit un tableau de 4 String T(0), T(1), T(2),T(3).

Toto
Tonton
Titi
 

On veut insérer l'élément "Tata" en seconde position, après "Toto"; il faut d'abord décaler les éléments vers la fin du tableau. Attention : il faut le faire en commençant par la fin du tableau: il faut passer l'avant dernier élément en dernière position puis l'avant avant dernier en avant dernière position.

 
Sélectionnez

Dim N As Integer

Dim T(N) As String  'création d'un tableau de String.

Dim i As Integer

For i= N-1 To 1 Step -1

    T(i)=T(i-1)

Next i

T(1)="Tata"           'ne pas oublier d'ajouter

On obtient:

Toto
Tata
Tonton
Titi

On remarque que la boucle doit commencer à la fin du tableau et remonter.

Avec les facilités du Framework:

On peut déplacer les éléments avec la méthode Copy de Array:

On copie le tableau sur le même tableau mais décalé d'un élément.

 
Sélectionnez

Array.Copy(T, 1, T, 2, T.Length - 2)

T(1)="Tata"

On utilise ici une surcharge de Copy:

 
Sélectionnez

Array.Copy(Tor, indexOrigine, td, indexDestitation, nombredElements)

Tor: Tableau d'origine; Td tableau destination

VII-C-2. Utiliser les Collections

Relire le chapitre sur les collections.

On rappelle que nombre d'élément dans une collection n'est pas défini au départ comme dans un tableau. Dans une collection il n'y a que les éléments que l'on a ajouté.

Les éléments sont repérés grâce à un index, mais attention, si vous ajoutez un élément, cela décale l'index des éléments qui suivent.

 
Sélectionnez

Dim L As New ArrayList()     'On crée une collection ArrayList 

L.Add("toto")             'On ajoute un élément à la collection

MsgBox(L(0))                 'On affiche le premier élément

On pourra aussi écrire L.Item(0) pour pointer le premier élément.

 
Sélectionnez

      MsgBox(L.Count.ToString)     'On affiche le nombre d'élément.

Attention c'est le nombre d'éléments. S'il y a 3 éléments dans la ArrayList ce sont les éléments d'index 0,1,2.

VII-C-2-a. Trier une collection

 
Sélectionnez

 L.Sort()                     'Trie la collection

VII-C-2-b. Rechercher un élément dans une collection

 
Sélectionnez

L.Containts (élément)        ' Retourne True si la liste contient élément.

Recherche d'un élément dans une collection NON TRIEE avec IndexOf:

 
Sélectionnez

Dim l As New ArrayList

Dim i As Integer

l.Add("toto")

l.Add("lulu")

i = l.IndexOf("lulu")

MsgBox(i.ToString)    'Affiche 1

On rappelle qu'il existe aussi LastIndexOf qui démarre par la fin et une surcharge permettant de débuter la recherche à partir d'un indice donné.

Recherche d'un élément dans une collection TRIEE avec BinarySearch:

 
Sélectionnez

Dim l As New ArrayList

Dim i As Integer

l.Add("toto")

l.Add("lulu")

l.Sort()'Il est nécessaire que le tableau soit trié 

i = l.BinarySearch("lulu")

MsgBox(i.ToString)

VII-C-2-c. Effacer, insérer un élément dans une collection

 
Sélectionnez

  L.Remove("toto")          'On enlève un élément de la liste

     L.RemoveAt(0)                'On enlève l'élément 0 de la liste

Insert permet d'insérer à un index spécifié.

 
Sélectionnez

     L.Insert( position, Ainserrer)

VII-C-3. Différences tableau/collection

Un tableau peut avoir plusieurs dimensions, cela permet plusieurs indices:

Soit un tableau T(X,2) de String permettant de stocker en mémoire des patients (Nom, prénom, adresse..).

Nom Prénom Adresse

Dupont Pierre 32 rue du..
Dubout Jean 12 Place..
..    
     

...

Le premier indice est l'indice patient (ligne), le second indice indique la colonne.

Ainsi le prénom du patient 1 est T(1,1)

Un tableau peut avoir X dimensions, tous les éléments sont du même type.

 
Sélectionnez

Dim t(45,45,45) As Strings

On peut définir une structure

 
Sélectionnez

Public Structure Adresse

   Dim Numero     As Integer

   Dim Rue        As String

   Dim Ville      As String

End Structure

Il est ensuite possible de travailler sur un tableau de variable 'structure'.

 
Sélectionnez

Dim Adresses(99) as Adresse    'Permet de travailler sur un tableau de 100 adresses

Adresses(33).Rue="Place de la mairie"

Un tableau a un nombre défini d'élément quand on le déclare, plus les dimensions sont grandes, plus il occupe de place, même si certains de ses éléments sont vides. Une collection ne contient que les éléments qu'on a mis dedans.

Une collection n'a qu'une 'dimension': pour chaque indice on n'a qu'un seul élément (un seul Objet). On peut créer une collection de String ou d'Integer.

On verra plus loin qu'une collection comme ArrayList est une collection d'objets. (Collection d'objet 'Patient' par exemple, chaque objet 'Patient' ayant un nom, un prénom..)

Le travail sur les tableaux est beaucoup plus rapide que sur les collections.

Par exemple , pour stocker 1000 string dans un tableau ou une collection, l'usage du tableau est 60% plus rapide.

En programmation procédurale on utilise les tableaux par habitude, en programmation Objet on utilise bien les Collections.

VII-C-4. Utilisation particulière des tableaux

Utiliser un tableau plutôt qu'une lourde routine permet parfois de résoudre un problème de programmation .

Le principe est: plutôt que d'utiliser une multitude de test pour trouver une valeur, il est parfois préférable de mettre judicieusement les valeurs dans un tableau et ensuite de lire la bonne 'case'.

1 - Exemple 1:

J'ai besoin de savoir le nom du jour de la semaine en fonction de son numéro.

1 doit retourner "Lundi"
2 doit retourner "Mardi"
3 doit retourner "Mercredi"
..

Avec If Then

C'est pas bien élégant, en plus il faut appeler la routine à chaque fois qu'on veut le nom.

 
Sélectionnez

Dim J As Integer  ' Contient le numéro du jour

Dim Nom As String    

If J= 1 Then

        Nom="Lundi"

ElseIf 2 Then

        Nom="Mardi"

...

End If

Avec Select Case

On peut faire un Select Case, c'est pas bien élégant, en plus il faut appeler la routine à chaque fois qu'on veut le nom.

 
Sélectionnez

SelectCase J

    Case 1 

        Nom="Lundi"

    Case 2

        Nom="Mardi"

    ..

End Select

Avec un tableau

C'est plus élégant de créer un tableau.

 
Sélectionnez

Dim Nom as String ={"Lundi", "Mardi", "Mercredi"...."Dimanche"}

Lenom= Nom (J-1)

C'est plus commode et le plus compact.

Notez que le premier élément du tableau étant l'élément 0 , il faut utiliser J-1.

Avec le Framework

On utilise pour cela une énumération:

 
Sélectionnez

Enum NomJour
    Lundi
    Mardi
    Mercredi
    Jeudi
    Vendredi
    Samedi
    Dimanche
End Enum 

puis

 
Sélectionnez

Dim s As Type = GetType(NomJour) 'on instance s

Nom = [Enum].GetName(s, J)    'Paramètre: une instance de l'énumération et J; retourne le nom.

2 - Exemple 2:

J'ai besoin de connaître le risque de faire un accident vasculaire en fonction du sexe et de la tranche d'age.

10 à 20 ans , Homme doit retourner 0
...
60 à 70 ans et Femme doit retourner 20
...

Avec If Then

C'est pas bien élégant, en plus il faut appeler la routine à chaque fois.

 
Sélectionnez

Dim S As Integer  ' Contient le sexe 0 masculin, 1 féminin

Dim A As Integer  ' Contient la tranche d'age

Dim Risque As Integer    

If S= 1 Then

     If A=1 Then

        Risque=0

     ElseIf A=2 Then

        Risque=3

    ..

    End If

Else

    If A=1 Then

        Risque=0

     ElseIf A=2 Then

        Risque=3

    ..

    End If

End If

Avec un tableau

C'est plus élégant de créer un tableau a 2 dimensions.

Les colonnes indiquent le sexe, les lignes, la tranche d'age.

Sexe Masculin Sexe Féminin

0 0
1 30
... ...
 
Sélectionnez

Dim Risques(,) as Integer ={{0, 0}, {1, 2}, {0, 0}, {2, 3}}

Risque= Risques(S, A)

VII-D. Calculs financiers simples

VII-D-1. Conversion Francs=>Euros

Si un objet coûte 100F, cela fait combien d'euros ?

 
Sélectionnez

Dim Valeur As Double=100

Dim Resultat As Double

Resultat =Math.Round((Valeur / 6.55957), 2)

On divise par 6.55957 puis on arrondit à 2 chiffres après la virgule.

VII-D-2. Coût d'augmentation de la vie

Si un objet de 100€ augmente de 3% par an, combien coûtera -t-il dans 10 ans.

 
Sélectionnez

Dim Prix As Decimal=100
Dim Taux As Decimal=3

Dim Periode As Integer=10
Dim i As Integer
For i= 1 to Periode
 Prix=Prix+(Prix*Taux/100)

Next i

On peut remplacer les 3 dernières lignes par:

 
Sélectionnez

Prix=Prix*(1+Taux/100)^Periode

Noter que l'on utilise des variables de type décimales, c'est une bonne habitude pour faire des calculs financiers (pas d'erreurs d'arrondis).

VII-D-3. Remboursement d'un prêt

Quel est le remboursement mensuel d'un prêt d'une somme S durant une durée D (en année) à un taux annuel T ?

R=S x T / 1-(1+T)^-D (ici avec T en % mensuel et D en mois

 
Sélectionnez

Dim R, S , D, T  As Decimal   

S=5000  '5000€

D=15    'Sur 15 ans

T=4     '4% par an

T=T/12/100 'Taux au mois

D=D*12     'Durée en mois

  R=S*T/(1-(T+1)^(-D))'Formule connue par tous bon comptable!!

Si on voulait afficher le résultat dans un label (on verra cela plus loin)

 
Sélectionnez

Label1.text= R.ToString("C")

Ici le résultat est transformé en chaîne de caractères (grâce à ToString) au format monétaire ("C"), on obtient '36,98€' que l'on met dans le label pour l'afficher.

Ultérieurement on verra un exemple plus complet utilisant les fonctions financières de VB.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.