Site:  Cours VB.net  
E 1.2 Exemples:Programmes de maths.

On prendra des exemples de routines mathématiques simples:

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.

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ées des 2 autres cotés.

Somme de N entiers.

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

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:

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

 

Afficher les tables de multiplication.

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.

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:

Table des 1

1 X 1 =1

1 X 2 =2

...

 

Trouver la valeur la plus élevée d'un tableau d'entier:

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.

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. 

 

Factorielle.

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

Exemple Factorielle 3 =1*2*3

Dim R As Long

R=Factorielle(3)    'retournera 6

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

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.

 

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:

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 Factionnelle est appelée 4 fois :Factorielle (4) puis Factorielle(3) puis Factorielle(2) puis Factorielle (1)

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.

 

Un nombre est-il premier?

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

Pour voir si N est entier on regardera 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:

 

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.

 

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 saisie 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:

 

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

 

Decomposition en nombre premier?

 

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

 

Diviseurs d'un nombre?

C'est une fonction qui retourne une collection de type List contenant des integers (tous les diviseurs de Numbre.

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

 

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