La fonction PureBasic Mod() retourne le Reste de la division d'un Nombre par son Diviseur
■ Considérons la table de 3 modulo 10
3 × 1 = 3 => 3 × 1 = 3 (mod. 10) Debug Mod(3, 10) = 3
3 × 2 = 6 => 3 × 2 = 6 (mod. 10) Debug Mod(6, 10) = 6
3 × 3 = 9 => 3 × 3 = 9 (mod. 10) Debug Mod(9, 10) = 9
3 × 4 = 12 => 3 × 4 = 2 (mod. 10) Debug Mod(12, 10) = 2
3 × 5 = 15 => 3 × 5 = 5 (mod. 10) Debug Mod(15, 10) = 5
Etc ....
Le code que je vous présente va vous permettre de voir graphiquement ce que ça donne.
Essayez par exemple d'afficher la table de 30 modulo 87 (Avec 87 points) et pourquoi pas la table de 464 modulo 691.
La touche Entrée de votre clavier ou le bouton Voir permet de voir le résultat.
Code : Tout sélectionner
; Beauté modulaire des tables de multiplication
; Le principe de l'arithmétique modulaire est de
; travailler non sur les nombres eux-mêmes, mais
; sur les restes de leur division par quelque chose.
; La fonction PureBasic Mod() retourne le reste de la division d'un 'Nombre' par son 'Diviseur
; Considérons la table de 3 modulo 10
; 3 × 1 = 3 => 3 × 1 = 3 (mod. 10) Debug Mod(3, 10) = 3
; 3 × 2 = 6 => 3 × 2 = 6 (mod. 10) Debug Mod(6, 10) = 6
; 3 × 3 = 9 => 3 × 3 = 9 (mod. 10) Debug Mod(9, 10) = 9
; 3 × 4 = 12 => 3 × 4 = 2 (mod. 10) Debug Mod(12, 10) = 2
; 3 × 5 = 15 => 3 × 5 = 5 (mod. 10) Debug Mod(15, 10) = 5
; Etc ....
EnableExplicit
Enumeration window
#mf
EndEnumeration
Enumeration gadget
#mfResult
#mfTable
#mfModulo
#mfShowCircle
#mfShowPoint
#mfView
EndEnumeration
Enumeration shortcut
#Return
EndEnumeration
; Font d'affichage des nombres
Global Font = LoadFont(#PB_Any, "", 10)
; Structure d'un point (Compatibilité Mac OS)
Structure NewPoint
x.i
y.i
EndStructure
; Sommaire
Declare Start()
Declare ViewResult()
Declare Exit()
Start()
Procedure Start()
OpenWindow(#mf, 0, 0, 1024, 768, "Beauté modulaire des tables de multiplication", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
AddKeyboardShortcut(#mf, #PB_Shortcut_Return, #Return)
; Affichage du résultat
CanvasGadget(#mfResult, 0, 0, 1024, 700)
TextGadget(#PB_Any, 10, 710, 80, 24, "Table de multiplication")
StringGadget(#mfTable, 90, 710, 50, 24, "2", #PB_String_Numeric)
TextGadget(#PB_Any, 180, 710, 80, 24, "Nombre de points")
StringGadget(#mfModulo, 260, 710, 50, 24, "10", #PB_String_Numeric)
CheckBoxGadget(#mfShowCircle, 340, 710, 100, 24, "Dessiner le cercle")
SetGadgetState(#mfShowCircle, #True)
CheckBoxGadget(#mfShowPoint, 460, 710, 100, 24, "Voir les points")
SetGadgetState(#mfShowPoint, #True)
ButtonGadget(#mfView, 930, 710, 80, 24, "Voir")
SetActiveGadget(#mfModulo)
ViewResult()
; Déclencheur
BindGadgetEvent(#mfView, @ViewResult())
BindEvent(#PB_Event_Menu, @ViewResult(), #mf, #Return)
BindEvent(#PB_Event_CloseWindow, @Exit())
Repeat : WaitWindowEvent(10) : ForEver
EndProcedure
Procedure ViewResult()
; Centre du cercle & Rayon
Protected CX = GadgetWidth(#mfResult)/2
Protected CY = GadgetHeight(#mfResult)/2
Protected Radius
; Afficher le cercle Oui ou Non
Protected ShowCircle.b = GetGadgetState(#mfShowCircle)
; Nombre de points sur le cercle
Protected Modulo = Val(GetGadgetText(#mfModulo))
; Point, Angle et position X, Y de chaque point
Protected P, Angle.f, X, Y
; Table de multiplication à utiliser
Protected Table = Val(GetGadgetText(#mfTable))
; Affichage des points
Protected ShowPoint.b = GetGadgetState(#mfShowPoint)
; Affichage des lignes
Protected X0, Y0, X1, Y1
; Mémorisation des points
Protected NewMap Points.NewPoint()
; Le nombre de points doit être supérieur à 0
If Modulo < 1
SetGadgetText(#mfModulo, "1")
Modulo = 1
EndIf
Angle = -90
If StartDrawing(CanvasOutput(#mfResult))
; Clear Canvas
Box(0, 0, 1024, 700, RGB(210, 180, 140))
; Affichage du cercle
Radius = 300
If ShowCircle
DrawingMode(#PB_2DDrawing_Outlined)
Circle(CX, CY, Radius, RGB(0, 0, 0))
EndIf
; Calcul et affichage des coordonnées de chaque point sur le cercle
While Angle < 270
Radius = 300
; Mémorisation des coordonnées X, Y de chaque point
X = CX + Radius * Cos(Angle * #PI / 180)
Y = CY + Radius * Sin(Angle * #PI / 180)
AddMapElement(Points(), Str(P))
Points()\x = X
Points()\y = Y
; Affichage de chaque point sur le cercle
If ShowPoint
Circle(X, Y, 1, RGB(0, 0, 0))
Radius = 320
X = CX + Radius * Cos(Angle * #PI / 180)
Y = CY + Radius * Sin(Angle * #PI / 180)
DrawingFont(FontID(Font))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X-TextWidth(Str(P))/2, Y-TextHeight(Str(P))/2, Str(P), RGB(0, 0, 0))
EndIf
; Point suivant
P + 1
Angle + 360/Modulo
Wend
; Représentation graphique de la table de multiplication
P = 0
While P < Modulo
; Recherche des coordonnées X0, Y0 du point 0 puis 1 puis 2 etc ....
FindMapElement(Points(), Str(P))
X0 = Points()\x
Y0 = Points()\y
; Recherche des coordonnées X1,Y1 du résultat ou du reste de la division
FindMapElement(Points(), Str(Mod(P * Table, Modulo)))
X1 = Points()\x
Y1 = Points()\y
; Dessin de la ligne reliant les deux points
LineXY(X0, y0, x1, y1, RGB(0, 0, 0))
; Point suivant
P + 1
Wend
StopDrawing()
EndIf
EndProcedure
Procedure Exit()
End
EndProcedure