VISUAL BASIC & EXCEL

TP 4

Carrés magiques, Plus grand diviseur, Décomposition en facteurs premiers


1. Solutions des exercices du TP 3
Voici le texte complet :
'Procédures graphiques du TP3
'ICES-Deug SV2-Mars 2002

Sub Géométrie()
    Sheets("Feuil2").Activate
    ActiveWindow.DisplayGridlines = False
    ActiveSheet.DrawingObjects.Delete
    With Sheets("Feuil1")
    For i = 1 To 10
       Select Case .Cells(i, 1)
         Case "Segment"
             Segment .Cells(i, 2), .Cells(i, 3), .Cells(i, 4), .Cells(i, 5), _
                    .Cells(i, 6)
         Case "Rectangle"
             Rectangle .Cells(i, 2), .Cells(i, 3), .Cells(i, 4), .Cells(i, 5), _
                    .Cells(i, 6), .Cells(i, 7)
         Case "Ellipse"
             Ellipse .Cells(i, 2), .Cells(i, 3), .Cells(i, 4), .Cells(i, 5), _
                    .Cells(i, 6), .Cells(i, 7)
         Case "Triangle"
             Triangle .Cells(i, 2), .Cells(i, 3), .Cells(i, 4), .Cells(i, 5), _
                        .Cells(i, 6), .Cells(i, 7), .Cells(i, 8), .Cells(i, 9)
         Case "Cercle"
             Cercle .Cells(i, 2), .Cells(i, 3), .Cells(i, 4), _
                    .Cells(i, 5), .Cells(i, 6)
         Case "DroiteAB"
             DroiteAB .Cells(i, 2), .Cells(i, 3), .Cells(i, 4), .Cells(i, 5), _
                    .Cells(i, 6)
       End Select
    Next
    End With
End Sub

Sub Segment(x1, y1, x2, y2, c)
    Set seg = ActiveSheet.Shapes.AddLine(x1, y1, x2, y2)
    seg.Line.ForeColor.SchemeColor = c
End Sub


Sub Rectangle(x1, y1, x2, y2, clBord, clInterieur)
    Set rect = ActiveSheet.Shapes.AddShape(msoShapeRectangle, x1, y1, x2 - x1, y2 - y1)
    rect.Fill.Transparency = 0
    rect.Fill.ForeColor.SchemeColor = clInterieur
    rect.Line.ForeColor.SchemeColor = clBord
End Sub

Sub Ellipse(x, y, rx, ry, clBord, clInterieur)
    x1 = x - rx: y1 = y - ry
    largeur = 2 * rx: hauteur = 2 * ry
    Set Ell = ActiveSheet.Shapes.AddShape(msoShapeOval, x1, y1, largeur, hauteur)
    Ell.Fill.Transparency = 0
    Ell.Fill.ForeColor.SchemeColor = clInterieur
    Ell.Line.ForeColor.SchemeColor = clBord
End Sub

Sub Triangle(x1, y1, x2, y2, x3, y3, clBord, clInterieur)
    Dim Sommet(1 To 4, 1 To 2) As Single
    Sommet(1, 1) = x1
    Sommet(1, 2) = y1
    Sommet(2, 1) = x2
    Sommet(2, 2) = y2
    Sommet(3, 1) = x3
    Sommet(3, 2) = y3
    Sommet(4, 1) = x1
    Sommet(4, 2) = y1
    Set Tri = ActiveSheet.Shapes.AddPolyline(Sommet)
    Tri.Fill.Transparency = 0
    Tri.Fill.ForeColor.SchemeColor = clInterieur
    Tri.Line.ForeColor.SchemeColor = clBord
    Tri.Fill.OneColorGradient msoGradientHorizontal, 1, 1
End Sub

Sub Cercle(x, y, r, clBord, clInterieur)
    Ellipse x, y, r, r, clBord, clInterieur
End Sub

