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 StringFor i = 1 To 10
T += ControlChars.CrLf
T += "Table des " & i & ControlChars.CrLf
For j = 1 To 10T += i.ToString & " X " & j.ToString & "=" & i * j & ControlChars.CrLf
Next j Next iTextBox1.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.ClickDim IsPremier As Boolean
Dim N As Double Dim I As DoubleN = Val(TextBox1.Text)
I = 2 : IsPremier =
True Do If N / I = Int(N / I) ThenIsPremier =
False ElseI += 1
End If
Loop While IsPremier = True And I < NMsgBox(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 Whilediv = div + 1
End WhileTextBox1.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