Sub DroiteAB(xa, ya, xb, yb, c)
    x = xa
    y = ya
    dx = xb - xa
    dy = yb - ya
    Do While dx * dx + dy * dy > 10
        Do While x + dx > 0 And x + dx < 500 And y + dy > 0 And y + dy < 400
            x = x + dx
            y = y + dy
        Loop
        dx = dx / 2
        dy = dy / 2
    Loop
    x1 = x
    y1 = y

    x = xa
    y = ya
    dx = xa - xb
    dy = ya - yb
    Do While dx * dx + dy * dy > 10
        Do While x + dx > 0 And x + dx < 500 And y + dy > 0 And y + dy < 400
            x = x + dx
            y = y + dy
        Loop
        dx = dx / 2
        dy = dy / 2
    Loop
    x2 = x
    y2 = y
    Segment x1, y1, x2, y2, c
End Sub

2. Carrés magiques

Tout le monde connaît sans doute la définition d'un carré magique. Rappelons qu'un tel carré, de côté n, (n entier naturel non nul) contient les nombres entiers de 1 à n², disposés de telle sorte que :

Voici, par exemple, un carré magique de côté 3 :

Dans le cas de ce carré, toutes les colonnes, toutes les lignes et les 2 diagonales contiennent des entiers dont la somme est toujours 15.

La méthode que nous proposons, valable uniquement pour les carrés de côté impair, est particulièrement simple :


Voici, en résumé, l'organigramme décrivant la construction d'un carré magique impair selon cette méthode :


Pour bien comprendre cet organigramme, et pour le traduire en langage VBA, il faut expliquer les opérations qui permettent de déterminer si un nombre entier est impair ou si un nombre entier est un multiple d'un autre.

La phrase " n est impair " peut se traduire par : " la division de n par 2 ne tombe pas juste "
Ou bien par : " le reste de la division de n par 2 est > 0 "

La phrase " x est multiple de n " peut se traduire par : " la division de x par n tombe juste "
ou bien par : " le reste de la division de x par n est égal à 0 "

On le voit, dans les deux cas, la question revient à calculer le reste de la division d'un entier par un autre entier. Il existe pour cela, en langage VBA comme dans tous les langages informatiques (y compris les langages des calculatrices programmables), une opération binaire, (c'est-à-dire à 2 opérandes) qui calcule le reste d'une division. Cette opération s'appelle MOD.

Tout le monde connaît les 6 opérations binaires classiques :

Il existe 2 autres opérations binaires très intéressantes :

Grâce à cette nouvelle opération, il est très facile de déterminer si un nombre entier est impair ou si un entier est multiple d'un autre entier.

Commencer par définir les dimensions des 20 colonnes et des 20 premières lignes :

3. Exercices

3.1. Carré magique " à l'envers " (donné à l'examen de juin 1999)

En utilisant une méthode analogue à celle du TP4, écrire une procédure permettant de construire un carré magique de côté impair mais en considérant que les cellules seront remplies selon les règles suivantes :

3.2. Fonction PlusGrandDiviseurDe

Il s'agit de créer une fonction qui calcule, pour un entier donné n, le plus grand diviseur de n autre que n lui-même.

Pour tester notre fonction, nous utiliserons la technique suivante : l'utilisateur entre dans les cellules de la colonne A des nombres entiers. Excel calcule alors, dans les cellules de la colonne B, le plus grand diviseur de ces nombres.

La marche à suivre est la suivante :

À la fin, on doit avoir sur l'écran quelque chose comme ceci :

L'organigramme de cette fonction est le suivant :


Remarque : noter la division de n par 2, au début, qui se fait avec la barre \ au lieu de / afin de faire une division entière et non pas une division réelle.

3.3. Fonction DécomposeEnFacteursPremiers

Selon les mêmes modalités que pour l'exercice précédent, l'utilisateur saisit des nombres entiers dans la colonne A et Excel décompose les nombres en un produit de facteurs premiers. Il s'agit cette fois, d'obtenir à l'écran à peu près ceci :

L'organigramme est le suivant :

<< TP précédent      TP suivant >>

Retour à la liste des TP